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 43SECTION CODE ABSOLUTE=0x00400000 FLAT USE32 44 45test_code: 46 47 ;; Your Code Goes Here 48 hlt 49 50;; ######################################################################## 51;; Setup Section 52;; ######################################################################## 53 54SECTION SETUP ALIGN=16 FLAT USE16 55 56setup: 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 73protect_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 91SECTION IDTP ALIGN=16 FLAT USE32 92 93 ;; cdesc32 base, limit, dpl 94gdt0: 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 101idt0: 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 122pgdt: dw 6 * 8 ; Limit 123 dd gdt0 ; base 124 125pidt: dw 20 * 8 ; Limit 126 dd idt0 ; base 127 128isrP: mov eax, 0xDEADBEEF ; Default Real Mode Interrupt Handler 129 out 0x80, eax 130 hlt 131 132;; ######################################################################## 133;; Real Mode IDT 134;; ######################################################################## 135 136SECTION 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 160isrR: mov eax, 0xDEADBEEF ; Default Real Mode Interrupt Handler 161 out 0x80, eax 162 hlt 163 164;; ######################################################################## 165;; SMM Handler 166;; ######################################################################## 167 168SECTION SMM ABSOLUTE=0x00038000 USE16 169 170 rsm 171 172;; ######################################################################## 173;; Reset Vector 174;; ######################################################################## 175 176SECTION RESET ABSOLUTE=0xFFFFFFF0 USE16 177 178 jmp far setup 179