#****************************************************************************** #* #* Copyright (c) 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. #* #****************************************************************************** .globl ASM_PFX(OrigVector) .globl ASM_PFX(InterruptEntryStub) .globl ASM_PFX(StubSize) .globl ASM_PFX(CommonIdtEntry) .globl ASM_PFX(FxStorSupport) ASM_PFX(AppEsp): .long 0x11111111 # ? ASM_PFX(DebugEsp): .long 0x22222222 # ? ASM_PFX(ExtraPush): .long 0x33333333 # ? ASM_PFX(ExceptData): .long 0x44444444 # ? ASM_PFX(Eflags): .long 0x55555555 # ? ASM_PFX(OrigVector): .long 0x66666666 # ? ASM_PFX(StubSize): .long ASM_PFX(InterruptEntryStubEnd) - ASM_PFX(InterruptEntryStub) .globl ASM_PFX(FxStorSupport) ASM_PFX(FxStorSupport): push %ebx mov $0x1,%eax cpuid mov %edx,%eax and $0x1000000,%eax shr $0x18,%eax pop %ebx ret .globl ASM_PFX(GetIdtr) ASM_PFX(GetIdtr): push %ebp mov %esp,%ebp add $0xfffffff8,%esp sidtl 0xfffffffa(%ebp) mov 0xfffffffc(%ebp),%eax leave ret .globl ASM_PFX(WriteInterruptFlag) ASM_PFX(WriteInterruptFlag): push %ebp mov %esp,%ebp pushf pop %eax and $0x200,%eax shr $0x9,%eax mov 0x8(%ebp),%ecx or %cl,%cl jne ASM_PFX(WriteInterruptFlag+0x17) cli jmp ASM_PFX(WriteInterruptFlag+0x18) sti leave ret .globl ASM_PFX(Vect2Desc) ASM_PFX(Vect2Desc): push %ebp mov %esp,%ebp mov 0xc(%ebp),%eax mov 0x8(%ebp),%ecx mov %ax,(%ecx) movw $0x20,0x2(%ecx) movw $0x8e00,0x4(%ecx) shr $0x10,%eax mov %ax,0x6(%ecx) leave ret .globl ASM_PFX(InterruptEntryStub) ASM_PFX(InterruptEntryStub): mov %esp,0x0 mov $0x0,%esp push $0x0 jmp ASM_PFX(CommonIdtEntry) .globl ASM_PFX(InterruptEntryStubEnd) ASM_PFX(InterruptEntryStubEnd): .globl ASM_PFX(CommonIdtEntry) ASM_PFX(CommonIdtEntry): pusha pushf pop %eax mov %eax,0x0 cmpl $0x8,0x0 jne ASM_PFX(CommonIdtEntry+0x20) movl $0x1,0x0 jmp ASM_PFX(CommonIdtEntry+0xa8) cmpl $0xa,0x0 jne ASM_PFX(CommonIdtEntry+0x35) movl $0x1,0x0 jmp ASM_PFX(CommonIdtEntry+0xa8) cmpl $0xb,0x0 jne ASM_PFX(CommonIdtEntry+0x4a) movl $0x1,0x0 jmp ASM_PFX(CommonIdtEntry+0xa8) cmpl $0xc,0x0 jne ASM_PFX(CommonIdtEntry+0x5f) movl $0x1,0x0 jmp ASM_PFX(CommonIdtEntry+0xa8) cmpl $0xd,0x0 jne ASM_PFX(CommonIdtEntry+0x74) movl $0x1,0x0 jmp ASM_PFX(CommonIdtEntry+0xa8) cmpl $0xe,0x0 jne ASM_PFX(CommonIdtEntry+0x89) movl $0x1,0x0 jmp ASM_PFX(CommonIdtEntry+0xa8) cmpl $0x11,0x0 jne ASM_PFX(CommonIdtEntry+0x9e) movl $0x1,0x0 jmp ASM_PFX(CommonIdtEntry+0xa8) movl $0x0,0x0 cmpl $0x1,0x0 jne ASM_PFX(CommonIdtEntry+0xc8) mov 0x0,%eax mov (%eax),%ebx mov %ebx,0x0 add $0x4,%eax mov %eax,0x0 jmp ASM_PFX(CommonIdtEntry+0xd2) movl $0x0,0x0 mov 0xc(%esp),%eax mov %eax,0x0 mov 0x0,%eax add $0xc,%eax mov %eax,0xc(%esp) mov %ss,%eax push %eax mov 0x0,%eax movzwl 0x4(%eax),%eax push %eax mov %ds,%eax push %eax mov %es,%eax push %eax mov %fs,%eax push %eax mov %gs,%eax push %eax mov 0x0,%eax pushl (%eax) push $0x0 push $0x0 sidtl (%esp) push $0x0 push $0x0 sgdtl (%esp) xor %eax,%eax str %eax push %eax sldt %eax push %eax mov 0x0,%eax pushl 0x8(%eax) mov %cr4,%eax or $0x208,%eax mov %eax,%cr4 push %eax mov %cr3,%eax push %eax mov %cr2,%eax push %eax push $0x0 mov %cr0,%eax push %eax mov %db7,%eax push %eax xor %eax,%eax mov %eax,%db7 mov %db6,%eax push %eax xor %eax,%eax mov %eax,%db6 mov %db3,%eax push %eax mov %db2,%eax push %eax mov %db1,%eax push %eax mov %db0,%eax push %eax sub $0x200,%esp mov %esp,%edi fxsave (%edi) mov 0x0,%eax push %eax mov %esp,%eax push %eax mov 0x0,%eax push %eax call ASM_PFX(CommonIdtEntry+0x184) add $0x8,%esp add $0x4,%esp mov %esp,%esi fxrstor (%esi) add $0x200,%esp pop %eax mov %eax,%db0 pop %eax mov %eax,%db1 pop %eax mov %eax,%db2 pop %eax mov %eax,%db3 add $0x4,%esp pop %eax mov %eax,%db7 pop %eax mov %eax,%cr0 add $0x4,%esp pop %eax mov %eax,%cr2 pop %eax mov %eax,%cr3 pop %eax mov %eax,%cr4 mov 0x0,%eax popl 0x8(%eax) add $0x18,%esp popl (%eax) pop %gs pop %fs pop %es pop %ds popl 0x4(%eax) pop %ss mov 0xc(%esp),%ebx mov 0x0,%eax add $0xc,%eax cmp %eax,%ebx je ASM_PFX(CommonIdtEntry+0x202) mov 0x0,%eax mov (%eax),%ecx mov %ecx,(%ebx) mov 0x4(%eax),%ecx mov %ecx,0x4(%ebx) mov 0x8(%eax),%ecx mov %ecx,0x8(%ebx) mov %ebx,%eax mov %eax,0x0 mov 0x0,%eax mov %eax,0xc(%esp) cmpl $0x68,0x0 jne PhonyIretd+0xd mov 0x0,%eax mov 0x8(%eax),%ebx and $0xfffffcff,%ebx push %ebx push %cs push $0x0 iret PhonyIretd: popa mov 0x0,%esp jmp *0x0 popa mov 0x0,%esp iret