From 2f529f9b558ca1c1bd74be7437a84e4711743404 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 01 Nov 2024 02:11:33 +0000
Subject: [PATCH] add xenomai
---
kernel/arch/arm64/kernel/traps.c | 36 ++++++++++++++++++++++++++++++------
1 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/kernel/arch/arm64/kernel/traps.c b/kernel/arch/arm64/kernel/traps.c
index 49b4b7b..a670df1 100644
--- a/kernel/arch/arm64/kernel/traps.c
+++ b/kernel/arch/arm64/kernel/traps.c
@@ -15,6 +15,7 @@
#include <linux/spinlock.h>
#include <linux/uaccess.h>
#include <linux/hardirq.h>
+#include <linux/irqstage.h>
#include <linux/kdebug.h>
#include <linux/module.h>
#include <linux/kexec.h>
@@ -117,7 +118,7 @@
return ret;
}
-static DEFINE_RAW_SPINLOCK(die_lock);
+static DEFINE_HARD_SPINLOCK(die_lock);
/*
* This function is protected against re-entrancy.
@@ -292,7 +293,7 @@
}
static LIST_HEAD(undef_hook);
-static DEFINE_RAW_SPINLOCK(undef_lock);
+static DEFINE_HARD_SPINLOCK(undef_lock);
void register_undef_hook(struct undef_hook *hook)
{
@@ -406,6 +407,13 @@
void do_undefinstr(struct pt_regs *regs)
{
+ /*
+ * If the companion core did not switched us to in-band
+ * context, we may assume that it has handled the trap.
+ */
+ if (running_oob())
+ return;
+
/* check for AArch32 breakpoint instructions */
if (!aarch32_break_handler(regs))
return;
@@ -415,14 +423,18 @@
trace_android_rvh_do_undefinstr(regs, user_mode(regs));
BUG_ON(!user_mode(regs));
+ mark_trap_entry(ARM64_TRAP_UNDI, regs);
force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc, 0);
+ mark_trap_exit(ARM64_TRAP_UNDI, regs);
}
NOKPROBE_SYMBOL(do_undefinstr);
void do_bti(struct pt_regs *regs)
{
BUG_ON(!user_mode(regs));
+ mark_trap_entry(ARM64_TRAP_BTI, regs);
force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc, 0);
+ mark_trap_exit(ARM64_TRAP_BTI, regs);
}
NOKPROBE_SYMBOL(do_bti);
@@ -492,9 +504,11 @@
return;
}
- if (ret)
- arm64_notify_segfault(tagged_address);
- else
+ if (ret) {
+ mark_trap_entry(ARM64_TRAP_ACCESS, regs);
+ arm64_notify_segfault(address);
+ mark_trap_exit(ARM64_TRAP_ACCESS, regs);
+ } else
arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
}
@@ -540,8 +554,11 @@
rt = ESR_ELx_SYS64_ISS_RT(esr);
sysreg = esr_sys64_to_sysreg(esr);
- if (do_emulate_mrs(regs, sysreg, rt) != 0)
+ if (do_emulate_mrs(regs, sysreg, rt) != 0) {
+ mark_trap_entry(ARM64_TRAP_ACCESS, regs);
force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc, 0);
+ mark_trap_exit(ARM64_TRAP_ACCESS, regs);
+ }
}
static void wfi_handler(unsigned int esr, struct pt_regs *regs)
@@ -768,6 +785,11 @@
*/
asmlinkage void notrace bad_mode(struct pt_regs *regs, int reason, unsigned int esr)
{
+ /*
+ * Dovetail: Same as __do_kernel_fault(), don't bother
+ * restoring the in-band stage, this trap is fatal and we are
+ * already walking on thin ice.
+ */
arm64_enter_nmi(regs);
console_verbose();
@@ -790,11 +812,13 @@
{
unsigned long pc = instruction_pointer(regs);
+ mark_trap_entry(ARM64_TRAP_ACCESS, regs);
current->thread.fault_address = 0;
current->thread.fault_code = esr;
arm64_force_sig_fault(SIGILL, ILL_ILLOPC, pc,
"Bad EL0 synchronous exception");
+ mark_trap_exit(ARM64_TRAP_ACCESS, regs);
}
#ifdef CONFIG_VMAP_STACK
--
Gitblit v1.6.2