mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-18 09:26:13 +07:00
01417c6cc7
"paca->soft_enabled" is used as a flag to mask some of interrupts. Currently supported flags values and their details: soft_enabled MSR[EE] 0 0 Disabled (PMI and HMI not masked) 1 1 Enabled "paca->soft_enabled" is initialized to 1 to make the interripts as enabled. arch_local_irq_disable() will toggle the value when interrupts needs to disbled. At this point, the interrupts are not actually disabled, instead, interrupt vector has code to check for the flag and mask it when it occurs. By "mask it", it update interrupt paca->irq_happened and return. arch_local_irq_restore() is called to re-enable interrupts, which checks and replays interrupts if any occured. Now, as mentioned, current logic doesnot mask "performance monitoring interrupts" and PMIs are implemented as NMI. But this patchset depends on local_irq_* for a successful local_* update. Meaning, mask all possible interrupts during local_* update and replay them after the update. So the idea here is to reserve the "paca->soft_enabled" logic. New values and details: soft_enabled MSR[EE] 1 0 Disabled (PMI and HMI not masked) 0 1 Enabled Reason for the this change is to create foundation for a third mask value "0x2" for "soft_enabled" to add support to mask PMIs. When ->soft_enabled is set to a value "3", PMI interrupts are mask and when set to a value of "1", PMI are not mask. With this patch also extends soft_enabled as interrupt disable mask. Current flags are renamed from IRQ_[EN?DIS}ABLED to IRQS_ENABLED and IRQS_DISABLED. Patch also fixes the ptrace call to force the user to see the softe value to be alway 1. Reason being, even though userspace has no business knowing about softe, it is part of pt_regs. Like-wise in signal context. Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
75 lines
1.7 KiB
C
75 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* IRQ flags handling
|
|
*/
|
|
#ifndef _ASM_IRQFLAGS_H
|
|
#define _ASM_IRQFLAGS_H
|
|
|
|
#ifndef __ASSEMBLY__
|
|
/*
|
|
* Get definitions for arch_local_save_flags(x), etc.
|
|
*/
|
|
#include <asm/hw_irq.h>
|
|
|
|
#else
|
|
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
#ifdef CONFIG_IRQSOFF_TRACER
|
|
/*
|
|
* Since the ftrace irqsoff latency trace checks CALLER_ADDR1,
|
|
* which is the stack frame here, we need to force a stack frame
|
|
* in case we came from user space.
|
|
*/
|
|
#define TRACE_WITH_FRAME_BUFFER(func) \
|
|
mflr r0; \
|
|
stdu r1, -STACK_FRAME_OVERHEAD(r1); \
|
|
std r0, 16(r1); \
|
|
stdu r1, -STACK_FRAME_OVERHEAD(r1); \
|
|
bl func; \
|
|
ld r1, 0(r1); \
|
|
ld r1, 0(r1);
|
|
#else
|
|
#define TRACE_WITH_FRAME_BUFFER(func) \
|
|
bl func;
|
|
#endif
|
|
|
|
/*
|
|
* These are calls to C code, so the caller must be prepared for volatiles to
|
|
* be clobbered.
|
|
*/
|
|
#define TRACE_ENABLE_INTS TRACE_WITH_FRAME_BUFFER(trace_hardirqs_on)
|
|
#define TRACE_DISABLE_INTS TRACE_WITH_FRAME_BUFFER(trace_hardirqs_off)
|
|
|
|
/*
|
|
* This is used by assembly code to soft-disable interrupts first and
|
|
* reconcile irq state.
|
|
*
|
|
* NB: This may call C code, so the caller must be prepared for volatiles to
|
|
* be clobbered.
|
|
*/
|
|
#define RECONCILE_IRQ_STATE(__rA, __rB) \
|
|
lbz __rA,PACASOFTIRQEN(r13); \
|
|
lbz __rB,PACAIRQHAPPENED(r13); \
|
|
andi. __rA,__rA,IRQS_DISABLED;\
|
|
li __rA,IRQS_DISABLED; \
|
|
ori __rB,__rB,PACA_IRQ_HARD_DIS; \
|
|
stb __rB,PACAIRQHAPPENED(r13); \
|
|
bne 44f; \
|
|
stb __rA,PACASOFTIRQEN(r13); \
|
|
TRACE_DISABLE_INTS; \
|
|
44:
|
|
|
|
#else
|
|
#define TRACE_ENABLE_INTS
|
|
#define TRACE_DISABLE_INTS
|
|
|
|
#define RECONCILE_IRQ_STATE(__rA, __rB) \
|
|
lbz __rA,PACAIRQHAPPENED(r13); \
|
|
li __rB,IRQS_DISABLED; \
|
|
ori __rA,__rA,PACA_IRQ_HARD_DIS; \
|
|
stb __rB,PACASOFTIRQEN(r13); \
|
|
stb __rA,PACAIRQHAPPENED(r13)
|
|
#endif
|
|
#endif
|
|
|
|
#endif
|