blob: 34bd7521b95a6794502bf2b3bc4de2eb94eab320 [file] [log] [blame]
Vishal Bhoj82c80712015-12-15 21:13:33 +05301#------------------------------------------------------------------------------
2#*
3#* Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
4#* This program and the accompanying materials
5#* are licensed and made available under the terms and conditions of the BSD License
6#* which accompanies this distribution. The full text of the license may be found at
7#* http://opensource.org/licenses/bsd-license.php
8#*
9#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11#*
12#* efi64.asm
13#*
14#* Abstract:
15#*
16#------------------------------------------------------------------------------
17
18##############################################################################
19# Now in 64-bit long mode.
20##############################################################################
21
22 .486:
23 .stack:
24 .code:
25 .org 0x21000
26
27.global _start
28_start:
29
30.equ DEFAULT_HANDLER_SIZE, INT1 - INT0
31
32.macro jmpCommonIdtEntry
33 # jmp commonIdtEntry - this must be hand coded to keep the assembler from
34 # using a 8 bit reletive jump when the entries are
35 # within 255 bytes of the common entry. This must
36 # be done to maintain the consistency of the size
37 # of entry points...
38 .byte 0xe9 # jmp 16 bit relative
39 .long commonIdtEntry - . - 4 # offset to jump to
40.endm
41
42
43Start:
44
45 movl $0x001fffe8,%esp # make final stack aligned
46
47 # set OSFXSR and OSXMMEXCPT because some code will use XMM register
48 .byte 0xf
49 .byte 0x20
50 .byte 0xe0
51# mov rax, cr4
52 btsl $9,%eax
53 btsl $0xa,%eax
54 .byte 0xf
55 .byte 0x22
56 .byte 0xe0
57# mov cr4, rax
58
59 call ClearScreen
60
61 # Populate IDT with meaningful offsets for exception handlers...
62 movl $Idtr, %eax
63 sidt (%eax) # get fword address of IDT
64
65
66 movl $Halt, %eax
67 movl %eax,%ebx # use bx to copy 15..0 to descriptors
68 shrl $16,%eax # use ax to copy 31..16 to descriptors
69 # 63..32 of descriptors is 0
70 movl $0x78,%ecx # 78h IDT entries to initialize with unique entry points (exceptions)
71 movl $(Idtr + 2), %esi
72 movl (%esi),%edi
73
74LOOP_1: # loop through all IDT entries exception handlers and initialize to default handler
75 movw %bx, (%edi) # write bits 15..0 of offset
76 movw $0x38, 2(%edi) # SYS_CODE_SEL64 from GDT
77 movw $(0x0e00 | 0x8000), 4(%edi) # type = 386 interrupt gate, present
78 movw %ax, 6(%edi) # write bits 31..16 of offset
79 movl $0, 8(%edi) # write bits 31..16 of offset
80 addl $16, %edi # move up to next descriptor
81 addw $DEFAULT_HANDLER_SIZE, %bx # move to next entry point
82 loopl LOOP_1 # loop back through again until all descriptors are initialized
83
84 ## at this point edi contains the offset of the descriptor for INT 20
85 ## and bx contains the low 16 bits of the offset of the default handler
86 ## so initialize all the rest of the descriptors with these two values...
87# mov ecx, 101 ; there are 100 descriptors left (INT 20 (14h) - INT 119 (77h)
88#@@: ; loop through all IDT entries exception handlers and initialize to default handler
89# mov word ptr [edi], bx ; write bits 15..0 of offset
90# mov word ptr [edi+2], 38h ; SYS_CODE64_SEL from GDT
91# mov word ptr [edi+4], 0e00h OR 8000h ; type = 386 interrupt gate, present
92# mov word ptr [edi+6], ax ; write bits 31..16 of offset
93# mov dword ptr [edi+8], 0 ; write bits 63..32 of offset
94# add edi, 16 ; move up to next descriptor
95# loop @b ; loop back through again until all descriptors are initialized
96
97
98## DUMP location of IDT and several of the descriptors
99# mov ecx, 8
100# mov eax, [offset Idtr + 2]
101# mov eax, [eax]
102# mov edi, 0b8000h
103# call PrintQword
104# mov esi, eax
105# mov edi, 0b80a0h
106# jmp OuterLoop
107
108##
109## just for fun, let's do a software interrupt to see if we correctly land in the exception handler...
110# mov eax, 011111111h
111# mov ebx, 022222222h
112# mov ecx, 033333333h
113# mov edx, 044444444h
114# mov ebp, 055555555h
115# mov esi, 066666666h
116# mov edi, 077777777h
117# push 011111111h
118# push 022222222h
119# push 033333333h
120# int 119
121
122 movl $0x22000,%esi # esi = 22000
123 movl 0x14(%esi),%eax # eax = [22014]
124 addl %eax,%esi # esi = 22000 + [22014] = Base of EFILDR.C
125 movl 0x3c(%esi),%ebp # ebp = [22000 + [22014] + 3c] = NT Image Header for EFILDR.C
126 addl %esi,%ebp
127 movl 0x30(%ebp),%edi # edi = [[22000 + [22014] + 3c] + 2c] = ImageBase (63..32 is zero, ignore)
128 movl 0x28(%ebp),%eax # eax = [[22000 + [22014] + 3c] + 24] = EntryPoint
129 addl %edi,%eax # eax = ImageBase + EntryPoint
130 movl $EfiLdrOffset, %ebx
131 movl %eax, (%ebx) # Modify far jump instruction for correct entry point
132
133 movw 6(%ebp), %bx # bx = Number of sections
134 xorl %eax,%eax
135 movw 0x14(%ebp), %ax # ax = Optional Header Size
136 addl %eax,%ebp
137 addl $0x18,%ebp # ebp = Start of 1st Section
138
139SectionLoop:
140 pushl %esi # Save Base of EFILDR.C
141 pushl %edi # Save ImageBase
142 addl 0x14(%ebp),%esi # esi = Base of EFILDR.C + PointerToRawData
143 addl 0x0c(%ebp),%edi # edi = ImageBase + VirtualAddress
144 movl 0x10(%ebp),%ecx # ecs = SizeOfRawData
145
146 cld
147 shrl $2,%ecx
148 rep
149 movsl
150
151 popl %edi # Restore ImageBase
152 popl %esi # Restore Base of EFILDR.C
153
154 addw $0x28,%bp # ebp = ebp + 028h = Pointer to next section record
155 .byte 0x66
156 .byte 0xff
157 .byte 0xcb
158# dec bx
159 cmpw $0,%bx
160 jne SectionLoop
161
162 movl $Idtr, %edx # get size of IDT
163 movzxw (%edx), %eax
164 .byte 0xff
165 .byte 0xc0
166# inc eax
167 addl 2(%edx), %eax # add to base of IDT to get location of memory map...
168 xorl %ecx,%ecx
169 movl %eax,%ecx # put argument to RCX
170
171 .byte 0x48
172 .byte 0xc7
173 .byte 0xc0
174EfiLdrOffset:
175 .long 0x00401000 # Offset of EFILDR
176# mov rax, 401000h
177 .byte 0x50
178# push rax
179
180# ret
181 .byte 0xc3
182
183# db "**** DEFAULT IDT ENTRY ***",0
184 .p2align 1
185Halt:
186INT0:
187 pushl $0x0 # push error code place holder on the stack
188 pushl $0x0
189 jmpCommonIdtEntry
190# db 0e9h ; jmp 16 bit reletive
191# dd commonIdtEntry - $ - 4 ; offset to jump to
192
193INT1:
194 pushl $0x0 # push error code place holder on the stack
195 pushl $0x1
196 jmpCommonIdtEntry
197
198INT2:
199 pushl $0x0 # push error code place holder on the stack
200 pushl $0x2
201 jmpCommonIdtEntry
202
203INT3:
204 pushl $0x0 # push error code place holder on the stack
205 pushl $0x3
206 jmpCommonIdtEntry
207
208INT4:
209 pushl $0x0 # push error code place holder on the stack
210 pushl $0x4
211 jmpCommonIdtEntry
212
213INT5:
214 pushl $0x0 # push error code place holder on the stack
215 pushl $0x5
216 jmpCommonIdtEntry
217
218INT6:
219 pushl $0x0 # push error code place holder on the stack
220 pushl $0x6
221 jmpCommonIdtEntry
222
223INT7:
224 pushl $0x0 # push error code place holder on the stack
225 pushl $0x7
226 jmpCommonIdtEntry
227
228INT8:
229# Double fault causes an error code to be pushed so no phony push necessary
230 nop
231 nop
232 pushl $0x8
233 jmpCommonIdtEntry
234
235INT9:
236 pushl $0x0 # push error code place holder on the stack
237 pushl $0x9
238 jmpCommonIdtEntry
239
240INT10:
241# Invalid TSS causes an error code to be pushed so no phony push necessary
242 nop
243 nop
244 pushl $10
245 jmpCommonIdtEntry
246
247INT11:
248# Segment Not Present causes an error code to be pushed so no phony push necessary
249 nop
250 nop
251 pushl $11
252 jmpCommonIdtEntry
253
254INT12:
255# Stack fault causes an error code to be pushed so no phony push necessary
256 nop
257 nop
258 pushl $12
259 jmpCommonIdtEntry
260
261INT13:
262# GP fault causes an error code to be pushed so no phony push necessary
263 nop
264 nop
265 pushl $13
266 jmpCommonIdtEntry
267
268INT14:
269# Page fault causes an error code to be pushed so no phony push necessary
270 nop
271 nop
272 pushl $14
273 jmpCommonIdtEntry
274
275INT15:
276 pushl $0x0 # push error code place holder on the stack
277 pushl $15
278 jmpCommonIdtEntry
279
280INT16:
281 pushl $0x0 # push error code place holder on the stack
282 pushl $16
283 jmpCommonIdtEntry
284
285INT17:
286# Alignment check causes an error code to be pushed so no phony push necessary
287 nop
288 nop
289 pushl $17
290 jmpCommonIdtEntry
291
292INT18:
293 pushl $0x0 # push error code place holder on the stack
294 pushl $18
295 jmpCommonIdtEntry
296
297INT19:
298 pushl $0x0 # push error code place holder on the stack
299 pushl $19
300 jmpCommonIdtEntry
301
302INTUnknown:
303# The following segment repeats (0x78 - 20) times:
304# No. 1
305 pushl $0x0 # push error code place holder on the stack
306# push xxh ; push vector number
307 .byte 0x6a
308 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
309 jmpCommonIdtEntry
310# No. 2
311 pushl $0x0 # push error code place holder on the stack
312# push xxh ; push vector number
313 .byte 0x6a
314 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
315 jmpCommonIdtEntry
316# No. 3
317 pushl $0x0 # push error code place holder on the stack
318# push xxh ; push vector number
319 .byte 0x6a
320 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
321 jmpCommonIdtEntry
322# No. 4
323 pushl $0x0 # push error code place holder on the stack
324# push xxh ; push vector number
325 .byte 0x6a
326 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
327 jmpCommonIdtEntry
328# No. 5
329 pushl $0x0 # push error code place holder on the stack
330# push xxh ; push vector number
331 .byte 0x6a
332 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
333 jmpCommonIdtEntry
334# No. 6
335 pushl $0x0 # push error code place holder on the stack
336# push xxh ; push vector number
337 .byte 0x6a
338 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
339 jmpCommonIdtEntry
340# No. 7
341 pushl $0x0 # push error code place holder on the stack
342# push xxh ; push vector number
343 .byte 0x6a
344 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
345 jmpCommonIdtEntry
346# No. 8
347 pushl $0x0 # push error code place holder on the stack
348# push xxh ; push vector number
349 .byte 0x6a
350 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
351 jmpCommonIdtEntry
352# No. 9
353 pushl $0x0 # push error code place holder on the stack
354# push xxh ; push vector number
355 .byte 0x6a
356 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
357 jmpCommonIdtEntry
358# No. 10
359 pushl $0x0 # push error code place holder on the stack
360# push xxh ; push vector number
361 .byte 0x6a
362 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
363 jmpCommonIdtEntry
364# No. 11
365 pushl $0x0 # push error code place holder on the stack
366# push xxh ; push vector number
367 .byte 0x6a
368 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
369 jmpCommonIdtEntry
370# No. 12
371 pushl $0x0 # push error code place holder on the stack
372# push xxh ; push vector number
373 .byte 0x6a
374 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
375 jmpCommonIdtEntry
376# No. 13
377 pushl $0x0 # push error code place holder on the stack
378# push xxh ; push vector number
379 .byte 0x6a
380 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
381 jmpCommonIdtEntry
382# No. 14
383 pushl $0x0 # push error code place holder on the stack
384# push xxh ; push vector number
385 .byte 0x6a
386 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
387 jmpCommonIdtEntry
388# No. 15
389 pushl $0x0 # push error code place holder on the stack
390# push xxh ; push vector number
391 .byte 0x6a
392 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
393 jmpCommonIdtEntry
394# No. 16
395 pushl $0x0 # push error code place holder on the stack
396# push xxh ; push vector number
397 .byte 0x6a
398 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
399 jmpCommonIdtEntry
400# No. 17
401 pushl $0x0 # push error code place holder on the stack
402# push xxh ; push vector number
403 .byte 0x6a
404 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
405 jmpCommonIdtEntry
406# No. 18
407 pushl $0x0 # push error code place holder on the stack
408# push xxh ; push vector number
409 .byte 0x6a
410 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
411 jmpCommonIdtEntry
412# No. 19
413 pushl $0x0 # push error code place holder on the stack
414# push xxh ; push vector number
415 .byte 0x6a
416 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
417 jmpCommonIdtEntry
418# No. 20
419 pushl $0x0 # push error code place holder on the stack
420# push xxh ; push vector number
421 .byte 0x6a
422 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
423 jmpCommonIdtEntry
424# No. 21
425 pushl $0x0 # push error code place holder on the stack
426# push xxh ; push vector number
427 .byte 0x6a
428 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
429 jmpCommonIdtEntry
430# No. 22
431 pushl $0x0 # push error code place holder on the stack
432# push xxh ; push vector number
433 .byte 0x6a
434 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
435 jmpCommonIdtEntry
436# No. 23
437 pushl $0x0 # push error code place holder on the stack
438# push xxh ; push vector number
439 .byte 0x6a
440 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
441 jmpCommonIdtEntry
442# No. 24
443 pushl $0x0 # push error code place holder on the stack
444# push xxh ; push vector number
445 .byte 0x6a
446 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
447 jmpCommonIdtEntry
448# No. 25
449 pushl $0x0 # push error code place holder on the stack
450# push xxh ; push vector number
451 .byte 0x6a
452 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
453 jmpCommonIdtEntry
454# No. 26
455 pushl $0x0 # push error code place holder on the stack
456# push xxh ; push vector number
457 .byte 0x6a
458 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
459 jmpCommonIdtEntry
460# No. 27
461 pushl $0x0 # push error code place holder on the stack
462# push xxh ; push vector number
463 .byte 0x6a
464 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
465 jmpCommonIdtEntry
466# No. 28
467 pushl $0x0 # push error code place holder on the stack
468# push xxh ; push vector number
469 .byte 0x6a
470 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
471 jmpCommonIdtEntry
472# No. 29
473 pushl $0x0 # push error code place holder on the stack
474# push xxh ; push vector number
475 .byte 0x6a
476 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
477 jmpCommonIdtEntry
478# No. 30
479 pushl $0x0 # push error code place holder on the stack
480# push xxh ; push vector number
481 .byte 0x6a
482 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
483 jmpCommonIdtEntry
484# No. 31
485 pushl $0x0 # push error code place holder on the stack
486# push xxh ; push vector number
487 .byte 0x6a
488 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
489 jmpCommonIdtEntry
490# No. 32
491 pushl $0x0 # push error code place holder on the stack
492# push xxh ; push vector number
493 .byte 0x6a
494 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
495 jmpCommonIdtEntry
496# No. 33
497 pushl $0x0 # push error code place holder on the stack
498# push xxh ; push vector number
499 .byte 0x6a
500 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
501 jmpCommonIdtEntry
502# No. 34
503 pushl $0x0 # push error code place holder on the stack
504# push xxh ; push vector number
505 .byte 0x6a
506 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
507 jmpCommonIdtEntry
508# No. 35
509 pushl $0x0 # push error code place holder on the stack
510# push xxh ; push vector number
511 .byte 0x6a
512 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
513 jmpCommonIdtEntry
514# No. 36
515 pushl $0x0 # push error code place holder on the stack
516# push xxh ; push vector number
517 .byte 0x6a
518 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
519 jmpCommonIdtEntry
520# No. 37
521 pushl $0x0 # push error code place holder on the stack
522# push xxh ; push vector number
523 .byte 0x6a
524 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
525 jmpCommonIdtEntry
526# No. 38
527 pushl $0x0 # push error code place holder on the stack
528# push xxh ; push vector number
529 .byte 0x6a
530 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
531 jmpCommonIdtEntry
532# No. 39
533 pushl $0x0 # push error code place holder on the stack
534# push xxh ; push vector number
535 .byte 0x6a
536 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
537 jmpCommonIdtEntry
538# No. 40
539 pushl $0x0 # push error code place holder on the stack
540# push xxh ; push vector number
541 .byte 0x6a
542 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
543 jmpCommonIdtEntry
544# No. 41
545 pushl $0x0 # push error code place holder on the stack
546# push xxh ; push vector number
547 .byte 0x6a
548 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
549 jmpCommonIdtEntry
550# No. 42
551 pushl $0x0 # push error code place holder on the stack
552# push xxh ; push vector number
553 .byte 0x6a
554 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
555 jmpCommonIdtEntry
556# No. 43
557 pushl $0x0 # push error code place holder on the stack
558# push xxh ; push vector number
559 .byte 0x6a
560 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
561 jmpCommonIdtEntry
562# No. 44
563 pushl $0x0 # push error code place holder on the stack
564# push xxh ; push vector number
565 .byte 0x6a
566 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
567 jmpCommonIdtEntry
568# No. 45
569 pushl $0x0 # push error code place holder on the stack
570# push xxh ; push vector number
571 .byte 0x6a
572 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
573 jmpCommonIdtEntry
574# No. 46
575 pushl $0x0 # push error code place holder on the stack
576# push xxh ; push vector number
577 .byte 0x6a
578 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
579 jmpCommonIdtEntry
580# No. 47
581 pushl $0x0 # push error code place holder on the stack
582# push xxh ; push vector number
583 .byte 0x6a
584 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
585 jmpCommonIdtEntry
586# No. 48
587 pushl $0x0 # push error code place holder on the stack
588# push xxh ; push vector number
589 .byte 0x6a
590 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
591 jmpCommonIdtEntry
592# No. 49
593 pushl $0x0 # push error code place holder on the stack
594# push xxh ; push vector number
595 .byte 0x6a
596 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
597 jmpCommonIdtEntry
598# No. 50
599 pushl $0x0 # push error code place holder on the stack
600# push xxh ; push vector number
601 .byte 0x6a
602 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
603 jmpCommonIdtEntry
604# No. 51
605 pushl $0x0 # push error code place holder on the stack
606# push xxh ; push vector number
607 .byte 0x6a
608 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
609 jmpCommonIdtEntry
610# No. 52
611 pushl $0x0 # push error code place holder on the stack
612# push xxh ; push vector number
613 .byte 0x6a
614 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
615 jmpCommonIdtEntry
616# No. 53
617 pushl $0x0 # push error code place holder on the stack
618# push xxh ; push vector number
619 .byte 0x6a
620 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
621 jmpCommonIdtEntry
622# No. 54
623 pushl $0x0 # push error code place holder on the stack
624# push xxh ; push vector number
625 .byte 0x6a
626 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
627 jmpCommonIdtEntry
628# No. 55
629 pushl $0x0 # push error code place holder on the stack
630# push xxh ; push vector number
631 .byte 0x6a
632 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
633 jmpCommonIdtEntry
634# No. 56
635 pushl $0x0 # push error code place holder on the stack
636# push xxh ; push vector number
637 .byte 0x6a
638 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
639 jmpCommonIdtEntry
640# No. 57
641 pushl $0x0 # push error code place holder on the stack
642# push xxh ; push vector number
643 .byte 0x6a
644 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
645 jmpCommonIdtEntry
646# No. 58
647 pushl $0x0 # push error code place holder on the stack
648# push xxh ; push vector number
649 .byte 0x6a
650 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
651 jmpCommonIdtEntry
652# No. 59
653 pushl $0x0 # push error code place holder on the stack
654# push xxh ; push vector number
655 .byte 0x6a
656 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
657 jmpCommonIdtEntry
658# No. 60
659 pushl $0x0 # push error code place holder on the stack
660# push xxh ; push vector number
661 .byte 0x6a
662 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
663 jmpCommonIdtEntry
664# No. 61
665 pushl $0x0 # push error code place holder on the stack
666# push xxh ; push vector number
667 .byte 0x6a
668 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
669 jmpCommonIdtEntry
670# No. 62
671 pushl $0x0 # push error code place holder on the stack
672# push xxh ; push vector number
673 .byte 0x6a
674 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
675 jmpCommonIdtEntry
676# No. 63
677 pushl $0x0 # push error code place holder on the stack
678# push xxh ; push vector number
679 .byte 0x6a
680 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
681 jmpCommonIdtEntry
682# No. 64
683 pushl $0x0 # push error code place holder on the stack
684# push xxh ; push vector number
685 .byte 0x6a
686 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
687 jmpCommonIdtEntry
688# No. 65
689 pushl $0x0 # push error code place holder on the stack
690# push xxh ; push vector number
691 .byte 0x6a
692 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
693 jmpCommonIdtEntry
694# No. 66
695 pushl $0x0 # push error code place holder on the stack
696# push xxh ; push vector number
697 .byte 0x6a
698 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
699 jmpCommonIdtEntry
700# No. 67
701 pushl $0x0 # push error code place holder on the stack
702# push xxh ; push vector number
703 .byte 0x6a
704 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
705 jmpCommonIdtEntry
706# No. 68
707 pushl $0x0 # push error code place holder on the stack
708# push xxh ; push vector number
709 .byte 0x6a
710 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
711 jmpCommonIdtEntry
712# No. 69
713 pushl $0x0 # push error code place holder on the stack
714# push xxh ; push vector number
715 .byte 0x6a
716 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
717 jmpCommonIdtEntry
718# No. 70
719 pushl $0x0 # push error code place holder on the stack
720# push xxh ; push vector number
721 .byte 0x6a
722 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
723 jmpCommonIdtEntry
724# No. 71
725 pushl $0x0 # push error code place holder on the stack
726# push xxh ; push vector number
727 .byte 0x6a
728 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
729 jmpCommonIdtEntry
730# No. 72
731 pushl $0x0 # push error code place holder on the stack
732# push xxh ; push vector number
733 .byte 0x6a
734 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
735 jmpCommonIdtEntry
736# No. 73
737 pushl $0x0 # push error code place holder on the stack
738# push xxh ; push vector number
739 .byte 0x6a
740 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
741 jmpCommonIdtEntry
742# No. 74
743 pushl $0x0 # push error code place holder on the stack
744# push xxh ; push vector number
745 .byte 0x6a
746 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
747 jmpCommonIdtEntry
748# No. 75
749 pushl $0x0 # push error code place holder on the stack
750# push xxh ; push vector number
751 .byte 0x6a
752 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
753 jmpCommonIdtEntry
754# No. 76
755 pushl $0x0 # push error code place holder on the stack
756# push xxh ; push vector number
757 .byte 0x6a
758 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
759 jmpCommonIdtEntry
760# No. 77
761 pushl $0x0 # push error code place holder on the stack
762# push xxh ; push vector number
763 .byte 0x6a
764 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
765 jmpCommonIdtEntry
766# No. 78
767 pushl $0x0 # push error code place holder on the stack
768# push xxh ; push vector number
769 .byte 0x6a
770 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
771 jmpCommonIdtEntry
772# No. 79
773 pushl $0x0 # push error code place holder on the stack
774# push xxh ; push vector number
775 .byte 0x6a
776 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
777 jmpCommonIdtEntry
778# No. 80
779 pushl $0x0 # push error code place holder on the stack
780# push xxh ; push vector number
781 .byte 0x6a
782 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
783 jmpCommonIdtEntry
784# No. 81
785 pushl $0x0 # push error code place holder on the stack
786# push xxh ; push vector number
787 .byte 0x6a
788 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
789 jmpCommonIdtEntry
790# No. 82
791 pushl $0x0 # push error code place holder on the stack
792# push xxh ; push vector number
793 .byte 0x6a
794 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
795 jmpCommonIdtEntry
796# No. 83
797 pushl $0x0 # push error code place holder on the stack
798# push xxh ; push vector number
799 .byte 0x6a
800 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
801 jmpCommonIdtEntry
802# No. 84
803 pushl $0x0 # push error code place holder on the stack
804# push xxh ; push vector number
805 .byte 0x6a
806 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
807 jmpCommonIdtEntry
808# No. 85
809 pushl $0x0 # push error code place holder on the stack
810# push xxh ; push vector number
811 .byte 0x6a
812 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
813 jmpCommonIdtEntry
814# No. 86
815 pushl $0x0 # push error code place holder on the stack
816# push xxh ; push vector number
817 .byte 0x6a
818 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
819 jmpCommonIdtEntry
820# No. 87
821 pushl $0x0 # push error code place holder on the stack
822# push xxh ; push vector number
823 .byte 0x6a
824 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
825 jmpCommonIdtEntry
826# No. 88
827 pushl $0x0 # push error code place holder on the stack
828# push xxh ; push vector number
829 .byte 0x6a
830 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
831 jmpCommonIdtEntry
832# No. 89
833 pushl $0x0 # push error code place holder on the stack
834# push xxh ; push vector number
835 .byte 0x6a
836 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
837 jmpCommonIdtEntry
838# No. 90
839 pushl $0x0 # push error code place holder on the stack
840# push xxh ; push vector number
841 .byte 0x6a
842 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
843 jmpCommonIdtEntry
844# No. 91
845 pushl $0x0 # push error code place holder on the stack
846# push xxh ; push vector number
847 .byte 0x6a
848 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
849 jmpCommonIdtEntry
850# No. 92
851 pushl $0x0 # push error code place holder on the stack
852# push xxh ; push vector number
853 .byte 0x6a
854 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
855 jmpCommonIdtEntry
856# No. 93
857 pushl $0x0 # push error code place holder on the stack
858# push xxh ; push vector number
859 .byte 0x6a
860 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
861 jmpCommonIdtEntry
862# No. 94
863 pushl $0x0 # push error code place holder on the stack
864# push xxh ; push vector number
865 .byte 0x6a
866 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
867 jmpCommonIdtEntry
868# No. 95
869 pushl $0x0 # push error code place holder on the stack
870# push xxh ; push vector number
871 .byte 0x6a
872 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
873 jmpCommonIdtEntry
874# No. 96
875 pushl $0x0 # push error code place holder on the stack
876# push xxh ; push vector number
877 .byte 0x6a
878 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
879 jmpCommonIdtEntry
880# No. 97
881 pushl $0x0 # push error code place holder on the stack
882# push xxh ; push vector number
883 .byte 0x6a
884 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
885 jmpCommonIdtEntry
886# No. 98
887 pushl $0x0 # push error code place holder on the stack
888# push xxh ; push vector number
889 .byte 0x6a
890 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
891 jmpCommonIdtEntry
892# No. 99
893 pushl $0x0 # push error code place holder on the stack
894# push xxh ; push vector number
895 .byte 0x6a
896 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
897 jmpCommonIdtEntry
898# No. 100
899 pushl $0x0 # push error code place holder on the stack
900# push xxh ; push vector number
901 .byte 0x6a
902 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
903 jmpCommonIdtEntry
904
905
906commonIdtEntry:
907 pushl %eax
908 pushl %ecx
909 pushl %edx
910 pushl %ebx
911 pushl %esp
912 pushl %ebp
913 pushl %esi
914 pushl %edi
915 .byte 0x41
916 .byte 0x50
917# push r8
918 .byte 0x41
919 .byte 0x51
920# push r9
921 .byte 0x41
922 .byte 0x52
923# push r10
924 .byte 0x41
925 .byte 0x53
926# push r11
927 .byte 0x41
928 .byte 0x54
929# push r12
930 .byte 0x41
931 .byte 0x55
932# push r13
933 .byte 0x41
934 .byte 0x56
935# push r14
936 .byte 0x41
937 .byte 0x57
938# push r15
939 .byte 0x48
940 movl %esp,%ebp
941# mov rbp, rsp
942
943##
944## At this point the stack looks like this:
945##
946## Calling SS
947## Calling RSP
948## rflags
949## Calling CS
950## Calling RIP
951## Error code or 0
952## Int num or 0ffh for unknown int num
953## rax
954## rcx
955## rdx
956## rbx
957## rsp
958## rbp
959## rsi
960## rdi
961## r8
962## r9
963## r10
964## r11
965## r12
966## r13
967## r14
968## r15 <------- RSP, RBP
969##
970
971 call ClearScreen
972 movl $String1, %esi
973 call PrintString
974 .byte 0x48
975 movl 16*8(%ebp),%eax ## move Int number into RAX
976 .byte 0x48
977 cmpl $18,%eax
978 ja PrintDefaultString
979PrintExceptionString:
980 shll $3,%eax ## multiply by 8 to get offset from StringTable to actual string address
981 addl $StringTable, %eax
982 movl (%eax),%esi
983 jmp PrintTheString
984PrintDefaultString:
985 movl $IntUnknownString, %esi
986 # patch Int number
987 movl %eax,%edx
988 call A2C
989 movb %al,1(%esi)
990 movl %edx,%eax
991 shrl $4,%eax
992 call A2C
993 movb %al,(%esi)
994PrintTheString:
995 call PrintString
996 movl $String2, %esi
997 call PrintString
998 .byte 0x48
999 movl 19*8(%ebp),%eax # CS
1000 call PrintQword
1001 movb $':', %al
1002 movb %al, (%edi)
1003 addl $2,%edi
1004 .byte 0x48
1005 movl 18*8(%ebp),%eax # RIP
1006 call PrintQword
1007 movl $String3, %esi
1008 call PrintString
1009
1010 movl $0xb8140,%edi
1011
1012 movl $StringRax, %esi
1013 call PrintString
1014 .byte 0x48
1015 movl 15*8(%ebp),%eax
1016 call PrintQword
1017
1018 movl $StringRcx, %esi
1019 call PrintString
1020 .byte 0x48
1021 movl 14*8(%ebp),%eax
1022 call PrintQword
1023
1024 movl $StringRdx, %esi
1025 call PrintString
1026 .byte 0x48
1027 movl 13*8(%ebp),%eax
1028 call PrintQword
1029
1030 movl $0xb81e0,%edi
1031
1032 movl $StringRbx, %esi
1033 call PrintString
1034 .byte 0x48
1035 movl 12*8(%ebp),%eax
1036 call PrintQword
1037
1038 movl $StringRsp, %esi
1039 call PrintString
1040 .byte 0x48
1041 movl 21*8(%ebp),%eax
1042 call PrintQword
1043
1044 movl $StringRbp, %esi
1045 call PrintString
1046 .byte 0x48
1047 movl 10*8(%ebp),%eax
1048 call PrintQword
1049
1050 movl $0xb8280,%edi
1051
1052 movl $StringRsi, %esi
1053 call PrintString
1054 .byte 0x48
1055 movl 9*8(%ebp),%eax
1056 call PrintQword
1057
1058 movl $StringRdi, %esi
1059 call PrintString
1060 .byte 0x48
1061 movl 8*8(%ebp),%eax
1062 call PrintQword
1063
1064 movl $StringEcode, %esi
1065 call PrintString
1066 .byte 0x48
1067 movl 17*8(%ebp),%eax
1068 call PrintQword
1069
1070 movl $0xb8320,%edi
1071
1072 movl $StringR8, %esi
1073 call PrintString
1074 .byte 0x48
1075 movl 7*8(%ebp),%eax
1076 call PrintQword
1077
1078 movl $StringR9, %esi
1079 call PrintString
1080 .byte 0x48
1081 movl 6*8(%ebp),%eax
1082 call PrintQword
1083
1084 movl $StringR10, %esi
1085 call PrintString
1086 .byte 0x48
1087 movl 5*8(%ebp),%eax
1088 call PrintQword
1089
1090 movl $0xb83c0,%edi
1091
1092 movl $StringR11, %esi
1093 call PrintString
1094 .byte 0x48
1095 movl 4*8(%ebp),%eax
1096 call PrintQword
1097
1098 movl $StringR12, %esi
1099 call PrintString
1100 .byte 0x48
1101 movl 3*8(%ebp),%eax
1102 call PrintQword
1103
1104 movl $StringR13, %esi
1105 call PrintString
1106 .byte 0x48
1107 movl 2*8(%ebp),%eax
1108 call PrintQword
1109
1110 movl $0xb8460,%edi
1111
1112 movl $StringR14, %esi
1113 call PrintString
1114 .byte 0x48
1115 movl 1*8(%ebp),%eax
1116 call PrintQword
1117
1118 movl $StringR15, %esi
1119 call PrintString
1120 .byte 0x48
1121 movl 0*8(%ebp),%eax
1122 call PrintQword
1123
1124 movl $StringSs, %esi
1125 call PrintString
1126 .byte 0x48
1127 movl 22*8(%ebp),%eax
1128 call PrintQword
1129
1130 movl $0xb8500,%edi
1131
1132 movl $StringRflags, %esi
1133 call PrintString
1134 .byte 0x48
1135 movl 20*8(%ebp),%eax
1136 call PrintQword
1137
1138 movl $0xb8640,%edi
1139
1140 movl %ebp,%esi
1141 addl $23*8,%esi
1142 movl $4,%ecx
1143
1144
1145OuterLoop:
1146 pushl %ecx
1147 movl $4,%ecx
1148 .byte 0x48
1149 movl %edi,%edx
1150
1151InnerLoop:
1152 .byte 0x48
1153 movl (%esi),%eax
1154 call PrintQword
1155 addl $8,%esi
1156 movb $0x20, %al # blank character
1157 movb %al,(%edi)
1158 addl $2,%edi
1159 loop InnerLoop
1160
1161 popl %ecx
1162 addl $0xa0,%edx
1163 movl %edx,%edi
1164 loop OuterLoop
1165
1166
1167 movl $0xb8960,%edi
1168
1169 .byte 0x48
1170 movl 18*8(%ebp),%eax # RIP
1171 subl $8*8,%eax
1172 .byte 0x48
1173 movl %eax,%esi # esi = rip - 8 QWORD linear (total 16 QWORD)
1174
1175 movl $4,%ecx
1176
1177OuterLoop1:
1178 pushl %ecx
1179 movl $4,%ecx
1180 movl %edi,%edx
1181
1182InnerLoop1:
1183 .byte 0x48
1184 movl (%esi),%eax
1185 call PrintQword
1186 addl $8,%esi
1187 movb $0x20, %al # blank character
1188 movb %al,(%edi)
1189 addl $2,%edi
1190 loop InnerLoop1
1191
1192 popl %ecx
1193 addl $0xa0,%edx
1194 movl %edx,%edi
1195 loop OuterLoop1
1196
1197
1198
1199 #wbinvd
1200LN_C1:
1201 jmp LN_C1
1202
1203#
1204# return
1205#
1206 movl %ebp,%esp
1207# mov rsp, rbp
1208 .byte 0x41
1209 .byte 0x5f
1210# pop r15
1211 .byte 0x41
1212 .byte 0x5e
1213# pop r14
1214 .byte 0x41
1215 .byte 0x5d
1216# pop r13
1217 .byte 0x41
1218 .byte 0x5c
1219# pop r12
1220 .byte 0x41
1221 .byte 0x5b
1222# pop r11
1223 .byte 0x41
1224 .byte 0x5a
1225# pop r10
1226 .byte 0x41
1227 .byte 0x59
1228# pop r9
1229 .byte 0x41
1230 .byte 0x58
1231# pop r8
1232 popl %edi
1233 popl %esi
1234 popl %ebp
1235 popl %eax # esp
1236 popl %ebx
1237 popl %edx
1238 popl %ecx
1239 popl %eax
1240
1241 .byte 0x48
1242 .byte 0x83
1243 .byte 0xc4
1244 .byte 0x10
1245# add esp, 16 ; error code and INT number
1246
1247 .byte 0x48
1248 .byte 0xcf
1249# iretq
1250
1251PrintString:
1252 pushl %eax
1253LN_C2:
1254 movb (%esi), %al
1255 cmpb $0,%al
1256 je LN_C3
1257 movb %al, (%edi)
1258 .byte 0xff
1259 .byte 0xc6
1260# inc esi
1261 addl $2,%edi
1262 jmp LN_C2
1263LN_C3:
1264 popl %eax
1265 ret
1266
1267## RAX contains qword to print
1268## RDI contains memory location (screen location) to print it to
1269PrintQword:
1270 pushl %ecx
1271 pushl %ebx
1272 pushl %eax
1273
1274 .byte 0x48
1275 .byte 0xc7
1276 .byte 0xc1
1277 .long 16
1278# mov rcx, 16
1279looptop:
1280 .byte 0x48
1281 roll $4,%eax
1282 movb %al,%bl
1283 andb $0xf,%bl
1284 addb $'0', %bl
1285 cmpb $'9', %bl
1286 jle LN_C4
1287 addb $7,%bl
1288LN_C4:
1289 movb %bl, (%edi)
1290 addl $2,%edi
1291 loop looptop
1292 #wbinvd
1293
1294 popl %eax
1295 popl %ebx
1296 popl %ecx
1297 ret
1298
1299ClearScreen:
1300 pushl %eax
1301 pushl %ecx
1302
1303 movb $0x20, %al # blank character
1304 movb $0xc,%ah
1305 movl $0xb8000,%edi
1306 movl $80*24,%ecx
1307LN_C5:
1308 movw %ax, (%edi)
1309 addl $2,%edi
1310 loop LN_C5
1311 movl $0xb8000,%edi
1312
1313 popl %ecx
1314 popl %eax
1315
1316 ret
1317
1318A2C:
1319 andb $0xf,%al
1320 addb $'0', %al
1321 cmpb $'9', %al
1322 jle LN_C6
1323 addb $7,%al
1324LN_C6:
1325 ret
1326
1327String1: .asciz "*** INT "
1328
1329Int0String: .asciz "00h Divide by 0 -"
1330Int1String: .asciz "01h Debug exception -"
1331Int2String: .asciz "02h NMI -"
1332Int3String: .asciz "03h Breakpoint -"
1333Int4String: .asciz "04h Overflow -"
1334Int5String: .asciz "05h Bound -"
1335Int6String: .asciz "06h Invalid opcode -"
1336Int7String: .asciz "07h Device not available -"
1337Int8String: .asciz "08h Double fault -"
1338Int9String: .asciz "09h Coprocessor seg overrun (reserved) -"
1339Int10String: .asciz "0Ah Invalid TSS -"
1340Int11String: .asciz "0Bh Segment not present -"
1341Int12String: .asciz "0Ch Stack fault -"
1342Int13String: .asciz "0Dh General protection fault -"
1343Int14String: .asciz "0Eh Page fault -"
1344Int15String: .asciz "0Fh (Intel reserved) -"
1345Int16String: .asciz "10h Floating point error -"
1346Int17String: .asciz "11h Alignment check -"
1347Int18String: .asciz "12h Machine check -"
1348Int19String: .asciz "13h SIMD Floating-Point Exception -"
1349IntUnknownString: .asciz "??h Unknown interrupt -"
1350
1351StringTable: .long Int0String, 0, Int1String, 0, Int2String, 0, Int3String, 0, \
1352 Int4String, 0, Int5String, 0, Int6String, 0, Int7String, 0, \
1353 Int8String, 0, Int9String, 0, Int10String, 0, Int11String, 0, \
1354 Int12String, 0, Int13String, 0, Int14String, 0, Int15String, 0, \
1355 Int16String, 0, Int17String, 0, Int18String, 0, Int19String, 0
1356
1357String2: .asciz " HALT!! *** ("
1358String3: .asciz ")"
1359StringRax: .asciz "RAX="
1360StringRcx: .asciz " RCX="
1361StringRdx: .asciz " RDX="
1362StringRbx: .asciz "RBX="
1363StringRsp: .asciz " RSP="
1364StringRbp: .asciz " RBP="
1365StringRsi: .asciz "RSI="
1366StringRdi: .asciz " RDI="
1367StringEcode: .asciz " ECODE="
1368StringR8: .asciz "R8 ="
1369StringR9: .asciz " R9 ="
1370StringR10: .asciz " R10="
1371StringR11: .asciz "R11="
1372StringR12: .asciz " R12="
1373StringR13: .asciz " R13="
1374StringR14: .asciz "R14="
1375StringR15: .asciz " R15="
1376StringSs: .asciz " SS ="
1377StringRflags: .asciz "RFLAGS="
1378
1379Idtr: .float 0
1380 .float 0
1381
1382 .org 0x21ffe
1383BlockSignature:
1384 .word 0xaa55
1385