run_in_exception_handler _does_ have other users.
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
goto die;
eip += sizeof(bug);
- id = bug.id & 3;
-
- if ( id == BUGFRAME_state )
- {
- show_execution_state(regs);
- regs->eip = (unsigned long)eip;
- return;
- }
-
/* Decode first pointer argument. */
if ( !is_kernel(eip) ||
__copy_from_user(&bug_str, eip, sizeof(bug_str)) ||
goto die;
eip += sizeof(bug_str);
+ id = bug.id & 3;
+
+ if ( id == BUGFRAME_run_fn )
+ {
+ void (*fn)(struct cpu_user_regs *) = (void *)p;
+ (*fn)(regs);
+ regs->eip = (unsigned long)eip;
+ return;
+ }
+
/* WARN, BUG or ASSERT: decode the filename pointer and line number. */
filename = p;
lineno = bug.id >> 2;
unsigned short id; /* BUGFRAME_??? */
} __attribute__((packed));
-#define BUGFRAME_state 0
+#define BUGFRAME_run_fn 0
#define BUGFRAME_warn 1
#define BUGFRAME_bug 2
#define BUGFRAME_assert 3
-#define dump_execution_state() \
+#define run_in_exception_handler(fn) \
asm volatile ( \
- "ud2 ; ret %0" \
- : : "i" (BUGFRAME_state) )
+ "ud2 ; ret %0" BUG_STR(1) \
+ : : "i" (BUGFRAME_run_fn), \
+ "i" (fn) )
#define WARN() \
asm volatile ( \
void show_stack_overflow(unsigned int cpu, unsigned long esp);
void show_registers(struct cpu_user_regs *regs);
void show_execution_state(struct cpu_user_regs *regs);
+#define dump_execution_state() run_in_exception_handler(show_execution_state)
void show_page_walk(unsigned long addr);
asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs);