summaryrefslogtreecommitdiff
path: root/kernel/gdt.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gdt.c')
-rw-r--r--kernel/gdt.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/kernel/gdt.c b/kernel/gdt.c
index dc760f2..4df089f 100644
--- a/kernel/gdt.c
+++ b/kernel/gdt.c
@@ -7,13 +7,13 @@
#define GDT_SIZE 6
extern sys_tss;
+static uint8_t gdt_struct[GDT_SIZE*8];
typedef struct GDT_struct
{
uint32_t base;
uint32_t limit;
uint32_t type;
-
}GDT;
//alternative
@@ -38,10 +38,6 @@ struct gdt_entry_bits
unsigned int base_high :8;
} __packed; //or __attribute__((packed))
-
-static GDT myGDT[GDT_SIZE];
-static uint8_t gdt_struct[GDT_SIZE*8];
-
/**
* \param target A pointer to the 8-byte GDT entry
* \param source An arbitrary structure describing the GDT entry
@@ -89,6 +85,16 @@ void encodeGdtEntry(uint8_t *target, GDT source)
void gdt_init()
{
+ /*
+ Pr=1 Privl 1 Exec DC RW Ac
+ 0x9A == 1001 1010 == 1 00 1 1 0 1 0
+ 0x92 == 1001 0010 == 1 00 1 0 0 1 0
+ 0xFA == 1111 1010 == 1 11 1 1 0 1 0
+ 0xF2 == 1111 0010 == 1 11 1 0 0 1 0
+ */
+
+ GDT myGDT[GDT_SIZE];
+
//selector 0x0
myGDT[0].base=0;
myGDT[0].limit=0;
@@ -115,15 +121,16 @@ void gdt_init()
myGDT[4].type=0xF2;
//TSS 0x28
- myGDT[5].base=&sys_tss; //tss start?
- myGDT[5].limit=sizeof(tss_struct); //tss end?
+ myGDT[5].base=&sys_tss; //tss start
+ myGDT[5].limit=sizeof(tss_struct); //tss end
myGDT[5].type=0x89;
// transcript to format the processor wants
for(int i=0;i<GDT_SIZE;i++)
encodeGdtEntry(&gdt_struct[8*i],myGDT[i]);
- // updat
+ // update tss entry
install_tss();
+
setup_gdt(&gdt_struct[0],8*GDT_SIZE);
}