Home | History | Annotate | Download | only in tests
      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