diff options
Diffstat (limited to 'EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S')
-rw-r--r-- | EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S new file mode 100644 index 0000000..131464a --- /dev/null +++ b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S @@ -0,0 +1,270 @@ +#****************************************************************************** +#* +#* 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. +#* +#****************************************************************************** + +.global _OrigVector +.global _InterruptEntryStub +.global _StubSize +.global _CommonIdtEntry +.global _FxStorSupport + +_AppEsp: .long 0x11111111 # ? +_DebugEsp: .long 0x22222222 # ? +_ExtraPush: .long 0x33333333 # ? +_ExceptData: .long 0x44444444 # ? +_Eflags: .long 0x55555555 # ? +_OrigVector: .long 0x66666666 # ? +_StubSize: .long _InterruptEntryStubEnd - _InterruptEntryStub + +.global _FxStorSupport +_FxStorSupport: + push %ebx + mov $0x1,%eax + cpuid + mov %edx,%eax + and $0x1000000,%eax + shr $0x18,%eax + pop %ebx + ret + +.global _GetIdtr +_GetIdtr: + push %ebp + mov %esp,%ebp + add $0xfffffff8,%esp + sidtl 0xfffffffa(%ebp) + mov 0xfffffffc(%ebp),%eax + leave + ret + +.global _WriteInterruptFlag +_WriteInterruptFlag: + push %ebp + mov %esp,%ebp + pushf + pop %eax + and $0x200,%eax + shr $0x9,%eax + mov 0x8(%ebp),%ecx + or %ecx,%ecx + jne _WriteInterruptFlag+0x17 + cli + jmp _WriteInterruptFlag+0x18 + sti + leave + ret + +.global _Vect2Desc +_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 + +.global _InterruptEntryStub +_InterruptEntryStub: + mov %esp,0x0 + mov $0x0,%esp + push $0x0 + jmp _CommonIdtEntry +.global _InterruptEntryStubEnd +_InterruptEntryStubEnd: + +.global _CommonIdtEntry +_CommonIdtEntry: + pusha + pushf + pop %eax + mov %eax,0x0 + cmpl $0x8,0x0 + jne _CommonIdtEntry+0x20 + movl $0x1,0x0 + jmp _CommonIdtEntry+0xa8 + cmpl $0xa,0x0 + jne _CommonIdtEntry+0x35 + movl $0x1,0x0 + jmp _CommonIdtEntry+0xa8 + cmpl $0xb,0x0 + jne _CommonIdtEntry+0x4a + movl $0x1,0x0 + jmp _CommonIdtEntry+0xa8 + cmpl $0xc,0x0 + jne _CommonIdtEntry+0x5f + movl $0x1,0x0 + jmp _CommonIdtEntry+0xa8 + cmpl $0xd,0x0 + jne _CommonIdtEntry+0x74 + movl $0x1,0x0 + jmp _CommonIdtEntry+0xa8 + cmpl $0xe,0x0 + jne _CommonIdtEntry+0x89 + movl $0x1,0x0 + jmp _CommonIdtEntry+0xa8 + cmpl $0x11,0x0 + jne _CommonIdtEntry+0x9e + movl $0x1,0x0 + jmp _CommonIdtEntry+0xa8 + movl $0x0,0x0 + cmpl $0x1,0x0 + jne _CommonIdtEntry+0xc8 + mov 0x0,%eax + mov (%eax),%ebx + mov %ebx,0x0 + add $0x4,%eax + mov %eax,0x0 + jmp _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 _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 _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 |