| #****************************************************************************** | |
| #* | |
| #* 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 |