From: Magnus Lindholm <linmag7@gmail.com>
To: richard.henderson@linaro.org, mattst88@gmail.com,
linux-kernel@vger.kernel.org, linux-alpha@vger.kernel.org
Cc: linmag7@gmail.com
Subject: [PATCH 07/14] alpha: use generic entry helpers for interrupts and exceptions
Date: Tue, 3 Nov 2026 22:35:13 +0100 [thread overview]
Message-ID: <20261103214120.1099893-8-linmag7@gmail.com> (raw)
In-Reply-To: <20261103214120.1099893-1-linmag7@gmail.com>
Use irqentry_enter()/irqentry_exit() for ordinary interrupts and
exceptions and centralize hardirq accounting in do_entInt(). Keep the
saved switch_stack available for signals and fault fixups; register
restoration and PAL_rti remain in assembly.
Interrupts now save a switch_stack too; generic exit handles kernel IRQ
state restoration. Keep kernel FEN recovery outside entry bookkeeping,
since it can interrupt FP saves and restores during entry or exit.
The special kernel unaligned-access path is unchanged.
Signed-off-by: Magnus Lindholm <linmag7@gmail.com>
---
arch/alpha/include/asm/entry-common.h | 7 --
arch/alpha/kernel/entry.S | 138 ++++++----------------------------
arch/alpha/kernel/irq.c | 8 +-
arch/alpha/kernel/irq_alpha.c | 41 +++-------
arch/alpha/kernel/process.c | 2 +-
arch/alpha/kernel/signal.c | 7 +-
arch/alpha/kernel/traps.c | 118 +++++++++++++++++++++++------
arch/alpha/mm/fault.c | 25 +++++-
8 files changed, 154 insertions(+), 192 deletions(-)
diff --git a/arch/alpha/include/asm/entry-common.h b/arch/alpha/include/asm/entry-common.h
index 85dabd1021da012269eb28acb3ce2da21e0ad706..1d3b3d67235858419a069b7d9e4ce44f2e4e5525 100644
--- a/arch/alpha/include/asm/entry-common.h
+++ b/arch/alpha/include/asm/entry-common.h
@@ -6,13 +6,6 @@
#include <asm/syscall.h>
#include <asm/thread_info.h>
-#define arch_exit_to_user_mode_work arch_exit_to_user_mode_work
-
-static __always_inline void arch_exit_to_user_mode_work(struct pt_regs *regs,
- unsigned long ti_work)
-{
-}
-
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
unsigned long ti_work)
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S
index d67ccfc8abac4b97ceb6fa8c7bad8024b9bf5660..2233eb6da7065e7d85cbc668a09e565bcfd75a52 100644
--- a/arch/alpha/kernel/entry.S
+++ b/arch/alpha/kernel/entry.S
@@ -185,77 +185,25 @@
* Non-syscall kernel entry points.
*/
-CFI_START_OSF_FRAME entInt
+/* Keep the switch_stack available to generic exit work and fault fixups. */
+.macro EXCEPTION_ENTRY name, handler, regs_arg
+CFI_START_OSF_FRAME \name
SAVE_ALL
- lda $8, 0x3fff
- lda $26, ret_from_exception
- bic $sp, $8, $8
- mov $sp, $19
- jsr $31, do_entInt
-CFI_END_OSF_FRAME entInt
-
-CFI_START_OSF_FRAME entArith
- SAVE_ALL
- lda $8, 0x3fff
- lda $26, ret_from_exception
- bic $sp, $8, $8
- mov $sp, $18
- jsr $31, do_entArith
-CFI_END_OSF_FRAME entArith
-
-CFI_START_OSF_FRAME entMM
- SAVE_ALL
-/* save $9 - $15 so the inline exception code can manipulate them. */
- subq $sp, 64, $sp
- .cfi_adjust_cfa_offset 64
- stq $9, 0($sp)
- stq $10, 8($sp)
- stq $11, 16($sp)
- stq $12, 24($sp)
- stq $13, 32($sp)
- stq $14, 40($sp)
- stq $15, 48($sp)
- .cfi_rel_offset $9, 0
- .cfi_rel_offset $10, 8
- .cfi_rel_offset $11, 16
- .cfi_rel_offset $12, 24
- .cfi_rel_offset $13, 32
- .cfi_rel_offset $14, 40
- .cfi_rel_offset $15, 48
- addq $sp, 64, $19
-/* handle the fault */
+ mov $sp, \regs_arg
+ DO_SWITCH_STACK
lda $8, 0x3fff
bic $sp, $8, $8
- jsr $26, do_page_fault
-/* reload the registers after the exception code played. */
- ldq $9, 0($sp)
- ldq $10, 8($sp)
- ldq $11, 16($sp)
- ldq $12, 24($sp)
- ldq $13, 32($sp)
- ldq $14, 40($sp)
- ldq $15, 48($sp)
- addq $sp, 64, $sp
- .cfi_restore $9
- .cfi_restore $10
- .cfi_restore $11
- .cfi_restore $12
- .cfi_restore $13
- .cfi_restore $14
- .cfi_restore $15
- .cfi_adjust_cfa_offset -64
-/* finish up the syscall as normal. */
+ jsr $26, \handler
+ ldgp $gp, 0($26)
+ UNDO_SWITCH_STACK
br ret_from_exception
-CFI_END_OSF_FRAME entMM
+CFI_END_OSF_FRAME \name
+.endm
-CFI_START_OSF_FRAME entIF
- SAVE_ALL
- lda $8, 0x3fff
- lda $26, ret_from_exception
- bic $sp, $8, $8
- mov $sp, $17
- jsr $31, do_entIF
-CFI_END_OSF_FRAME entIF
+EXCEPTION_ENTRY entInt, do_entInt, $19
+EXCEPTION_ENTRY entArith, do_entArith, $18
+EXCEPTION_ENTRY entMM, do_page_fault, $19
+EXCEPTION_ENTRY entIF, do_entIF, $17
CFI_START_OSF_FRAME entUna
lda $sp, -256($sp)
@@ -391,53 +339,17 @@ entUnaUser:
.cfi_restore $0
.cfi_adjust_cfa_offset -256
SAVE_ALL /* setup normal kernel stack */
- lda $sp, -64($sp)
- .cfi_adjust_cfa_offset 64
- stq $9, 0($sp)
- stq $10, 8($sp)
- stq $11, 16($sp)
- stq $12, 24($sp)
- stq $13, 32($sp)
- stq $14, 40($sp)
- stq $15, 48($sp)
- .cfi_rel_offset $9, 0
- .cfi_rel_offset $10, 8
- .cfi_rel_offset $11, 16
- .cfi_rel_offset $12, 24
- .cfi_rel_offset $13, 32
- .cfi_rel_offset $14, 40
- .cfi_rel_offset $15, 48
+ mov $sp, $19
+ DO_SWITCH_STACK
lda $8, 0x3fff
- addq $sp, 64, $19
bic $sp, $8, $8
jsr $26, do_entUnaUser
- ldq $9, 0($sp)
- ldq $10, 8($sp)
- ldq $11, 16($sp)
- ldq $12, 24($sp)
- ldq $13, 32($sp)
- ldq $14, 40($sp)
- ldq $15, 48($sp)
- lda $sp, 64($sp)
- .cfi_restore $9
- .cfi_restore $10
- .cfi_restore $11
- .cfi_restore $12
- .cfi_restore $13
- .cfi_restore $14
- .cfi_restore $15
- .cfi_adjust_cfa_offset -64
+ ldgp $gp, 0($26)
+ UNDO_SWITCH_STACK
br ret_from_exception
CFI_END_OSF_FRAME entUna
-CFI_START_OSF_FRAME entDbg
- SAVE_ALL
- lda $8, 0x3fff
- lda $26, ret_from_exception
- bic $sp, $8, $8
- mov $sp, $16
- jsr $31, do_entDbg
-CFI_END_OSF_FRAME entDbg
+EXCEPTION_ENTRY entDbg, do_entDbg, $16
/*
@@ -499,10 +411,11 @@ restore_other:
call_pal PAL_rti
ret_from_exception:
+ .cfi_restore_state
ldq $0, SP_OFF($sp)
and $0, 8, $0
- beq $0, ret_to_kernel
- br ret_to_user_from_exception
+ beq $0, restore_other
+ br restore_all
ret_to_user_from_exception:
@@ -513,13 +426,6 @@ ret_to_user_from_exception:
UNDO_SWITCH_STACK
br restore_all
-ret_to_kernel:
- .cfi_restore_state
- lda $16, 7
- call_pal PAL_swpipl
- LOCKDEP_HARDIRQS_ON_RESTORE SP_OFF($sp)
- br restore_other
-
CFI_END_OSF_FRAME entSys
/*
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c
index 5867a165504511a6e693bc6a200e7e9a69415103..c7dfa895c64832a4669a44d0bf92e99d0c5247ee 100644
--- a/arch/alpha/kernel/irq.c
+++ b/arch/alpha/kernel/irq.c
@@ -86,9 +86,7 @@ int arch_show_interrupts(struct seq_file *p, int prec)
}
/*
- * handle_irq handles all normal device IRQ's (the special
- * SMP cross-CPU interrupts have their own specific
- * handlers).
+ * Device IRQs use this path. do_entInt() handles hardirq accounting.
*/
#define MAX_ILLEGAL_IRQS 16
@@ -109,8 +107,6 @@ handle_irq(int irq)
static unsigned int illegal_count=0;
struct irq_desc *desc;
- irq_enter();
-
desc = irq_to_desc(irq);
if (!desc || ((unsigned) irq > ACTUAL_NR_IRQS &&
illegal_count < MAX_ILLEGAL_IRQS)) {
@@ -118,10 +114,8 @@ handle_irq(int irq)
illegal_count++;
printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n",
irq);
- irq_exit();
return;
}
generic_handle_irq_desc(desc);
- irq_exit();
}
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c
index 8366d6de439d1cd26fd0cadb3fb26f93a7cee8a1..270d98116ffef4ea9c314222fe64c8e3b19628e5 100644
--- a/arch/alpha/kernel/irq_alpha.c
+++ b/arch/alpha/kernel/irq_alpha.c
@@ -4,6 +4,7 @@
*/
#include <linux/init.h>
+#include <linux/irq-entry-common.h>
#include <linux/sched.h>
#include <linux/irq.h>
#include <linux/kernel_stat.h>
@@ -41,38 +42,25 @@ EXPORT_SYMBOL(perf_irq);
* The main interrupt entry point.
*/
-asmlinkage void
+asmlinkage noinstr void
do_entInt(unsigned long type, unsigned long vector,
unsigned long la_ptr, struct pt_regs *regs)
{
+ irqentry_state_t state;
struct pt_regs *old_regs;
- /*
- * Disable interrupts during IRQ handling.
- * Note that there is no matching local_irq_enable() due to
- * severe problems with RTI at IPL0 and some MILO PALcode
- * (namely LX164).
- *
- * PALcode has already raised PS.IPL to the level of the interrupt
- * being delivered. For an IPL 7 entry - a machine check or a system
- * event - that is IPL_MAX, which is what arch_irqs_disabled() tests
- * for, so local_irq_disable() would decide interrupts were already
- * off and skip trace_hardirqs_off(). lockdep would then spend the
- * whole handler believing interrupts are enabled. Drive the
- * annotation from lockdep's own state rather than the hardware IPL.
- */
+ /* PALcode raises IPL only to the level of the delivered interrupt. */
raw_local_irq_disable();
- if (lockdep_hardirqs_enabled())
- trace_hardirqs_off();
+ state = irqentry_enter(regs);
+ instrumentation_begin();
+ irq_enter_rcu();
old_regs = set_irq_regs(regs);
switch (type) {
case 0:
#ifdef CONFIG_SMP
- irq_enter();
handle_ipi(regs);
- irq_exit();
break;
#else
irq_err_count++;
@@ -80,23 +68,16 @@ do_entInt(unsigned long type, unsigned long vector,
break;
#endif
case 1:
- /* handle_irq() already does irq_enter()/irq_exit() */
handle_irq(RTC_IRQ);
break;
case 2:
- irq_enter();
alpha_mv.machine_check(vector, la_ptr);
- irq_exit();
break;
case 3:
- irq_enter();
alpha_mv.device_interrupt(vector);
- irq_exit();
break;
case 4:
- irq_enter();
perf_irq(la_ptr, regs);
- irq_exit();
break;
default:
pr_crit("Hardware intr %lu %lx? Huh?\n", type, vector);
@@ -105,11 +86,11 @@ do_entInt(unsigned long type, unsigned long vector,
}
set_irq_regs(old_regs);
+ irq_exit_rcu();
+ instrumentation_end();
- /*
- * Intentionally no local_irq_enable(): Alpha historically avoids
- * enabling at IPL0 here due to PAL/RTI issues (LX164/MILO note).
- */
+ /* Do not lower IPL here before PAL_rti (LX164/MILO PALcode). */
+ irqentry_exit(regs, state);
}
void notrace lockdep_on_restore(unsigned long ps,
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
index 7861c9e767b720a5939553e9ff3218519ee8e4b5..2182496c535661f399a73400e308c0a7fc6d76f1 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -136,7 +136,7 @@ common_shutdown_1(void *generic_ptr)
/* If we've gotten here after SysRq-b, leave interrupt
context before taking over the console. */
if (in_hardirq())
- irq_exit();
+ irq_exit_rcu();
/* This has the effect of resetting the VGA video origin. */
console_lock();
do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES-1, 1);
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c
index c6dd0f2864ade320d59cf1531764640bc6713aa6..244fec20294b81e0c749a07321f917befb62b1a7 100644
--- a/arch/alpha/kernel/signal.c
+++ b/arch/alpha/kernel/signal.c
@@ -538,11 +538,12 @@ do_signal(struct pt_regs *regs, unsigned long r0, unsigned long r19)
ptrace_set_bpt(current); /* re-set breakpoint */
}
-asmlinkage void alpha_exit_to_user_mode(struct pt_regs *regs)
+asmlinkage noinstr void alpha_exit_to_user_mode(struct pt_regs *regs)
{
+ instrumentation_begin();
local_irq_disable();
- irqentry_exit_to_user_mode_prepare(regs);
- exit_to_user_mode();
+ instrumentation_end();
+ irqentry_exit_to_user_mode(regs);
}
void arch_do_signal_or_restart(struct pt_regs *regs)
diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c
index db6277b3bed03b6d7fd97f483eaa6873d351bbe0..a4209bca38063882a5bebe8dd3a285fd2b39e218 100644
--- a/arch/alpha/kernel/traps.c
+++ b/arch/alpha/kernel/traps.c
@@ -10,6 +10,7 @@
*/
#include <linux/cpu.h>
+#include <linux/irq-entry-common.h>
#include <linux/jiffies.h>
#include <linux/mm.h>
#include <linux/sched/signal.h>
@@ -174,9 +175,9 @@ long alpha_fp_emul_imprecise(struct pt_regs *regs, unsigned long writemask);
long alpha_fp_emul (unsigned long pc, unsigned long summary);
#endif
-asmlinkage void
-do_entArith(unsigned long summary, unsigned long write_mask,
- struct pt_regs *regs)
+static void
+handle_entArith(unsigned long summary, unsigned long write_mask,
+ struct pt_regs *regs)
{
long si_code = FPE_FLTINV;
@@ -196,25 +197,29 @@ do_entArith(unsigned long summary, unsigned long write_mask,
send_sig_fault_trapno(SIGFPE, si_code, (void __user *) regs->pc, 0, current);
}
-asmlinkage void
-do_entIF(unsigned long type, struct pt_regs *regs)
+asmlinkage noinstr void
+do_entArith(unsigned long summary, unsigned long write_mask,
+ struct pt_regs *regs)
{
- int signo, code;
+ irqentry_state_t state;
- if (type == 3) { /* FEN fault */
- /* Irritating users can call PAL_clrfen to disable the
- FPU for the process. The kernel will then trap in
- do_switch_stack and undo_switch_stack when we try
- to save and restore the FP registers.
+ raw_local_irq_disable();
+ state = irqentry_enter(regs);
+
+ instrumentation_begin();
+ local_irq_restore(regs->ps);
+ handle_entArith(summary, write_mask, regs);
+ local_irq_disable();
+ instrumentation_end();
+
+ irqentry_exit(regs, state);
+}
+
+static void
+handle_entIF(unsigned long type, struct pt_regs *regs)
+{
+ int signo, code;
- Given that GCC by default generates code that uses the
- FP registers, PAL_clrfen is not useful except for DoS
- attacks. So turn the bleeding FPU back on and be done
- with it. */
- current_thread_info()->pcb.flags |= 1;
- __reload_thread(¤t_thread_info()->pcb);
- return;
- }
if (!user_mode(regs)) {
if (type == 1) {
const unsigned int *data
@@ -330,6 +335,34 @@ do_entIF(unsigned long type, struct pt_regs *regs)
send_sig_fault(SIGILL, ILL_ILLOPC, (void __user *)regs->pc, current);
}
+asmlinkage noinstr void
+do_entIF(unsigned long type, struct pt_regs *regs)
+{
+ irqentry_state_t state;
+
+ raw_local_irq_disable();
+ if (type == 3) {
+ /*
+ * Kernel FEN faults can interrupt entry or exit while saving user FP
+ * state or restoring it. Re-enable the FPU without running entry hooks.
+ */
+ current_thread_info()->pcb.flags |= 1;
+ __reload_thread(¤t_thread_info()->pcb);
+ if (!user_mode(regs))
+ return;
+ }
+ state = irqentry_enter(regs);
+
+ instrumentation_begin();
+ local_irq_restore(regs->ps);
+ if (type != 3)
+ handle_entIF(type, regs);
+ local_irq_disable();
+ instrumentation_end();
+
+ irqentry_exit(regs, state);
+}
+
/* There is an ifdef in the PALcode in MILO that enables a
"kernel debugging entry point" as an unprivileged call_pal.
@@ -337,14 +370,31 @@ do_entIF(unsigned long type, struct pt_regs *regs)
several versions of MILO included in distributions have it enabled,
and if we don't put something on the entry point we'll oops. */
-asmlinkage void
-do_entDbg(struct pt_regs *regs)
+static void
+handle_entDbg(struct pt_regs *regs)
{
die_if_kernel("Instruction fault", regs, 0, NULL);
force_sig_fault(SIGILL, ILL_ILLOPC, (void __user *)regs->pc);
}
+asmlinkage noinstr void
+do_entDbg(struct pt_regs *regs)
+{
+ irqentry_state_t state;
+
+ raw_local_irq_disable();
+ state = irqentry_enter(regs);
+
+ instrumentation_begin();
+ local_irq_restore(regs->ps);
+ handle_entDbg(regs);
+ local_irq_disable();
+ instrumentation_end();
+
+ irqentry_exit(regs, state);
+}
+
/*
* entUna has a different register layout to be reasonably simple. It
@@ -649,7 +699,7 @@ s_reg_to_mem (unsigned long s_reg)
static int unauser_reg_offsets[32] = {
R(r0), R(r1), R(r2), R(r3), R(r4), R(r5), R(r6), R(r7), R(r8),
/* r9 ... r15 are stored in front of regs. */
- -64, -56, -48, -40, -32, -24, -16, /* padding at -8 */
+ -64, -56, -48, -40, -32, -24, -16, /* r26 at -8 */
R(r16), R(r17), R(r18),
R(r19), R(r20), R(r21), R(r22), R(r23), R(r24), R(r25), R(r26),
R(r27), R(r28), R(gp),
@@ -658,9 +708,9 @@ static int unauser_reg_offsets[32] = {
#undef R
-asmlinkage void
-do_entUnaUser(void __user * va, unsigned long opcode,
- unsigned long reg, struct pt_regs *regs)
+static void
+handle_entUnaUser(void __user *va, unsigned long opcode,
+ unsigned long reg, struct pt_regs *regs)
{
static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5);
@@ -913,6 +963,24 @@ give_sigbus:
return;
}
+asmlinkage noinstr void
+do_entUnaUser(void __user *va, unsigned long opcode,
+ unsigned long reg, struct pt_regs *regs)
+{
+ irqentry_state_t state;
+
+ raw_local_irq_disable();
+ state = irqentry_enter(regs);
+
+ instrumentation_begin();
+ local_irq_restore(regs->ps);
+ handle_entUnaUser(va, opcode, reg, regs);
+ local_irq_disable();
+ instrumentation_end();
+
+ irqentry_exit(regs, state);
+}
+
void
trap_init(void)
{
diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c
index f09f69894cfd65d814ab1cf498c946043fb9e8a3..a46553b5e7d91f6209e2323e92d086989676262c 100644
--- a/arch/alpha/mm/fault.c
+++ b/arch/alpha/mm/fault.c
@@ -5,6 +5,7 @@
* Copyright (C) 1995 Linus Torvalds
*/
+#include <linux/irq-entry-common.h>
#include <linux/sched/signal.h>
#include <linux/kernel.h>
#include <linux/mm.h>
@@ -130,9 +131,9 @@ static bool is_prefetch(struct pt_regs *regs)
(1ul << (insn >> 26) & 0x30f00001400ul);
}
-asmlinkage void
-do_page_fault(unsigned long address, unsigned long mmcsr,
- long cause, struct pt_regs *regs)
+static void
+handle_page_fault(unsigned long address, unsigned long mmcsr,
+ long cause, struct pt_regs *regs)
{
struct vm_area_struct * vma;
struct mm_struct *mm = current->mm;
@@ -309,3 +310,21 @@ retry:
}
#endif
}
+
+asmlinkage noinstr void
+do_page_fault(unsigned long address, unsigned long mmcsr,
+ long cause, struct pt_regs *regs)
+{
+ irqentry_state_t state;
+
+ raw_local_irq_disable();
+ state = irqentry_enter(regs);
+
+ instrumentation_begin();
+ local_irq_restore(regs->ps);
+ handle_page_fault(address, mmcsr, cause, regs);
+ local_irq_disable();
+ instrumentation_end();
+
+ irqentry_exit(regs, state);
+}
--
2.43.0
next prev parent reply other threads:[~2026-11-03 21:43 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 21:35 [PATCH 00/14] alpha: fix entry bugs and consolidate generic helpers Magnus Lindholm
2026-11-03 21:35 ` [PATCH 01/14] alpha: fix saved registers in page-fault oops dumps Magnus Lindholm
2026-11-03 21:35 ` [PATCH 02/14] alpha: report syscall errors correctly to audit Magnus Lindholm
2026-11-03 21:35 ` [PATCH 03/14] alpha: preserve rolled-back registers for SIGSYS Magnus Lindholm
2026-11-03 21:35 ` [PATCH 04/14] alpha: fix syscall restart eligibility Magnus Lindholm
2026-11-03 21:35 ` [PATCH 05/14] alpha: distinguish skipped syscalls from invalid numbers Magnus Lindholm
2026-11-03 21:35 ` [PATCH 06/14] alpha: dispatch system calls from C Magnus Lindholm
2026-11-03 21:35 ` Magnus Lindholm [this message]
2026-11-03 21:35 ` [PATCH 08/14] alpha: use generic syscall exit for new tasks Magnus Lindholm
2026-11-03 21:35 ` [PATCH 09/14] alpha: remove obsolete core dump register hooks Magnus Lindholm
2026-11-03 21:35 ` [PATCH 10/14] alpha: use generic syscall audit classification Magnus Lindholm
2026-11-03 21:35 ` [PATCH 11/14] alpha: use generic ptrace memory writes Magnus Lindholm
2026-11-03 21:35 ` [PATCH 12/14] alpha: use memparse for memory size options Magnus Lindholm
2026-11-03 21:35 ` [PATCH 13/14] alpha: use generic getrusage for OSF resource accounting Magnus Lindholm
2026-11-03 21:35 ` [PATCH 14/14] alpha: use generic CPU device registration Magnus Lindholm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261103214120.1099893-8-linmag7@gmail.com \
--to=linmag7@gmail.com \
--cc=linux-alpha@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mattst88@gmail.com \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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®