On Tue, Aug 1, 2017 at 9:46 PM, H.J. Lu <hongjiu...@intel.com> wrote: > Add some tests for implementing interrupt handlers with naked attribute. > > OK for trunk? > > H.J. > --- > * gcc.dg/guality/pr25967-1.c: New test. > * gcc.dg/guality/pr25967-2.c: Likewise. > * gcc.dg/torture/pr25967-1.c: Likewise. > * gcc.dg/torture/pr25967-2.c: Likewise.
OK with a small change below. Thanks, Uros. > gcc/testsuite/gcc.dg/guality/pr25967-1.c | 79 > ++++++++++++++++++++++++++++++++ > gcc/testsuite/gcc.dg/guality/pr25967-2.c | 72 +++++++++++++++++++++++++++++ > gcc/testsuite/gcc.dg/torture/pr25967-1.c | 72 +++++++++++++++++++++++++++++ > gcc/testsuite/gcc.dg/torture/pr25967-2.c | 66 ++++++++++++++++++++++++++ > 4 files changed, 289 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/guality/pr25967-1.c > create mode 100644 gcc/testsuite/gcc.dg/guality/pr25967-2.c > create mode 100644 gcc/testsuite/gcc.dg/torture/pr25967-1.c > create mode 100644 gcc/testsuite/gcc.dg/torture/pr25967-2.c > > diff --git a/gcc/testsuite/gcc.dg/guality/pr25967-1.c > b/gcc/testsuite/gcc.dg/guality/pr25967-1.c > new file mode 100644 > index 00000000000..1100aa638a4 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/guality/pr25967-1.c > @@ -0,0 +1,79 @@ > +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ > +/* { dg-options "-g -mgeneral-regs-only" } */ > + > +extern void exit (int); > + > +typedef unsigned int uword_t __attribute__ ((mode (__word__))); > + > +#define ERROR 0x12345670 > +#define IP 0x12345671 > +#define CS 0x12345672 > +#define FLAGS 0x12345673 > +#define SP 0x12345674 > +#define SS 0x12345675 > + > +#ifdef __x86_64__ > +# define STACK_POINTER "rsp" > +# define WORD_SIZE "8" > +#else > +# define STACK_POINTER "esp" > +# define WORD_SIZE "4" > +#endif > + > +#define STRING(x) XSTRING(x) > +#define XSTRING(x) #x > +#define ASMNAME(cname) ASMNAME2 (__USER_LABEL_PREFIX__, cname) > +#define ASMNAME2(prefix, cname) XSTRING (prefix) cname > + > +struct interrupt_frame > +{ > + uword_t ip; > + uword_t cs; > + uword_t flags; > + uword_t sp; > + uword_t ss; > +}; > + > +__attribute__((naked, used)) > +void > +fn (void) > +{ > + struct interrupt_frame *frame; > + uword_t error; > + asm ("lea " WORD_SIZE "(%%" STACK_POINTER "), %0" : "=r" (frame) : ); > + asm ("mov (%%" STACK_POINTER "), %0" : "=r" (error) : ); The above two asm needs to be volatile. They are not "simple" asm, and access stack pointer behind the compilers back. And please merge them to one multi-line volatile asm statement. > + if (ERROR != error) /* BREAK */ > + __builtin_abort (); > + if (IP != frame->ip) > + __builtin_abort (); > + if (CS != frame->cs) > + __builtin_abort (); > + if (FLAGS != frame->flags) > + __builtin_abort (); > + if (SP != frame->sp) > + __builtin_abort (); > + if (SS != frame->ss) > + __builtin_abort (); > + > + exit (0); > +} > + > +int > +main () > +{ > + asm ("push $" STRING (SS) "; \ > + push $" STRING (SP) "; \ > + push $" STRING (FLAGS) "; \ > + push $" STRING (CS) "; \ > + push $" STRING (IP) "; \ > + push $" STRING (ERROR) "; \ > + jmp " ASMNAME ("fn")); > + return 0; > +} > + > +/* { dg-final { gdb-test 45 "error" "0x12345670" } } */ > +/* { dg-final { gdb-test 45 "frame->ip" "0x12345671" } } */ > +/* { dg-final { gdb-test 45 "frame->cs" "0x12345672" } } */ > +/* { dg-final { gdb-test 45 "frame->flags" "0x12345673" } } */ > +/* { dg-final { gdb-test 45 "frame->sp" "0x12345674" } } */ > +/* { dg-final { gdb-test 45 "frame->ss" "0x12345675" } } */ > diff --git a/gcc/testsuite/gcc.dg/guality/pr25967-2.c > b/gcc/testsuite/gcc.dg/guality/pr25967-2.c > new file mode 100644 > index 00000000000..dde31e82d43 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/guality/pr25967-2.c > @@ -0,0 +1,72 @@ > +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ > +/* { dg-options "-g -mgeneral-regs-only" } */ > + > +extern void exit (int); > + > +typedef unsigned int uword_t __attribute__ ((mode (__word__))); > + > +#define IP 0x12345671 > +#define CS 0x12345672 > +#define FLAGS 0x12345673 > +#define SP 0x12345674 > +#define SS 0x12345675 > + > +#ifdef __x86_64__ > +# define STACK_POINTER "rsp" > +# define WORD_SIZE "8" > +#else > +# define STACK_POINTER "esp" > +# define WORD_SIZE "4" > +#endif > + > +#define STRING(x) XSTRING(x) > +#define XSTRING(x) #x > +#define ASMNAME(cname) ASMNAME2 (__USER_LABEL_PREFIX__, cname) > +#define ASMNAME2(prefix, cname) XSTRING (prefix) cname > + > +struct interrupt_frame > +{ > + uword_t ip; > + uword_t cs; > + uword_t flags; > + uword_t sp; > + uword_t ss; > +}; > + > +__attribute__((naked, used)) > +void > +fn (void) > +{ > + struct interrupt_frame *frame; > + asm ("lea (%%" STACK_POINTER "), %0" : "=r" (frame) : ); > + if (IP != frame->ip) /* BREAK */ > + __builtin_abort (); > + if (CS != frame->cs) > + __builtin_abort (); > + if (FLAGS != frame->flags) > + __builtin_abort (); > + if (SP != frame->sp) > + __builtin_abort (); > + if (SS != frame->ss) > + __builtin_abort (); > + > + exit (0); > +} > + > +int > +main () > +{ > + asm ("push $" STRING (SS) "; \ > + push $" STRING (SP) "; \ > + push $" STRING (FLAGS) "; \ > + push $" STRING (CS) "; \ > + push $" STRING (IP) "; \ > + jmp " ASMNAME ("fn")); > + return 0; > +} > + > +/* { dg-final { gdb-test 42 "frame->ip" "0x12345671" } } */ > +/* { dg-final { gdb-test 42 "frame->cs" "0x12345672" } } */ > +/* { dg-final { gdb-test 42 "frame->flags" "0x12345673" } } */ > +/* { dg-final { gdb-test 42 "frame->sp" "0x12345674" } } */ > +/* { dg-final { gdb-test 42 "frame->ss" "0x12345675" } } */ > diff --git a/gcc/testsuite/gcc.dg/torture/pr25967-1.c > b/gcc/testsuite/gcc.dg/torture/pr25967-1.c > new file mode 100644 > index 00000000000..356c3334960 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/pr25967-1.c > @@ -0,0 +1,72 @@ > +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ > +/* { dg-options "-mgeneral-regs-only" } */ > + > +extern void exit (int); > + > +typedef unsigned int uword_t __attribute__ ((mode (__word__))); > + > +#define ERROR 0x12345670 > +#define IP 0x12345671 > +#define CS 0x12345672 > +#define FLAGS 0x12345673 > +#define SP 0x12345674 > +#define SS 0x12345675 > + > +#ifdef __x86_64__ > +# define STACK_POINTER "rsp" > +# define WORD_SIZE "8" > +#else > +# define STACK_POINTER "esp" > +# define WORD_SIZE "4" > +#endif > + > +#define STRING(x) XSTRING(x) > +#define XSTRING(x) #x > +#define ASMNAME(cname) ASMNAME2 (__USER_LABEL_PREFIX__, cname) > +#define ASMNAME2(prefix, cname) XSTRING (prefix) cname > + > +struct interrupt_frame > +{ > + uword_t ip; > + uword_t cs; > + uword_t flags; > + uword_t sp; > + uword_t ss; > +}; > + > +__attribute__((naked, used)) > +void > +fn (void) > +{ > + struct interrupt_frame *frame; > + uword_t error; > + asm ("lea " WORD_SIZE "(%%" STACK_POINTER "), %0" : "=r" (frame) : ); > + asm ("mov (%%" STACK_POINTER "), %0" : "=r" (error) : ); > + if (ERROR != error) > + __builtin_abort (); > + if (IP != frame->ip) > + __builtin_abort (); > + if (CS != frame->cs) > + __builtin_abort (); > + if (FLAGS != frame->flags) > + __builtin_abort (); > + if (SP != frame->sp) > + __builtin_abort (); > + if (SS != frame->ss) > + __builtin_abort (); > + > + exit (0); > +} > + > +int > +main () > +{ > + asm ("push $" STRING (SS) "; \ > + push $" STRING (SP) "; \ > + push $" STRING (FLAGS) "; \ > + push $" STRING (CS) "; \ > + push $" STRING (IP) "; \ > + push $" STRING (ERROR) "; \ > + jmp " ASMNAME ("fn")); > + return 0; > +} > diff --git a/gcc/testsuite/gcc.dg/torture/pr25967-2.c > b/gcc/testsuite/gcc.dg/torture/pr25967-2.c > new file mode 100644 > index 00000000000..2e51c7361d7 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/pr25967-2.c > @@ -0,0 +1,66 @@ > +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ > +/* { dg-options "-mgeneral-regs-only" } */ > + > +extern void exit (int); > + > +typedef unsigned int uword_t __attribute__ ((mode (__word__))); > + > +#define IP 0x12345671 > +#define CS 0x12345672 > +#define FLAGS 0x12345673 > +#define SP 0x12345674 > +#define SS 0x12345675 > + > +#ifdef __x86_64__ > +# define STACK_POINTER "rsp" > +# define WORD_SIZE "8" > +#else > +# define STACK_POINTER "esp" > +# define WORD_SIZE "4" > +#endif > + > +#define STRING(x) XSTRING(x) > +#define XSTRING(x) #x > +#define ASMNAME(cname) ASMNAME2 (__USER_LABEL_PREFIX__, cname) > +#define ASMNAME2(prefix, cname) XSTRING (prefix) cname > + > +struct interrupt_frame > +{ > + uword_t ip; > + uword_t cs; > + uword_t flags; > + uword_t sp; > + uword_t ss; > +}; > + > +__attribute__((naked, used)) > +void > +fn (void) > +{ > + struct interrupt_frame *frame; > + asm ("lea (%%" STACK_POINTER "), %0" : "=r" (frame) : ); > + if (IP != frame->ip) > + __builtin_abort (); > + if (CS != frame->cs) > + __builtin_abort (); > + if (FLAGS != frame->flags) > + __builtin_abort (); > + if (SP != frame->sp) > + __builtin_abort (); > + if (SS != frame->ss) > + __builtin_abort (); > + > + exit (0); > +} > + > +int > +main () > +{ > + asm ("push $" STRING (SS) "; \ > + push $" STRING (SP) "; \ > + push $" STRING (FLAGS) "; \ > + push $" STRING (CS) "; \ > + push $" STRING (IP) "; \ > + jmp " ASMNAME ("fn")); > + return 0; > +} > -- > 2.13.3 >