|
| 1 | +.section .romdata, "a" |
| 2 | + |
| 3 | +gdt32_ptr: |
| 4 | + .short gdt32_end - gdt32_start - 1 # GDT length is actually (length - 1) |
| 5 | + .long gdt32_start |
| 6 | + |
| 7 | +gdt32_start: # First descriptor is always null |
| 8 | + .quad 0 |
| 9 | +code32_desc: # Base = 0, Limit = 0xF_FFFF w/ 4K Ganularity = 4G |
| 10 | + # CS.Limit[15:00] = 0xFFFF |
| 11 | + .short 0xffff |
| 12 | + # CS.Base[15:00] = 0 |
| 13 | + .short 0x0000 |
| 14 | + # CS.Base[23:16] = 0 (bits 0-7) |
| 15 | + .byte 0x00 |
| 16 | + # CS.Accessed = 1 (bit 8) - Don't write to segment on first use |
| 17 | + # CS.ReadEnable = 1 (bit 9) - Read/Execute Code-Segment |
| 18 | + # CS.Conforming = 0 (bit 10) - Nonconforming, no lower-priv access |
| 19 | + # CS.Executable = 1 (bit 11) - Code-Segement |
| 20 | + # CS.S = 1 (bit 12) - Not a System-Segement |
| 21 | + # CS.DPL = 0 (bits 13-14) - We only use this segment in Ring 0 |
| 22 | + # CS.P = 1 (bit 15) - Segment is present |
| 23 | + .byte 0b10011011 |
| 24 | + # CS.Limit[19:16] = 0xF (bits 16-19) |
| 25 | + # CS.AVL = 0 (bit 20) - Our software doesn't use this bit |
| 26 | + # CS.L = 0 (bit 21) - This isn't a 64-bit segment |
| 27 | + # CS.B = 1 (bit 22) - This is a 32-bit segment |
| 28 | + # CS.G = 1 (bit 23) - 4K Granularity |
| 29 | + .byte 0b11001111 |
| 30 | + # CS.Base[31:24] = 0 (bits 24-31) |
| 31 | + .byte 0x00 |
| 32 | + |
| 33 | +data32_desc: # Base = 0, Limit = 0xF_FFFF w/ 4K Ganularity = 4G |
| 34 | + # DS.Limit[15:00] = 0xFFFF |
| 35 | + .short 0xffff |
| 36 | + # DS.Base[15:00] = 0 |
| 37 | + .short 0x0000 |
| 38 | + # DS.Base[23:16] = 0 (bits 0-7) |
| 39 | + .byte 0x00 |
| 40 | + # DS.Accessed = 1 (bit 8) - Don't write to segment on first use |
| 41 | + # DS.WriteEnable = 1 (bit 9) - Read/Write Data-Segment |
| 42 | + # DS.Expansion = 0 (bit 10) - Expand-up |
| 43 | + # DS.Executable = 0 (bit 11) - Data-Segement |
| 44 | + # DS.S = 1 (bit 12) - Not a System-Segement |
| 45 | + # DS.DPL = 0 (bits 13-14) - We only use this segment in Ring 0 |
| 46 | + # DS.P = 1 (bit 15) - Segment is present |
| 47 | + .byte 0b10010011 |
| 48 | + # DS.Limit[19:16] = 0xF (bits 16-19) |
| 49 | + # DS.AVL = 0 (bit 20) - Our software doesn't use this bit |
| 50 | + # DS.L = 0 (bit 21) - This isn't a 64-bit segment |
| 51 | + # DS.B = 1 (bit 22) - This is a 32-bit segment |
| 52 | + # DS.G = 1 (bit 23) - 4K Granularity |
| 53 | + .byte 0b11001111 |
| 54 | + # DS.Base[31:24] = 0 (bits 24-31) |
| 55 | + .byte 0x00 |
| 56 | +gdt32_end: |
0 commit comments