while ( ((long)stack & (STACK_SIZE-BYTES_PER_LONG)) != 0 )
{
addr = *stack++;
- if ( is_kernel_text(addr) || is_kernel_inittext(addr) )
+ if ( is_active_kernel_text(addr) )
{
printk("[<%p>]", _p(addr));
print_symbol(" %s\n ", addr);
printk("Xen call trace:\n ");
- printk("[<%p>]", _p(regs->eip));
- print_symbol(" %s\n ", regs->eip);
+ /*
+ * If RIP is not pointing into hypervisor code then someone may have
+ * called into oblivion. Peek to see if they left a return address at
+ * top of stack.
+ */
+ addr = is_active_kernel_text(regs->eip) ||
+ !is_active_kernel_text(*ESP_BEFORE_EXCEPTION(regs)) ?
+ regs->eip : *ESP_BEFORE_EXCEPTION(regs);
+ printk("[<%p>]", _p(addr));
+ print_symbol(" %s\n ", addr);
/* Bounds for range of valid frame pointer. */
low = (unsigned long)(ESP_BEFORE_EXCEPTION(regs) - 2);
while ( ((long)stack & (STACK_SIZE-BYTES_PER_LONG)) != 0 )
{
addr = *stack++;
- if ( is_kernel_text(addr) || is_kernel_inittext(addr) )
+ if ( is_active_kernel_text(addr) )
{
printk("%p: [<%p>]", stack, _p(addr));
print_symbol(" %s\n ", addr);
return name - symbols_names;
}
+bool_t is_active_kernel_text(unsigned long addr)
+{
+ return (is_kernel_text(addr) ||
+ (system_state == SYS_STATE_boot && is_kernel_inittext(addr)));
+}
+
const char *symbols_lookup(unsigned long addr,
unsigned long *symbolsize,
unsigned long *offset,
namebuf[KSYM_NAME_LEN] = 0;
namebuf[0] = 0;
- if (!is_kernel_text(addr) && !is_kernel_inittext(addr))
+ if (!is_active_kernel_text(addr))
return NULL;
/* do a binary search on the sorted symbols_addresses array */
* 'kernel.h' contains some often-used function prototypes etc
*/
+#include <xen/types.h>
+
/*
* min()/max() macros that also do
* strict type-checking.. See the
SYS_STATE_resume
} system_state;
+bool_t is_active_kernel_text(unsigned long addr);
+
#endif /* _LINUX_KERNEL_H */