Message ID | 000d01cd4d68$8b595f00$a20c1d00$@Yorsh@arm.com |
---|---|
State | New |
Headers | show |
On 18/06/12 16:39, Greta Yorsh wrote: > This test checks that the stack pointer is handled correctly in > prologue/epilogue of Cortex-M interrupt handlers. An interrupt handler may > be called when stack is not double-word aligned. The prologue of the > interrupt handler aligns the stack pointer and the epilogue restores the > original stack pointer. > > However, in this test, the stack is always double-word aligned when the > handler function foo is called. As a result, the test is not very effective, > for example it passes even if the epilogue does not restore the stack > pointer. This patch forces the stack pointer to be not double-word aligned > on the call to foo. > > Tested on qemu -cpu cortex-m3. > > Ok for trunk? > > Thanks, > Greta > > ChangeLog: > > gcc/testsuite > > 2012-06-18 Greta Yorsh <Greta.Yorsh@arm.com> > > * gcc.target/arm/handler-align.c (main): Force the stack pointer > to be not double-word aligned on the call to the interrupt handler. > > Please add a new test for this; the existing test is still valid. I'd also prefer a test that didn't mess directly with SP within a function -- this looks very unsafe, even if it works today. R. > test-handler-align.v1.patch.txt > > > diff --git a/gcc/testsuite/gcc.target/arm/handler-align.c b/gcc/testsuite/gcc.target/arm/handler-align.c > index 6c5187b..b0efa58 100644 > --- a/gcc/testsuite/gcc.target/arm/handler-align.c > +++ b/gcc/testsuite/gcc.target/arm/handler-align.c > @@ -29,8 +29,15 @@ int main() > /* Check stack pointer before/after calling the interrupt > * handler. Not equal means that handler doesn't restore > * stack correctly. */ > save_sp = sp; > - foo(); > + > + /* The stack is always double-word aligned here. To test interrupt handling, > + force the stack to be not double-word aligned. */ > + asm volatile ("sub\tsp, sp, #4" : : : "memory" ); > + foo (); > + /* Restore the stack. */ > + asm volatile ("add\t sp, sp, #4" : : : "memory" ); > + > /* Abort here instead of return non-zero. Due to wrong sp, lr value, > * returning from main may not work. */ > if (save_sp != sp)
diff --git a/gcc/testsuite/gcc.target/arm/handler-align.c b/gcc/testsuite/gcc.target/arm/handler-align.c index 6c5187b..b0efa58 100644 --- a/gcc/testsuite/gcc.target/arm/handler-align.c +++ b/gcc/testsuite/gcc.target/arm/handler-align.c @@ -29,8 +29,15 @@ int main() /* Check stack pointer before/after calling the interrupt * handler. Not equal means that handler doesn't restore * stack correctly. */ save_sp = sp; - foo(); + + /* The stack is always double-word aligned here. To test interrupt handling, + force the stack to be not double-word aligned. */ + asm volatile ("sub\tsp, sp, #4" : : : "memory" ); + foo (); + /* Restore the stack. */ + asm volatile ("add\t sp, sp, #4" : : : "memory" ); + /* Abort here instead of return non-zero. Due to wrong sp, lr value, * returning from main may not work. */ if (save_sp != sp)