|
@@ -135,140 +135,6 @@ void print_itlb(void)
|
|
|
(" =============================================================\n");
|
|
|
}
|
|
|
|
|
|
-/* ======================================================================= */
|
|
|
-
|
|
|
-#ifdef CONFIG_POOR_MANS_STRACE
|
|
|
-
|
|
|
-#include "syscalltab.h"
|
|
|
-
|
|
|
-struct ring_node {
|
|
|
- int evt;
|
|
|
- int ret_addr;
|
|
|
- int event;
|
|
|
- int tra;
|
|
|
- int pid;
|
|
|
- unsigned long sp;
|
|
|
- unsigned long pc;
|
|
|
-};
|
|
|
-
|
|
|
-static struct ring_node event_ring[16];
|
|
|
-static int event_ptr = 0;
|
|
|
-
|
|
|
-struct stored_syscall_data {
|
|
|
- int pid;
|
|
|
- int syscall_number;
|
|
|
-};
|
|
|
-
|
|
|
-#define N_STORED_SYSCALLS 16
|
|
|
-
|
|
|
-static struct stored_syscall_data stored_syscalls[N_STORED_SYSCALLS];
|
|
|
-static int syscall_next=0;
|
|
|
-static int syscall_next_print=0;
|
|
|
-
|
|
|
-void evt_debug(int evt, int ret_addr, int event, int tra, struct pt_regs *regs)
|
|
|
-{
|
|
|
- int syscallno = tra & 0xff;
|
|
|
- unsigned long sp;
|
|
|
- unsigned long stack_bottom;
|
|
|
- int pid;
|
|
|
- struct ring_node *rr;
|
|
|
-
|
|
|
- pid = current->pid;
|
|
|
- stack_bottom = (unsigned long) task_stack_page(current);
|
|
|
- asm volatile("ori r15, 0, %0" : "=r" (sp));
|
|
|
- rr = event_ring + event_ptr;
|
|
|
- rr->evt = evt;
|
|
|
- rr->ret_addr = ret_addr;
|
|
|
- rr->event = event;
|
|
|
- rr->tra = tra;
|
|
|
- rr->pid = pid;
|
|
|
- rr->sp = sp;
|
|
|
- rr->pc = regs->pc;
|
|
|
-
|
|
|
- if (sp < stack_bottom + 3092) {
|
|
|
- int i, j;
|
|
|
- printk("evt_debug : stack underflow report\n");
|
|
|
- for (j=0, i = event_ptr; j<16; j++) {
|
|
|
- rr = event_ring + i;
|
|
|
- printk("evt=%08x event=%08x tra=%08x pid=%5d sp=%08lx pc=%08lx\n",
|
|
|
- rr->evt, rr->event, rr->tra, rr->pid, rr->sp, rr->pc);
|
|
|
- i--;
|
|
|
- i &= 15;
|
|
|
- }
|
|
|
- panic("STACK UNDERFLOW\n");
|
|
|
- }
|
|
|
-
|
|
|
- event_ptr = (event_ptr + 1) & 15;
|
|
|
-
|
|
|
- if ((event == 2) && (evt == 0x160)) {
|
|
|
- if (syscallno < NUM_SYSCALL_INFO_ENTRIES) {
|
|
|
- /* Store the syscall information to print later. We
|
|
|
- * can't print this now - currently we're running with
|
|
|
- * SR.BL=1, so we can't take a tlbmiss (which could occur
|
|
|
- * in the console drivers under printk).
|
|
|
- *
|
|
|
- * Just overwrite old entries on ring overflow - this
|
|
|
- * is only for last-hope debugging. */
|
|
|
- stored_syscalls[syscall_next].pid = current->pid;
|
|
|
- stored_syscalls[syscall_next].syscall_number = syscallno;
|
|
|
- syscall_next++;
|
|
|
- syscall_next &= (N_STORED_SYSCALLS - 1);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void drain_syscalls(void) {
|
|
|
- while (syscall_next_print != syscall_next) {
|
|
|
- printk("Task %d: %s()\n",
|
|
|
- stored_syscalls[syscall_next_print].pid,
|
|
|
- syscall_info_table[stored_syscalls[syscall_next_print].syscall_number].name);
|
|
|
- syscall_next_print++;
|
|
|
- syscall_next_print &= (N_STORED_SYSCALLS - 1);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void evt_debug2(unsigned int ret)
|
|
|
-{
|
|
|
- drain_syscalls();
|
|
|
- printk("Task %d: syscall returns %08x\n", current->pid, ret);
|
|
|
-}
|
|
|
-
|
|
|
-void evt_debug_ret_from_irq(struct pt_regs *regs)
|
|
|
-{
|
|
|
- int pid;
|
|
|
- struct ring_node *rr;
|
|
|
-
|
|
|
- pid = current->pid;
|
|
|
- rr = event_ring + event_ptr;
|
|
|
- rr->evt = 0xffff;
|
|
|
- rr->ret_addr = 0;
|
|
|
- rr->event = 0;
|
|
|
- rr->tra = 0;
|
|
|
- rr->pid = pid;
|
|
|
- rr->pc = regs->pc;
|
|
|
- event_ptr = (event_ptr + 1) & 15;
|
|
|
-}
|
|
|
-
|
|
|
-void evt_debug_ret_from_exc(struct pt_regs *regs)
|
|
|
-{
|
|
|
- int pid;
|
|
|
- struct ring_node *rr;
|
|
|
-
|
|
|
- pid = current->pid;
|
|
|
- rr = event_ring + event_ptr;
|
|
|
- rr->evt = 0xfffe;
|
|
|
- rr->ret_addr = 0;
|
|
|
- rr->event = 0;
|
|
|
- rr->tra = 0;
|
|
|
- rr->pid = pid;
|
|
|
- rr->pc = regs->pc;
|
|
|
- event_ptr = (event_ptr + 1) & 15;
|
|
|
-}
|
|
|
-
|
|
|
-#endif /* CONFIG_POOR_MANS_STRACE */
|
|
|
-
|
|
|
-/* ======================================================================= */
|
|
|
-
|
|
|
void show_excp_regs(char *from, int trapnr, int signr, struct pt_regs *regs)
|
|
|
{
|
|
|
|