ArmPkg - Supoprt for ARM specific things that can change as the architecture changes. Plus semihosting JTAG drivers. EmbeddedPkg - Generic support for an embeddded platform. Including a light weight command line shell. BeagleBoardPkg - Platform specifics for BeagleBoard. SD Card works, but USB has issues. Looks like a bug in the open source USB stack (Our internal stack works fine). git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9518 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			159 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
| #------------------------------------------------------------------------------ 
 | |
| #
 | |
| # Copyright (c) 2008-2009 Apple Inc. All rights reserved.
 | |
| #
 | |
| # 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.
 | |
| #
 | |
| #------------------------------------------------------------------------------
 | |
| 
 | |
| .text
 | |
| .align 2
 | |
| 
 | |
| .globl _ExceptionHandlersStart
 | |
| .globl _ExceptionHandlersEnd
 | |
| .globl _CommonExceptionEntry
 | |
| .globl _AsmCommonExceptionEntry
 | |
| .globl _gExceptionHandlers
 | |
| 
 | |
| _ExceptionHandlersStart:
 | |
| 
 | |
| _Reset:
 | |
|         b               _ResetEntry
 | |
| 
 | |
| _UndefinedInstruction:
 | |
|         b               _UndefinedInstructionEntry
 | |
| 
 | |
| _SoftwareInterrupt:
 | |
|         b               _SoftwareInterruptEntry
 | |
| 
 | |
| _PrefetchAbort:
 | |
|         b               _PrefetchAbortEntry
 | |
| 
 | |
| _DataAbort:
 | |
|         b               _DataAbortEntry
 | |
| 
 | |
| _ReservedException:
 | |
|         b               _ReservedExceptionEntry
 | |
| 
 | |
| _Irq:
 | |
|         b               _IrqEntry
 | |
| 
 | |
| _Fiq:
 | |
|         b               _FiqEntry
 | |
| 
 | |
| _ResetEntry:
 | |
|         stmfd           sp!,{r0-r1}
 | |
|         mov             r0,#0
 | |
|         ldr             r1,_CommonExceptionEntry
 | |
|         bx              r1
 | |
| 
 | |
| _UndefinedInstructionEntry:
 | |
|         stmfd           sp!,{r0-r1}
 | |
|         mov             r0,#1
 | |
|         ldr             r1,_CommonExceptionEntry
 | |
|         bx              r1
 | |
| 
 | |
| _SoftwareInterruptEntry:
 | |
|         stmfd           sp!,{r0-r1}
 | |
|         mov             r0,#2
 | |
|         ldr             r1,_CommonExceptionEntry
 | |
|         bx              r1
 | |
| 
 | |
| _PrefetchAbortEntry:
 | |
|         stmfd           sp!,{r0-r1}
 | |
|         mov             r0,#3
 | |
|         sub             lr,lr,#4
 | |
|         ldr             r1,_CommonExceptionEntry
 | |
|         bx              r1
 | |
| 
 | |
| _DataAbortEntry:
 | |
|         stmfd           sp!,{r0-r1}
 | |
|         mov             r0,#4
 | |
|         sub             lr,lr,#8
 | |
|         ldr             r1,_CommonExceptionEntry
 | |
|         bx              r1
 | |
| 
 | |
| _ReservedExceptionEntry:
 | |
|         stmfd           sp!,{r0-r1}
 | |
|         mov             r0,#5
 | |
|         ldr             r1,_CommonExceptionEntry
 | |
|         bx              r1
 | |
| 
 | |
| _IrqEntry:
 | |
|         stmfd           sp!,{r0-r1}
 | |
|         mov             r0,#6
 | |
|         sub             lr,lr,#4
 | |
|         ldr             r1,_CommonExceptionEntry
 | |
|         bx              r1
 | |
| 
 | |
| _FiqEntry:
 | |
|         stmfd           sp!,{r0-r1}
 | |
|         mov             r0,#7
 | |
|         sub             lr,lr,#4
 | |
|         ldr             r1,_CommonExceptionEntry
 | |
|         bx              r1
 | |
| 
 | |
| _CommonExceptionEntry:
 | |
|         .byte             0x12
 | |
|         .byte             0x34
 | |
|         .byte             0x56
 | |
|         .byte             0x78
 | |
| 
 | |
| _ExceptionHandlersEnd:
 | |
| 
 | |
| LIndirectgExceptionHandlers:
 | |
|         .long             _gExceptionHandlers
 | |
| 
 | |
| _AsmCommonExceptionEntry:
 | |
|         mrc             p15, 0, r1, c6, c0, 2   @ Read IFAR
 | |
|         stmfd           sp!,{r1}                @ Store the IFAR
 | |
|         
 | |
|         mrc             p15, 0, r1, c5, c0, 1   @ Read IFSR
 | |
|         stmfd           sp!,{r1}                @ Store the IFSR
 | |
|         
 | |
|         mrc             p15, 0, r1, c6, c0, 0   @ Read DFAR
 | |
|         stmfd           sp!,{r1}                @ Store the DFAR
 | |
|         
 | |
|         mrc             p15, 0, r1, c5, c0, 0   @ Read DFSR
 | |
|         stmfd           sp!,{r1}                @ Store the DFSR
 | |
|         
 | |
|         mrs             r1,spsr                 @ Read SPSR (which is the pre-exception CPSR)
 | |
|         stmfd           sp!,{r1}                @ Store the SPSR
 | |
|         
 | |
|         stmfd           sp!,{lr}                @ Store the link register (which is the pre-exception PC)
 | |
|         stmfd           sp,{sp,lr}^             @ Store user/system mode stack pointer and link register
 | |
|         nop                                     @ Required by ARM architecture
 | |
|         sub             sp,sp,#0x08             @ Adjust stack pointer
 | |
|         stmfd           sp!,{r2-r12}            @ Store general purpose registers
 | |
|         
 | |
|         ldr             r3,[sp,#0x40]           @ Read saved R1 from the stack (it was saved by the exception entry routine)
 | |
|         ldr             r2,[sp,#0x3C]           @ Read saved R0 from the stack (it was saved by the exception entry routine)
 | |
|         stmfd           sp!,{r2-r3}	            @ Store general purpose registers R0 and R1
 | |
|         
 | |
|         mov             r1,sp                   @ Prepare System Context pointer as an argument for the exception handler
 | |
|         
 | |
|         ldr             r2,LIndirectgExceptionHandlers  @ Offset to 32-bit address of exception handler
 | |
|         ldr             r2,[r2]                         @ Load exception handler table
 | |
|         ldr             r3,[r2,r0,lsl #2]               @ Index to find the handler for this exception
 | |
|         
 | |
| //        blx             r3                      @ Call exception handler
 | |
|         bx             r3                      @ Call exception handler
 | |
|         
 | |
|         ldr             r2,[sp,#0x40]           @ Load CPSR from context, in case it has changed
 | |
|         msr             SPSR_cxsf,r2            @ Store it back to the SPSR to be restored when exiting this handler
 | |
| 
 | |
|         ldmfd           sp!,{r0-r12}            @ Restore general purpose registers
 | |
|         ldmia           sp,{sp,lr}^             @ Restore user/system mode stack pointer and link register
 | |
|         nop                                     @ Required by ARM architecture
 | |
|         add             sp,sp,#0x08             @ Adjust stack pointer
 | |
|         ldmfd           sp!,{lr}                @ Restore the link register (which is the pre-exception PC)
 | |
|         add             sp,sp,#0x1C             @ Clear out the remaining stack space
 | |
|         movs            pc,lr                   @ Return from exception
 | |
|         
 |