| #------------------------------------------------------------------------------ | |
| #* | |
| #* Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> | |
| #* This program and the accompanying materials | |
| #* are licensed and made available under the terms and conditions of the BSD License | |
| #* which accompanies this distribution. The full text of the license may be found at | |
| #* http://opensource.org/licenses/bsd-license.php | |
| #* | |
| #* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| #* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| #* | |
| #* efi64.asm | |
| #* | |
| #* Abstract: | |
| #* | |
| #------------------------------------------------------------------------------ | |
| ############################################################################## | |
| # Now in 64-bit long mode. | |
| ############################################################################## | |
| .486: | |
| .stack: | |
| .code: | |
| .org 0x21000 | |
| .global _start | |
| _start: | |
| .equ DEFAULT_HANDLER_SIZE, INT1 - INT0 | |
| .macro jmpCommonIdtEntry | |
| # jmp commonIdtEntry - this must be hand coded to keep the assembler from | |
| # using a 8 bit reletive jump when the entries are | |
| # within 255 bytes of the common entry. This must | |
| # be done to maintain the consistency of the size | |
| # of entry points... | |
| .byte 0xe9 # jmp 16 bit relative | |
| .long commonIdtEntry - . - 4 # offset to jump to | |
| .endm | |
| Start: | |
| movl $0x001fffe8,%esp # make final stack aligned | |
| # set OSFXSR and OSXMMEXCPT because some code will use XMM register | |
| .byte 0xf | |
| .byte 0x20 | |
| .byte 0xe0 | |
| # mov rax, cr4 | |
| btsl $9,%eax | |
| btsl $0xa,%eax | |
| .byte 0xf | |
| .byte 0x22 | |
| .byte 0xe0 | |
| # mov cr4, rax | |
| call ClearScreen | |
| # Populate IDT with meaningful offsets for exception handlers... | |
| movl $Idtr, %eax | |
| sidt (%eax) # get fword address of IDT | |
| movl $Halt, %eax | |
| movl %eax,%ebx # use bx to copy 15..0 to descriptors | |
| shrl $16,%eax # use ax to copy 31..16 to descriptors | |
| # 63..32 of descriptors is 0 | |
| movl $0x78,%ecx # 78h IDT entries to initialize with unique entry points (exceptions) | |
| movl $(Idtr + 2), %esi | |
| movl (%esi),%edi | |
| LOOP_1: # loop through all IDT entries exception handlers and initialize to default handler | |
| movw %bx, (%edi) # write bits 15..0 of offset | |
| movw $0x38, 2(%edi) # SYS_CODE_SEL64 from GDT | |
| movw $(0x0e00 | 0x8000), 4(%edi) # type = 386 interrupt gate, present | |
| movw %ax, 6(%edi) # write bits 31..16 of offset | |
| movl $0, 8(%edi) # write bits 31..16 of offset | |
| addl $16, %edi # move up to next descriptor | |
| addw $DEFAULT_HANDLER_SIZE, %bx # move to next entry point | |
| loopl LOOP_1 # loop back through again until all descriptors are initialized | |
| ## at this point edi contains the offset of the descriptor for INT 20 | |
| ## and bx contains the low 16 bits of the offset of the default handler | |
| ## so initialize all the rest of the descriptors with these two values... | |
| # mov ecx, 101 ; there are 100 descriptors left (INT 20 (14h) - INT 119 (77h) | |
| #@@: ; loop through all IDT entries exception handlers and initialize to default handler | |
| # mov word ptr [edi], bx ; write bits 15..0 of offset | |
| # mov word ptr [edi+2], 38h ; SYS_CODE64_SEL from GDT | |
| # mov word ptr [edi+4], 0e00h OR 8000h ; type = 386 interrupt gate, present | |
| # mov word ptr [edi+6], ax ; write bits 31..16 of offset | |
| # mov dword ptr [edi+8], 0 ; write bits 63..32 of offset | |
| # add edi, 16 ; move up to next descriptor | |
| # loop @b ; loop back through again until all descriptors are initialized | |
| ## DUMP location of IDT and several of the descriptors | |
| # mov ecx, 8 | |
| # mov eax, [offset Idtr + 2] | |
| # mov eax, [eax] | |
| # mov edi, 0b8000h | |
| # call PrintQword | |
| # mov esi, eax | |
| # mov edi, 0b80a0h | |
| # jmp OuterLoop | |
| ## | |
| ## just for fun, let's do a software interrupt to see if we correctly land in the exception handler... | |
| # mov eax, 011111111h | |
| # mov ebx, 022222222h | |
| # mov ecx, 033333333h | |
| # mov edx, 044444444h | |
| # mov ebp, 055555555h | |
| # mov esi, 066666666h | |
| # mov edi, 077777777h | |
| # push 011111111h | |
| # push 022222222h | |
| # push 033333333h | |
| # int 119 | |
| movl $0x22000,%esi # esi = 22000 | |
| movl 0x14(%esi),%eax # eax = [22014] | |
| addl %eax,%esi # esi = 22000 + [22014] = Base of EFILDR.C | |
| movl 0x3c(%esi),%ebp # ebp = [22000 + [22014] + 3c] = NT Image Header for EFILDR.C | |
| addl %esi,%ebp | |
| movl 0x30(%ebp),%edi # edi = [[22000 + [22014] + 3c] + 2c] = ImageBase (63..32 is zero, ignore) | |
| movl 0x28(%ebp),%eax # eax = [[22000 + [22014] + 3c] + 24] = EntryPoint | |
| addl %edi,%eax # eax = ImageBase + EntryPoint | |
| movl $EfiLdrOffset, %ebx | |
| movl %eax, (%ebx) # Modify far jump instruction for correct entry point | |
| movw 6(%ebp), %bx # bx = Number of sections | |
| xorl %eax,%eax | |
| movw 0x14(%ebp), %ax # ax = Optional Header Size | |
| addl %eax,%ebp | |
| addl $0x18,%ebp # ebp = Start of 1st Section | |
| SectionLoop: | |
| pushl %esi # Save Base of EFILDR.C | |
| pushl %edi # Save ImageBase | |
| addl 0x14(%ebp),%esi # esi = Base of EFILDR.C + PointerToRawData | |
| addl 0x0c(%ebp),%edi # edi = ImageBase + VirtualAddress | |
| movl 0x10(%ebp),%ecx # ecs = SizeOfRawData | |
| cld | |
| shrl $2,%ecx | |
| rep | |
| movsl | |
| popl %edi # Restore ImageBase | |
| popl %esi # Restore Base of EFILDR.C | |
| addw $0x28,%bp # ebp = ebp + 028h = Pointer to next section record | |
| .byte 0x66 | |
| .byte 0xff | |
| .byte 0xcb | |
| # dec bx | |
| cmpw $0,%bx | |
| jne SectionLoop | |
| movl $Idtr, %edx # get size of IDT | |
| movzxw (%edx), %eax | |
| .byte 0xff | |
| .byte 0xc0 | |
| # inc eax | |
| addl 2(%edx), %eax # add to base of IDT to get location of memory map... | |
| xorl %ecx,%ecx | |
| movl %eax,%ecx # put argument to RCX | |
| .byte 0x48 | |
| .byte 0xc7 | |
| .byte 0xc0 | |
| EfiLdrOffset: | |
| .long 0x00401000 # Offset of EFILDR | |
| # mov rax, 401000h | |
| .byte 0x50 | |
| # push rax | |
| # ret | |
| .byte 0xc3 | |
| # db "**** DEFAULT IDT ENTRY ***",0 | |
| .p2align 1 | |
| Halt: | |
| INT0: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x0 | |
| jmpCommonIdtEntry | |
| # db 0e9h ; jmp 16 bit reletive | |
| # dd commonIdtEntry - $ - 4 ; offset to jump to | |
| INT1: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x1 | |
| jmpCommonIdtEntry | |
| INT2: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x2 | |
| jmpCommonIdtEntry | |
| INT3: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x3 | |
| jmpCommonIdtEntry | |
| INT4: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x4 | |
| jmpCommonIdtEntry | |
| INT5: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x5 | |
| jmpCommonIdtEntry | |
| INT6: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x6 | |
| jmpCommonIdtEntry | |
| INT7: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x7 | |
| jmpCommonIdtEntry | |
| INT8: | |
| # Double fault causes an error code to be pushed so no phony push necessary | |
| nop | |
| nop | |
| pushl $0x8 | |
| jmpCommonIdtEntry | |
| INT9: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $0x9 | |
| jmpCommonIdtEntry | |
| INT10: | |
| # Invalid TSS causes an error code to be pushed so no phony push necessary | |
| nop | |
| nop | |
| pushl $10 | |
| jmpCommonIdtEntry | |
| INT11: | |
| # Segment Not Present causes an error code to be pushed so no phony push necessary | |
| nop | |
| nop | |
| pushl $11 | |
| jmpCommonIdtEntry | |
| INT12: | |
| # Stack fault causes an error code to be pushed so no phony push necessary | |
| nop | |
| nop | |
| pushl $12 | |
| jmpCommonIdtEntry | |
| INT13: | |
| # GP fault causes an error code to be pushed so no phony push necessary | |
| nop | |
| nop | |
| pushl $13 | |
| jmpCommonIdtEntry | |
| INT14: | |
| # Page fault causes an error code to be pushed so no phony push necessary | |
| nop | |
| nop | |
| pushl $14 | |
| jmpCommonIdtEntry | |
| INT15: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $15 | |
| jmpCommonIdtEntry | |
| INT16: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $16 | |
| jmpCommonIdtEntry | |
| INT17: | |
| # Alignment check causes an error code to be pushed so no phony push necessary | |
| nop | |
| nop | |
| pushl $17 | |
| jmpCommonIdtEntry | |
| INT18: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $18 | |
| jmpCommonIdtEntry | |
| INT19: | |
| pushl $0x0 # push error code place holder on the stack | |
| pushl $19 | |
| jmpCommonIdtEntry | |
| INTUnknown: | |
| # The following segment repeats (0x78 - 20) times: | |
| # No. 1 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 2 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 3 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 4 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 5 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 6 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 7 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 8 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 9 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 10 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 11 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 12 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 13 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 14 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 15 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 16 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 17 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 18 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 19 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 20 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 21 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 22 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 23 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 24 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 25 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 26 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 27 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 28 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 29 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 30 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 31 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 32 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 33 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 34 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 35 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 36 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 37 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 38 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 39 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 40 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 41 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 42 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 43 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 44 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 45 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 46 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 47 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 48 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 49 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 50 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 51 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 52 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 53 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 54 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 55 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 56 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 57 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 58 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 59 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 60 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 61 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 62 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 63 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 64 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 65 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 66 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 67 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 68 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 69 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 70 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 71 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 72 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 73 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 74 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 75 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 76 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 77 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 78 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 79 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 80 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 81 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 82 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 83 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 84 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 85 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 86 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 87 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 88 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 89 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 90 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 91 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 92 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 93 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 94 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 95 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 96 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 97 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 98 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 99 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| # No. 100 | |
| pushl $0x0 # push error code place holder on the stack | |
| # push xxh ; push vector number | |
| .byte 0x6a | |
| .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number | |
| jmpCommonIdtEntry | |
| commonIdtEntry: | |
| pushl %eax | |
| pushl %ecx | |
| pushl %edx | |
| pushl %ebx | |
| pushl %esp | |
| pushl %ebp | |
| pushl %esi | |
| pushl %edi | |
| .byte 0x41 | |
| .byte 0x50 | |
| # push r8 | |
| .byte 0x41 | |
| .byte 0x51 | |
| # push r9 | |
| .byte 0x41 | |
| .byte 0x52 | |
| # push r10 | |
| .byte 0x41 | |
| .byte 0x53 | |
| # push r11 | |
| .byte 0x41 | |
| .byte 0x54 | |
| # push r12 | |
| .byte 0x41 | |
| .byte 0x55 | |
| # push r13 | |
| .byte 0x41 | |
| .byte 0x56 | |
| # push r14 | |
| .byte 0x41 | |
| .byte 0x57 | |
| # push r15 | |
| .byte 0x48 | |
| movl %esp,%ebp | |
| # mov rbp, rsp | |
| ## | |
| ## At this point the stack looks like this: | |
| ## | |
| ## Calling SS | |
| ## Calling RSP | |
| ## rflags | |
| ## Calling CS | |
| ## Calling RIP | |
| ## Error code or 0 | |
| ## Int num or 0ffh for unknown int num | |
| ## rax | |
| ## rcx | |
| ## rdx | |
| ## rbx | |
| ## rsp | |
| ## rbp | |
| ## rsi | |
| ## rdi | |
| ## r8 | |
| ## r9 | |
| ## r10 | |
| ## r11 | |
| ## r12 | |
| ## r13 | |
| ## r14 | |
| ## r15 <------- RSP, RBP | |
| ## | |
| call ClearScreen | |
| movl $String1, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 16*8(%ebp),%eax ## move Int number into RAX | |
| .byte 0x48 | |
| cmpl $18,%eax | |
| ja PrintDefaultString | |
| PrintExceptionString: | |
| shll $3,%eax ## multiply by 8 to get offset from StringTable to actual string address | |
| addl $StringTable, %eax | |
| movl (%eax),%esi | |
| jmp PrintTheString | |
| PrintDefaultString: | |
| movl $IntUnknownString, %esi | |
| # patch Int number | |
| movl %eax,%edx | |
| call A2C | |
| movb %al,1(%esi) | |
| movl %edx,%eax | |
| shrl $4,%eax | |
| call A2C | |
| movb %al,(%esi) | |
| PrintTheString: | |
| call PrintString | |
| movl $String2, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 19*8(%ebp),%eax # CS | |
| call PrintQword | |
| movb $':', %al | |
| movb %al, (%edi) | |
| addl $2,%edi | |
| .byte 0x48 | |
| movl 18*8(%ebp),%eax # RIP | |
| call PrintQword | |
| movl $String3, %esi | |
| call PrintString | |
| movl $0xb8140,%edi | |
| movl $StringRax, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 15*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringRcx, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 14*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringRdx, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 13*8(%ebp),%eax | |
| call PrintQword | |
| movl $0xb81e0,%edi | |
| movl $StringRbx, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 12*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringRsp, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 21*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringRbp, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 10*8(%ebp),%eax | |
| call PrintQword | |
| movl $0xb8280,%edi | |
| movl $StringRsi, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 9*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringRdi, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 8*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringEcode, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 17*8(%ebp),%eax | |
| call PrintQword | |
| movl $0xb8320,%edi | |
| movl $StringR8, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 7*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringR9, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 6*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringR10, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 5*8(%ebp),%eax | |
| call PrintQword | |
| movl $0xb83c0,%edi | |
| movl $StringR11, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 4*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringR12, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 3*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringR13, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 2*8(%ebp),%eax | |
| call PrintQword | |
| movl $0xb8460,%edi | |
| movl $StringR14, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 1*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringR15, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 0*8(%ebp),%eax | |
| call PrintQword | |
| movl $StringSs, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 22*8(%ebp),%eax | |
| call PrintQword | |
| movl $0xb8500,%edi | |
| movl $StringRflags, %esi | |
| call PrintString | |
| .byte 0x48 | |
| movl 20*8(%ebp),%eax | |
| call PrintQword | |
| movl $0xb8640,%edi | |
| movl %ebp,%esi | |
| addl $23*8,%esi | |
| movl $4,%ecx | |
| OuterLoop: | |
| pushl %ecx | |
| movl $4,%ecx | |
| .byte 0x48 | |
| movl %edi,%edx | |
| InnerLoop: | |
| .byte 0x48 | |
| movl (%esi),%eax | |
| call PrintQword | |
| addl $8,%esi | |
| movb $0x20, %al # blank character | |
| movb %al,(%edi) | |
| addl $2,%edi | |
| loop InnerLoop | |
| popl %ecx | |
| addl $0xa0,%edx | |
| movl %edx,%edi | |
| loop OuterLoop | |
| movl $0xb8960,%edi | |
| .byte 0x48 | |
| movl 18*8(%ebp),%eax # RIP | |
| subl $8*8,%eax | |
| .byte 0x48 | |
| movl %eax,%esi # esi = rip - 8 QWORD linear (total 16 QWORD) | |
| movl $4,%ecx | |
| OuterLoop1: | |
| pushl %ecx | |
| movl $4,%ecx | |
| movl %edi,%edx | |
| InnerLoop1: | |
| .byte 0x48 | |
| movl (%esi),%eax | |
| call PrintQword | |
| addl $8,%esi | |
| movb $0x20, %al # blank character | |
| movb %al,(%edi) | |
| addl $2,%edi | |
| loop InnerLoop1 | |
| popl %ecx | |
| addl $0xa0,%edx | |
| movl %edx,%edi | |
| loop OuterLoop1 | |
| #wbinvd | |
| LN_C1: | |
| jmp LN_C1 | |
| # | |
| # return | |
| # | |
| movl %ebp,%esp | |
| # mov rsp, rbp | |
| .byte 0x41 | |
| .byte 0x5f | |
| # pop r15 | |
| .byte 0x41 | |
| .byte 0x5e | |
| # pop r14 | |
| .byte 0x41 | |
| .byte 0x5d | |
| # pop r13 | |
| .byte 0x41 | |
| .byte 0x5c | |
| # pop r12 | |
| .byte 0x41 | |
| .byte 0x5b | |
| # pop r11 | |
| .byte 0x41 | |
| .byte 0x5a | |
| # pop r10 | |
| .byte 0x41 | |
| .byte 0x59 | |
| # pop r9 | |
| .byte 0x41 | |
| .byte 0x58 | |
| # pop r8 | |
| popl %edi | |
| popl %esi | |
| popl %ebp | |
| popl %eax # esp | |
| popl %ebx | |
| popl %edx | |
| popl %ecx | |
| popl %eax | |
| .byte 0x48 | |
| .byte 0x83 | |
| .byte 0xc4 | |
| .byte 0x10 | |
| # add esp, 16 ; error code and INT number | |
| .byte 0x48 | |
| .byte 0xcf | |
| # iretq | |
| PrintString: | |
| pushl %eax | |
| LN_C2: | |
| movb (%esi), %al | |
| cmpb $0,%al | |
| je LN_C3 | |
| movb %al, (%edi) | |
| .byte 0xff | |
| .byte 0xc6 | |
| # inc esi | |
| addl $2,%edi | |
| jmp LN_C2 | |
| LN_C3: | |
| popl %eax | |
| ret | |
| ## RAX contains qword to print | |
| ## RDI contains memory location (screen location) to print it to | |
| PrintQword: | |
| pushl %ecx | |
| pushl %ebx | |
| pushl %eax | |
| .byte 0x48 | |
| .byte 0xc7 | |
| .byte 0xc1 | |
| .long 16 | |
| # mov rcx, 16 | |
| looptop: | |
| .byte 0x48 | |
| roll $4,%eax | |
| movb %al,%bl | |
| andb $0xf,%bl | |
| addb $'0', %bl | |
| cmpb $'9', %bl | |
| jle LN_C4 | |
| addb $7,%bl | |
| LN_C4: | |
| movb %bl, (%edi) | |
| addl $2,%edi | |
| loop looptop | |
| #wbinvd | |
| popl %eax | |
| popl %ebx | |
| popl %ecx | |
| ret | |
| ClearScreen: | |
| pushl %eax | |
| pushl %ecx | |
| movb $0x20, %al # blank character | |
| movb $0xc,%ah | |
| movl $0xb8000,%edi | |
| movl $80*24,%ecx | |
| LN_C5: | |
| movw %ax, (%edi) | |
| addl $2,%edi | |
| loop LN_C5 | |
| movl $0xb8000,%edi | |
| popl %ecx | |
| popl %eax | |
| ret | |
| A2C: | |
| andb $0xf,%al | |
| addb $'0', %al | |
| cmpb $'9', %al | |
| jle LN_C6 | |
| addb $7,%al | |
| LN_C6: | |
| ret | |
| String1: .asciz "*** INT " | |
| Int0String: .asciz "00h Divide by 0 -" | |
| Int1String: .asciz "01h Debug exception -" | |
| Int2String: .asciz "02h NMI -" | |
| Int3String: .asciz "03h Breakpoint -" | |
| Int4String: .asciz "04h Overflow -" | |
| Int5String: .asciz "05h Bound -" | |
| Int6String: .asciz "06h Invalid opcode -" | |
| Int7String: .asciz "07h Device not available -" | |
| Int8String: .asciz "08h Double fault -" | |
| Int9String: .asciz "09h Coprocessor seg overrun (reserved) -" | |
| Int10String: .asciz "0Ah Invalid TSS -" | |
| Int11String: .asciz "0Bh Segment not present -" | |
| Int12String: .asciz "0Ch Stack fault -" | |
| Int13String: .asciz "0Dh General protection fault -" | |
| Int14String: .asciz "0Eh Page fault -" | |
| Int15String: .asciz "0Fh (Intel reserved) -" | |
| Int16String: .asciz "10h Floating point error -" | |
| Int17String: .asciz "11h Alignment check -" | |
| Int18String: .asciz "12h Machine check -" | |
| Int19String: .asciz "13h SIMD Floating-Point Exception -" | |
| IntUnknownString: .asciz "??h Unknown interrupt -" | |
| StringTable: .long Int0String, 0, Int1String, 0, Int2String, 0, Int3String, 0, \ | |
| Int4String, 0, Int5String, 0, Int6String, 0, Int7String, 0, \ | |
| Int8String, 0, Int9String, 0, Int10String, 0, Int11String, 0, \ | |
| Int12String, 0, Int13String, 0, Int14String, 0, Int15String, 0, \ | |
| Int16String, 0, Int17String, 0, Int18String, 0, Int19String, 0 | |
| String2: .asciz " HALT!! *** (" | |
| String3: .asciz ")" | |
| StringRax: .asciz "RAX=" | |
| StringRcx: .asciz " RCX=" | |
| StringRdx: .asciz " RDX=" | |
| StringRbx: .asciz "RBX=" | |
| StringRsp: .asciz " RSP=" | |
| StringRbp: .asciz " RBP=" | |
| StringRsi: .asciz "RSI=" | |
| StringRdi: .asciz " RDI=" | |
| StringEcode: .asciz " ECODE=" | |
| StringR8: .asciz "R8 =" | |
| StringR9: .asciz " R9 =" | |
| StringR10: .asciz " R10=" | |
| StringR11: .asciz "R11=" | |
| StringR12: .asciz " R12=" | |
| StringR13: .asciz " R13=" | |
| StringR14: .asciz "R14=" | |
| StringR15: .asciz " R15=" | |
| StringSs: .asciz " SS =" | |
| StringRflags: .asciz "RFLAGS=" | |
| Idtr: .float 0 | |
| .float 0 | |
| .org 0x21ffe | |
| BlockSignature: | |
| .word 0xaa55 | |