• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1;; ########################################################################
2;; Macros
3;; ########################################################################
4
5; descriptor type, base, limit, p_dpl_s, g_db_a
6%macro descriptor 5
7	dw %3		       			; Limit 15-0
8	dw %2            			; Base  15-0
9	db %2 >> 16				; Base  23-16
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 >> 24				; Base  31-24
13%endmacro
14
15; cdesc64 base, limit, dpl
16%macro cdesc64 3
17       descriptor 0xB, %1, %2, 0x9 | (%3 & 0x3) << 1, 0xD
18%endmacro
19
20; gates type, offset, selector, p_dpl_s
21%macro gates 4
22	dw %2 		      			; Offset 15-00
23	dw %3					; Selector
24	db 0					; Ist
25	db ((%4 & 0xF) << 4) | (%1 & 0xF) 	; p_dpl_s_type
26	dw %2 >> 16				; Offset 31-16
27	dd %2 >> 32				; Offset 63-32
28%endmacro
29
30; idesc64 offset, selector, ring
31%macro idesc64 3
32       gates 0xE, %1, %2, 0x8 | ((%3 & 0x3) << 1)
33%endmacro
34
35
36; pageDirectory2M addr, nx, a, pcd, pwt, u, w, p
37%macro pageDirectory2M 8
38	db %2 << 7
39	dw %1 >> 40
40	dd %1 >> 8
41	db (%3 << 5) | (%4 << 4) | (%5 << 3) | (%6 << 2) | (%7 << 1) | %8
42%endmacro
43
44; pageEntry2M addr, nx, pat, g, d, a, pcd, pwt, u, w, p
45%macro pageEntry2M 11
46	db %2 << 7
47	db %1 >> 48
48	dd %1 >> 16
49	dw (%3 << 12) | (%4 << 8) | (%5 << 6) | (%6 << 5) | (%7 << 4) | (%8 << 3) | (%9 << 2) | (%10 << 1) | %11 | 0x80
50%endmacro
51
52
53;; ########################################################################
54;; Code Section
55;; ########################################################################
56
57SECTION CODE ABSOLUTE=0xFFFFFFFF00000000 FLAT USE64
58
59test_code:
60
61	;; Your Code Goes Here
62	add r8, r15
63
64	hlt
65
66;; ########################################################################
67;; Setup Section
68;; ########################################################################
69
70SECTION SETUP ALIGN=16 FLAT USE16
71
72setup:
73
74	xor edx, edx		; Enable Var MTRRs
75	mov eax, 0x0806		; WriteBack
76	mov ecx, 0x2FF
77	wrmsr
78
79	mov ebx, cr0
80        or  ebx, 0x00000021	; Protect Mode On, Int 16 for FPU
81	and ebx, 0x9FFFFFFF     ; Turn Caches on
82	mov cr0, ebx
83
84	mov edx, cr4
85	or  edx, 0x00000620     ; Enable PAE, SSE OSFXSR, SEE OSXMMEXCPT
86	mov cr4, edx
87
88	mov edx, pageMapL4	; load pagetables
89	mov cr3, edx
90
91	mov ecx, 0x80000080
92	rdmsr			; Read EFER
93	bts eax, 8		; Enable Long Mode (LME=1)
94	wrmsr			; Write EFER
95
96	bts ebx, 31		; Enable Paging (PG=1)
97	mov cr0, ebx
98
99	;; At this point LME=1, PAE=1, PG=1, CS.L=0, CS.D=0
100
101	lgdt [pgdt]		; Set GDT
102	lidt [pidt]		; Set IDT
103
104	jmp 0x8 : long_mode
105
106long_mode:
107
108        BITS 64
109
110	mov rax, qword test_code	; jmp to testcode
111	jmp [rax]
112
113
114
115;; ########################################################################
116;; Long Mode IDT
117;; ########################################################################
118
119SECTION IDTP ALIGN=16 FLAT USE64
120
121	;; cdesc32 base, limit, dpl
122gdt0:	dq 0				; 0x0000 - Null descriptor
123     	cdesc64 zero, 0xFFFFF, 0	; 0x0008 - Code Selector
124gdt_:
125
126	;; idesc64 offset, selector, dpl
127idt0:	idesc64 isrL, 0x0008, 0		; 0x00,  0   #DE, Divide Error
128     	idesc64 isrL, 0x0008, 0		; 0x01,  1   #DB, Debug Fault
129     	idesc64 isrL, 0x0008, 0		; 0x02,  2,  ---, NMI
130     	idesc64 isrL, 0x0008, 0		; 0x03,  3,  #BP, Breakpoint
131     	idesc64 isrL, 0x0008, 0		; 0x04,  4,  #OF, INTO detected Overflow
132     	idesc64 isrL, 0x0008, 0	        ; 0x05,  5,  #BR, Bound Range Exceeded
133     	idesc64 isrL, 0x0008, 0		; 0x06,  6,  #UD, Invalid Opcode
134     	idesc64 isrL, 0x0008, 0		; 0x07,  7,  #NM, Device Not Available
135     	idesc64 isrL, 0x0008, 0		; 0x08,  8,  #DF, Double Fault
136     	idesc64 isrL, 0x0008, 0		; 0x09   9,  ---, Coprocessor Segment Overrun
137      	idesc64 isrL, 0x0008, 0		; 0x0A,  10, #TS, Invalid TSS
138      	idesc64 isrL, 0x0008, 0		; 0x0B,  11, #NP, Segment Not Present
139      	idesc64 isrL, 0x0008, 0		; 0x0C,  12, #SS, Stack Fault
140      	idesc64 isrL, 0x0008, 0	        ; 0x0D,  13, #GP, General Protection Fault
141      	idesc64 isrL, 0x0008, 0		; 0x0E,  14, #PF, Page Fault
142      	idesc64 isrL, 0x0008, 0		; 0x0F,  15, ---, Reserved
143      	idesc64 isrL, 0x0008, 0		; 0x10,  16, #MF, Floating Point Fault
144      	idesc64 isrL, 0x0008, 0		; 0x11,  17, #AC, Alignment Check
145      	idesc64 isrL, 0x0008, 0		; 0x12   18, #MC, Machine Check
146      	idesc64 isrL, 0x0008, 0		; 0x13,  19, #XF, SSE Fault
147idt_:
148
149pgdt:   dw (gdt_ - gdt0)		; Limit
150	dd gdt0			        ; base
151
152pidt:   dw (idt_ - idt0)		; Limit
153	dd idt0			        ; base
154
155isrL:	mov eax, 0xDEADBEEF             ; Default Interrupt Handler
156	out 0x80, eax
157	hlt
158
159;; ########################################################################
160;; Real Mode IDT
161;; ########################################################################
162
163SECTION IDTR ABSOLUTE=0x00000000 FLAT USE16
164
165	;; FORMAT IP:CS
166zero:	dw isrR, 0			; 0x00,  0   #DE, Divide Error
167	dw isrR, 0			; 0x01,  1   #DB, Debug Fault
168	dw isrR, 0			; 0x02,  2,  ---, NMI
169	dw isrR, 0			; 0x03,  3,  #BP, Breakpoint
170	dw isrR, 0			; 0x04,  4,  #OF, INTO detected Overflow
171	dw isrR, 0			; 0x05,  5,  #BR, Bound Range Exceeded
172	dw isrR, 0			; 0x06,  6,  #UD, Invalid Opcode
173	dw isrR, 0			; 0x07,  7,  #NM, Device Not Available
174	dw isrR, 0			; 0x08,  8,  #DF, Double Fault
175	dw isrR, 0			; 0x09   9,  ---, Coprocessor Segment Overrun
176	dw isrR, 0			; 0x0A,  10, #TS, Invalid TSS
177	dw isrR, 0			; 0x0B,  11, #NP, Segment Not Present
178	dw isrR, 0			; 0x0C,  12, #SS, Stack Fault
179	dw isrR, 0			; 0x0D,  13, #GP, General Protection Fault
180	dw isrR, 0			; 0x0E,  14, #PF, Page Fault
181	dw isrR, 0			; 0x0F,  15, ---, Reserved
182	dw isrR, 0			; 0x10,  16, #MF, Floating Point Fault
183	dw isrR, 0			; 0x11,  17, #AC, Alignment Check
184	dw isrR, 0			; 0x12   18, #MC, Machine Check
185	dw isrR, 0			; 0x13,  19, #XF, SSE Fault
186
187isrR:	mov eax, 0xDEADBEEF             ; Default Real Interrupt Handler
188	out 0x80, eax
189	hlt
190
191;; ########################################################################
192;; 2 Meg Page Tables
193;; ########################################################################
194
195SECTION PAGE ALIGN=4096 FLAT
196
197pageDirE:
198%assign addr 0
199%rep 512
200	; pageEntry addr, nx, pat, g, d, a, pcd, pwt, u, w, p
201	pageEntry2M addr,  0,   0, 0, 1, 1,   0,   0, 1, 1, 1  ; Accessed, WB, User, Writable, Present
202%assign addr addr + 0x200000
203%endrep
204
205pageDirP:
206%rep 512
207	; pageDirPointer     addr, nx, a, pcd, pwt, u, w, p
208	pageDirectory2M  pageDirE,  0, 1,   0,   0, 1, 1, 1    ; Accessed, WB, User, Writable, Present
209%endrep
210
211pageMapL4:
212%rep 512
213	; pageDirectory      addr, nx, a, pcd, pwt, u, w, p
214	pageDirectory2M  pageDirP,  0, 1,   0,   0, 1, 1, 1    ; Accessed, WB, User, Writable, Present
215%endrep
216
217;; ########################################################################
218;; SMM Handler
219;; ########################################################################
220
221SECTION SMM ABSOLUTE=0x00038000 USE16
222
223	rsm
224
225;; ########################################################################
226;; Reset Vector
227;; ########################################################################
228
229SECTION RESET ABSOLUTE=0xFFFFFFF0 USE16
230
231	jmp far setup
232