git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2556 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			271 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			271 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #******************************************************************************
 | |
| #*
 | |
| #* 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   
 |