diff --git a/Makefile b/Makefile
index 6e0aff8..d5b7de2 100644
--- a/Makefile
+++ b/Makefile
@@ -162,6 +162,15 @@ $(KOBJDIR)/kernel/cpu/idt.o: $(KALEIDDIR)/kernel/cpu/idt.c \
@rm -f $@.1 $@.2
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
+$(KOBJDIR)/kernel/mm/gdt.o: $(KALEIDDIR)/kernel/mm/gdt.c \
+ $(KALEIDDIR)/kernel/mm/gdt.asm | $(KOBJDIR)
+ @mkdir -p $(shell dirname $@)
+ @$(ASM) $(ASMFLAGS) $(KALEIDDIR)/kernel/mm/gdt.asm -o $@.1
+ @$(KCC) $< -o $@.2
+ @$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@
+ @rm -f $@.1 $@.2
+ @echo ${CL2}[$@] ${CL}Compiled.${CL3}
+
$(KOBJDIR)/kernel/cpu/cpuid.o: $(KALEIDDIR)/kernel/cpu/cpuid.c \
$(KALEIDDIR)/kernel/cpu/cpuf.asm | $(KOBJDIR)
@mkdir -p $(shell dirname $@)
diff --git a/include/kernel/base.h b/include/kernel/base.h
index bccb425..113c711 100644
--- a/include/kernel/base.h
+++ b/include/kernel/base.h
@@ -58,6 +58,8 @@ typedef struct MemoryMap_t MemoryMap_t;
typedef struct MapEntry_t MapEntry_t;
typedef struct GdtEntry_t GdtEntry_t;
typedef struct GdtPtr_t GdtPtr_t;
+typedef struct TssEntry_t TssEntry_t;
+typedef struct TssDescriptor_t TssDescriptor_t;
//----------------------------------------------------------------------------//
diff --git a/include/kernel/mm.h b/include/kernel/mm.h
index ec1ce6a..cc2949c 100644
--- a/include/kernel/mm.h
+++ b/include/kernel/mm.h
@@ -60,14 +60,40 @@ struct MemoryMap_t {
// The gdt
struct GdtEntry_t
{
- ushort lowLimit; // lower 16 bits
- ushort lowBase; // lower 16 bits
- uchar middleBase; // next 8 bits
- uchar access; // determine what ring this segment can be used in
- uchar granularity;
- uchar highBase; // last 8 bits
+ ushort lowLimit; // lower 16 bits
+ ushort lowBase; // lower 16 bits
+ uchar middleBase; // next 8 bits
+ uchar access; // determine what ring this segment can be used in
+ uchar granularity;
+ uchar highBase; // last 8 bits
} __attribute__((__packed__));
+struct TssDescriptor_t
+{
+ ushort limitLow;
+ ushort base00;
+ uchar base16;
+ uchar access;
+ uchar size;
+ uchar base24;
+ uint base32;
+ uint reserved;
+} __attribute__ ((packed));
+
+struct TssEntry_t
+{
+ uint reserved0;
+
+ ulong privStackPointer[3]; // stack pointers for CPL 0-2
+ ulong intStackTable[8]; // /!\ [0] is reserved
+
+ ulong reserved1;
+ ushort reserved2;
+ ushort ioMapOffset;
+} __attribute__ ((packed));
+
+
+
// The gdt pointer
struct GdtPtr_t
{
@@ -106,7 +132,13 @@ void MmInitGdt(void);
//
// Loads the descriptor table
//
-extern void MmLoadGdt(GdtPtr_t *GdtPtr);
+extern void MmLoadGdt(ulong ds, ulong cs, ulong tr);
+
+
+//
+// Stores the descriptor table
+//
+extern void MmStoreGdt(void);
//----------------------------------------------------------------------------//
diff --git a/kaleid/kernel/cpu/cpuf.asm b/kaleid/kernel/cpu/cpuf.asm
index 98abe26..ecffec7 100644
--- a/kaleid/kernel/cpu/cpuf.asm
+++ b/kaleid/kernel/cpu/cpuf.asm
@@ -22,5 +22,7 @@
; along with OS/K. If not, see . ;
;=----------------------------------------------------------------------------=;
+[BITS 64]
+
%include "kaleid/kernel/cpu/cpuf.inc"
diff --git a/kaleid/kernel/cpu/isr.asm b/kaleid/kernel/cpu/isr.asm
index 76b05e9..14b0523 100644
--- a/kaleid/kernel/cpu/isr.asm
+++ b/kaleid/kernel/cpu/isr.asm
@@ -22,6 +22,8 @@
; along with OS/K. If not, see . ;
;=----------------------------------------------------------------------------=;
+[BITS 64]
+
%include "kaleid/kernel/cpu/cpuf.inc"
global IdtInit
diff --git a/kaleid/kernel/init/init.c b/kaleid/kernel/init/init.c
index 8e90088..7b2a540 100644
--- a/kaleid/kernel/init/init.c
+++ b/kaleid/kernel/init/init.c
@@ -44,7 +44,7 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
// Sanity checks
BtDoSanityChecks(mbMagic);
- // Memory & scheduler
+ // Memory
MmInitMemoryMap();
// Interrupts launching
diff --git a/kaleid/kernel/mm/gdt.c b/kaleid/kernel/mm/gdt.c
index f21d63a..aeb752c 100644
--- a/kaleid/kernel/mm/gdt.c
+++ b/kaleid/kernel/mm/gdt.c
@@ -24,13 +24,11 @@
#include
-// The Gdt
-GdtEntry_t gdtEntries[5];
+GdtEntry_t gdtEntries[5] = { 0 };
+TssEntry_t tssEntry = { 0 };
GdtPtr_t gdtPtr;
-#if 0
-static void SetGdtEntry(int index, uint base, uint limit, uchar access,
- uchar granularity)
+static void SetGdtEntry(int index, uint base, uint limit, uchar access)
{
gdtEntries[index].lowBase = (base & 0xFFFF);
gdtEntries[index].middleBase = (base >> 16) & 0xFF;
@@ -39,10 +37,30 @@ static void SetGdtEntry(int index, uint base, uint limit, uchar access,
gdtEntries[index].lowLimit = (limit & 0xFFFF);
gdtEntries[index].granularity = (limit >> 16) & 0x0F;
- gdtEntries[index].granularity |= granularity & 0xF0;
- gdtEntries[index].access = access;
+ gdtEntries[index].granularity |= 0xA0;
+
+ // 0x10 is system
+ // 0x80 is present
+ gdtEntries[index].access = access | 0x10 | 0x80;
+}
+
+static void SetTssEntry(uchar index, ulong base, ulong limit)
+{
+ TssDescriptor_t tssDesc = { 0 };
+
+ tssDesc.limitLow = limit & 0xffff;
+ tssDesc.size = (limit >> 16) & 0xf;
+
+ tssDesc.base00 = base & 0xffff;
+ tssDesc.base16 = (base >> 16) & 0xff;
+ tssDesc.base24 = (base >> 24) & 0xff;
+ tssDesc.base32 = (base >> 32) & 0xffffffff;
+ tssDesc.reserved = 0;
+
+ tssDesc.access = 0x01 | 0x08 | 0x10 | 0x80;
+
+ memmove(&gdtEntries[index], &tssDesc, sizeof(TssDescriptor_t));
}
-#endif
void MmInitGdt(void)
@@ -50,11 +68,15 @@ void MmInitGdt(void)
gdtPtr.limit = (sizeof(GdtEntry_t) * 5) - 1;
gdtPtr.base = (uint)(ullong)&gdtEntries;
- //SetGdtEntry(0,0,0,0,0);
+ MmStoreGdt();
- /* XXX set TSS register */
+ /* SetGdtEntry(1, 0x0, 0xfffff, 0x02 | 0x08); */
- //MmLoadGdt(&gdtPtr);
+ /* tssEntry.ioMapOffset = sizeof(TssEntry_t); */
+
+ /* SetTssEntry(2, (ulong)&tssEntry, sizeof(TssEntry_t)); */
+
+ /* MmLoadGdt(0x8, 0x0, 2 << 3); */
}