1+ #include "gdt.h"
2+
3+ gdt_entry_t entries [GDT_MAX_ENTRIES ];
4+ gdt_ptr_t ptr ;
5+
6+ void init_gdt ()
7+ {
8+ printf ("[GDT] Configuring GDT pointer...\n" );
9+ ptr .limit = (sizeof (gdt_entry_t ) * GDT_MAX_ENTRIES ) - 1 ;
10+ ptr .base = (uint32_t )& entries ;
11+
12+ printf ("[GDT] Adding entries...\n" );
13+
14+ gdt_setGate (0 , 0 , 0 , 0 , 0 );
15+ gdt_setGate (1 , 0 , 0xFFFFFFFF , 0x9A , 0xCF );
16+ gdt_setGate (2 , 0 , 0xFFFFFFFF , 0x92 , 0xCF );
17+ gdt_setGate (3 , 0 , 0xFFFFFFFF , 0xFA , 0xCF );
18+ gdt_setGate (4 , 0 , 0xFFFFFFFF , 0xF2 , 0xCF );
19+
20+ printf ("[GDT] Flushing GDT entries...\n" );
21+
22+ flush_gdt ((uint32_t )& ptr );
23+
24+ printf ("[GDT] Initialized successfully\n" );
25+ }
26+
27+ void gdt_setGate (int32_t index , uint32_t base , uint32_t limit , uint8_t access , uint8_t gran )
28+ {
29+ entries [index ].base_low = (base & 0xFFFF );
30+ entries [index ].base_middle = (base >> 16 ) & 0xFF ;
31+ entries [index ].base_high = (base >> 24 ) & 0xFF ;
32+ entries [index ].limit_low = (limit & 0xFFFF );
33+ entries [index ].granularity = (limit >> 16 ) & 0x0F ;
34+ entries [index ].granularity |= gran & 0xF0 ;
35+ entries [index ].access = access ;
36+ printf ("[GDT] New entry %d. Base: 0x%06x, Limit: 0x%06x, Access: 0x%02x, Gran: 0x%02x\n" , index , base , limit , access , gran );
37+ }
0 commit comments