mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
powerpc/syscall: Do not check unsupported scv vector on PPC32
Only book3s/64 has scv. No need to check the 0x7ff0 trap on 32 or 64e. For that, add a helper trap_is_unsupported_scv() similar to trap_is_scv(). And ignore the scv parameter in syscall_exit_prepare (Save 14 cycles 346 => 332 cycles) Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/fb87b205ae8eb8c623f33bb316801acf95a831e6.1612898425.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
eb595eca74
commit
b966f22790
|
|
@ -229,6 +229,11 @@ static inline bool trap_is_scv(struct pt_regs *regs)
|
|||
return (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && TRAP(regs) == 0x3000);
|
||||
}
|
||||
|
||||
static inline bool trap_is_unsupported_scv(struct pt_regs *regs)
|
||||
{
|
||||
return IS_ENABLED(CONFIG_PPC_BOOK3S_64) && TRAP(regs) == 0x7ff0;
|
||||
}
|
||||
|
||||
static inline bool trap_is_syscall(struct pt_regs *regs)
|
||||
{
|
||||
return (trap_is_scv(regs) || TRAP(regs) == 0xc00);
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ notrace long system_call_exception(long r3, long r4, long r5,
|
|||
local_irq_enable();
|
||||
|
||||
if (unlikely(current_thread_info()->flags & _TIF_SYSCALL_DOTRACE)) {
|
||||
if (unlikely(regs->trap == 0x7ff0)) {
|
||||
if (unlikely(trap_is_unsupported_scv(regs))) {
|
||||
/* Unsupported scv vector */
|
||||
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
||||
return regs->gpr[3];
|
||||
|
|
@ -111,7 +111,7 @@ notrace long system_call_exception(long r3, long r4, long r5,
|
|||
r8 = regs->gpr[8];
|
||||
|
||||
} else if (unlikely(r0 >= NR_syscalls)) {
|
||||
if (unlikely(regs->trap == 0x7ff0)) {
|
||||
if (unlikely(trap_is_unsupported_scv(regs))) {
|
||||
/* Unsupported scv vector */
|
||||
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
||||
return regs->gpr[3];
|
||||
|
|
@ -220,6 +220,7 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
|
|||
unsigned long *ti_flagsp = ¤t_thread_info()->flags;
|
||||
unsigned long ti_flags;
|
||||
unsigned long ret = 0;
|
||||
bool is_not_scv = !IS_ENABLED(CONFIG_PPC_BOOK3S_64) || !scv;
|
||||
|
||||
CT_WARN_ON(ct_state() == CONTEXT_USER);
|
||||
|
||||
|
|
@ -234,7 +235,7 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
|
|||
|
||||
ti_flags = *ti_flagsp;
|
||||
|
||||
if (unlikely(r3 >= (unsigned long)-MAX_ERRNO) && !scv) {
|
||||
if (unlikely(r3 >= (unsigned long)-MAX_ERRNO) && is_not_scv) {
|
||||
if (likely(!(ti_flags & (_TIF_NOERROR | _TIF_RESTOREALL)))) {
|
||||
r3 = -r3;
|
||||
regs->ccr |= 0x10000000; /* Set SO bit in CR */
|
||||
|
|
@ -305,7 +306,7 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
|
|||
user_enter_irqoff();
|
||||
|
||||
/* scv need not set RI=0 because SRRs are not used */
|
||||
if (unlikely(!__prep_irq_for_enabled_exit(!scv))) {
|
||||
if (unlikely(!__prep_irq_for_enabled_exit(is_not_scv))) {
|
||||
user_exit_irqoff();
|
||||
local_irq_enable();
|
||||
local_irq_disable();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user