Skip to content

Commit 44070a4

Browse files
Wengang-oracleSomasundaram Krishnasamy
authored andcommitted
Revert "x86/unwind: Handle NULL pointer calls better in frame unwinder"
This reverts commit c60f18c. It breaks KABI. Orabug: 30540100 Signed-off-by: Wengang Wang <[email protected]> Reviewed-by: John Donnelly <[email protected]> Signed-off-by: Somasundaram Krishnasamy <[email protected]>
1 parent 2d178ba commit 44070a4

File tree

2 files changed

+3
-28
lines changed

2 files changed

+3
-28
lines changed

arch/x86/include/asm/unwind.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,6 @@ struct unwind_state {
2323
#elif defined(CONFIG_UNWINDER_FRAME_POINTER)
2424
bool got_irq;
2525
unsigned long *bp, *orig_sp, ip;
26-
/*
27-
* If non-NULL: The current frame is incomplete and doesn't contain a
28-
* valid BP. When looking for the next frame, use this instead of the
29-
* non-existent saved BP.
30-
*/
31-
unsigned long *next_bp;
3226
struct pt_regs *regs;
3327
#else
3428
unsigned long *sp;

arch/x86/kernel/unwind_frame.c

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -320,14 +320,10 @@ bool unwind_next_frame(struct unwind_state *state)
320320
}
321321

322322
/* Get the next frame pointer: */
323-
if (state->next_bp) {
324-
next_bp = state->next_bp;
325-
state->next_bp = NULL;
326-
} else if (state->regs) {
323+
if (state->regs)
327324
next_bp = (unsigned long *)state->regs->bp;
328-
} else {
325+
else
329326
next_bp = (unsigned long *)READ_ONCE_TASK_STACK(state->task, *state->bp);
330-
}
331327

332328
/* Move to the next frame if it's safe: */
333329
if (!update_stack_state(state, next_bp))
@@ -402,21 +398,6 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
402398

403399
bp = get_frame_pointer(task, regs);
404400

405-
/*
406-
* If we crash with IP==0, the last successfully executed instruction
407-
* was probably an indirect function call with a NULL function pointer.
408-
* That means that SP points into the middle of an incomplete frame:
409-
* *SP is a return pointer, and *(SP-sizeof(unsigned long)) is where we
410-
* would have written a frame pointer if we hadn't crashed.
411-
* Pretend that the frame is complete and that BP points to it, but save
412-
* the real BP so that we can use it when looking for the next frame.
413-
*/
414-
if (regs && regs->ip == 0 &&
415-
(unsigned long *)kernel_stack_pointer(regs) >= first_frame) {
416-
state->next_bp = bp;
417-
bp = ((unsigned long *)kernel_stack_pointer(regs)) - 1;
418-
}
419-
420401
/* Initialize stack info and make sure the frame data is accessible: */
421402
get_stack_info(bp, state->task, &state->stack_info,
422403
&state->stack_mask);
@@ -429,7 +410,7 @@ void __unwind_start(struct unwind_state *state, struct task_struct *task,
429410
*/
430411
while (!unwind_done(state) &&
431412
(!on_stack(&state->stack_info, first_frame, sizeof(long)) ||
432-
(state->next_bp == NULL && state->bp < first_frame)))
413+
state->bp < first_frame))
433414
unwind_next_frame(state);
434415
}
435416
EXPORT_SYMBOL_GPL(__unwind_start);

0 commit comments

Comments
 (0)