Mailing List Archive

[xen master] xen: enable keyhandlers to work without register set specified
commit a4e8b178bfb4ee404cc7329032112d0c18ca4b66
Author: Juergen Gross <jgross@suse.com>
AuthorDate: Sat Jan 16 11:33:38 2021 +0100
Commit: Julien Grall <jgrall@amazon.com>
CommitDate: Sat Jan 23 11:31:32 2021 +0000

xen: enable keyhandlers to work without register set specified

There are only two keyhandlers which make use of the cpu_user_regs
struct passed to them. In order to be able to call any keyhandler in
non-interrupt contexts, too, modify those two handlers to cope with a
NULL regs pointer by using run_in_exception_handler() in that case.

Suggested-by: Julien Grall <julien@xen.org>
Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Julien Grall <jgrall@amazon.com>
---
xen/common/keyhandler.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c
index 68364e987d..38020a1360 100644
--- a/xen/common/keyhandler.c
+++ b/xen/common/keyhandler.c
@@ -181,7 +181,10 @@ static void dump_registers(unsigned char key, struct cpu_user_regs *regs)
cpumask_copy(&dump_execstate_mask, &cpu_online_map);

/* Get local execution state out immediately, in case we get stuck. */
- dump_execstate(regs);
+ if ( regs )
+ dump_execstate(regs);
+ else
+ run_in_exception_handler(dump_execstate);

/* Alt. handling: remaining CPUs are dumped asynchronously one-by-one. */
if ( alt_key_handling )
@@ -481,15 +484,23 @@ static void run_all_keyhandlers(unsigned char key, struct cpu_user_regs *regs)
tasklet_schedule(&run_all_keyhandlers_tasklet);
}

-static void do_debug_key(unsigned char key, struct cpu_user_regs *regs)
+static void do_debugger_trap_fatal(struct cpu_user_regs *regs)
{
- printk("'%c' pressed -> trapping into debugger\n", key);
(void)debugger_trap_fatal(0xf001, regs);

/* Prevent tail call optimisation, which confuses xendbg. */
barrier();
}

+static void do_debug_key(unsigned char key, struct cpu_user_regs *regs)
+{
+ printk("'%c' pressed -> trapping into debugger\n", key);
+ if ( regs )
+ do_debugger_trap_fatal(regs);
+ else
+ run_in_exception_handler(do_debugger_trap_fatal);
+}
+
static void do_toggle_alt_key(unsigned char key, struct cpu_user_regs *regs)
{
alt_key_handling = !alt_key_handling;
--
generated by git-patchbot for /home/xen/git/xen.git#master