* [PATCH 0/6] x86/irq: trap and interrupt cleanups
@ 2021-05-11 0:55 H. Peter Anvin
2021-05-11 0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
` (5 more replies)
0 siblings, 6 replies; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 0:55 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
A collection of trap/interrupt-related patches, almost all
cleanups. The only patches that should have any possible effect at all
are:
4/6 - x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
This patch reverses kvm_set_cpu_l1tf_flush_l1d() and
__irq_enter_raw() in DEFINE_IDTENTRY_SYSVEC_SIMPLE() in order
to be able to unify the code with DEFINE_IDTENTRY_SYSVEC().
The reason for unification is mainly to avoid the possibility
of inadvertent divergence rather than the rather modest amount
of code.
5/6 - x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
This condition is believed to be impossible after many
improvements to the IRQ vector allocation code since this
function was written. Per discussion with tglx, add a
WARN_ONCE() if this happens as a first step towards excising
this hack.
---
x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h>
x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS
x86/idt: remove address argument to idt_invalidate()
x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
x86/irq: remove unused vectors from <asm/irq_vectors.h>
arch/x86/include/asm/desc.h | 2 +-
arch/x86/include/asm/idtentry.h | 39 +++++++++++++++++---------------
arch/x86/include/asm/irq_vectors.h | 7 ++++--
arch/x86/include/asm/trapnr.h | 1 +
arch/x86/kernel/apic/vector.c | 5 ++++
arch/x86/kernel/idt.c | 5 ++--
arch/x86/kernel/machine_kexec_32.c | 4 ++--
arch/x86/kernel/reboot.c | 2 +-
tools/arch/x86/include/asm/irq_vectors.h | 7 ++++--
9 files changed, 43 insertions(+), 29 deletions(-)
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h>
2021-05-11 0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
@ 2021-05-11 0:55 ` H. Peter Anvin
2021-05-14 22:53 ` Andy Lutomirski
2021-05-11 0:55 ` [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS H. Peter Anvin
` (4 subsequent siblings)
5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 0:55 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
The x86 architecture supports up to 32 trap vectors. Add that constant
to <asm/trapnr.h>.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
arch/x86/include/asm/trapnr.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/x86/include/asm/trapnr.h b/arch/x86/include/asm/trapnr.h
index f5d2325aa0b7..f0baf92da20b 100644
--- a/arch/x86/include/asm/trapnr.h
+++ b/arch/x86/include/asm/trapnr.h
@@ -27,6 +27,7 @@
#define X86_TRAP_VE 20 /* Virtualization Exception */
#define X86_TRAP_CP 21 /* Control Protection Exception */
#define X86_TRAP_VC 29 /* VMM Communication Exception */
+#define X86_NR_HW_TRAPS 32 /* Max hardware trap number */
#define X86_TRAP_IRET 32 /* IRET Exception */
#endif
--
2.31.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS
2021-05-11 0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
2021-05-11 0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
@ 2021-05-11 0:55 ` H. Peter Anvin
2021-05-14 22:53 ` Andy Lutomirski
2021-05-11 0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
` (3 subsequent siblings)
5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 0:55 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
Add defines for the number of external vectors and number of system
vectors instead of requiring the use of (FIRST_SYSTEM_VECTOR -
FIRST_EXTERNAL_VECTOR) and (NR_VECTORS - FIRST_SYSTEM_VECTOR)
respectively.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
arch/x86/include/asm/idtentry.h | 4 ++--
arch/x86/include/asm/irq_vectors.h | 3 +++
tools/arch/x86/include/asm/irq_vectors.h | 3 +++
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index 73d45b0dfff2..c03a18cac78e 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -504,7 +504,7 @@ __visible noinstr void func(struct pt_regs *regs, \
.align 8
SYM_CODE_START(irq_entries_start)
vector=FIRST_EXTERNAL_VECTOR
- .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
+ .rept NR_EXTERNAL_VECTORS
UNWIND_HINT_IRET_REGS
0 :
.byte 0x6a, vector
@@ -520,7 +520,7 @@ SYM_CODE_END(irq_entries_start)
.align 8
SYM_CODE_START(spurious_entries_start)
vector=FIRST_SYSTEM_VECTOR
- .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR)
+ .rept NR_SYSTEM_VECTORS
UNWIND_HINT_IRET_REGS
0 :
.byte 0x6a, vector
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
index 889f8b1b5b7f..d2ef35927770 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -114,6 +114,9 @@
#define FIRST_SYSTEM_VECTOR NR_VECTORS
#endif
+#define NR_EXTERNAL_VECTORS (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
+#define NR_SYSTEM_VECTORS (NR_VECTORS - FIRST_SYSTEM_VECTOR)
+
/*
* Size the maximum number of interrupts.
*
diff --git a/tools/arch/x86/include/asm/irq_vectors.h b/tools/arch/x86/include/asm/irq_vectors.h
index 889f8b1b5b7f..d2ef35927770 100644
--- a/tools/arch/x86/include/asm/irq_vectors.h
+++ b/tools/arch/x86/include/asm/irq_vectors.h
@@ -114,6 +114,9 @@
#define FIRST_SYSTEM_VECTOR NR_VECTORS
#endif
+#define NR_EXTERNAL_VECTORS (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
+#define NR_SYSTEM_VECTORS (NR_VECTORS - FIRST_SYSTEM_VECTOR)
+
/*
* Size the maximum number of interrupts.
*
--
2.31.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 3/6] x86/idt: remove address argument to idt_invalidate()
2021-05-11 0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
2021-05-11 0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
2021-05-11 0:55 ` [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS H. Peter Anvin
@ 2021-05-11 0:55 ` H. Peter Anvin
2021-05-11 4:37 ` kernel test robot
2021-05-11 14:14 ` Thomas Gleixner
2021-05-11 0:55 ` [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] H. Peter Anvin
` (2 subsequent siblings)
5 siblings, 2 replies; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 0:55 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
There is no reason to specify any specific address to
idt_invalidate(). It looks mostly like an artifact of unifying code
done differently by accident.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
arch/x86/include/asm/desc.h | 2 +-
arch/x86/kernel/idt.c | 5 ++---
arch/x86/kernel/machine_kexec_32.c | 4 ++--
arch/x86/kernel/reboot.c | 2 +-
4 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h
index 476082a83d1c..b8429ae50b71 100644
--- a/arch/x86/include/asm/desc.h
+++ b/arch/x86/include/asm/desc.h
@@ -427,6 +427,6 @@ static inline void idt_setup_early_pf(void) { }
static inline void idt_setup_ist_traps(void) { }
#endif
-extern void idt_invalidate(void *addr);
+extern void idt_invalidate(void);
#endif /* _ASM_X86_DESC_H */
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
index d552f177eca0..17f824462f5e 100644
--- a/arch/x86/kernel/idt.c
+++ b/arch/x86/kernel/idt.c
@@ -331,11 +331,10 @@ void __init idt_setup_early_handler(void)
/**
* idt_invalidate - Invalidate interrupt descriptor table
- * @addr: The virtual address of the 'invalid' IDT
*/
-void idt_invalidate(void *addr)
+void idt_invalidate(void)
{
- struct desc_ptr idt = { .address = (unsigned long) addr, .size = 0 };
+ struct desc_ptr idt = { .address = 0, .size = 0 };
load_idt(&idt);
}
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
index 64b00b0d7fe8..6ba90f47d8c3 100644
--- a/arch/x86/kernel/machine_kexec_32.c
+++ b/arch/x86/kernel/machine_kexec_32.c
@@ -232,8 +232,8 @@ void machine_kexec(struct kimage *image)
* The gdt & idt are now invalid.
* If you want to load them you must set up your own idt & gdt.
*/
- idt_invalidate(phys_to_virt(0));
- set_gdt(phys_to_virt(0), 0);
+ idt_invalidate();
+ set_gdt(0, 0);
/* now call it */
image->start = relocate_kernel_ptr((unsigned long)image->head,
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index b29657b76e3f..ebfb91108232 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -669,7 +669,7 @@ static void native_machine_emergency_restart(void)
break;
case BOOT_TRIPLE:
- idt_invalidate(NULL);
+ idt_invalidate();
__asm__ __volatile__("int3");
/* We're probably dead after this, but... */
--
2.31.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
2021-05-11 0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
` (2 preceding siblings ...)
2021-05-11 0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
@ 2021-05-11 0:55 ` H. Peter Anvin
2021-05-11 14:22 ` Thomas Gleixner
2021-05-11 0:55 ` [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt H. Peter Anvin
2021-05-11 0:55 ` [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h> H. Peter Anvin
5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 0:55 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
Move the common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] into a common
macro.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
arch/x86/include/asm/idtentry.h | 35 ++++++++++++++++++---------------
1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index c03a18cac78e..de3727db021a 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -219,6 +219,23 @@ static noinline void __##func(struct pt_regs *regs, u32 vector)
#define DECLARE_IDTENTRY_SYSVEC(vector, func) \
DECLARE_IDTENTRY(vector, func)
+/**
+ * IDTENTRY_INVOKE_SYSVEC - Common code for system vector IDT entry points
+ * @what: What should be called
+ *
+ * Common code for DEFINE_IDTENTRY_SYSVEC and _SYSVEC_SIMPLE
+ */
+#define IDTENTRY_INVOKE_SYSVEC(what) \
+do { \
+ irqentry_state_t state = irqentry_enter(regs); \
+ \
+ instrumentation_begin(); \
+ kvm_set_cpu_l1tf_flush_l1d(); \
+ what; \
+ instrumentation_end(); \
+ irqentry_exit(regs, state); \
+} while (0) \
+
/**
* DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points
* @func: Function name of the entry point
@@ -233,13 +250,7 @@ static void __##func(struct pt_regs *regs); \
\
__visible noinstr void func(struct pt_regs *regs) \
{ \
- irqentry_state_t state = irqentry_enter(regs); \
- \
- instrumentation_begin(); \
- kvm_set_cpu_l1tf_flush_l1d(); \
- run_sysvec_on_irqstack_cond(__##func, regs); \
- instrumentation_end(); \
- irqentry_exit(regs, state); \
+ IDTENTRY_INVOKE_SYSVEC(run_sysvec_on_irqstack_cond(__##func, regs)); \
} \
\
static noinline void __##func(struct pt_regs *regs)
@@ -260,15 +271,7 @@ static __always_inline void __##func(struct pt_regs *regs); \
\
__visible noinstr void func(struct pt_regs *regs) \
{ \
- irqentry_state_t state = irqentry_enter(regs); \
- \
- instrumentation_begin(); \
- __irq_enter_raw(); \
- kvm_set_cpu_l1tf_flush_l1d(); \
- __##func (regs); \
- __irq_exit_raw(); \
- instrumentation_end(); \
- irqentry_exit(regs, state); \
+ IDTENTRY_INVOKE_SYSVEC(__irq_enter_raw(); __##func(regs); __irq_exit_raw()); \
} \
\
static __always_inline void __##func(struct pt_regs *regs)
--
2.31.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
2021-05-11 0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
` (3 preceding siblings ...)
2021-05-11 0:55 ` [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] H. Peter Anvin
@ 2021-05-11 0:55 ` H. Peter Anvin
2021-05-11 14:23 ` Thomas Gleixner
2021-05-11 0:55 ` [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h> H. Peter Anvin
5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 0:55 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
The current IRQ vector allocation code should be "clean" and never
issue a IRQ_MOVE_CLEANUP_VECTOR IPI for an interrupt that could still
be pending. This should make it possible to move it to the "normal"
system IRQ vector range. This should probably be a three-step process:
1. Introduce this WARN_ONCE() on this event ever occurring.
2. Move the IRQ_MOVE_CLEANUP_VECTOR to the sysvec range.
3. Remove the self-IPI hack.
This implements step 1.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
arch/x86/kernel/apic/vector.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index 6dbdc7c22bb7..7ba2982a3585 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -939,9 +939,14 @@ DEFINE_IDTENTRY_SYSVEC(sysvec_irq_move_cleanup)
* to this CPU. IRQ_MOVE_CLEANUP_VECTOR is the lowest
* priority external vector, so on return from this
* interrupt the device interrupt will happen first.
+ *
+ * *** This should never happen with the current IRQ
+ * cleanup code, so WARN_ONCE() for now, and
+ * eventually get rid of this hack.
*/
irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
if (irr & (1U << (vector % 32))) {
+ WARN_ONCE(1, "irq_move_cleanup called on still pending interrupt\n");
apic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
continue;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h>
2021-05-11 0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
` (4 preceding siblings ...)
2021-05-11 0:55 ` [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt H. Peter Anvin
@ 2021-05-11 0:55 ` H. Peter Anvin
2021-05-11 17:04 ` Steve Wahl
5 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 0:55 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
UV_BAU_MESSAGE is defined but not used anywhere in the
kernel. Presumably this is a stale vector number that can be
reclaimed.
MCE_VECTOR is not an actual vector: #MC is an exception, not an
interrupt vector, and as such is correctly described as
X86_TRAP_MC. MCE_VECTOR is not used anywhere is the kernel.
Note that NMI_VECTOR *is* used; specifically it is the vector number
programmed into the APIC LVT when an NMI interrupt is configured. At
the moment it is always numerically identical to X86_TRAP_NMI, that is
not necessarily going to be the case indefinitely.
Cc: Steve Wahl <steve.wahl@hpe.com>
Cc: Mike Travis <mike.travis@hpe.com>
Cc: Dimitri Sivanich <dimitri.sivanich@hpe.com>
Cc: Russ Anderson <russ.anderson@hpe.com>
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
arch/x86/include/asm/irq_vectors.h | 4 ++--
tools/arch/x86/include/asm/irq_vectors.h | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
index d2ef35927770..43dcb9284208 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -26,8 +26,8 @@
* This file enumerates the exact layout of them:
*/
+/* This is used as an interrupt vector when programming the APIC. */
#define NMI_VECTOR 0x02
-#define MCE_VECTOR 0x12
/*
* IDT vectors usable for external interrupt sources start at 0x20.
@@ -84,7 +84,7 @@
*/
#define IRQ_WORK_VECTOR 0xf6
-#define UV_BAU_MESSAGE 0xf5
+/* 0xf5 - unused, was UV_BAU_MESSAGE */
#define DEFERRED_ERROR_VECTOR 0xf4
/* Vector on which hypervisor callbacks will be delivered */
diff --git a/tools/arch/x86/include/asm/irq_vectors.h b/tools/arch/x86/include/asm/irq_vectors.h
index d2ef35927770..43dcb9284208 100644
--- a/tools/arch/x86/include/asm/irq_vectors.h
+++ b/tools/arch/x86/include/asm/irq_vectors.h
@@ -26,8 +26,8 @@
* This file enumerates the exact layout of them:
*/
+/* This is used as an interrupt vector when programming the APIC. */
#define NMI_VECTOR 0x02
-#define MCE_VECTOR 0x12
/*
* IDT vectors usable for external interrupt sources start at 0x20.
@@ -84,7 +84,7 @@
*/
#define IRQ_WORK_VECTOR 0xf6
-#define UV_BAU_MESSAGE 0xf5
+/* 0xf5 - unused, was UV_BAU_MESSAGE */
#define DEFERRED_ERROR_VECTOR 0xf4
/* Vector on which hypervisor callbacks will be delivered */
--
2.31.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 3/6] x86/idt: remove address argument to idt_invalidate()
2021-05-11 0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
@ 2021-05-11 4:37 ` kernel test robot
2021-05-11 14:14 ` Thomas Gleixner
1 sibling, 0 replies; 20+ messages in thread
From: kernel test robot @ 2021-05-11 4:37 UTC (permalink / raw)
To: H. Peter Anvin, Ingo Molnar, Thomas Gleixner, Borislav Petkov,
Andy Lutomirski
Cc: kbuild-all, Steve Wahl, Mike Travis, Dimitri Sivanich,
Russ Anderson, Linux Kernel Mailing List, H. Peter Anvin (Intel)
[-- Attachment #1: Type: text/plain, Size: 3832 bytes --]
Hi Peter,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on tip/x86/core]
[also build test WARNING on tip/master linus/master v5.13-rc1 next-20210510]
[cannot apply to bp/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/H-Peter-Anvin/x86-irq-trap-and-interrupt-cleanups/20210511-085650
base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 2c88d45edbb89029c1190bb3b136d2602f057c98
config: i386-randconfig-s002-20210511 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.3-341-g8af24329-dirty
# https://github.com/0day-ci/linux/commit/c9c68d8ad1ef0923798c18f7e9a9570fa23aee0e
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review H-Peter-Anvin/x86-irq-trap-and-interrupt-cleanups/20210511-085650
git checkout c9c68d8ad1ef0923798c18f7e9a9570fa23aee0e
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' W=1 ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
sparse warnings: (new ones prefixed by >>)
>> arch/x86/kernel/machine_kexec_32.c:236:17: sparse: sparse: Using plain integer as NULL pointer
vim +236 arch/x86/kernel/machine_kexec_32.c
188
189 save_ftrace_enabled = __ftrace_enabled_save();
190
191 /* Interrupts aren't acceptable while we reboot */
192 local_irq_disable();
193 hw_breakpoint_disable();
194
195 if (image->preserve_context) {
196 #ifdef CONFIG_X86_IO_APIC
197 /*
198 * We need to put APICs in legacy mode so that we can
199 * get timer interrupts in second kernel. kexec/kdump
200 * paths already have calls to restore_boot_irq_mode()
201 * in one form or other. kexec jump path also need one.
202 */
203 clear_IO_APIC();
204 restore_boot_irq_mode();
205 #endif
206 }
207
208 control_page = page_address(image->control_code_page);
209 memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE);
210
211 relocate_kernel_ptr = control_page;
212 page_list[PA_CONTROL_PAGE] = __pa(control_page);
213 page_list[VA_CONTROL_PAGE] = (unsigned long)control_page;
214 page_list[PA_PGD] = __pa(image->arch.pgd);
215
216 if (image->type == KEXEC_TYPE_DEFAULT)
217 page_list[PA_SWAP_PAGE] = (page_to_pfn(image->swap_page)
218 << PAGE_SHIFT);
219
220 /*
221 * The segment registers are funny things, they have both a
222 * visible and an invisible part. Whenever the visible part is
223 * set to a specific selector, the invisible part is loaded
224 * with from a table in memory. At no other time is the
225 * descriptor table in memory accessed.
226 *
227 * I take advantage of this here by force loading the
228 * segments, before I zap the gdt with an invalid value.
229 */
230 load_segments();
231 /*
232 * The gdt & idt are now invalid.
233 * If you want to load them you must set up your own idt & gdt.
234 */
235 idt_invalidate();
> 236 set_gdt(0, 0);
237
238 /* now call it */
239 image->start = relocate_kernel_ptr((unsigned long)image->head,
240 (unsigned long)page_list,
241 image->start,
242 boot_cpu_has(X86_FEATURE_PAE),
243 image->preserve_context);
244
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 35108 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/6] x86/idt: remove address argument to idt_invalidate()
2021-05-11 0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
2021-05-11 4:37 ` kernel test robot
@ 2021-05-11 14:14 ` Thomas Gleixner
2021-05-11 14:43 ` H. Peter Anvin
1 sibling, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2021-05-11 14:14 UTC (permalink / raw)
To: H. Peter Anvin, Ingo Molnar, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
> diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
> index 64b00b0d7fe8..6ba90f47d8c3 100644
> --- a/arch/x86/kernel/machine_kexec_32.c
> +++ b/arch/x86/kernel/machine_kexec_32.c
> @@ -232,8 +232,8 @@ void machine_kexec(struct kimage *image)
> * The gdt & idt are now invalid.
> * If you want to load them you must set up your own idt & gdt.
> */
> - idt_invalidate(phys_to_virt(0));
> - set_gdt(phys_to_virt(0), 0);
> + idt_invalidate();
> + set_gdt(0, 0);
(NULL, 0)
first argument it a pointer...
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
2021-05-11 0:55 ` [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] H. Peter Anvin
@ 2021-05-11 14:22 ` Thomas Gleixner
2021-05-11 17:44 ` H. Peter Anvin
0 siblings, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2021-05-11 14:22 UTC (permalink / raw)
To: H. Peter Anvin, Ingo Molnar, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
> +/**
> + * IDTENTRY_INVOKE_SYSVEC - Common code for system vector IDT entry points
> + * @what: What should be called
> + *
> + * Common code for DEFINE_IDTENTRY_SYSVEC and _SYSVEC_SIMPLE
> + */
> +#define IDTENTRY_INVOKE_SYSVEC(what) \
> +do { \
> + irqentry_state_t state = irqentry_enter(regs); \
> + \
> + instrumentation_begin(); \
> + kvm_set_cpu_l1tf_flush_l1d(); \
> + what; \
> + instrumentation_end(); \
> + irqentry_exit(regs, state); \
> +} while (0) \
> +
> /**
> * DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points
> * @func: Function name of the entry point
> @@ -233,13 +250,7 @@ static void __##func(struct pt_regs *regs); \
> \
> __visible noinstr void func(struct pt_regs *regs) \
> { \
> - irqentry_state_t state = irqentry_enter(regs); \
> - \
> - instrumentation_begin(); \
> - kvm_set_cpu_l1tf_flush_l1d(); \
> - run_sysvec_on_irqstack_cond(__##func, regs); \
> - instrumentation_end(); \
> - irqentry_exit(regs, state); \
> + IDTENTRY_INVOKE_SYSVEC(run_sysvec_on_irqstack_cond(__##func, regs)); \
> } \
> \
> static noinline void __##func(struct pt_regs *regs)
> @@ -260,15 +271,7 @@ static __always_inline void __##func(struct pt_regs *regs); \
> \
> __visible noinstr void func(struct pt_regs *regs) \
> { \
> - irqentry_state_t state = irqentry_enter(regs); \
> - \
> - instrumentation_begin(); \
> - __irq_enter_raw(); \
> - kvm_set_cpu_l1tf_flush_l1d(); \
> - __##func (regs); \
> - __irq_exit_raw(); \
> - instrumentation_end(); \
> - irqentry_exit(regs, state); \
> + IDTENTRY_INVOKE_SYSVEC(__irq_enter_raw(); __##func(regs); __irq_exit_raw()); \
That's not really making the code more readable. Something like the
below perhaps?
#define IDTENTRY_INVOKE_SYSVEC(func, regs, raw) \
do { \
irqentry_state_t state = irqentry_enter(regs); \
\
instrumentation_begin(); \
kvm_set_cpu_l1tf_flush_l1d(); \
if (raw) { \
__irq_enter_raw(); \
func(regs); \
__irq_exit_raw(); \
} else { \
run_sysvec_on_irqstack_cond(func, regs); \
} \
instrumentation_end(); \
irqentry_exit(regs, state); \
} while (0) \
Thanks,
tglx
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
2021-05-11 0:55 ` [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt H. Peter Anvin
@ 2021-05-11 14:23 ` Thomas Gleixner
2021-05-11 15:55 ` H. Peter Anvin
0 siblings, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2021-05-11 14:23 UTC (permalink / raw)
To: H. Peter Anvin, Ingo Molnar, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List, H. Peter Anvin (Intel)
On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>
> The current IRQ vector allocation code should be "clean" and never
> issue a IRQ_MOVE_CLEANUP_VECTOR IPI for an interrupt that could still
> be pending. This should make it possible to move it to the "normal"
> system IRQ vector range. This should probably be a three-step process:
>
> 1. Introduce this WARN_ONCE() on this event ever occurring.
> 2. Move the IRQ_MOVE_CLEANUP_VECTOR to the sysvec range.
> 3. Remove the self-IPI hack.
Actually 2+3 must be combined because _if_ this ever happens then the
self-IPI loops forever.
Thanks,
tglx
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/6] x86/idt: remove address argument to idt_invalidate()
2021-05-11 14:14 ` Thomas Gleixner
@ 2021-05-11 14:43 ` H. Peter Anvin
0 siblings, 0 replies; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 14:43 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
Yup, me bad.
On May 11, 2021 7:14:47 AM PDT, Thomas Gleixner <tglx@linutronix.de> wrote:
>On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
>> diff --git a/arch/x86/kernel/machine_kexec_32.c
>b/arch/x86/kernel/machine_kexec_32.c
>> index 64b00b0d7fe8..6ba90f47d8c3 100644
>> --- a/arch/x86/kernel/machine_kexec_32.c
>> +++ b/arch/x86/kernel/machine_kexec_32.c
>> @@ -232,8 +232,8 @@ void machine_kexec(struct kimage *image)
>> * The gdt & idt are now invalid.
>> * If you want to load them you must set up your own idt & gdt.
>> */
>> - idt_invalidate(phys_to_virt(0));
>> - set_gdt(phys_to_virt(0), 0);
>> + idt_invalidate();
>> + set_gdt(0, 0);
>
> (NULL, 0)
>
>first argument it a pointer...
>
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt
2021-05-11 14:23 ` Thomas Gleixner
@ 2021-05-11 15:55 ` H. Peter Anvin
0 siblings, 0 replies; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 15:55 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
You are, of course, correct – or 2 and 3 can be reversed, I believe.
On May 11, 2021 7:23:53 AM PDT, Thomas Gleixner <tglx@linutronix.de> wrote:
>On Mon, May 10 2021 at 17:55, H. Peter Anvin wrote:
>> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>>
>> The current IRQ vector allocation code should be "clean" and never
>> issue a IRQ_MOVE_CLEANUP_VECTOR IPI for an interrupt that could still
>> be pending. This should make it possible to move it to the "normal"
>> system IRQ vector range. This should probably be a three-step
>process:
>>
>> 1. Introduce this WARN_ONCE() on this event ever occurring.
>> 2. Move the IRQ_MOVE_CLEANUP_VECTOR to the sysvec range.
>> 3. Remove the self-IPI hack.
>
>Actually 2+3 must be combined because _if_ this ever happens then the
>self-IPI loops forever.
>
>Thanks,
>
> tglx
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h>
2021-05-11 0:55 ` [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h> H. Peter Anvin
@ 2021-05-11 17:04 ` Steve Wahl
0 siblings, 0 replies; 20+ messages in thread
From: Steve Wahl @ 2021-05-11 17:04 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Ingo Molnar, Thomas Gleixner, Borislav Petkov, Andy Lutomirski,
Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
Acked-by: Steve Wahl <steve.wahl@hpe.com>
Yes, we believe UV_BAU_MESSAGE is one we missed in some earlier code
cleanup, and agree with its removal.
On Mon, May 10, 2021 at 05:55:31PM -0700, H. Peter Anvin wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>
> UV_BAU_MESSAGE is defined but not used anywhere in the
> kernel. Presumably this is a stale vector number that can be
> reclaimed.
>
> MCE_VECTOR is not an actual vector: #MC is an exception, not an
> interrupt vector, and as such is correctly described as
> X86_TRAP_MC. MCE_VECTOR is not used anywhere is the kernel.
>
> Note that NMI_VECTOR *is* used; specifically it is the vector number
> programmed into the APIC LVT when an NMI interrupt is configured. At
> the moment it is always numerically identical to X86_TRAP_NMI, that is
> not necessarily going to be the case indefinitely.
>
> Cc: Steve Wahl <steve.wahl@hpe.com>
> Cc: Mike Travis <mike.travis@hpe.com>
> Cc: Dimitri Sivanich <dimitri.sivanich@hpe.com>
> Cc: Russ Anderson <russ.anderson@hpe.com>
> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
> ---
> arch/x86/include/asm/irq_vectors.h | 4 ++--
> tools/arch/x86/include/asm/irq_vectors.h | 4 ++--
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
> index d2ef35927770..43dcb9284208 100644
> --- a/arch/x86/include/asm/irq_vectors.h
> +++ b/arch/x86/include/asm/irq_vectors.h
> @@ -26,8 +26,8 @@
> * This file enumerates the exact layout of them:
> */
>
> +/* This is used as an interrupt vector when programming the APIC. */
> #define NMI_VECTOR 0x02
> -#define MCE_VECTOR 0x12
>
> /*
> * IDT vectors usable for external interrupt sources start at 0x20.
> @@ -84,7 +84,7 @@
> */
> #define IRQ_WORK_VECTOR 0xf6
>
> -#define UV_BAU_MESSAGE 0xf5
> +/* 0xf5 - unused, was UV_BAU_MESSAGE */
> #define DEFERRED_ERROR_VECTOR 0xf4
>
> /* Vector on which hypervisor callbacks will be delivered */
> diff --git a/tools/arch/x86/include/asm/irq_vectors.h b/tools/arch/x86/include/asm/irq_vectors.h
> index d2ef35927770..43dcb9284208 100644
> --- a/tools/arch/x86/include/asm/irq_vectors.h
> +++ b/tools/arch/x86/include/asm/irq_vectors.h
> @@ -26,8 +26,8 @@
> * This file enumerates the exact layout of them:
> */
>
> +/* This is used as an interrupt vector when programming the APIC. */
> #define NMI_VECTOR 0x02
> -#define MCE_VECTOR 0x12
>
> /*
> * IDT vectors usable for external interrupt sources start at 0x20.
> @@ -84,7 +84,7 @@
> */
> #define IRQ_WORK_VECTOR 0xf6
>
> -#define UV_BAU_MESSAGE 0xf5
> +/* 0xf5 - unused, was UV_BAU_MESSAGE */
> #define DEFERRED_ERROR_VECTOR 0xf4
>
> /* Vector on which hypervisor callbacks will be delivered */
> --
> 2.31.1
>
--
Steve Wahl, Hewlett Packard Enterprise
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
2021-05-11 14:22 ` Thomas Gleixner
@ 2021-05-11 17:44 ` H. Peter Anvin
2021-05-12 8:38 ` Ingo Molnar
0 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-11 17:44 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
On 5/11/21 7:22 AM, Thomas Gleixner wrote:
>
> That's not really making the code more readable. Something like the
> below perhaps?
>
> #define IDTENTRY_INVOKE_SYSVEC(func, regs, raw) \
> do { \
> irqentry_state_t state = irqentry_enter(regs); \
> \
> instrumentation_begin(); \
> kvm_set_cpu_l1tf_flush_l1d(); \
> if (raw) { \
> __irq_enter_raw(); \
> func(regs); \
> __irq_exit_raw(); \
> } else { \
> run_sysvec_on_irqstack_cond(func, regs); \
> } \
> instrumentation_end(); \
> irqentry_exit(regs, state); \
> } while (0) \
>
Digging more into it, it looks like a *lot* of the macros in
<asm/irq_stack.h> and <asm/idtentry.h> can be replaced with inlines
without any change in functionality or generated code.
-hpa
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
2021-05-11 17:44 ` H. Peter Anvin
@ 2021-05-12 8:38 ` Ingo Molnar
2021-05-12 18:00 ` H. Peter Anvin
0 siblings, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2021-05-12 8:38 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski,
Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
* H. Peter Anvin <hpa@zytor.com> wrote:
> On 5/11/21 7:22 AM, Thomas Gleixner wrote:
> >
> > That's not really making the code more readable. Something like the
> > below perhaps?
> >
> > #define IDTENTRY_INVOKE_SYSVEC(func, regs, raw) \
> > do { \
> > irqentry_state_t state = irqentry_enter(regs); \
> > \
> > instrumentation_begin(); \
> > kvm_set_cpu_l1tf_flush_l1d(); \
> > if (raw) { \
> > __irq_enter_raw(); \
> > func(regs); \
> > __irq_exit_raw(); \
> > } else { \
> > run_sysvec_on_irqstack_cond(func, regs); \
> > } \
> > instrumentation_end(); \
> > irqentry_exit(regs, state); \
> > } while (0) \
> >
>
> Digging more into it, it looks like a *lot* of the macros in
> <asm/irq_stack.h> and <asm/idtentry.h> can be replaced with inlines without
> any change in functionality or generated code.
That would be a much preferred outcome ...
Thanks,
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
2021-05-12 8:38 ` Ingo Molnar
@ 2021-05-12 18:00 ` H. Peter Anvin
2021-05-12 18:40 ` Ingo Molnar
0 siblings, 1 reply; 20+ messages in thread
From: H. Peter Anvin @ 2021-05-12 18:00 UTC (permalink / raw)
To: Ingo Molnar
Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski,
Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
[-- Attachment #1: Type: text/plain, Size: 1391 bytes --]
On 5/12/21 1:38 AM, Ingo Molnar wrote:
>
> * H. Peter Anvin <hpa@zytor.com> wrote:
>
>> On 5/11/21 7:22 AM, Thomas Gleixner wrote:
>>>
>>> That's not really making the code more readable. Something like the
>>> below perhaps?
>>>
>>> #define IDTENTRY_INVOKE_SYSVEC(func, regs, raw) \
>>> do { \
>>> irqentry_state_t state = irqentry_enter(regs); \
>>> \
>>> instrumentation_begin(); \
>>> kvm_set_cpu_l1tf_flush_l1d(); \
>>> if (raw) { \
>>> __irq_enter_raw(); \
>>> func(regs); \
>>> __irq_exit_raw(); \
>>> } else { \
>>> run_sysvec_on_irqstack_cond(func, regs); \
>>> } \
>>> instrumentation_end(); \
>>> irqentry_exit(regs, state); \
>>> } while (0) \
>>>
>>
>> Digging more into it, it looks like a *lot* of the macros in
>> <asm/irq_stack.h> and <asm/idtentry.h> can be replaced with inlines without
>> any change in functionality or generated code.
>
> That would be a much preferred outcome ...
Well, here is an RFC. This is obviously a much bigger change and I don't
feel it is mature yet, but it would be good to know if you (plural) feel
it is in the right direction.
I will clean up the rest of the patchset and resubmit.
-hpa
[-- Attachment #2: 0001-x86-irq-merge-and-functionalize-common-code-in-DECLA.patch --]
[-- Type: text/x-patch, Size: 17742 bytes --]
From e52200ed187e30f45d32639612e09281a544c062 Mon Sep 17 00:00:00 2001
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
Date: Wed, 5 May 2021 17:43:46 -0700
Subject: [PATCH] x86/irq: merge and functionalize common code in
DECLARE/DEFINE_IDTENTRY_*
Move as much of the common code in the _IDTENTRY_ and
run_*_on_irq_stack() into inline functions instead of macros. A lot of
them differ only in types and/or the presence or absence of an
additional argument; the differential amount of code is neglible and
after bending the types a little bit, they unify nicely.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
---
arch/x86/entry/common.c | 5 +-
arch/x86/include/asm/idtentry.h | 170 +++++++++++++++----------------
arch/x86/include/asm/irq_stack.h | 73 +++++--------
arch/x86/kernel/apic/apic.c | 2 +-
arch/x86/kernel/irq.c | 1 +
arch/x86/kernel/sev-es.c | 6 +-
arch/x86/kernel/traps.c | 2 +-
7 files changed, 117 insertions(+), 142 deletions(-)
diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
index 7b2542b13ebd..1e46a1a35b20 100644
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -253,7 +253,8 @@ static __always_inline bool get_and_clear_inhcall(void) { return false; }
static __always_inline void restore_inhcall(bool inhcall) { }
#endif
-static void __xen_pv_evtchn_do_upcall(struct pt_regs *regs)
+static void __xen_pv_evtchn_do_upcall(struct pt_regs *regs,
+ u32 __dummy __always_unused)
{
struct pt_regs *old_regs = set_irq_regs(regs);
@@ -269,7 +270,7 @@ __visible noinstr void xen_pv_evtchn_do_upcall(struct pt_regs *regs)
irqentry_state_t state = irqentry_enter(regs);
bool inhcall;
- run_sysvec_on_irqstack_cond(__xen_pv_evtchn_do_upcall, regs);
+ run_on_irqstack_cond(__xen_pv_evtchn_do_upcall, regs, 0);
inhcall = get_and_clear_inhcall();
if (inhcall && !WARN_ON_ONCE(state.exit_rcu)) {
diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index c03a18cac78e..85f79a429a39 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -11,6 +11,65 @@
#include <asm/irq_stack.h>
+/**
+ * idtentry_call - Common code for non-trivial IDT entry points
+ * @func: What should ultimately be called
+ * @regs: Pointer to entry struct pt_regs
+ * @arg: Extra argument to func (vector, error_code)
+ * @flush: If kvm_set_cpu_l1tf_flush_l1d() should be called
+ * @wrapper: Wrapper to call func; NULL for just call
+ */
+static __always_inline void
+idtentry_call(irq_func_t func, struct pt_regs *regs, bool flush,
+ void (*wrapper)(irq_func_t, struct pt_regs *, u32),
+ u32 arg)
+{
+ irqentry_state_t state = irqentry_enter(regs);
+
+ instrumentation_begin();
+ if (flush)
+ kvm_set_cpu_l1tf_flush_l1d();
+ if (wrapper)
+ wrapper(func, regs, arg);
+ else
+ func(regs, arg);
+ instrumentation_end();
+ irqentry_exit(regs, state);
+}
+
+/**
+ * _DEFINE_IDTENTRY - Common macro for defining idtentries with no argument
+ * @func: Function name of the entry point
+ * @flush: If wrapper should call kvm_set_cpu_l1tf_flush_l1d()
+ * @inline_opt: __always_inline or noinline as appropriate for __func
+ * @wrapper: Wrapper function for calling __func
+ *
+ */
+#define _DEFINE_IDTENTRY(func, flush, inline_opt, wrapper) \
+static inline_opt void __##func(struct pt_regs *regs, u32); \
+__visible noinstr void func(struct pt_regs *regs) \
+{ \
+ idtentry_call(__##func, regs, flush, wrapper, 0); \
+} \
+static inline_opt void \
+__##func(struct pt_regs *regs, u32 __dummy __always_unused)
+
+/**
+ * _DEFINE_IDTENTRY_ERRORCODE - Common macro for defining idtentries with argument
+ * @func: Function name of the entry point
+ * @flush: If wrapper should call kvm_set_cpu_l1tf_flush_l1d()
+ * @inline_opt: __always_inline or noinline as appropriate for __func
+ * @wrapper: Wrapper function for calling __func
+ *
+ */
+#define _DEFINE_IDTENTRY_ERRORCODE(func, flush, inline_opt, wrapper) \
+static inline_opt void __##func(struct pt_regs *regs, u32 error_code); \
+__visible noinstr void func(struct pt_regs *regs, u32 error_code) \
+{ \
+ idtentry_call(__##func, regs, flush, wrapper, error_code); \
+} \
+static inline_opt void __##func(struct pt_regs *regs, u32 error_code)
+
/**
* DECLARE_IDTENTRY - Declare functions for simple IDT entry points
* No error code pushed by hardware
@@ -45,19 +104,7 @@
* which has to run before returning to the low level assembly code.
*/
#define DEFINE_IDTENTRY(func) \
-static __always_inline void __##func(struct pt_regs *regs); \
- \
-__visible noinstr void func(struct pt_regs *regs) \
-{ \
- irqentry_state_t state = irqentry_enter(regs); \
- \
- instrumentation_begin(); \
- __##func (regs); \
- instrumentation_end(); \
- irqentry_exit(regs, state); \
-} \
- \
-static __always_inline void __##func(struct pt_regs *regs)
+ _DEFINE_IDTENTRY(func, false, __always_inline, NULL)
/* Special case for 32bit IRET 'trap' */
#define DECLARE_IDTENTRY_SW DECLARE_IDTENTRY
@@ -80,7 +127,7 @@ static __always_inline void __##func(struct pt_regs *regs)
#define DECLARE_IDTENTRY_ERRORCODE(vector, func) \
asmlinkage void asm_##func(void); \
asmlinkage void xen_asm_##func(void); \
- __visible void func(struct pt_regs *regs, unsigned long error_code)
+ __visible void func(struct pt_regs *regs, u32 error_code)
/**
* DEFINE_IDTENTRY_ERRORCODE - Emit code for simple IDT entry points
@@ -90,22 +137,7 @@ static __always_inline void __##func(struct pt_regs *regs)
* Same as DEFINE_IDTENTRY, but has an extra error_code argument
*/
#define DEFINE_IDTENTRY_ERRORCODE(func) \
-static __always_inline void __##func(struct pt_regs *regs, \
- unsigned long error_code); \
- \
-__visible noinstr void func(struct pt_regs *regs, \
- unsigned long error_code) \
-{ \
- irqentry_state_t state = irqentry_enter(regs); \
- \
- instrumentation_begin(); \
- __##func (regs, error_code); \
- instrumentation_end(); \
- irqentry_exit(regs, state); \
-} \
- \
-static __always_inline void __##func(struct pt_regs *regs, \
- unsigned long error_code)
+ _DEFINE_IDTENTRY_ERRORCODE(func, false, __always_inline, NULL)
/**
* DECLARE_IDTENTRY_RAW - Declare functions for raw IDT entry points
@@ -161,7 +193,7 @@ __visible noinstr void func(struct pt_regs *regs)
* is required before the enter/exit() helpers are invoked.
*/
#define DEFINE_IDTENTRY_RAW_ERRORCODE(func) \
-__visible noinstr void func(struct pt_regs *regs, unsigned long error_code)
+__visible noinstr void func(struct pt_regs *regs, u32 error_code)
/**
* DECLARE_IDTENTRY_IRQ - Declare functions for device interrupt IDT entry
@@ -187,25 +219,11 @@ __visible noinstr void func(struct pt_regs *regs, unsigned long error_code)
* has to be done in the function body if necessary.
*/
#define DEFINE_IDTENTRY_IRQ(func) \
-static void __##func(struct pt_regs *regs, u32 vector); \
- \
-__visible noinstr void func(struct pt_regs *regs, \
- unsigned long error_code) \
-{ \
- irqentry_state_t state = irqentry_enter(regs); \
- u32 vector = (u32)(u8)error_code; \
- \
- instrumentation_begin(); \
- kvm_set_cpu_l1tf_flush_l1d(); \
- run_irq_on_irqstack_cond(__##func, regs, vector); \
- instrumentation_end(); \
- irqentry_exit(regs, state); \
-} \
- \
-static noinline void __##func(struct pt_regs *regs, u32 vector)
+ _DEFINE_IDTENTRY_ERRORCODE(func, true, noinline, run_on_irqstack_cond)
/**
- * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points
+ * DECLARE_IDTENTRY - Declare functions for simple IDT entry points
+ * No error code pushed by hardware
* @vector: Vector number (ignored for C)
* @func: Function name of the entry point
*
@@ -214,9 +232,11 @@ static noinline void __##func(struct pt_regs *regs, u32 vector)
* - The XEN PV trap entry point: xen_##func (maybe unused)
* - The C handler called from the ASM entry point
*
- * Maps to DECLARE_IDTENTRY().
+ * Note: This is the C variant of DECLARE_IDTENTRY(). As the name says it
+ * declares the entry points for usage in C code. There is an ASM variant
+ * as well which is used to emit the entry stubs in entry_32/64.S.
*/
-#define DECLARE_IDTENTRY_SYSVEC(vector, func) \
+#define DECLARE_IDTENTRY_SYSVEC(vector, func) \
DECLARE_IDTENTRY(vector, func)
/**
@@ -229,20 +249,7 @@ static noinline void __##func(struct pt_regs *regs, u32 vector)
* Runs the function on the interrupt stack if the entry hit kernel mode
*/
#define DEFINE_IDTENTRY_SYSVEC(func) \
-static void __##func(struct pt_regs *regs); \
- \
-__visible noinstr void func(struct pt_regs *regs) \
-{ \
- irqentry_state_t state = irqentry_enter(regs); \
- \
- instrumentation_begin(); \
- kvm_set_cpu_l1tf_flush_l1d(); \
- run_sysvec_on_irqstack_cond(__##func, regs); \
- instrumentation_end(); \
- irqentry_exit(regs, state); \
-} \
- \
-static noinline void __##func(struct pt_regs *regs)
+ _DEFINE_IDTENTRY(func, true, noinline, run_on_irqstack_cond)
/**
* DEFINE_IDTENTRY_SYSVEC_SIMPLE - Emit code for simple system vector IDT
@@ -255,23 +262,16 @@ static noinline void __##func(struct pt_regs *regs)
* Only use for 'empty' vectors like reschedule IPI and KVM posted
* interrupt vectors.
*/
+static __always_inline void
+call_sysvec_simple(irq_func_t func, struct pt_regs *regs, u32 arg)
+{
+ __irq_enter_raw();
+ func(regs, arg);
+ __irq_exit_raw();
+}
+
#define DEFINE_IDTENTRY_SYSVEC_SIMPLE(func) \
-static __always_inline void __##func(struct pt_regs *regs); \
- \
-__visible noinstr void func(struct pt_regs *regs) \
-{ \
- irqentry_state_t state = irqentry_enter(regs); \
- \
- instrumentation_begin(); \
- __irq_enter_raw(); \
- kvm_set_cpu_l1tf_flush_l1d(); \
- __##func (regs); \
- __irq_exit_raw(); \
- instrumentation_end(); \
- irqentry_exit(regs, state); \
-} \
- \
-static __always_inline void __##func(struct pt_regs *regs)
+ _DEFINE_IDTENTRY(func, true, __always_inline, call_sysvec_simple)
/**
* DECLARE_IDTENTRY_XENCB - Declare functions for XEN HV callback entry point
@@ -312,8 +312,8 @@ static __always_inline void __##func(struct pt_regs *regs)
*/
#define DECLARE_IDTENTRY_VC(vector, func) \
DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func); \
- __visible noinstr void ist_##func(struct pt_regs *regs, unsigned long error_code); \
- __visible noinstr void safe_stack_##func(struct pt_regs *regs, unsigned long error_code)
+ __visible noinstr void ist_##func(struct pt_regs *regs, u32 error_code); \
+ __visible noinstr void safe_stack_##func(struct pt_regs *regs, u32 error_code)
/**
* DEFINE_IDTENTRY_IST - Emit code for IST entry points
@@ -396,8 +396,7 @@ static __always_inline void __##func(struct pt_regs *regs)
*/
#define DECLARE_IDTENTRY_DF(vector, func) \
asmlinkage void asm_##func(void); \
- __visible void func(struct pt_regs *regs, \
- unsigned long error_code, \
+ __visible void func(struct pt_regs *regs, u32 error_code, \
unsigned long address)
/**
@@ -408,8 +407,7 @@ static __always_inline void __##func(struct pt_regs *regs)
* cr2 in the address argument.
*/
#define DEFINE_IDTENTRY_DF(func) \
-__visible noinstr void func(struct pt_regs *regs, \
- unsigned long error_code, \
+__visible noinstr void func(struct pt_regs *regs, u32 error_code, \
unsigned long address)
#endif /* !CONFIG_X86_64 */
diff --git a/arch/x86/include/asm/irq_stack.h b/arch/x86/include/asm/irq_stack.h
index 562854c60808..305ca95b2743 100644
--- a/arch/x86/include/asm/irq_stack.h
+++ b/arch/x86/include/asm/irq_stack.h
@@ -6,6 +6,8 @@
#include <asm/processor.h>
+typedef void (*irq_func_t)(struct pt_regs *regs, u32 arg);
+
#ifdef CONFIG_X86_64
/*
@@ -132,7 +134,7 @@
}
/*
- * Function call sequence for __call_on_irqstack() for system vectors.
+ * Function call sequence for __call_on_irqstack() for irqs and system vectors.
*
* Note that irq_enter_rcu() and irq_exit_rcu() do not use the input
* mechanism because these functions are global and cannot be optimized out
@@ -145,27 +147,6 @@
* call to idtentry_exit() anyway, it's likely that it does not cause extra
* effort for this asm magic.
*/
-#define ASM_CALL_SYSVEC \
- "call irq_enter_rcu \n" \
- "movq %[arg1], %%rdi \n" \
- "call %P[__func] \n" \
- "call irq_exit_rcu \n"
-
-#define SYSVEC_CONSTRAINTS , [arg1] "r" (regs)
-
-#define run_sysvec_on_irqstack_cond(func, regs) \
-{ \
- assert_function_type(func, void (*)(struct pt_regs *)); \
- assert_arg_type(regs, struct pt_regs *); \
- \
- call_on_irqstack_cond(func, regs, ASM_CALL_SYSVEC, \
- SYSVEC_CONSTRAINTS, regs); \
-}
-
-/*
- * As in ASM_CALL_SYSVEC above the clobbers force the compiler to store
- * @regs and @vector in callee saved registers.
- */
#define ASM_CALL_IRQ \
"call irq_enter_rcu \n" \
"movq %[arg1], %%rdi \n" \
@@ -173,16 +154,13 @@
"call %P[__func] \n" \
"call irq_exit_rcu \n"
-#define IRQ_CONSTRAINTS , [arg1] "r" (regs), [arg2] "r" (vector)
+#define IRQ_CONSTRAINTS , [arg1] "r" (regs), [arg2] "r" (arg)
-#define run_irq_on_irqstack_cond(func, regs, vector) \
-{ \
- assert_function_type(func, void (*)(struct pt_regs *, u32)); \
- assert_arg_type(regs, struct pt_regs *); \
- assert_arg_type(vector, u32); \
- \
- call_on_irqstack_cond(func, regs, ASM_CALL_IRQ, \
- IRQ_CONSTRAINTS, regs, vector); \
+static __always_inline void
+run_on_irqstack_cond(irq_func_t func, struct pt_regs *regs, u32 arg)
+{
+ call_on_irqstack_cond(func, regs, ASM_CALL_IRQ,
+ IRQ_CONSTRAINTS, regs, arg);
}
#define ASM_CALL_SOFTIRQ \
@@ -194,28 +172,25 @@
* interrupts are pending to be processed. The interrupt stack cannot be in
* use here.
*/
-#define do_softirq_own_stack() \
-{ \
- __this_cpu_write(hardirq_stack_inuse, true); \
- call_on_irqstack(__do_softirq, ASM_CALL_SOFTIRQ); \
- __this_cpu_write(hardirq_stack_inuse, false); \
+static __always_inline void do_softirq_own_stack(void)
+{
+ __this_cpu_write(hardirq_stack_inuse, true);
+ call_on_irqstack(__do_softirq, ASM_CALL_SOFTIRQ);
+ __this_cpu_write(hardirq_stack_inuse, false);
}
#else /* CONFIG_X86_64 */
-/* System vector handlers always run on the stack they interrupted. */
-#define run_sysvec_on_irqstack_cond(func, regs) \
-{ \
- irq_enter_rcu(); \
- func(regs); \
- irq_exit_rcu(); \
-}
-/* Switches to the irq stack within func() */
-#define run_irq_on_irqstack_cond(func, regs, vector) \
-{ \
- irq_enter_rcu(); \
- func(regs, vector); \
- irq_exit_rcu(); \
+/*
+ * System vector handlers always run on the stack they interrupted;
+ * irqs switch to the irq stack withing func().
+ */
+static __always_inline void
+run_on_irqstack_cond(irq_func_t func, struct pt_regs *regs, u32 arg)
+{
+ irq_enter_rcu();
+ func(regs, arg);
+ irq_exit_rcu();
}
#endif /* !CONFIG_X86_64 */
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 4a39fb429f15..64832869e1a1 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2188,7 +2188,7 @@ static noinline void handle_spurious_interrupt(u8 vector)
*/
DEFINE_IDTENTRY_IRQ(spurious_interrupt)
{
- handle_spurious_interrupt(vector);
+ handle_spurious_interrupt((u8)error_code);
}
DEFINE_IDTENTRY_SYSVEC(sysvec_spurious_apic_interrupt)
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index e28f6a5d14f1..27994818d9b1 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -239,6 +239,7 @@ static __always_inline void handle_irq(struct irq_desc *desc,
*/
DEFINE_IDTENTRY_IRQ(common_interrupt)
{
+ const u8 vector = error_code;
struct pt_regs *old_regs = set_irq_regs(regs);
struct irq_desc *desc;
diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c
index 73873b007838..bdd75b71d0f3 100644
--- a/arch/x86/kernel/sev-es.c
+++ b/arch/x86/kernel/sev-es.c
@@ -1335,15 +1335,15 @@ DEFINE_IDTENTRY_VC_SAFE_STACK(exc_vmm_communication)
vc_finish_insn(&ctxt);
break;
case ES_UNSUPPORTED:
- pr_err_ratelimited("Unsupported exit-code 0x%02lx in early #VC exception (IP: 0x%lx)\n",
+ pr_err_ratelimited("Unsupported exit-code 0x%02x in early #VC exception (IP: 0x%lx)\n",
error_code, regs->ip);
goto fail;
case ES_VMM_ERROR:
- pr_err_ratelimited("Failure in communication with VMM (exit-code 0x%02lx IP: 0x%lx)\n",
+ pr_err_ratelimited("Failure in communication with VMM (exit-code 0x%02x IP: 0x%lx)\n",
error_code, regs->ip);
goto fail;
case ES_DECODE_FAILED:
- pr_err_ratelimited("Failed to decode instruction (exit-code 0x%02lx IP: 0x%lx)\n",
+ pr_err_ratelimited("Failed to decode instruction (exit-code 0x%02x IP: 0x%lx)\n",
error_code, regs->ip);
goto fail;
case ES_EXCEPTION:
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 853ea7a80806..f5aecbb44bc7 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -461,7 +461,7 @@ DEFINE_IDTENTRY_DF(exc_double_fault)
}
#endif
- pr_emerg("PANIC: double fault, error_code: 0x%lx\n", error_code);
+ pr_emerg("PANIC: double fault, error_code: 0x%x\n", error_code);
die("double fault", regs, error_code);
panic("Machine halted.");
instrumentation_end();
--
2.31.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE]
2021-05-12 18:00 ` H. Peter Anvin
@ 2021-05-12 18:40 ` Ingo Molnar
0 siblings, 0 replies; 20+ messages in thread
From: Ingo Molnar @ 2021-05-12 18:40 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Andy Lutomirski,
Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
* H. Peter Anvin <hpa@zytor.com> wrote:
>
>
> On 5/12/21 1:38 AM, Ingo Molnar wrote:
> >
> > * H. Peter Anvin <hpa@zytor.com> wrote:
> >
> > > On 5/11/21 7:22 AM, Thomas Gleixner wrote:
> > > >
> > > > That's not really making the code more readable. Something like the
> > > > below perhaps?
> > > >
> > > > #define IDTENTRY_INVOKE_SYSVEC(func, regs, raw) \
> > > > do { \
> > > > irqentry_state_t state = irqentry_enter(regs); \
> > > > \
> > > > instrumentation_begin(); \
> > > > kvm_set_cpu_l1tf_flush_l1d(); \
> > > > if (raw) { \
> > > > __irq_enter_raw(); \
> > > > func(regs); \
> > > > __irq_exit_raw(); \
> > > > } else { \
> > > > run_sysvec_on_irqstack_cond(func, regs); \
> > > > } \
> > > > instrumentation_end(); \
> > > > irqentry_exit(regs, state); \
> > > > } while (0) \
> > > >
> > >
> > > Digging more into it, it looks like a *lot* of the macros in
> > > <asm/irq_stack.h> and <asm/idtentry.h> can be replaced with inlines without
> > > any change in functionality or generated code.
> >
> > That would be a much preferred outcome ...
>
> Well, here is an RFC. This is obviously a much bigger change and I don't
> feel it is mature yet, but it would be good to know if you (plural) feel it
> is in the right direction.
Looks much cleaner IMO, and there's also some linecount reduction:
> 7 files changed, 117 insertions(+), 142 deletions(-)
Thanks,
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h>
2021-05-11 0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
@ 2021-05-14 22:53 ` Andy Lutomirski
0 siblings, 0 replies; 20+ messages in thread
From: Andy Lutomirski @ 2021-05-14 22:53 UTC (permalink / raw)
To: H. Peter Anvin, Ingo Molnar, Thomas Gleixner, Borislav Petkov
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
On 5/10/21 5:55 PM, H. Peter Anvin wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>
> The x86 architecture supports up to 32 trap vectors. Add that constant
> to <asm/trapnr.h>.
>
> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
> ---
> arch/x86/include/asm/trapnr.h | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/arch/x86/include/asm/trapnr.h b/arch/x86/include/asm/trapnr.h
> index f5d2325aa0b7..f0baf92da20b 100644
> --- a/arch/x86/include/asm/trapnr.h
> +++ b/arch/x86/include/asm/trapnr.h
> @@ -27,6 +27,7 @@
> #define X86_TRAP_VE 20 /* Virtualization Exception */
> #define X86_TRAP_CP 21 /* Control Protection Exception */
> #define X86_TRAP_VC 29 /* VMM Communication Exception */
> +#define X86_NR_HW_TRAPS 32 /* Max hardware trap number */
> #define X86_TRAP_IRET 32 /* IRET Exception */
>
> #endif
>
Acked-by: Andy Lutomirski <luto@kernel.org>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS
2021-05-11 0:55 ` [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS H. Peter Anvin
@ 2021-05-14 22:53 ` Andy Lutomirski
0 siblings, 0 replies; 20+ messages in thread
From: Andy Lutomirski @ 2021-05-14 22:53 UTC (permalink / raw)
To: H. Peter Anvin, Ingo Molnar, Thomas Gleixner, Borislav Petkov
Cc: Steve Wahl, Mike Travis, Dimitri Sivanich, Russ Anderson,
Linux Kernel Mailing List
On 5/10/21 5:55 PM, H. Peter Anvin wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>
> Add defines for the number of external vectors and number of system
> vectors instead of requiring the use of (FIRST_SYSTEM_VECTOR -
> FIRST_EXTERNAL_VECTOR) and (NR_VECTORS - FIRST_SYSTEM_VECTOR)
> respectively.
Acked-by: Andy Lutomirski <luto@kernel.org>
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2021-05-14 22:53 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-11 0:55 [PATCH 0/6] x86/irq: trap and interrupt cleanups H. Peter Anvin
2021-05-11 0:55 ` [PATCH 1/6] x86/traps: add X86_NR_HW_TRAPS to <asm/trapnr.h> H. Peter Anvin
2021-05-14 22:53 ` Andy Lutomirski
2021-05-11 0:55 ` [PATCH 2/6] x86/irqvector: add NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS H. Peter Anvin
2021-05-14 22:53 ` Andy Lutomirski
2021-05-11 0:55 ` [PATCH 3/6] x86/idt: remove address argument to idt_invalidate() H. Peter Anvin
2021-05-11 4:37 ` kernel test robot
2021-05-11 14:14 ` Thomas Gleixner
2021-05-11 14:43 ` H. Peter Anvin
2021-05-11 0:55 ` [PATCH 4/6] x86/irq: merge common code in DEFINE_IDTENTRY_SYSVEC[_SIMPLE] H. Peter Anvin
2021-05-11 14:22 ` Thomas Gleixner
2021-05-11 17:44 ` H. Peter Anvin
2021-05-12 8:38 ` Ingo Molnar
2021-05-12 18:00 ` H. Peter Anvin
2021-05-12 18:40 ` Ingo Molnar
2021-05-11 0:55 ` [PATCH 5/6] x86/irq: WARN_ONCE() if irq_move_cleanup is called on a pending interrupt H. Peter Anvin
2021-05-11 14:23 ` Thomas Gleixner
2021-05-11 15:55 ` H. Peter Anvin
2021-05-11 0:55 ` [PATCH 6/6] x86/irq: remove unused vectors from <asm/irq_vectors.h> H. Peter Anvin
2021-05-11 17:04 ` Steve Wahl
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).