mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 00/32] s390: Improve exception table handling and disassembler
@ 2026-10-01 10:32 Heiko Carstens
  2026-10-01 10:32 ` [PATCH 01/32] s390/kprobes: Prevent kprobes on instructions with exception table entry Heiko Carstens
                   ` (31 more replies)
  0 siblings, 32 replies; 33+ messages in thread
From: Heiko Carstens @ 2026-10-01 10:32 UTC (permalink / raw)
  To: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
	Christian Borntraeger, Niklas Schnelle, Matthew Rosato,
	Gerald Schaefer, Vineeth Vijayan, Peter Oberparleiter,
	Harald Freudenberger, Holger Dengler, Stefan Haberland,
	Jan Hoeppner, Ilya Leoshkevich, Janosch Frank, Claudio Imbrenda
  Cc: linux-kernel, linux-s390

Extend the existing get_trap_ip() so that it returns the address of
the instruction which caused an exception, and use that for both the
disassembler as well as exception handling.

This allows improving two things:

- The in kernel disassembler prints PGM+PSW markers which clearly
  identify the instruction causing an exception, and the current PSW
  address. This replaces the previous "best guess" approach with '*' and
  '>' markers

- EX_TABLE entries for inline assemblies are simplified. Only the address
  of the faulting instruction needs to be provided from now on. The second
  entry, which is the address following the faulting instruction, is not
  needed anymore

Disassembler
------------

The output of the kernel disassembler changes. If the disassembly is
printed as a result of a program check, 'PGM' and 'PSW' markers identify
the instruction which caused the exception, and where the PSW points
to. For suppressing exceptions, the output now looks like this:

 Krnl Code:
            000003ff8dc7bff8: e310f0080004 lg      %r1,8(%r15)
       PGM >000003ff8dc7bffe: e3a0e0000004 lg      %r10,0(%r14)
       PSW >000003ff8dc7c004: a7280000     lhi     %r2,0
            000003ff8dc7c008: eb9ff0900024 stmg    %r9,%r15,144(%r15)

For nullifying exceptions where both addresses are the same,
'PGM+PSW >' is printed instead:

 Krnl Code:
            000003ff8dc7bff8: e310f0080004 lg      %r1,8(%r15)
   PGM+PSW >000003ff8dc7bffe: e3a0e0000004 lg      %r10,0(%r14)
            000003ff8dc7c004: a7280000     lhi     %r2,0
            000003ff8dc7c008: eb9ff0900024 stmg    %r9,%r15,144(%r15)

EX_TABLE entries
----------------

With get_trap_ip() now returning the exact faulting instruction address,
EX_TABLE entries for inline assemblies are simplified. Only the address
of the faulting instruction needs to be provided. The second entry - the
address following the faulting instruction - is no longer needed.

For example, an inline assembly using a single instruction can now be
written as:

        asm_inline volatile(
                "0:     lg      %[data],%[addr]\n"
                "1:\n"
                EX_TABLE_INSN(0b, 1b));

Previously this required:

        asm_inline volatile(
                "       nopr    %%r7\n"
                "0:     lg      %[data],%[addr]\n"
                "1:     nopr    %%r7\n"
                EX_TABLE(0b, 1b)
                EX_TABLE(1b, 1b));

The old approach had several non-obvious restrictions:

- If an instruction immediately preceding the inline assembly caused a
  non-nullifying exception, the PSW would point to the start of the
  inline assembly. If the faulting instruction was placed there, the
  exception handler would incorrectly resolve the fault using the inline
  assembly's fixup handler.  Hence, a leading NOP was required before the
  faulting instruction

- Similarly, an exception table entry placed behind a faulting
  instruction must also point to an instruction that cannot fault. A
  nullifying exception on the following instruction would otherwise be
  incorrectly resolved by that entry

- Furthermore, instructions that can cause both nullifying and
  non-nullifying exceptions required two separate exception table entries

These restrictions are error-prone and have caused several bugs in the
past.

All EX_TABLE* macros have been renamed to EX_TABLE_INSN*. This allows the
old and new semantics to be distinguished, and ensures that backports of
code using the new semantics will intentionally fail to compile if the
new infrastructure is not present.

Note
----

There are some existing oddities and corner cases with kprobes. Only
some of them will be addressed with this series. The other ones will
be addressed with follow-on changes, since this series is already
large enough.

Thanks,
Heiko

Heiko Carstens (32):
  s390/kprobes: Prevent kprobes on instructions with exception table entry
  s390/early: Fix early warning handling
  s390: Clear pt_regs flags field
  s390/bug: Indicate modified PSW in disassembly
  s390/tools: Rename gen_facilities to gen_bitmaps
  s390/tools: Generate bitmap of nullified program checks
  s390/traps: Handle nullifying program checks in get_trap_ip()
  s390/dis: Improve show_code() output
  s390/extable: Rework exception handling logic
  s390/diag: Convert amode31 exception tables to EX_TABLE_INSN
  s390/uaccess: Convert inline assembly to EX_TABLE_INSN
  s390/lib/uaccess: Convert inline assembly to EX_TABLE_INSN
  s390/futex: Convert inline assembly to EX_TABLE_INSN
  s390/diag: Convert inline assembly to EX_TABLE_INSN
  s390/mm/pfault: Convert inline assembly to EX_TABLE_INSN
  s390/cpu_mf: Convert inline assembly to EX_TABLE_INSN
  s390/cert_store: Convert inline assembly to EX_TABLE_INSN
  s390/ipl: Convert inline assembly to EX_TABLE_INSN
  s390/hypfs: Convert inline assembly to EX_TABLE_INSN
  s390/ap: Convert inline assembly to EX_TABLE_INSN
  s390/fpu: Convert inline assembly to EX_TABLE_INSN
  s390/traps: Convert inline assembly to EX_TABLE_INSN
  s390/word-at-a-time: Convert inline assembly to EX_TABLE_INSN
  s390/kvm: Convert inline assembly to EX_TABLE_INSN
  s390/pci: Convert inline assembly to EX_TABLE_INSN
  s390/boot: Convert inline assembly to EX_TABLE_INSN
  s390/cio: Convert inline assembly to EX_TABLE_INSN
  s390/dasd: Convert inline assembly to EX_TABLE_INSN
  s390/diag_ftp: Convert inline assembly to EX_TABLE_INSN
  s390/sclp: Convert inline assembly to EX_TABLE_INSN
  s390/bpf: Simplify exception table entry handling
  s390/extable: Remove EX_TABLE macros and fallback extable search

 arch/s390/boot/ipl_parm.c                     |   6 +-
 arch/s390/boot/pgm_check.c                    |  14 ++-
 arch/s390/boot/physmem_info.c                 |  18 +--
 arch/s390/boot/startup.c                      |  12 +-
 arch/s390/hypfs/hypfs_vm.c                    |   6 +-
 arch/s390/include/asm/Kbuild                  |   1 +
 arch/s390/include/asm/ap.h                    |  12 +-
 arch/s390/include/asm/asm-extable.h           |  28 +++--
 arch/s390/include/asm/cpu_mf.h                |  18 +--
 arch/s390/include/asm/diag.h                  |   5 +-
 arch/s390/include/asm/diag288.h               |   6 +-
 arch/s390/include/asm/extable.h               |  25 ++---
 arch/s390/include/asm/fpu-insn.h              |   6 +-
 arch/s390/include/asm/futex.h                 |  17 ++-
 arch/s390/include/asm/ptrace.h                |   6 +
 arch/s390/include/asm/uaccess.h               |  45 +++-----
 arch/s390/include/asm/word-at-a-time.h        |   5 +-
 arch/s390/kernel/cert_store.c                 |   6 +-
 arch/s390/kernel/diag/diag.c                  |  12 +-
 arch/s390/kernel/dis.c                        |  35 +++---
 arch/s390/kernel/dumpstack.c                  |   7 +-
 arch/s390/kernel/early.c                      |  26 ++++-
 arch/s390/kernel/entry.S                      |   1 +
 arch/s390/kernel/ipl.c                        |   6 +-
 arch/s390/kernel/kprobes.c                    |   3 +
 arch/s390/kernel/text_amode31.S               |  34 +++---
 arch/s390/kernel/traps.c                      |  30 +++--
 arch/s390/kvm/s390/gaccess.c                  |  11 +-
 arch/s390/lib/uaccess.c                       |  29 ++---
 arch/s390/mm/extable.c                        |   2 +-
 arch/s390/mm/pfault.c                         |  12 +-
 arch/s390/net/bpf_jit_comp.c                  |  78 ++++---------
 arch/s390/pci/pci_clp.c                       |  12 +-
 arch/s390/pci/pci_insn.c                      |  36 +++---
 arch/s390/pci/pci_mmio.c                      |  28 ++---
 arch/s390/tools/.gitignore                    |   1 +
 arch/s390/tools/Makefile                      |  16 ++-
 .../tools/{gen_facilities.c => gen_bitmaps.c} | 103 ++++++++++++++----
 drivers/s390/block/dasd_diag.c                |   6 +-
 drivers/s390/char/diag_ftp.c                  |   6 +-
 drivers/s390/char/sclp.h                      |   7 +-
 drivers/s390/cio/ioasm.c                      |  24 ++--
 42 files changed, 409 insertions(+), 352 deletions(-)
 rename arch/s390/tools/{gen_facilities.c => gen_bitmaps.c} (65%)

-- 
2.53.0


^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2026-10-01 10:33 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-01 10:32 [PATCH 00/32] s390: Improve exception table handling and disassembler Heiko Carstens
2026-10-01 10:32 ` [PATCH 01/32] s390/kprobes: Prevent kprobes on instructions with exception table entry Heiko Carstens
2026-10-01 10:32 ` [PATCH 02/32] s390/early: Fix early warning handling Heiko Carstens
2026-10-01 10:32 ` [PATCH 03/32] s390: Clear pt_regs flags field Heiko Carstens
2026-10-01 10:32 ` [PATCH 04/32] s390/bug: Indicate modified PSW in disassembly Heiko Carstens
2026-10-01 10:32 ` [PATCH 05/32] s390/tools: Rename gen_facilities to gen_bitmaps Heiko Carstens
2026-10-01 10:32 ` [PATCH 06/32] s390/tools: Generate bitmap of nullified program checks Heiko Carstens
2026-10-01 10:32 ` [PATCH 07/32] s390/traps: Handle nullifying program checks in get_trap_ip() Heiko Carstens
2026-10-01 10:32 ` [PATCH 08/32] s390/dis: Improve show_code() output Heiko Carstens
2026-10-01 10:32 ` [PATCH 09/32] s390/extable: Rework exception handling logic Heiko Carstens
2026-10-01 10:32 ` [PATCH 10/32] s390/diag: Convert amode31 exception tables to EX_TABLE_INSN Heiko Carstens
2026-10-01 10:32 ` [PATCH 11/32] s390/uaccess: Convert inline assembly " Heiko Carstens
2026-10-01 10:32 ` [PATCH 12/32] s390/lib/uaccess: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 13/32] s390/futex: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 14/32] s390/diag: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 15/32] s390/mm/pfault: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 16/32] s390/cpu_mf: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 17/32] s390/cert_store: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 18/32] s390/ipl: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 19/32] s390/hypfs: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 20/32] s390/ap: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 21/32] s390/fpu: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 22/32] s390/traps: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 23/32] s390/word-at-a-time: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 24/32] s390/kvm: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 25/32] s390/pci: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 26/32] s390/boot: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 27/32] s390/cio: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 28/32] s390/dasd: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 29/32] s390/diag_ftp: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 30/32] s390/sclp: " Heiko Carstens
2026-10-01 10:32 ` [PATCH 31/32] s390/bpf: Simplify exception table entry handling Heiko Carstens
2026-10-01 10:32 ` [PATCH 32/32] s390/extable: Remove EX_TABLE macros and fallback extable search Heiko Carstens

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®