X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Farch%2Farmv7%2Fstart.S;h=2d3f81a5d1e299a0f7ec91144b4ff42f0330e1da;hb=419b7b18a70e5f65698c5eda4f62f546f02d32e4;hp=ef6ac76a94374b84d6a0938e44d041a754fd9ee0;hpb=f4ea8dd4c261e7a3a10d768c01cd3a121b42a045;p=tpg%2Facess2.git diff --git a/Kernel/arch/armv7/start.S b/Kernel/arch/armv7/start.S index ef6ac76a..2d3f81a5 100644 --- a/Kernel/arch/armv7/start.S +++ b/Kernel/arch/armv7/start.S @@ -68,14 +68,17 @@ _ptr_kmain: .extern SyscallHandler SVC_Handler: @ sub lr, #4 - srsdb sp!, #19 @ Switch to supervisor mode (DDI0406B D1.6.5) (actually SRSFD) - cpsid ifa, #19 + srsdb sp!, #19 @ Save state to stack + cpsie ifa, #19 @ Ensure we're in supervisor with interrupts enabled (should already be there) push {r0-r12} ldr r4, [lr,#-4] mvn r5, #0xFF000000 and r4, r5 + tst r4, #0x1000 + bne .arm_specifics + push {r4} mov r0, sp @@ -88,6 +91,18 @@ SVC_Handler: pop {r4-r12} rfeia sp! @ Pop state (actually RFEFD) +.arm_specifics: + and r4, #0xFF + mov r0, r4 @ Number + mov r1, sp @ Arguments + + ldr r4, =ARMv7_int_HandleSyscalls + blx r4 + + add sp, #4*4 + pop {r4-r12} + rfeia sp! + .globl gpIRQHandler gpIRQHandler: .long 0 @@ -135,7 +150,6 @@ DataAbort: @ POP_GPRS @ rfeia sp! @ Pop state (actually RFEFD) - bx lr .globl PrefetchAbort PrefetchAbort: @@ -152,6 +166,7 @@ PrefetchAbort: blx r4 b . +.section .rodata csIRQ_Tag: csAbort_Tag: .asciz "ARMv7"