On Thu, Nov 18, 2021 at 10:39:44AM +0100, Peter Zijlstra wrote:
@@ -396,22 +416,27 @@ static bool deref_stack_iret_regs(struct unwind_state *state, unsigned long addr static bool get_reg(struct unwind_state *state, unsigned int reg_off, unsigned long *val) {
- unsigned int reg = reg_off/8;
- if (!state->regs) return false;
- pagefault_disable(); if (state->full_regs) {
*val = READ_ONCE_NOCHECK(((unsigned long *)state->regs)[reg]);
__get_kernel_nofault(val, (void *)state->regs + reg_off, unsigned long, Efault);
return true; }pagefault_enable();
if (state->prev_regs) {
*val = READ_ONCE_NOCHECK(((unsigned long *)state->prev_regs)[reg]);
__get_kernel_nofault(val, (void *)state->regs + reg_off, unsigned long, Efault);
^^^ prev_regs
return true; }pagefault_enable();
return false;
+Efault:
- pagefault_enable();
- return false;
}