mbox series

[0/2] linux-user/s390x: Fix single-stepping SVC

Message ID 20230510230213.330134-1-iii@linux.ibm.com (mailing list archive)
Headers show
Series linux-user/s390x: Fix single-stepping SVC | expand

Message

Ilya Leoshkevich May 10, 2023, 11:02 p.m. UTC
Hi,

I noticed that single-stepping SVC runs two instructions instead of
one. The reason is that EXCP_SVC masks EXCP_DEBUG.
Patch 1 fixes this problem, patch 2 adds a test.

Btw, there is at least one more problem in that area, namely
single-stepping instructions that cause e.g. SIGILL. Using the
existing signals-s390x test as an example:

    (gdb) x/i $pc
    => 0x1001740 <illegal_op>:      .long   0x000007fe

    (gdb) si
    Program received signal SIGILL, Illegal instruction.
    (gdb) x/i $pc
    => 0x1001742 <after_illegal_op>:        br      %r14
    # So far so good.

    (gdb) si
    (gdb) x/i $pc
    => 0x10017b6 <handle_signal+6>: lay     %r15,-344(%r15)
    # Missed the first signal handler instruction!

I'm not sure what to do about it - the trivial fix to add
gdb_handlesig(cpu, 0) to the end of handle_pending_signal() caused GDB
to hang, and I haven't looked further yet.

Best regards,
Ilya

Ilya Leoshkevich (2):
  linux-user/s390x: Fix single-stepping SVC
  tests/tcg/s390x: Test single-stepping SVC

 linux-user/s390x/cpu_loop.c         |  9 ++++
 tests/tcg/s390x/Makefile.target     | 11 ++++-
 tests/tcg/s390x/gdbstub/test-svc.py | 64 +++++++++++++++++++++++++++++
 tests/tcg/s390x/hello-s390x-asm.S   | 20 +++++++++
 4 files changed, 103 insertions(+), 1 deletion(-)
 create mode 100644 tests/tcg/s390x/gdbstub/test-svc.py
 create mode 100644 tests/tcg/s390x/hello-s390x-asm.S

Comments

Thomas Huth May 31, 2023, 2:37 p.m. UTC | #1
On 11/05/2023 01.02, Ilya Leoshkevich wrote:
> Hi,
> 
> I noticed that single-stepping SVC runs two instructions instead of
> one. The reason is that EXCP_SVC masks EXCP_DEBUG.
> Patch 1 fixes this problem, patch 2 adds a test.
> 
> Btw, there is at least one more problem in that area, namely
> single-stepping instructions that cause e.g. SIGILL. Using the
> existing signals-s390x test as an example:
> 
>      (gdb) x/i $pc
>      => 0x1001740 <illegal_op>:      .long   0x000007fe
> 
>      (gdb) si
>      Program received signal SIGILL, Illegal instruction.
>      (gdb) x/i $pc
>      => 0x1001742 <after_illegal_op>:        br      %r14
>      # So far so good.
> 
>      (gdb) si
>      (gdb) x/i $pc
>      => 0x10017b6 <handle_signal+6>: lay     %r15,-344(%r15)
>      # Missed the first signal handler instruction!
> 
> I'm not sure what to do about it - the trivial fix to add
> gdb_handlesig(cpu, 0) to the end of handle_pending_signal() caused GDB
> to hang, and I haven't looked further yet.
> 
> Best regards,
> Ilya
> 
> Ilya Leoshkevich (2):
>    linux-user/s390x: Fix single-stepping SVC
>    tests/tcg/s390x: Test single-stepping SVC

If there are no disagreements, I can take this through my s390x tree. Queued 
it for my next pull request now.

  Thomas