reactos/ntoskrnl/include/internal/arm/kxarm.h
2013-06-16 22:01:41 +00:00

189 lines
3.3 KiB
C

.macro TEXTAREA
.section .text, "rx"
.align 2
.endm
.macro NESTED_ENTRY Name
.global &Name
.align 2
.func &Name
&Name:
.endm
.macro PROLOG_END Name
prolog_&Name:
.endm
.macro ENTRY_END Name
end_&Name:
.endfunc
.endm
.macro TRAP_PROLOG Abort
//
// Fixup lr
//
.if \Abort
sub lr, lr, #8
.else
sub lr, lr, #4
.endif
//
// Save the bottom 4 registers
//
stmdb sp, {r0-r3}
//
// Save the abort lr, sp, spsr, cpsr
//
mov r0, lr
mov r1, sp
mrs r2, cpsr
mrs r3, spsr
//
// Switch to SVC mode
//
bic r2, r2, #CPSR_MODES
orr r2, r2, #CPSR_SVC_MODE
msr cpsr_c, r2
//
// Save the SVC sp before we modify it
//
mov r2, sp
//
// Make space for the trap frame
//
sub sp, sp, #TrapFrameLength
//
// Save abt32 state
//
str r0, [sp, #TrPc]
str lr, [sp, #TrSvcLr]
str r2, [sp, #TrSvcSp]
//
// Restore the saved SPSR
//
msr spsr_all, r3
//
// Restore our 4 registers
//
ldmdb r1, {r0-r3}
//
// Build trap frame
// FIXME: Change to stmdb later
//
str r0, [sp, #TrR0]
str r1, [sp, #TrR1]
str r2, [sp, #TrR2]
str r3, [sp, #TrR3]
str r4, [sp, #TrR4]
str r5, [sp, #TrR5]
str r6, [sp, #TrR6]
str r7, [sp, #TrR7]
str r8, [sp, #TrR8]
str r9, [sp, #TrR9]
str r10, [sp, #TrR10]
str r11, [sp, #TrR11]
str r12, [sp, #TrR12]
mov r12, sp
add r12, r12, #TrUserSp
stm r12, {sp, lr}^
mrs r0, spsr_all
str r0, [sp, #TrSpsr]
ldr r0, =0xBADB0D00
str r0, [sp, #TrDbgArgMark]
.endm
.macro SYSCALL_PROLOG
//
// Make space for the trap frame
//
sub sp, sp, #TrapFrameLength
//
// Build trap frame
// FIXME: Change to stmdb later
//
str r0, [sp, #TrR0]
str r1, [sp, #TrR1]
str r2, [sp, #TrR2]
str r3, [sp, #TrR3]
str r4, [sp, #TrR4]
str r5, [sp, #TrR5]
str r6, [sp, #TrR6]
str r7, [sp, #TrR7]
str r8, [sp, #TrR8]
str r9, [sp, #TrR9]
str r10, [sp, #TrR10]
str r11, [sp, #TrR11]
str r12, [sp, #TrR12]
mov r12, sp
add r12, r12, #TrUserSp
stm r12, {sp, lr}^
str sp, [sp, #TrSvcSp]
str lr, [sp, #TrPc]
mrs r0, spsr_all
str r0, [sp, #TrSpsr]
ldr r0, =0xBADB0D00
str r0, [sp, #TrDbgArgMark]
.endm
.macro TRAP_EPILOG SystemCall
//
// ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00)
//
ldr r0, [sp, #TrDbgArgMark]
ldr r1, =0xBADB0D00
cmp r0, r1
bne 1f
//
// Get the SPSR and restore it
//
ldr r0, [sp, #TrSpsr]
msr spsr_all, r0
//
// Restore the registers
// FIXME: Use LDMIA later
//
mov r0, sp
add r0, r0, #TrUserSp
ldm r0, {sp, lr}^
ldr r0, [sp, #TrR0]
ldr r1, [sp, #TrR1]
ldr r2, [sp, #TrR2]
ldr r3, [sp, #TrR3]
ldr r4, [sp, #TrR4]
ldr r5, [sp, #TrR5]
ldr r6, [sp, #TrR6]
ldr r7, [sp, #TrR7]
ldr r8, [sp, #TrR8]
ldr r9, [sp, #TrR9]
ldr r10, [sp, #TrR10]
ldr r11, [sp, #TrR11]
ldr r12, [sp, #TrR12]
//
// Restore program execution state
//
.if \SystemCall
ldr lr, [sp, #TrPc]
add sp, sp, #TrapFrameLength
movs pc, lr
.else
add sp, sp, #TrSvcSp
ldmia sp, {sp, lr, pc}^
.endif
1:
b .
.endm