Message ID | 20210521030146.2831663-3-iii@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix SIGILL psw.addr reporting | expand |
On 21.05.21 05:01, Ilya Leoshkevich wrote: > Verify that s390x-specific uc_mcontext.psw.addr is reported correctly. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > tests/tcg/s390x/Makefile.target | 1 + > tests/tcg/s390x/sigill.c | 41 +++++++++++++++++++++++++++++++++ > 2 files changed, 42 insertions(+) > create mode 100644 tests/tcg/s390x/sigill.c > > diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target > index 241ef28f61..8699d829a5 100644 > --- a/tests/tcg/s390x/Makefile.target > +++ b/tests/tcg/s390x/Makefile.target > @@ -8,3 +8,4 @@ TESTS+=exrl-trtr > TESTS+=pack > TESTS+=mvo > TESTS+=mvc > +TESTS+=sigill > diff --git a/tests/tcg/s390x/sigill.c b/tests/tcg/s390x/sigill.c > new file mode 100644 > index 0000000000..f8021dc6af > --- /dev/null > +++ b/tests/tcg/s390x/sigill.c > @@ -0,0 +1,41 @@ > +#include <assert.h> > +#include <signal.h> > +#include <string.h> > +#include <ucontext.h> > +#include <unistd.h> > + > +extern char expected_si_addr[]; > +extern char expected_psw_addr[]; Why "extern" ? For the magic inline asm below to work? > + > +static void handle_signal(int sig, siginfo_t *info, void *ucontext) > +{ > + if (sig != SIGILL) { > + _exit(1); > + } > + > + if (info->si_addr != expected_si_addr) { > + _exit(2); > + } > + > + if (((ucontext_t *)ucontext)->uc_mcontext.psw.addr != > + (unsigned long)expected_psw_addr) { > + _exit(3); > + } > +} > + > +int main(void) > +{ > + struct sigaction act; > + > + memset(&act, 0, sizeof(act)); > + act.sa_sigaction = handle_signal; > + act.sa_flags = SA_SIGINFO; > + > + int ret = sigaction(SIGILL, &act, NULL); Mixing code and declaration. > + assert(ret == 0); > + > + asm volatile("expected_si_addr:\t.byte\t0x00,0x00\n" > + "expected_psw_addr:"); At least I am confused how the right values actually end up in expected_si_addr and expected_psw_addr. Can we maybe add a comment? This looks quite hacky ;)
On Fri, 2021-05-21 at 09:54 +0200, David Hildenbrand wrote: > On 21.05.21 05:01, Ilya Leoshkevich wrote: > > Verify that s390x-specific uc_mcontext.psw.addr is reported > > correctly. > > > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > > --- > > tests/tcg/s390x/Makefile.target | 1 + > > tests/tcg/s390x/sigill.c | 41 > > +++++++++++++++++++++++++++++++++ > > 2 files changed, 42 insertions(+) > > create mode 100644 tests/tcg/s390x/sigill.c > > > > diff --git a/tests/tcg/s390x/Makefile.target > > b/tests/tcg/s390x/Makefile.target > > index 241ef28f61..8699d829a5 100644 > > --- a/tests/tcg/s390x/Makefile.target > > +++ b/tests/tcg/s390x/Makefile.target > > @@ -8,3 +8,4 @@ TESTS+=exrl-trtr > > TESTS+=pack > > TESTS+=mvo > > TESTS+=mvc > > +TESTS+=sigill > > diff --git a/tests/tcg/s390x/sigill.c b/tests/tcg/s390x/sigill.c > > new file mode 100644 > > index 0000000000..f8021dc6af > > --- /dev/null > > +++ b/tests/tcg/s390x/sigill.c > > @@ -0,0 +1,41 @@ > > +#include <assert.h> > > +#include <signal.h> > > +#include <string.h> > > +#include <ucontext.h> > > +#include <unistd.h> > > + > > +extern char expected_si_addr[]; > > +extern char expected_psw_addr[]; > > Why "extern" ? For the magic inline asm below to work? Yes - it cannot be static, because AFAIK there is no such thing as static variable declaration (one can only define static variables). > > + > > +static void handle_signal(int sig, siginfo_t *info, void > > *ucontext) > > +{ > > + if (sig != SIGILL) { > > + _exit(1); > > + } > > + > > + if (info->si_addr != expected_si_addr) { > > + _exit(2); > > + } > > + > > + if (((ucontext_t *)ucontext)->uc_mcontext.psw.addr != > > + (unsigned long)expected_psw_addr) { > > + _exit(3); > > + } > > +} > > + > > +int main(void) > > +{ > > + struct sigaction act; > > + > > + memset(&act, 0, sizeof(act)); > > + act.sa_sigaction = handle_signal; > > + act.sa_flags = SA_SIGINFO; > > + > > + int ret = sigaction(SIGILL, &act, NULL); > > Mixing code and declaration. Ouch, will fix. > > + assert(ret == 0); > > + > > + asm volatile("expected_si_addr:\t.byte\t0x00,0x00\n" > > + "expected_psw_addr:"); > > At least I am confused how the right values actually end up in > expected_si_addr and expected_psw_addr. > > Can we maybe add a comment? This looks quite hacky ;) This whole construction is roughly the same as having sigill.s file with: .globl expected_si_addr expected_si_addr: .byte 0,0 .globl expected_psw_addr expected_psw_addr: br 14 and sigill.h file with: void expected_si_addr(void); extern char expected_psw_addr[]; Doing it this way would complicate the build, so I thought it would be better to just put everything into a single file.
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target index 241ef28f61..8699d829a5 100644 --- a/tests/tcg/s390x/Makefile.target +++ b/tests/tcg/s390x/Makefile.target @@ -8,3 +8,4 @@ TESTS+=exrl-trtr TESTS+=pack TESTS+=mvo TESTS+=mvc +TESTS+=sigill diff --git a/tests/tcg/s390x/sigill.c b/tests/tcg/s390x/sigill.c new file mode 100644 index 0000000000..f8021dc6af --- /dev/null +++ b/tests/tcg/s390x/sigill.c @@ -0,0 +1,41 @@ +#include <assert.h> +#include <signal.h> +#include <string.h> +#include <ucontext.h> +#include <unistd.h> + +extern char expected_si_addr[]; +extern char expected_psw_addr[]; + +static void handle_signal(int sig, siginfo_t *info, void *ucontext) +{ + if (sig != SIGILL) { + _exit(1); + } + + if (info->si_addr != expected_si_addr) { + _exit(2); + } + + if (((ucontext_t *)ucontext)->uc_mcontext.psw.addr != + (unsigned long)expected_psw_addr) { + _exit(3); + } +} + +int main(void) +{ + struct sigaction act; + + memset(&act, 0, sizeof(act)); + act.sa_sigaction = handle_signal; + act.sa_flags = SA_SIGINFO; + + int ret = sigaction(SIGILL, &act, NULL); + assert(ret == 0); + + asm volatile("expected_si_addr:\t.byte\t0x00,0x00\n" + "expected_psw_addr:"); + + return 0; +}
Verify that s390x-specific uc_mcontext.psw.addr is reported correctly. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- tests/tcg/s390x/Makefile.target | 1 + tests/tcg/s390x/sigill.c | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 tests/tcg/s390x/sigill.c