4 #include "config_gdt.h"
11 /** Segment numbers. */
15 gdt_code_kernel = GDT_CODE_KERNEL,
16 gdt_data_kernel = GDT_DATA_KERNEL,
17 gdt_code_user = GDT_CODE_USER,
18 gdt_data_user = GDT_DATA_USER,
19 gdt_tss_dbf = GDT_TSS_DBF,
22 gdt_user_entry1 = GDT_USER_ENTRY1,
23 gdt_user_entry2 = GDT_USER_ENTRY2,
24 gdt_user_entry3 = GDT_USER_ENTRY3,
25 gdt_user_entry4 = GDT_USER_ENTRY4,
26 gdt_code_user32 = GDT_CODE_USER32,
33 Selector_kernel = 0x00,
37 Gdt_entry _entries[0];
40 //------------------------------------------------------------------
41 IMPLEMENTATION [amd64]:
45 Gdt::set_entry_tss(int nr, Address base, Unsigned32 limit,
46 Unsigned8 access, Unsigned8 szbits)
48 // system-segment descriptor is 16byte
49 _entries[nr] = Gdt_entry(base, limit >> 12, access, szbits | 0x08);
50 _entries[nr + 1].raw = base >> 32;
53 //------------------------------------------------------------------
59 Gdt::set_entry_byte(int nr, Address base, Unsigned32 limit,
60 Unsigned8 access, Unsigned8 szbits)
62 _entries[nr] = Gdt_entry(base, limit, access, szbits);
67 Gdt::set_entry_4k(int nr, Address base, Unsigned32 limit,
68 Unsigned8 access, Unsigned8 szbits)
70 _entries[nr] = Gdt_entry(base, limit >> 12, access, szbits | 0x08);
75 Gdt::clear_entry(int nr)
89 Gdt::operator [] (unsigned idx)
90 { return _entries[idx]; }
94 Gdt::operator [] (unsigned idx) const
95 { return _entries[idx]; }
98 IMPLEMENTATION[ia32 | amd64]:
102 Gdt::set (Pseudo_descriptor *desc)
104 asm volatile ("lgdt %0" : : "m" (*desc));
109 Gdt::get (Pseudo_descriptor *desc)
111 asm volatile ("sgdt %0" : "=m" (*desc) : : "memory");
117 { return gdt_data_user | Selector_user; }