1 ;; ######################################################################## 2 ;; Macros 3 ;; ######################################################################## 4 5 ; descriptor type, base, limit, p_dpl_s, g_db_a 6 %macro descriptor 5 7 dw (%3 & 0xFFFF) ; Limit 0-15 8 dw (%2 & 0xFFFF) ; Base 0-15 9 db ((%2 & 0xFF0000) >> 16) ; Base 16-23 10 db ((%4 & 0xF) << 4) | (%1 & 0xF ) ; p_dpl_s_type 11 db (%5 << 4) | ((%3 & 0xF0000) >> 16) ; g_db_a limit 19:16 12 db ((%2 & 0xFF000000) >> 24) ; Base 24-31 13 %endmacro 14 15 ; cdesc32 base, limit, dpl 16 %macro cdesc32 3 17 descriptor 0xB, %1, %2, 0x9 | (%3 & 0x3) << 1, 0xD 18 %endmacro 19 20 ; ddesc32 base, limit, dpl 21 %macro ddesc32 3 22 descriptor 0x3, %1, %2, 0x9 | (%3 & 0x3) << 1, 0xD 23 %endmacro 24 25 ; gates type, offset, selector, p_dpl_s 26 %macro gates 4 27 dw %2 ; Offset 0-15 28 dw (%3 & 0xFFFF) ; Selector 0-15 29 db 0 ; Reserved 30 db ((%4 & 0xF) << 4) | (%1 & 0xF) ; p_dpl_s_type 31 dw 0 ; Offset 16-31 32 %endmacro 33 34 %macro idesc32 3 35 gates 0xE, %1, %2, 0x8 | ((%3 & 0x3) << 1) 36 %endmacro 37 38 39 ;; ######################################################################## 40 ;; Code Section 41 ;; ######################################################################## 42 43 SECTION CODE ABSOLUTE=0x00400000 FLAT USE32 44 45 test_code: 46 47 ;; Your Code Goes Here 48 hlt 49 50 ;; ######################################################################## 51 ;; Setup Section 52 ;; ######################################################################## 53 54 SECTION SETUP ALIGN=16 FLAT USE16 55 56 setup: 57 58 mov edx, cr0 59 or dl, 0x21 ; Protect Mode On, Int 16 for FPU 60 and edx, 0x9FFFFFFF ; Turn Caches on 61 mov cr0, edx 62 63 xor edx, edx ; Enable Var MTRRs 64 mov eax, 0x0806 ; WriteBack 65 mov ecx, 0x2FF 66 wrmsr 67 68 lgdt [pgdt] ; Set GDT 69 lidt [pidt] ; Set IDT 70 71 jmp 0x8:protect_mode 72 73 protect_mode: 74 75 BITS 32 76 77 mov esp, 0x01000000 ; Get some stack space 78 mov ax, 0x0010 ; Set data selectors 79 mov ss, ax 80 mov ds, ax 81 mov es, ax 82 mov fs, ax 83 mov gs, ax 84 85 jmp test_code ; Jmp to test code 86 87 ;; ######################################################################## 88 ;; Protect Mode IDT 89 ;; ######################################################################## 90 91 SECTION IDTP ALIGN=16 FLAT USE32 92 93 ;; cdesc32 base, limit, dpl 94 gdt0: dq 0.0 ; 0x0000 - Null descriptor 95 cdesc32 0x00000000, 0xFFFFF, 0 ; 0x0008 - Code Selector 96 ddesc32 0x00000000, 0xFFFFF, 0 ; 0x0010 - Data Selector 97 cdesc32 0x00000000, 0xFFFFF, 3 ; 0x0018 - Code Select Ring 3 98 ddesc32 0x00000000, 0xFFFFF, 3 ; 0x0020 - Data Select Ring 3 99 100 ;; idesc32 offset, selector, dpl 101 idt0: idesc32 isrP, 0x0008, 0 ; 0x00, 0 #DE, Divide Error 102 idesc32 isrP, 0x0008, 0 ; 0x01, 1 #DB, Debug Fault 103 idesc32 isrP, 0x0008, 0 ; 0x02, 2, ---, NMI 104 idesc32 isrP, 0x0008, 0 ; 0x03, 3, #BP, Breakpoint 105 idesc32 isrP, 0x0008, 0 ; 0x04, 4, #OF, INTO detected Overflow 106 idesc32 isrP, 0x0008, 0 ; 0x05, 5, #BR, Bound Range Exceeded 107 idesc32 isrP, 0x0008, 0 ; 0x06, 6, #UD, Invalid Opcode 108 idesc32 isrP, 0x0008, 0 ; 0x07, 7, #NM, Device Not Available 109 idesc32 isrP, 0x0008, 0 ; 0x08, 8, #DF, Double Fault 110 idesc32 isrP, 0x0008, 0 ; 0x09 9, ---, Coprocessor Segment Overrun 111 idesc32 isrP, 0x0008, 0 ; 0x0A, 10, #TS, Invalid TSS 112 idesc32 isrP, 0x0008, 0 ; 0x0B, 11, #NP, Segment Not Present 113 idesc32 isrP, 0x0008, 0 ; 0x0C, 12, #SS, Stack Fault 114 idesc32 isrP, 0x0008, 0 ; 0x0D, 13, #GP, General Protection Fault 115 idesc32 isrP, 0x0008, 0 ; 0x0E, 14, #PF, Page Fault 116 idesc32 isrP, 0x0008, 0 ; 0x0F, 15, ---, Reserved 117 idesc32 isrP, 0x0008, 0 ; 0x10, 16, #MF, Floating Point Fault 118 idesc32 isrP, 0x0008, 0 ; 0x11, 17, #AC, Alignment Check 119 idesc32 isrP, 0x0008, 0 ; 0x12 18, #MC, Machine Check 120 idesc32 isrP, 0x0008, 0 ; 0x13, 19, #XF, SSE Fault 121 122 pgdt: dw 6 * 8 ; Limit 123 dd gdt0 ; base 124 125 pidt: dw 20 * 8 ; Limit 126 dd idt0 ; base 127 128 isrP: mov eax, 0xDEADBEEF ; Default Real Mode Interrupt Handler 129 out 0x80, eax 130 hlt 131 132 ;; ######################################################################## 133 ;; Real Mode IDT 134 ;; ######################################################################## 135 136 SECTION IDTR ABSOLUTE=0x00000000 FLAT USE16 137 138 ;; FORMAT IP:CS 139 dw isrR, 0 ; 0x00, 0 #DE, Divide Error 140 dw isrR, 0 ; 0x01, 1 #DB, Debug Fault 141 dw isrR, 0 ; 0x02, 2, ---, NMI 142 dw isrR, 0 ; 0x03, 3, #BP, Breakpoint 143 dw isrR, 0 ; 0x04, 4, #OF, INTO detected Overflow 144 dw isrR, 0 ; 0x05, 5, #BR, Bound Range Exceeded 145 dw isrR, 0 ; 0x06, 6, #UD, Invalid Opcode 146 dw isrR, 0 ; 0x07, 7, #NM, Device Not Available 147 dw isrR, 0 ; 0x08, 8, #DF, Double Fault 148 dw isrR, 0 ; 0x09 9, ---, Coprocessor Segment Overrun 149 dw isrR, 0 ; 0x0A, 10, #TS, Invalid TSS 150 dw isrR, 0 ; 0x0B, 11, #NP, Segment Not Present 151 dw isrR, 0 ; 0x0C, 12, #SS, Stack Fault 152 dw isrR, 0 ; 0x0D, 13, #GP, General Protection Fault 153 dw isrR, 0 ; 0x0E, 14, #PF, Page Fault 154 dw isrR, 0 ; 0x0F, 15, ---, Reserved 155 dw isrR, 0 ; 0x10, 16, #MF, Floating Point Fault 156 dw isrR, 0 ; 0x11, 17, #AC, Alignment Check 157 dw isrR, 0 ; 0x12 18, #MC, Machine Check 158 dw isrR, 0 ; 0x13, 19, #XF, SSE Fault 159 160 isrR: mov eax, 0xDEADBEEF ; Default Real Mode Interrupt Handler 161 out 0x80, eax 162 hlt 163 164 ;; ######################################################################## 165 ;; SMM Handler 166 ;; ######################################################################## 167 168 SECTION SMM ABSOLUTE=0x00038000 USE16 169 170 rsm 171 172 ;; ######################################################################## 173 ;; Reset Vector 174 ;; ######################################################################## 175 176 SECTION RESET ABSOLUTE=0xFFFFFFF0 USE16 177 178 jmp far setup 179