📄 entry-armv.s
字号:
#error INTSR stride != INTMR stride#endif .macro get_irqnr_and_base, irqnr, stat, base, mask mov \base, #CLPS7111_BASE ldr \stat, [\base, #INTSR1] ldr \mask, [\base, #INTMR1] mov \irqnr, #4 mov \mask, \mask, lsl #16 and \stat, \stat, \mask, lsr #16 movs \stat, \stat, lsr #4 bne 1001f add \base, \base, #INTSR2 - INTSR1 ldr \stat, [\base, #INTSR1] ldr \mask, [\base, #INTMR1] mov \irqnr, #16 mov \mask, \mask, lsl #16 and \stat, \stat, \mask, lsr #161001: tst \stat, #255 addeq \irqnr, \irqnr, #8 moveq \stat, \stat, lsr #8 tst \stat, #15 addeq \irqnr, \irqnr, #4 moveq \stat, \stat, lsr #4 tst \stat, #3 addeq \irqnr, \irqnr, #2 moveq \stat, \stat, lsr #2 tst \stat, #1 addeq \irqnr, \irqnr, #1 moveq \stat, \stat, lsr #1 tst \stat, #1 @ bit 0 should be set .endm .macro irq_prio_table .endm#elif defined(CONFIG_ARCH_ANAKIN) .macro disable_fiq .endm .macro get_irqnr_and_base, irqnr, irqstat, base, tmp mov \base, #IO_BASE mov \irqstat, #INTERRUPT_CONTROLLER ldr \tmp, =anakin_irq_mask ldr \irqstat, [\base, \irqstat] ldr \tmp, [\tmp] ands \irqstat, \irqstat, \tmp ldrne \tmp, =anakin_active_irqs strne \irqstat, [\tmp] movne \irqnr, #IRQ_ANAKIN .endm .macro irq_prio_table .ltorg .bssENTRY(anakin_irq_mask) .word 0ENTRY(anakin_active_irqs) .space 4 .text .endm#elif defined(CONFIG_ARCH_CNXT) .macro disable_fiq .endm .macro get_irqnr_and_base, irqnr, irqstat, base, tmp#ifdef CONFIG_ARCH_P52 ldr r4, =P52INT_STATUS_M ldr \irqstat, [r4] tst \irqstat, #P52INT_MASK_TIMER_1 movne \irqnr, #P52INT_LVL_TIMER_1 bne 1001f tst \irqstat, #P52INT_MASK_TIMER_2 movne \irqnr, #P52INT_LVL_TIMER_2 bne 1001f tst \irqstat, #P52INT_MASK_TIMER_3 movne \irqnr, #P52INT_LVL_TIMER_3 bne 1001f tst \irqstat, #P52INT_MASK_TIMER_4 movne \irqnr, #P52INT_LVL_TIMER_4 bne 1001f tst \irqstat, #P52INT_MASK_USB movne \irqnr, #P52INT_LVL_USB bne 1001f tst \irqstat, #P52INT_MASK_HOST movne \irqnr, #P52INT_LVL_HOST bne 1001f tst \irqstat, #P52INT_MASK_HOST_ERR movne \irqnr, #P52INT_LVL_HOST_ERR bne 1001f tst \irqstat, #P52INT_MASK_DMA8 movne \irqnr, #P52INT_LVL_DMA8 bne 1001f tst \irqstat, #P52INT_MASK_DMA6 movne \irqnr, #P52INT_LVL_DMA6 bne 1001f tst \irqstat, #P52INT_MASK_DMA5 movne \irqnr, #P52INT_LVL_DMA5 bne 1001f tst \irqstat, #P52INT_MASK_DMA4 movne \irqnr, #P52INT_LVL_DMA4 bne 1001f tst \irqstat, #P52INT_MASK_DMA3 movne \irqnr, #P52INT_LVL_DMA3 bne 1001f tst \irqstat, #P52INT_MASK_DMA2 movne \irqnr, #P52INT_LVL_DMA2 bne 1001f tst \irqstat, #P52INT_MASK_DMA1 movne \irqnr, #P52INT_LVL_DMA1 bne 1001f tst \irqstat, #P52INT_MASK_DMA_ERR movne \irqnr, #P52INT_LVL_DMA_ERR bne 1001f tst \irqstat, #P52INT_MASK_E2_ERR movne \irqnr, #P52INT_LVL_E2_ERR bne 1001f tst \irqstat, #P52INT_MASK_E1_ERR movne \irqnr, #P52INT_LVL_E1_ERR bne 1001f tst \irqstat, #P52INT_MASK_DSL movne \irqnr, #P52INT_LVL_DSL bne 1001f tst \irqstat, #P52INT_MASK_GPIO movne \irqnr, #P52INT_LVL_GPIO bne 1001f tst \irqstat, #P52INT_MASK_COMMTX movne \irqnr, #P52INT_LVL_COMMTX bne 1001f tst \irqstat, #P52INT_MASK_COMMRX movne \irqnr, #P52INT_LVL_COMMRX bne 1001f tst \irqstat, #P52INT_MASK_SW1 movne \irqnr, #P52INT_LVL_SW1 bne 1001f tst \irqstat, #P52INT_MASK_SW2 movne \irqnr, #P52INT_LVL_SW2 bne 1001f tst \irqstat, #P52INT_MASK_SW3 movne \irqnr, #P52INT_LVL_SW3 bne 1001f tst \irqstat, #P52INT_MASK_SW4 movne \irqnr, #P52INT_LVL_SW4 1001:#endif #ifdef CONFIG_ARCH_SPIPE @ @ not been tested @ ldr r4, =0x350044 ldr \irqnr, [r4] mov r5,#0icloopusr: cmp r5,#31 ble icshftusr b icendusricshftusr: mov r4,r6,lsr r5 @ shift untill we get one and r0,r4,#1 @ int priority is in the status cmp r0,#0 beq incicusr b icendusrincicusr: add r5,r5,#1 b icloopusr icendusr: mov r0, r5#endif .endm .macro irq_prio_table .endm #elif defined(CONFIG_ARCH_ATMEL) .macro disable_fiq .endm .macro get_irqnr_and_base, irqnr, irqstat, base, tmp ldr r4, =AIC_IVR ldr \irqnr, [r4] @ignore value ldr r4, =AIC_ISR @read interrupt nr. ldr \irqnr, [r4] teq \irqnr, #0 ldreq r4, =AIC_EOICR @ EOI streq r4, [r4] @ value=dont care .endm .macro irq_prio_table .endm#elif defined(CONFIG_ARCH_NETARM)#include <asm/arch/netarm_gen_module.h> .macro disable_fiq mrs r13, spsr orr r13, r13, #F_BIT msr spsr_c, r13 .endm .macro get_irqnr_and_base, irqnr, stat, base, temp ldr \irqnr, =(NETARM_GEN_MODULE_BASE+NETARM_GEN_INTR_STATUS_EN) ldr \base, [\irqnr, #0] @ stash ISTATUS mov \irqnr, #01001: cmp \base, #0 @ no flags set? beq 1002f @ keep "eq" status when finishing! tst \base, #1 @ lsb set? addeq \irqnr, \irqnr, #1 @ if not, incr IRQ# moveq \base, \base, LSR #1 @ r = r >> 1 beq 1001b cmp \irqnr, #32 @ IRQ# too big? blge _netarm_led_FAIL21002: adr \base, irq_prio_netarm .endm .macro irq_prio_tableirq_prio_netarm: .byte 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .byte 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 .endm#elif defined(CONFIG_ARCH_SAMSUNG) .macro disable_fiq .endm .macro get_irqnr_and_base, irqnr, irqstat, base, tmp ldr \base, =INTOSET_IRQ ldr \irqnr, [\base] mov \irqnr, \irqnr, lsr #2 teq \irqnr, #21 .endm .macro irq_prio_table .endm#elif defined(CONFIG_ARCH_S3C44B0) .macro disable_fiq .endm .macro get_irqnr_and_base, irqnr, irqstat, base, tmp ldr \base, =0x01e00020 @I_ISPR ldr \base, [\base] mov \irqnr, #02222: tst \base, #1 bne 1111f add \irqnr, \irqnr, #1 mov \base, \base, lsr #1 cmp \irqnr, #26 bcc 2222b1111: .endm .macro irq_prio_table .endm#elif defined(CONFIG_ARCH_SWARM) .macro disable_fiq .endm .macro get_irqnr_and_base, irqnr, irqstat, base, tmp ldr \irqstat, =SWARM_INT_IRQ_STATUS ldr \irqstat, [\irqstat] @ get interrupts mov \irqnr, #01001: tst \irqstat, #1 bne 1002f add \irqnr, \irqnr, #1 mov \irqstat, \irqstat, lsr #1 cmp \irqnr, #32 bcc 1001b1002: /* EQ will be set if we reach 32 */ .endm .macro irq_prio_tableirq_prio_swarm: .byte 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 .endm#else#error Unknown architecture#endif/* * Invalid mode handlers */__pabt_invalid: sub sp, sp, #S_FRAME_SIZE @ Allocate frame size in one go stmia sp, {r0 - lr} @ Save XXX r0 - lr ldr r4, .LCabt mov r1, #BAD_PREFETCH b 1f__dabt_invalid: sub sp, sp, #S_FRAME_SIZE stmia sp, {r0 - lr} @ Save SVC r0 - lr [lr *should* be intact] ldr r4, .LCabt mov r1, #BAD_DATA b 1f__irq_invalid: sub sp, sp, #S_FRAME_SIZE @ Allocate space on stack for frame stmfd sp, {r0 - lr} @ Save r0 - lr ldr r4, .LCirq mov r1, #BAD_IRQ b 1f__und_invalid: sub sp, sp, #S_FRAME_SIZE stmia sp, {r0 - lr} ldr r4, .LCund mov r1, #BAD_UNDEFINSTR @ int reason1: zero_fp ldmia r4, {r5 - r7} @ Get XXX pc, cpsr, old_r0 add r4, sp, #S_PC stmia r4, {r5 - r7} @ Save XXX pc, cpsr, old_r0 mov r0, sp and r2, r6, #31 @ int mode b SYMBOL_NAME(bad_mode)#if defined CONFIG_FPE_NWFPE || defined CONFIG_FPE_FASTFPE /* The FPE is always present */ .equ fpe_not_present, 0#elsewfs_mask_data: .word 0x0e200110 @ WFS/RFS .word 0x0fef0fff .word 0x0d000100 @ LDF [sp]/STF [sp] .word 0x0d000100 @ LDF [fp]/STF [fp] .word 0x0f000f00/* We get here if an undefined instruction happens and the floating * point emulator is not present. If the offending instruction was * a WFS, we just perform a normal return as if we had emulated the * operation. This is a hack to allow some basic userland binaries * to run so that the emulator module proper can be loaded. --philb */fpe_not_present: adr r10, wfs_mask_data ldmia r10, {r4, r5, r6, r7, r8} ldr r10, [sp, #S_PC] @ Load PC sub r10, r10, #4 mask_pc r10, r10 ldrt r10, [r10] @ get instruction and r5, r10, r5 teq r5, r4 @ Is it WFS? moveq pc, r9 and r5, r10, r8 teq r5, r6 @ Is it LDF/STF on sp or fp? teqne r5, r7 movne pc, lr tst r10, #0x00200000 @ Does it have WB moveq pc, r9 and r4, r10, #255 @ get offset and r6, r10, #0x000f0000 tst r10, #0x00800000 @ +/- ldr r5, [sp, r6, lsr #14] @ Load reg rsbeq r4, r4, #0 add r5, r5, r4, lsl #2 str r5, [sp, r6, lsr #14] @ Save reg mov pc, r9#endif/* * SVC mode handlers */ .align 5__dabt_svc: sub sp, sp, #S_FRAME_SIZE stmia sp, {r0 - r12} @ save r0 - r12 ldr r2, .LCabt add r0, sp, #S_FRAME_SIZE ldmia r2, {r2 - r4} @ get pc, cpsr add r5, sp, #S_SP mov r1, lr stmia r5, {r0 - r4} @ save sp_SVC, lr_SVC, pc, cpsr, old_ro mrs r9, cpsr @ Enable interrupts if they were tst r3, #I_BIT biceq r9, r9, #I_BIT @ previously mov r0, r2/* * This routine must not corrupt r9 */#ifdef MULTI_CPU ldr r2, .LCprocfns mov lr, pc ldr pc, [r2] @ call processor specific code#else bl cpu_data_abort#endif msr cpsr_c, r9 mov r2, sp bl SYMBOL_NAME(do_DataAbort) mrs r0, cpsr bic r0, r0, #MODE_MASK orr r0, r0, #I_BIT | MODE_SVC @ preserve FIQ bit msr cpsr_c, r0 ldr r0, [sp, #S_PSR] msr spsr, r0 ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr .align 5__irq_svc: sub sp, sp, #S_FRAME_SIZE stmia sp, {r0 - r12} @ save r0 - r1 ldr r7, .LCirq add r5, sp, #S_FRAME_SIZE ldmia r7, {r7 - r9} add r4, sp, #S_SP mov r6, lr stmia r4, {r5, r6, r7, r8, r9} @ save sp_SVC, lr_SVC, pc, cpsr, old_ro1: get_irqnr_and_base r0, r6, r5, lr movne r1, sp @ @ routine called with r0 = irq number, r1 = struct pt_regs * @ adrsvc ne, lr, 1b bne do_IRQ ldr r0, [sp, #S_PSR] @ irqs are already disabled msr spsr, r0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -