oemabort.s

来自「PXA255 WINCE 4.2 BSP ,该BSP是商用的。」· S 代码 · 共 151 行

S
151
字号
;
; Copyright (c) Microsoft Corporation.  All rights reserved.
;
;
; Use of this source code is subject to the terms of the Microsoft end-user
; license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
; If you did not accept the terms of the EULA, you are not authorized to use
; this source code. For a copy of the EULA, please see the LICENSE.RTF on your
; install media.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Header file for the data abort veneer
; =====================================
;
; This file selects options suitable for Windows CE's use of
; the data abort veneer.
;

	IF _TGTCPU = "ARMV4"
		GBLS    AreaName
AreaName        SETS    "|.text|"

		GBLS    VeneerEntry
VeneerEntry     SETS    "OEMDataAbortHandler"

		GBLL    BaseUpdated
BaseUpdated     SETL    {TRUE}

		GBLL    BaseRestored
BaseRestored    SETL    {FALSE}

		GBLS    HandlerCallStd
HandlerCallStd  SETS    "APCS_MACRO"

		GBLS    HandlerName
HandlerName     SETS    "HandlerMacro"

		MACRO
		HandlerMacro
		CMP     R0,#DABORT_ERROR_NONE
		MOVEQ   R0,#DABORT_RETVAL_TONEXT
		MOVNE   R0,#DABORT_RETVAL_UNDEF
		MEND

		GBLS    ReturnUndef
ReturnUndef     SETS    "0xFFFF0004"

		GBLS    ReturnToNext
ReturnToNext    SETS    "DataAbortHandler"

		INCLUDE dabort.s

	ELSE

;TEST_DISPLAYING_MARKERS EQU 1

        OPT     2       ; disable listing
        INCLUDE kxarm.h
        INCLUDE XSC1.inc
      IF :DEF: TEST_DISPLAYING_MARKERS
        INCLUDE XSC1BD.inc
      ENDIF; :DEF: TEST_DISPLAYING_MARKERS
        OPT     1       ; reenable listing
        OPT     128     ; disable listing of macro expansions


        TEXTAREA
        IMPORT  DataAbortHandler
  IF B_STEP_PXA2X0 = "1"
        IMPORT  Batt_FaultHandler
  ENDIF; B_STEP_PXA2X0 = "1"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 
;;  OEMDataAbortHandler()
;;   - Subroutine implementation that is aware of Imprecise Data Abort
;;     due to power emergency.
;;
        LEAF_ENTRY OEMDataAbortHandler

    IF B_STEP_PXA2X0 = "1"

PSFS_BIT_MASK EQU 0x20  ; in cp7, reg 4: (1<<5)

        ; Only using imprecise data abort for B steppings of
        ;  PXA250 or PXA210

;; Do the imprecise data abort / Batt fault test 

    stmdb   sp!, {r0-r3}
    mrs     r0, cpsr
    str     r0, [sp, #-4]!       ; push r0

;; For testing, need to force IDAE bit here in CE .NET because that OS variant
;;  clears it as of 2002/04/01 
;        ldr     r2,  =PWR_BASE_U_VIRTUAL
            ; set the immediate sleep mode on batt/vdd fault
;        mov     r1, #1                       ; force Imprecise Data Abort on Fault
;        str     r1, [r2, #PMCR_OFFSET]


  IF :DEF: TEST_DISPLAYING_MARKERS
    IF PLAT_LUBBOCK = "1"
    ; development, just prove we got here.
        ldr r0, =(0x88800999)
        ldr     r1,  =(FPGA_REGS_BASE_U_VIRTUAL)
        str     r0,  [r1, #HEXLED_OFFSET]
        ldr     r1, =(0x1000)
11
        subs    r1, r1, #1
        bne     %B11
    ENDIF; PLAT_LUBBOCK = "1"
  ENDIF; :DEF: TEST_DISPLAYING_MARKERS

    ;; Get access to coprocessor
    mrc     p15, 0, r3, c15, c1, 0   ;Get Reg15 of CP15 
    str     r3, [sp, #-4]!           ; push r3: save cp15:15 on stack
    orr     r3, r3, #0x80            ;  Permission bit for CP7
    mcr     p15, 0, r3, c15, c1, 0   ;Now set the new value into R15 of CP15
    CPWAIT  

    mrc     p7,0,r2,c4,c1,0     ; CP7, r4 data into processor r2
    CPWAIT  

    tst     r2, #PSFS_BIT_MASK  ; Power emergency?
    bne     Batt_FaultHandler   ; Yes, handle the battery fault.  Never return.

                                ; No power emergency, clean up and  return.
    ldr     r3, [sp], #4        ; pop r3 (previous Cp15:15)
    mcr     p15, 0, r3, c15, c1, 0   ;Now set the old value back into R15 of CP15
    CPWAIT  

    ; pop flags in r0 - going back to main path
    ldr     r0, [sp], #4        ; pop cpsr
    msr     cpsr_c, r0
    ldmia   sp!, {r0-r3}        ; restore all used registers

    ENDIF ; B_STEP_PXA2X0 = "1"

    b       DataAbortHandler        ; Jump to the main data abort handler

;;
;; End of OEMDataAbortHandler()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	ENDIF

		END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?