Subject: [PATCH v4 00/23] powerpc/32: Implement C syscall entry/exit

From: Christophe Leroy <[email-masked]>
Date: Mon, 25 Jan 2021 14:48:12 +0000 (UTC)

This series implements C syscall entry/exit for PPC32. It reuses
the work already done for PPC64.

This series is based on Nick's v6 series "powerpc: interrupt wrappers".

Patch 1 is a bug fix submitted separately but this series depends on it.
Patches 2-4 are an extract from the series "powerpc/32: Reduce head
complexity and re-activate MMU earlier". The changes here are limited
to system calls. That series will be respined to only contain exception
related changes and the syscall changes will remain in this series.
Patches 5-16 are preparatory changes.
Patch 17 is THE patch that changes to C syscall entry/exit
Patches 18-23 are optimisations.

In terms on performance we have the following number of cycles on an
8xx running null_syscall benchmark:
- mainline: 296 cycles
- after patch 4: 283 cycles
- after patch 16: 304 cycles
- after patch 17: 348 cycles
- at the end of the series: 320 cycles

So in summary, we have a degradation of performance of 8% on null_syscall.

I think it is not a big degradation, it is worth it.

v4 is the first mature version.

Christophe Leroy (23):
  powerpc/32s: Add missing call to kuep_lock on syscall entry
  powerpc/32: Always enable data translation on syscall entry
  powerpc/32: On syscall entry, enable instruction translation at the
    same time as data
  powerpc/32: Reorder instructions to avoid using CTR in syscall entry
  powerpc/64s: Make kuap_check_amr() and kuap_get_and_check_amr()
    generic
  powerpc/32s: Create C version of kuap_user/kernel_restore() and
    friends
  powerpc/8xx: Create C version of kuap_user/kernel_restore() and
    friends
  powerpc/irq: Add helper to set regs->softe
  powerpc/irq: Rework helpers that manipulate MSR[EE/RI]
  powerpc/irq: Add stub irq_soft_mask_return() for PPC32
  powerpc/syscall: Rename syscall_64.c into syscall.c
  powerpc/syscall: Make syscall.c buildable on PPC32
  powerpc/syscall: Use is_compat_task()
  powerpc/syscall: Save r3 in regs->orig_r3
  powerpc/syscall: Change condition to check MSR_RI
  powerpc/32: Always save non volatile GPRs at syscall entry
  powerpc/syscall: implement system call entry/exit logic in C for PPC32
  powerpc/32: Remove verification of MSR_PR on syscall in the ASM entry
  powerpc/syscall: Avoid stack frame in likely part of
    system_call_exception()
  powerpc/syscall: Do not check unsupported scv vector on PPC32
  powerpc/syscall: Remove FULL_REGS verification in
    system_call_exception
  powerpc/syscall: Optimise checks in beginning of
    system_call_exception()
  powerpc/syscall: Avoid storing 'current' in another pointer

 arch/powerpc/include/asm/book3s/32/kup.h      |  33 ++
 arch/powerpc/include/asm/book3s/64/kup.h      |  24 +-
 arch/powerpc/include/asm/hw_irq.h             |  91 ++++--
 arch/powerpc/include/asm/kup.h                |   9 +-
 arch/powerpc/include/asm/nohash/32/kup-8xx.h  |  27 ++
 arch/powerpc/include/asm/reg.h                |   1 +
 arch/powerpc/kernel/Makefile                  |   4 +-
 arch/powerpc/kernel/entry_32.S                | 305 ++----------------
 arch/powerpc/kernel/entry_64.S                |   1 -
 arch/powerpc/kernel/head_32.h                 |  76 +----
 arch/powerpc/kernel/head_booke.h              |  27 +-
 .../kernel/{syscall_64.c => syscall.c}        |  57 ++--
 arch/powerpc/kernel/syscalls/syscall.tbl      |  20 +-
 13 files changed, 225 insertions(+), 450 deletions(-)
 rename arch/powerpc/kernel/{syscall_64.c => syscall.c} (90%)

-- 
2.25.0