#------------------------------------------------------------------------------ #* #* Copyright (c) 2006 - 2011, 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. #* #* efi32.asm #* #* Abstract: #* #------------------------------------------------------------------------------ ############################################################################## # Now in 32-bit protected mode. ############################################################################## .org 0x21000 .code32 .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: movw %bx, %ax movw %ax, %ds movw %ax, %es movw %ax, %fs movw %ax, %gs movw %ax, %ss # .byte 0x66 # movl $0x00400000, %ebp movl $0x001ffff0, %esp # movl $0x00070000, %ebx #Slice # call ClearScreen # movl $0xb8000, %edi # movl Int9String, %esi # call PrintString # call PrintString # call PrintString # call PrintString # Populate IDT with meaningful offsets for exception handlers... sidt Idtr leal Halt, %eax movl %eax, %ebx # use bx to copy 15..0 to descriptors shrl $16, %eax # use ax to copy 31..16 to descriptors movl $0x78, %ecx # 78h IDT entries to initialize with unique entry points (exceptions) movl (Idtr + 2), %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 $0x20, 2(%edi) # SYS_CODE_SEL from GDT movw $(0x0e00 | 0x8000), 4(%edi) # type = 386 interrupt gate, present movw %ax, 6(%edi) # write bits 31..16 of offset addl $8, %edi # move up to next descriptor addw $DEFAULT_HANDLER_SIZE, %bx # move to next entry point loop 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], 20h ; SYS_CODE_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 # add edi, 8 ; 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 PrintDword # 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... # movl $0x011111111, %eax # mov ebx, 022222222h # mov ecx, 033333333h # mov edx, 044444444h # mov ebp, 055555555h # mov esi, 066666666h # mov edi, 077777777h # push 011111111h # push 022222222h # push $0x033333333 # int $119 # movl $0xb8000, %edi # movl Int9String, %esi # call PrintString # int $5 # jmp Halt 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 0x34(%ebp), %edi # edi = [[22000 + [22014] + 3c] + 30] = ImageBase movl 0x28(%ebp), %eax # eax = [[22000 + [22014] + 3c] + 24] = EntryPoint addl %edi, %eax # eax = ImageBase + EntryPoint movl %eax, (EfiLdrOffset + 1) # 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 # ecx = 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 decw %bx cmpw $0, %bx jne SectionLoop #Slice # movl $0xb8000, %edi # movl Int9String, %esi # call PrintString # movzwl (Idtr), %eax # get size of IDT incl %eax addl (Idtr + 2), %eax # add to base of IDT to get location of memory map... pushl %eax # push memory map location on stack for call to EFILDR... pushl %eax # push return address (useless, just for stack balance) EfiLdrOffset: movl $0x00401000, %eax # Offset of EFILDR jmpl *%eax # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # 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 $0xxx # push vector number .byte 0x6a .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number jmpCommonIdtEntry commonIdtEntry: pushal movl %esp, %ebp ## ## At this point the stack looks like this: ## ## eflags ## Calling CS ## Calling EIP ## Error code or 0 ## Int num or 0ffh for unknown int num ## eax ## ecx ## edx ## ebx ## esp ## ebp ## esi ## edi <------- ESP, EBP ## # call ClearScreen movl $0xb8000, %edi leal String1, %esi call PrintString movl 32(%ebp), %eax ## move Int number into EAX cmpl $19, %eax ja PrintDefaultString PrintExceptionString: shll $2, %eax ## multiply by 4 to get offset from StringTable to actual string address movl StringTable(%eax), %esi jmp PrintTheString PrintDefaultString: leal 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 leal String2, %esi call PrintString movl 44(%ebp), %eax # CS call PrintDword movb $':', (%edi) addl $2, %edi movl 40(%ebp), %eax # EIP call PrintDword leal String3, %esi call PrintString movl $0xb8140, %edi leal StringEax, %esi # eax call PrintString movl 28(%ebp), %eax call PrintDword leal StringEbx, %esi # ebx call PrintString movl 16(%ebp), %eax call PrintDword leal StringEcx, %esi # ecx call PrintString movl 24(%ebp), %eax call PrintDword leal StringEdx, %esi # edx call PrintString movl 20(%ebp), %eax call PrintDword leal StringEcode, %esi # error code call PrintString movl 36(%ebp), %eax call PrintDword movl $0xb81e0, %edi leal StringEsp, %esi # esp call PrintString movl 12(%ebp), %eax call PrintDword leal StringEbp, %esi # ebp call PrintString movl 8(%ebp), %eax call PrintDword leal StringEsi, %esi # esi call PrintString movl 4(%ebp), %eax call PrintDword leal StringEdi, %esi # edi call PrintString movl (%ebp), %eax call PrintDword leal StringEflags, %esi # eflags call PrintString movl 48(%ebp), %eax call PrintDword movl $0xb8320, %edi movl %ebp, %esi addl $52, %esi movl $8, %ecx OuterLoop: pushl %ecx movl $8, %ecx movl %edi, %edx InnerLoop: movl (%esi), %eax call PrintDword addl $4, %esi movb $' ', (%edi) addl $2, %edi loop InnerLoop popl %ecx addl $0xa0, %edx movl %edx, %edi loop OuterLoop movl $0xb8960, %edi movl 40(%ebp), %eax # EIP subl $32*4, %eax movl %eax, %esi # esi = eip - 32 DWORD linear (total 64 DWORD) movl $8, %ecx OuterLoop1: pushl %ecx movl $8, %ecx movl %edi, %edx InnerLoop1: movl (%esi), %eax call PrintDword addl $4, %esi movb $' ', (%edi) addl $2, %edi loop InnerLoop1 popl %ecx addl $0xa0, %edx movl %edx, %edi loop OuterLoop1 # wbinvd ; this intruction does not support in early than 486 arch LN_C1: jmp LN_C1 # # return # movl %ebp, %esp popal addl $8, %esp # error code and INT number iretl PrintString: pushl %eax LN_C2: movb (%esi), %al cmpb $0, %al je LN_C3 movb %al, (%edi) incl %esi addl $2, %edi jmp LN_C2 LN_C3: popl %eax ret ## EAX contains dword to print ## EDI contains memory location (screen location) to print it to PrintDword: pushl %ecx pushl %ebx pushl %eax movl $8, %ecx looptop: 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 $0x00, %al 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, Int1String, Int2String, Int3String .long Int4String, Int5String, Int6String, Int7String .long Int8String, Int9String, Int10String, Int11String .long Int12String, Int13String, Int14String, Int15String .long Int16String, Int17String, Int18String, Int19String String2: .asciz " HALT!! *** (" String3: .asciz ")" StringEax: .asciz "EAX=" StringEbx: .asciz " EBX=" StringEcx: .asciz " ECX=" StringEdx: .asciz " EDX=" StringEcode: .asciz " ECODE=" StringEsp: .asciz "ESP=" StringEbp: .asciz " EBP=" StringEsi: .asciz " ESI=" StringEdi: .asciz " EDI=" StringEflags: .asciz " EFLAGS=" .p2align 1 Idtr: .skip 6 .org 0x21ffe BlockSignature: .word 0xaa55