|
@@ -168,7 +168,7 @@ void unwind_table_remove(struct unwind_table *table)
|
|
|
}
|
|
|
|
|
|
/* Called from setup_arch to import the kernel unwind info */
|
|
|
-int unwind_init(void)
|
|
|
+int __init unwind_init(void)
|
|
|
{
|
|
|
long start, stop;
|
|
|
register unsigned long gp __asm__ ("r27");
|
|
@@ -233,7 +233,6 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
|
|
|
e = find_unwind_entry(info->ip);
|
|
|
if (e == NULL) {
|
|
|
unsigned long sp;
|
|
|
- extern char _stext[], _etext[];
|
|
|
|
|
|
dbg("Cannot find unwind entry for 0x%lx; forced unwinding\n", info->ip);
|
|
|
|
|
@@ -281,8 +280,7 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
|
|
|
break;
|
|
|
info->prev_ip = tmp;
|
|
|
sp = info->prev_sp;
|
|
|
- } while (info->prev_ip < (unsigned long)_stext ||
|
|
|
- info->prev_ip > (unsigned long)_etext);
|
|
|
+ } while (!kernel_text_address(info->prev_ip));
|
|
|
|
|
|
info->rp = 0;
|
|
|
|
|
@@ -435,9 +433,8 @@ unsigned long return_address(unsigned int level)
|
|
|
do {
|
|
|
if (unwind_once(&info) < 0 || info.ip == 0)
|
|
|
return 0;
|
|
|
- if (!__kernel_text_address(info.ip)) {
|
|
|
+ if (!kernel_text_address(info.ip))
|
|
|
return 0;
|
|
|
- }
|
|
|
} while (info.ip && level--);
|
|
|
|
|
|
return info.ip;
|