We can't assume that if we execute the unwinder code and the unwinder was already running that it has faulted. Clearly two kernel threads can invoke the unwinder at the same time and may be running simultaneously. The previous approach used BUG() and BUG_ON() in the unwinder code to detect whether the unwinder was incapable of unwinding the stack, and that the next available unwinder should be used instead. A better approach is to explicitly invoke a trap handler to switch unwinders when the current unwinder cannot continue. Signed-off-by: Matt Fleming <matt@console-pimps.org>
47 lines
1.3 KiB
ArmAsm
47 lines
1.3 KiB
ArmAsm
/*
|
|
* arch/sh/kernel/debugtraps.S
|
|
*
|
|
* Debug trap jump tables for SuperH
|
|
*
|
|
* Copyright (C) 2006 - 2008 Paul Mundt
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*/
|
|
#include <linux/sys.h>
|
|
#include <linux/linkage.h>
|
|
|
|
#if !defined(CONFIG_KGDB)
|
|
#define breakpoint_trap_handler debug_trap_handler
|
|
#define singlestep_trap_handler debug_trap_handler
|
|
#endif
|
|
|
|
#if !defined(CONFIG_SH_STANDARD_BIOS)
|
|
#define sh_bios_handler debug_trap_handler
|
|
#endif
|
|
|
|
#if !defined(CONFIG_DWARF_UNWINDER)
|
|
#define unwinder_trap_handler debug_trap_handler
|
|
#endif
|
|
|
|
.data
|
|
|
|
ENTRY(debug_trap_table)
|
|
.long debug_trap_handler /* 0x30 */
|
|
.long debug_trap_handler /* 0x31 */
|
|
.long debug_trap_handler /* 0x32 */
|
|
.long debug_trap_handler /* 0x33 */
|
|
.long debug_trap_handler /* 0x34 */
|
|
.long debug_trap_handler /* 0x35 */
|
|
.long debug_trap_handler /* 0x36 */
|
|
.long debug_trap_handler /* 0x37 */
|
|
.long debug_trap_handler /* 0x38 */
|
|
.long debug_trap_handler /* 0x39 */
|
|
.long debug_trap_handler /* 0x3a */
|
|
.long unwinder_trap_handler /* 0x3b */
|
|
.long breakpoint_trap_handler /* 0x3c */
|
|
.long singlestep_trap_handler /* 0x3d */
|
|
.long bug_trap_handler /* 0x3e */
|
|
.long sh_bios_handler /* 0x3f */
|