Module Name: src Committed By: matt Date: Tue Jul 31 07:23:16 UTC 2012
Modified Files: src/sys/arch/arm/include: frame.h src/sys/arch/arm/include/arm32: frame.h Log Message: Make trapframe/irqframe an even number of words (make adjustments for the filler word). Improve the comments in PUSH/PULL macros. Use the armv6+ CPS instruction if we can. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/include/frame.h cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/include/arm32/frame.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/include/frame.h diff -u src/sys/arch/arm/include/frame.h:1.13 src/sys/arch/arm/include/frame.h:1.14 --- src/sys/arch/arm/include/frame.h:1.13 Sun Feb 19 21:06:05 2012 +++ src/sys/arch/arm/include/frame.h Tue Jul 31 07:23:16 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: frame.h,v 1.13 2012/02/19 21:06:05 rmind Exp $ */ +/* $NetBSD: frame.h,v 1.14 2012/07/31 07:23:16 matt Exp $ */ /* * Copyright (c) 1994-1997 Mark Brinicombe. @@ -67,6 +67,7 @@ typedef struct trapframe { register_t tf_r12; register_t tf_usr_sp; register_t tf_usr_lr; + register_t tf_fill; register_t tf_svc_sp; /* Not used on arm26 */ register_t tf_svc_lr; /* Not used on arm26 */ register_t tf_pc; Index: src/sys/arch/arm/include/arm32/frame.h diff -u src/sys/arch/arm/include/arm32/frame.h:1.24 src/sys/arch/arm/include/arm32/frame.h:1.25 --- src/sys/arch/arm/include/arm32/frame.h:1.24 Tue Jul 31 06:56:57 2012 +++ src/sys/arch/arm/include/arm32/frame.h Tue Jul 31 07:23:16 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: frame.h,v 1.24 2012/07/31 06:56:57 matt Exp $ */ +/* $NetBSD: frame.h,v 1.25 2012/07/31 07:23:16 matt Exp $ */ /* * Copyright (c) 1994-1997 Mark Brinicombe. @@ -71,6 +71,7 @@ typedef struct irqframe { unsigned int if_r12; unsigned int if_usr_sp; unsigned int if_usr_lr; + unsigned int if_fill; unsigned int if_svc_sp; unsigned int if_svc_lr; unsigned int if_pc; @@ -311,13 +312,13 @@ LOCK_CAS_DEBUG_LOCALS #define PUSHFRAME \ str lr, [sp, #-4]!; /* Push the return address */ \ - sub sp, sp, #(4*17); /* Adjust the stack pointer */ \ + sub sp, sp, #(4*18); /* Adjust the stack pointer */ \ stmia sp, {r0-r12}; /* Push the user mode registers */ \ add r0, sp, #(4*13); /* Adjust the stack pointer */ \ stmia r0, {r13-r14}^; /* Push the user mode registers */ \ mov r0, r0; /* NOP for previous instruction */ \ - mrs r0, spsr_all; /* Put the SPSR on the stack */ \ - str r0, [sp, #-4]! + mrs r0, spsr_all; /* Get the SPSR */ \ + str r0, [sp, #-4]! /* Push the SPSR on the stack */ /* * PULLFRAME - macro to pull a trap frame from the stack in the current mode @@ -325,12 +326,12 @@ LOCK_CAS_DEBUG_LOCALS */ #define PULLFRAME \ - ldr r0, [sp], #0x0004; /* Get the SPSR from stack */ \ + ldr r0, [sp], #0x0004; /* Pop the SPSR from stack */ \ msr spsr_all, r0; \ ldmia sp, {r0-r14}^; /* Restore registers (usr mode) */ \ mov r0, r0; /* NOP for previous instruction */ \ - add sp, sp, #(4*17); /* Adjust the stack pointer */ \ - ldr lr, [sp], #0x0004 /* Pull the return address */ + add sp, sp, #(4*18); /* Adjust the stack pointer */ \ + ldr lr, [sp], #0x0004 /* Pop the return address */ /* * PUSHFRAMEINSVC - macro to push a trap frame on the stack in SVC32 mode @@ -343,19 +344,28 @@ LOCK_CAS_DEBUG_LOCALS * SA110 rev 2 STM^ bug */ +#ifdef _ARM_ARCH_6 +#define SET_CPSR_MODE(tmp, mode) \ + cps #(mode) +#else +#define SET_CPSR_MODE(tmp, mode) \ + mrs tmp, cpsr; /* Get the CPSR */ \ + bic tmp, tmp, #(PSR_MODE); /* Fix for SVC mode */ \ + orr tmp, tmp, #(mode); \ + msr cpsr_c, tmp /* Punch into SVC mode */ +#endif + #define PUSHFRAMEINSVC \ stmdb sp, {r0-r3}; /* Save 4 registers */ \ mov r0, lr; /* Save xxx32 r14 */ \ mov r1, sp; /* Save xxx32 sp */ \ mrs r3, spsr; /* Save xxx32 spsr */ \ - mrs r2, cpsr; /* Get the CPSR */ \ - bic r2, r2, #(PSR_MODE); /* Fix for SVC mode */ \ - orr r2, r2, #(PSR_SVC32_MODE); \ - msr cpsr_c, r2; /* Punch into SVC mode */ \ + SET_CPSR_MODE(r2, PSR_SVC32_MODE); \ mov r2, sp; /* Save SVC sp */ \ str r0, [sp, #-4]!; /* Push return address */ \ str lr, [sp, #-4]!; /* Push SVC lr */ \ str r2, [sp, #-4]!; /* Push SVC sp */ \ + sub sp, sp, #4; /* Keep stack aligned */ \ msr spsr_all, r3; /* Restore correct spsr */ \ ldmdb r1, {r0-r3}; /* Restore 4 regs from xxx mode */ \ sub sp, sp, #(4*15); /* Adjust the stack pointer */ \ @@ -363,8 +373,8 @@ LOCK_CAS_DEBUG_LOCALS add r0, sp, #(4*13); /* Adjust the stack pointer */ \ stmia r0, {r13-r14}^; /* Push the user mode registers */ \ mov r0, r0; /* NOP for previous instruction */ \ - mrs r0, spsr_all; /* Put the SPSR on the stack */ \ - str r0, [sp, #-4]! + mrs r0, spsr_all; /* Get the SPSR */ \ + str r0, [sp, #-4]! /* Push the SPSR onto the stack */ /* * PULLFRAMEFROMSVCANDEXIT - macro to pull a trap frame from the stack @@ -374,11 +384,11 @@ LOCK_CAS_DEBUG_LOCALS */ #define PULLFRAMEFROMSVCANDEXIT \ - ldr r0, [sp], #0x0004; /* Get the SPSR from stack */ \ + ldr r0, [sp], #0x0004; /* Pop the SPSR from stack */ \ msr spsr_all, r0; /* restore SPSR */ \ ldmia sp, {r0-r14}^; /* Restore registers (usr mode) */ \ mov r0, r0; /* NOP for previous instruction */ \ - add sp, sp, #(4*15); /* Adjust the stack pointer */ \ + add sp, sp, #(4*16); /* Adjust the stack pointer */ \ ldmia sp, {sp, lr, pc}^ /* Restore lr and exit */ #endif /* _LOCORE */