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