⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intr.s

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 S
📖 第 1 页 / 共 2 页
字号:
	msr     cpsr_c, #ABORT_MODE | 0x80      @ switch back to abort mode w/IRQs disabled
	
	ldmfd   sp!, {r4}             	@ 恢复r4
	
	mov     r0, lr
	mrs     r1, spsr

	msr     cpsr_c, #SYS_MODE | 0x80       @ switch to system mode w/IRQs disabled
	stmfd   sp!, {r0-r1}                   @ save lr and spsr

	msr     cpsr_c, #SYS_MODE             @ w/IRQs enable
	bl      INTR_PrefetchAbort             @ 调用C异常处理函数

    msr     cpsr_c, #SYS_MODE | 0x80      @ switch to sys mode w/IRQs disabed
	ldmfd   sp!, {r0-r1}                  @ restore lr and spsr
	msr     cpsr_c, #ABORT_MODE | 0x80       @ switch back to abort mode w/IRQs disabled
    mov     lr, r0
	msr     spsr, r1

	msr     cpsr_c, #SYS_MODE | 0x80       @ switch to system mode w/IRQs disabled
	ldmfd   sp!, {r0-r3, r12, lr}          @ restore r0-r3,r12, and lr

	msr     cpsr_c, #ABORT_MODE | 0x80     @ switch back to abort mode w/IRQs disabled
    movs    pc, lr                         @ 返回
    
@ 正常调用返回退出
_HandleCallReturn:
    msr    cpsr_c, #SYS_MODE       @ switch to system mode w/IRQs enable
    b      APICallRet              @
    
@=======================================================
@=======================================================
    ENTRY ES_DataAbortHandler
	sub     lr, lr, #8
	stmfd   sp!, {r0-r3, r12, lr}           @ save some register

    mfc15   r0, c6                          @ (r0) = fault address
    mfc15   r1, c5                          @ (r1) = fault status

	and     r1, r1, #0x0D                   @ type of data abort
    cmp     r1, #0x05                       @ translation error?
	movne   r0, #0x0
	bleq    LoadFailurePage

	cmp     r0, #0x0	                    @ not handle the page failure
	ldmnefd sp!, {r0-r3,r12,pc}^

@   now to handle exception
	ldmfd   sp!, {r0-r3,r12,lr}             @ 恢复r0-r3,r12,lr
   	                                        @ 装入页错误, 以下处理错误
	stmfd   sp!, {r4}           			@ save r4

	msr     cpsr_c, #SYS_MODE | 0x80        @ switch to system mode w/IRQs disabled
	
	@ 切换到 sys sp	
	ldr     r4, =lpCurThread
	ldr     r4, [r4]
	add     sp, r4, #0x400        @=0x400-4
	sub     sp, sp, #4
	
	stmfd   sp!, {r0-r3, r12, lr}           @ save r0-r3,r12, and lr

	msr     cpsr_c, #ABORT_MODE | 0x80      @ switch back to abort mode w/IRQs disabled
	
	ldmfd   sp!, {r4}           			@ 恢复r4
		
	mov     r0, lr
	mrs     r1, spsr
    mfc15   r3, c6                          @ (r3) = abort address
    mfc15   r12, c5                         @ (r12) = abort status

	msr     cpsr_c, #SYS_MODE | 0x80       @ switch to system mode w/IRQs disabled
	stmfd   sp!, {r0-r1}                   @ save lr and spsr

    mov     r1, r3                         @为INTR_DataAbort准备参数
	mov     r2, r12                        @为INTR_DataAbort准备参数   
	msr     cpsr_c, #SYS_MODE             @ w/IRQs enable
	bl      INTR_DataAbort                 @ 调用C异常处理函数 (r0)=abort pc address (r1) = abort data address,(r2) = abort status, 

    msr     cpsr_c, #SYS_MODE | 0x80      @ switch to sys mode w/IRQs disabed
	ldmfd   sp!, {r0-r1}                  @ restore lr and spsr
	msr     cpsr_c, #ABORT_MODE | 0x80    @ switch back to abort mode w/IRQs disabled
    mov     lr, r0
	msr     spsr, r1

	msr     cpsr_c, #SYS_MODE | 0x80       @ switch to system mode w/IRQs disabled
	ldmfd   sp!, {r0-r3, r12, lr}          @ restore r0-r3,r12, and lr

	msr     cpsr_c, #ABORT_MODE | 0x80     @ switch back to abort mode w/IRQs disabled
    movs    pc, lr                         @ 返回

@=======================================================
@=======================================================
    ENTRY ES_UnusedHandler

	stmfd   sp!, {r0-r3, r12, lr}           @ save some register 
    mrs     r1, spsr                        @ r1 = spsr
    stmfd   sp!, {r1}                       @ save SPSR onto the IRQ stack

    mov  r0, #0x01
	bl INTR_HandleErrorTrap

    ldmfd   sp!, {r1}                       @ restore IRQ SPSR from the IRQ stack
    msr     spsr, r1                        @ spsr = r1
	ldmfd   sp!, {r0-r3, r12, lr}           @ restore some register
	@subs pc, lr, #4		@ return
	movs pc, lr

	
@=======================================================
@=============================================================
    ENTRY ES_IRQHandler
	sub     lr, lr, #4
	msr     cpsr_c, #SYS_MODE | 0x80       @ switch to system mode w/IRQs disabled
	stmfd   sp!, {r0-r3, r12, lr}          @ save r0-r3,r12, and lr

	msr     cpsr_c, #IRQ_MODE | 0x80       @ switch back to IRQ mode w/IRQs disabled
	mov     r0, lr
   	mrs     r1, spsr

	msr     cpsr_c, #SYS_MODE | 0x80       @ switch to system mode w/IRQs disabled
	stmfd   sp!, {r0-r1}                   @ save lr and spsr
	bl      INTR_Interrupt                 @ 调用C中断处理函数(参数r0=pc)

    msr     cpsr_c, #SYS_MODE              @ switch to supervisor mode w/IRQs enable
	bl      DefaultHandler                 @ 调用C默认处理函数

    msr     cpsr_c, #SYS_MODE | 0x80        @ switch to sys mode w/IRQs disabel
	ldmfd   sp!, {r0-r1}                    @ restore lr and spsr
	msr     cpsr_c, #IRQ_MODE | 0x80        @ switch back to IRQ mode w/IRQs disabled
    mov     lr, r0
	msr     spsr, r1

	msr     cpsr_c, #SYS_MODE | 0x80       @ switch to system mode w/IRQs disabled
	ldmfd   sp!, {r0-r3, r12, lr}                   @ restore r0-r3,r12, and lr

	msr     cpsr_c, #IRQ_MODE | 0x80       @ switch back to IRQ mode w/IRQs disabled
    movs    pc, lr

@=======================================================
@=======================================================
    ENTRY ES_FIQHandler
	stmfd   sp!, {r0-r3, r12, lr}           @ save some register 
    mrs     r1, spsr                        @ r1 = spsr
    stmfd   sp!, {r1}                       @ save SPSR onto the IRQ stack

	mov r0, #0x02                       @ r0 = trap message
	bl INTR_HandleErrorTrap				@ call c code

    ldmfd   sp!, {r1}                       @ restore IRQ SPSR from the IRQ stack
    msr     spsr, r1                        @ spsr = r1
	ldmfd   sp!, {r0-r3, r12, lr}           @ restore some register
	subs pc, lr, #4		@ return


@=======================================================
@INTR_ON - enable interrupts
@=======================================================
        ENTRY INTR_ON

        mrs     r0, cpsr                        @ (r0) = current status
        bic     r1, r0, #0x80                   @ clear interrupt disable bit
        msr     cpsr, r1                        @ update status register
        mov     pc, lr                                  @ return to caller


@=======================================================
@ INTR_OFF - disable interrupts
@=======================================================
        ENTRY INTR_OFF

        mrs     r0, cpsr                        @ (r0) = current status
        orr     r1, r0, #0x80                   @ set interrupt disable bit
        msr     cpsr, r1                        @ update status register
        mov     pc, lr                          @ return to caller


@=======================================================
@=======================================================

	ENTRY SetDataBreakpoint
	@r0 = Access data breakpoint address register (DBAR).
	@r1 = Access data breakpoint value register (DBVR).
	@r2 = Access data breakpoint mask register (DBMR).
	@r3 = Load data breakpoint control register (DBCR).
	mcr p15,0,r0,c14,c0,0
	mcr p15,0,r1,c14,c1,0
	mcr p15,0,r2,c14,c2,0
	mcr p15,0,r3,c14,c3,0
	mov	pc, lr			@ return


@=======================================================
@=======================================================

	ENTRY SetInstructionBreakpoint
	@r0 = Write instruction breakpoint address and control register (IBCR).
	cmp r0, #0x0
	orrne r0, r0, #0x1                   @ enable InstructionBreakpoint
	mcrne p15,0,r0,c14,c8,0
	mov	pc, lr			@ return

@=======================================================
@=======================================================

	ENTRY GetInstructionBreakpoint
	mrc p15,0,r0,c14,c8,0
	mov	pc, lr			@ return


@=======================================================
@=======================================================

    ENTRY SetCPUId

    mtc15   r0, c13                         @ set process base address register
    nop
    nop
	mov	pc, lr			@ return

@=======================================================
@=======================================================
    ENTRY GetCPUId

    mfc15   r0, c13                         @ set process base address register
	mov	pc, lr			@ return

@=======================================================
@=======================================================

    ENTRY KL_GetCPSR
    mrs     r0, cpsr                        @ (r0) = current status
    mov     pc, lr                                  @ return to caller


    @LEAF_ENTRY KL_SetCPSR
    @stmfd   sp!, {r0, r1, lr}           @ save some register 
    @msr     spsr, r0                               @ (r0) = new status
	@ldmfd   sp!, {r0, r1, pc}^
	@movs     pc, lr
	@ENTRY_END  

⌨️ 快捷键说明

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