void rb_compile_bug(const char *file, int line, const char *fmt, ...) { report_bug(file, line, fmt, NULL); abort(); }
void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str) { siginfo_t info; if (user_mode(regs)) { info.si_signo = si_signo; info.si_errno = 0; info.si_code = si_code; info.si_addr = get_trap_ip(regs); force_sig_info(si_signo, &info, current); report_user_fault(regs, si_signo); } else { const struct exception_table_entry *fixup; fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); if (fixup) regs->psw.addr = extable_fixup(fixup) | PSW_ADDR_AMODE; else { enum bug_trap_type btt; btt = report_bug(regs->psw.addr & PSW_ADDR_INSN, regs); if (btt == BUG_TRAP_TYPE_WARN) return; die(regs, str); } } }
/* * This function is protected against re-entrancy. */ void die(const char *str, struct pt_regs *regs, int err) { enum bug_trap_type bug_type = BUG_TRAP_TYPE_NONE; struct thread_info *thread = current_thread_info(); int ret; oops_enter(); raw_spin_lock_irq(&die_lock); console_verbose(); bust_spinlocks(1); if (!user_mode(regs)) bug_type = report_bug(regs->pc, regs); if (bug_type != BUG_TRAP_TYPE_NONE) str = "Oops - BUG"; ret = __die(str, err, thread, regs); if (regs && kexec_should_crash(thread->task)) crash_kexec(regs); bust_spinlocks(0); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE); raw_spin_unlock_irq(&die_lock); oops_exit(); if (in_interrupt()) panic("Fatal exception in interrupt"); if (panic_on_oops) panic("Fatal exception"); if (ret != NOTIFY_STOP) do_exit(SIGSEGV); }
void rb_compile_bug(const char *file, int line, const char *fmt, ...) { va_list args; va_start(args, fmt); report_bug(file, line, fmt, args); va_end(args); abort(); }
void rb_bug(const char *fmt, ...) { va_list args; va_start(args, fmt); report_bug(rb_sourcefile(), rb_sourceline(), fmt, args); va_end(args); abort(); }
static void handle_BUG(struct pt_regs *regs) { enum bug_trap_type tt; tt = report_bug(regs->pc, regs); if (tt == BUG_TRAP_TYPE_WARN) { regs->pc += instruction_size(regs->pc); return; } die("Kernel BUG", regs, TRAPA_BUG_OPCODE & 0xff); }
/* * This is gone through when something in the kernel has done something bad * and is about to be terminated: */ void die(const char *str, struct pt_regs *regs, long err) { unsigned long flags = oops_begin(); int sig = SIGSEGV; if (!user_mode_vm(regs)) report_bug(regs->ip, regs); if (__die(str, regs, err)) sig = 0; oops_end(flags, regs, sig); }
void rb_bug(const char *fmt, ...) { const char *file = NULL; int line = 0; if (GET_THREAD()) { file = rb_sourcefile(); line = rb_sourceline(); } report_bug(file, line, fmt, NULL); die(); }
/* * This is gone through when something in the kernel has done something bad * and is about to be terminated: */ void die(const char *str, struct pt_regs *regs, long err) { unsigned long flags = oops_begin(); if (die_nest_count < 3) { report_bug(regs->ip, regs); if (__die(str, regs, err)) regs = NULL; } else { printk(KERN_EMERG "Recursive die() failure, output suppressed\n"); } oops_end(flags, regs, SIGSEGV); }
void die(const char *str, struct pt_regs *fp, unsigned long err) { static int diecount; oops_enter(); console_verbose(); spin_lock_irq(&die_lock); report_bug(fp->pc, fp); printk(KERN_EMERG "%s: %04lx [#%d] ", str, err & 0xffff, ++diecount); dump(fp); spin_unlock_irq(&die_lock); do_exit(SIGSEGV); }
void rb_bug(const char *fmt, ...) { va_list args; va_start(args, fmt); report_bug(rb_sourcefile(), rb_sourceline(), fmt, args); va_end(args); #if defined(_WIN32) && defined(RT_VER) && RT_VER >= 80 _set_abort_behavior( 0, _CALL_REPORTFAULT); #endif abort(); }
void rb_bug_context(const void *ctx, const char *fmt, ...) { const char *file = NULL; int line = 0; if (GET_THREAD()) { file = rb_sourcefile(); line = rb_sourceline(); } report_bug(file, line, fmt, ctx); die(); }
void rb_bug(const char *fmt, ...) { va_list args; const char *file = NULL; int line = 0; if (GET_THREAD()) { file = rb_sourcefile(); line = rb_sourceline(); } va_start(args, fmt); report_bug(file, line, fmt, args); va_end(args); #if defined(_WIN32) && defined(RT_VER) && RT_VER >= 80 _set_abort_behavior( 0, _CALL_REPORTFAULT); #endif abort(); }
static int bug_handler(struct pt_regs *regs, unsigned int esr) { if (user_mode(regs)) return DBG_HOOK_ERROR; switch (report_bug(regs->pc, regs)) { case BUG_TRAP_TYPE_BUG: die("Oops - BUG", regs, 0); break; case BUG_TRAP_TYPE_WARN: /* Ideally, report_bug() should backtrace for us... but no. */ dump_backtrace(regs, NULL); break; default: /* unknown/unrecognised bug trap type */ return DBG_HOOK_ERROR; } /* If thread survives, skip over the BUG instruction and continue: */ regs->pc += AARCH64_INSN_SIZE; /* skip BRK and resume */ return DBG_HOOK_HANDLED; }
static void handle_BUG(struct pt_regs *regs) { const struct bug_entry *bug; unsigned long bugaddr = regs->pc; enum bug_trap_type tt; if (!is_valid_bugaddr(bugaddr)) goto invalid; bug = find_bug(bugaddr); /* Switch unwinders when unwind_stack() is called */ if (bug->flags & BUGFLAG_UNWINDER) unwinder_faulted = 1; tt = report_bug(bugaddr, regs); if (tt == BUG_TRAP_TYPE_WARN) { regs->pc += instruction_size(bugaddr); return; } invalid: die("Kernel BUG", regs, TRAPA_BUG_OPCODE & 0xff); }
asmlinkage notrace void trap_c(struct pt_regs *fp) { #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON int j; #endif #ifdef CONFIG_BFIN_PSEUDODBG_INSNS int opcode; #endif unsigned int cpu = raw_smp_processor_id(); const char *strerror = NULL; int sig = 0; siginfo_t info; unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; trace_buffer_save(j); #if defined(CONFIG_DEBUG_MMRS) || defined(CONFIG_DEBUG_MMRS_MODULE) last_seqstat = (u32)fp->seqstat; #endif fp->orig_pc = fp->retx; switch (trapnr) { case VEC_EXCPT01: info.si_code = TRAP_ILLTRAP; sig = SIGTRAP; CHK_DEBUGGER_TRAP_MAYBE(); if (kernel_mode_regs(fp)) goto traps_done; else break; case VEC_EXCPT03: info.si_code = SEGV_STACKFLOW; sig = SIGSEGV; strerror = KERN_NOTICE EXC_0x03(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_EXCPT02: #ifdef CONFIG_KGDB info.si_code = TRAP_ILLTRAP; sig = SIGTRAP; CHK_DEBUGGER_TRAP(); goto traps_done; #endif case VEC_EXCPT04 ... VEC_EXCPT15: info.si_code = ILL_ILLPARAOP; sig = SIGILL; strerror = KERN_NOTICE EXC_0x04(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_STEP: info.si_code = TRAP_STEP; sig = SIGTRAP; CHK_DEBUGGER_TRAP_MAYBE(); if (kernel_mode_regs(fp)) goto traps_done; else break; case VEC_OVFLOW: info.si_code = TRAP_TRACEFLOW; sig = SIGTRAP; strerror = KERN_NOTICE EXC_0x11(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_UNDEF_I: #ifdef CONFIG_BUG if (kernel_mode_regs(fp)) { switch (report_bug(fp->pc, fp)) { case BUG_TRAP_TYPE_NONE: break; case BUG_TRAP_TYPE_WARN: dump_bfin_trace_buffer(); fp->pc += 2; goto traps_done; case BUG_TRAP_TYPE_BUG: panic("BUG()"); } } #endif #ifdef CONFIG_BFIN_PSEUDODBG_INSNS if (!kernel_mode_regs(fp) && get_instruction(&opcode, (unsigned short *)fp->pc)) { if (execute_pseudodbg_assert(fp, opcode)) goto traps_done; if (execute_pseudodbg(fp, opcode)) goto traps_done; } #endif info.si_code = ILL_ILLOPC; sig = SIGILL; strerror = KERN_NOTICE EXC_0x21(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_ILGAL_I: info.si_code = ILL_ILLPARAOP; sig = SIGILL; strerror = KERN_NOTICE EXC_0x22(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_CPLB_VL: info.si_code = ILL_CPLB_VI; sig = SIGSEGV; strerror = KERN_NOTICE EXC_0x23(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_MISALI_D: info.si_code = BUS_ADRALN; sig = SIGBUS; strerror = KERN_NOTICE EXC_0x24(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_UNCOV: info.si_code = ILL_ILLEXCPT; sig = SIGILL; strerror = KERN_NOTICE EXC_0x25(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_CPLB_M: info.si_code = BUS_ADRALN; sig = SIGBUS; strerror = KERN_NOTICE EXC_0x26(KERN_NOTICE); break; case VEC_CPLB_MHIT: info.si_code = ILL_CPLB_MULHIT; sig = SIGSEGV; #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO if (cpu_pda[cpu].dcplb_fault_addr < FIXED_CODE_START) strerror = KERN_NOTICE "NULL pointer access\n"; else #endif strerror = KERN_NOTICE EXC_0x27(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_WATCH: info.si_code = TRAP_WATCHPT; sig = SIGTRAP; pr_debug(EXC_0x28(KERN_DEBUG)); CHK_DEBUGGER_TRAP_MAYBE(); if (kernel_mode_regs(fp)) goto traps_done; else break; #ifdef CONFIG_BF535 case VEC_ISTRU_VL: info.si_code = BUS_OPFETCH; sig = SIGBUS; strerror = KERN_NOTICE "BF535: VEC_ISTRU_VL\n"; CHK_DEBUGGER_TRAP_MAYBE(); break; #else #endif case VEC_MISALI_I: info.si_code = BUS_ADRALN; sig = SIGBUS; strerror = KERN_NOTICE EXC_0x2A(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_CPLB_I_VL: info.si_code = ILL_CPLB_VI; sig = SIGBUS; strerror = KERN_NOTICE EXC_0x2B(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_CPLB_I_M: info.si_code = ILL_CPLB_MISS; sig = SIGBUS; strerror = KERN_NOTICE EXC_0x2C(KERN_NOTICE); break; case VEC_CPLB_I_MHIT: info.si_code = ILL_CPLB_MULHIT; sig = SIGSEGV; #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO if (cpu_pda[cpu].icplb_fault_addr < FIXED_CODE_START) strerror = KERN_NOTICE "Jump to NULL address\n"; else #endif strerror = KERN_NOTICE EXC_0x2D(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_ILL_RES: info.si_code = ILL_PRVOPC; sig = SIGILL; strerror = KERN_NOTICE EXC_0x2E(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; case VEC_HWERR: info.si_code = BUS_ADRALN; sig = SIGBUS; switch (fp->seqstat & SEQSTAT_HWERRCAUSE) { case (SEQSTAT_HWERRCAUSE_SYSTEM_MMR): info.si_code = BUS_ADRALN; sig = SIGBUS; strerror = KERN_NOTICE HWC_x2(KERN_NOTICE); break; case (SEQSTAT_HWERRCAUSE_EXTERN_ADDR): if (ANOMALY_05000310) { static unsigned long anomaly_rets; if ((fp->pc >= (L1_CODE_START + L1_CODE_LENGTH - 512)) && (fp->pc < (L1_CODE_START + L1_CODE_LENGTH))) { anomaly_rets = fp->rets; goto traps_done; } else if (fp->rets == anomaly_rets) { goto traps_done; } else if ((fp->rets >= (L1_CODE_START + L1_CODE_LENGTH - 512)) && (fp->rets < (L1_CODE_START + L1_CODE_LENGTH))) { goto traps_done; } else anomaly_rets = 0; } info.si_code = BUS_ADRERR; sig = SIGBUS; strerror = KERN_NOTICE HWC_x3(KERN_NOTICE); break; case (SEQSTAT_HWERRCAUSE_PERF_FLOW): strerror = KERN_NOTICE HWC_x12(KERN_NOTICE); break; case (SEQSTAT_HWERRCAUSE_RAISE_5): printk(KERN_NOTICE HWC_x18(KERN_NOTICE)); break; default: printk(KERN_NOTICE HWC_default(KERN_NOTICE)); break; } CHK_DEBUGGER_TRAP_MAYBE(); break; default: info.si_code = ILL_ILLPARAOP; sig = SIGILL; verbose_printk(KERN_EMERG "Caught Unhandled Exception, code = %08lx\n", (fp->seqstat & SEQSTAT_EXCAUSE)); CHK_DEBUGGER_TRAP_MAYBE(); break; } BUG_ON(sig == 0); if (kernel_mode_regs(fp) || (current && !current->mm)) { console_verbose(); oops_in_progress = 1; } if (sig != SIGTRAP) { if (strerror) verbose_printk(strerror); dump_bfin_process(fp); dump_bfin_mem(fp); show_regs(fp); #ifndef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE if (trapnr == VEC_CPLB_I_M || trapnr == VEC_CPLB_M) verbose_printk(KERN_NOTICE "No trace since you do not have " "CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE enabled\n\n"); else #endif dump_bfin_trace_buffer(); if (oops_in_progress) { verbose_printk(KERN_NOTICE "Kernel Stack\n"); show_stack(current, NULL); print_modules(); #ifndef CONFIG_ACCESS_CHECK verbose_printk(KERN_EMERG "Please turn on " "CONFIG_ACCESS_CHECK\n"); #endif panic("Kernel exception"); } else { #ifdef CONFIG_DEBUG_VERBOSE unsigned long *stack; stack = (unsigned long *)rdusp(); verbose_printk(KERN_NOTICE "Userspace Stack\n"); show_stack(NULL, stack); #endif } } #ifdef CONFIG_IPIPE if (!ipipe_trap_notify(fp->seqstat & 0x3f, fp)) #endif { info.si_signo = sig; info.si_errno = 0; switch (trapnr) { case VEC_CPLB_VL: case VEC_MISALI_D: case VEC_CPLB_M: case VEC_CPLB_MHIT: info.si_addr = (void __user *)cpu_pda[cpu].dcplb_fault_addr; break; default: info.si_addr = (void __user *)fp->pc; break; } force_sig_info(sig, &info, current); } if ((ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) || (ANOMALY_05000281 && trapnr == VEC_HWERR) || (ANOMALY_05000189 && (trapnr == VEC_CPLB_I_VL || trapnr == VEC_CPLB_VL))) fp->pc = SAFE_USER_INSTRUCTION; traps_done: trace_buffer_restore(j); }
//---------------------------------------------------------------------------------------------------------------------- // WM_COMMAND //---------------------------------------------------------------------------------------------------------------------- void cWinMain :: wm_command ( WPARAM wParam, LPARAM lParam ) { UNREFERENCED_PARAMETER ( lParam ); UNREFERENCED_PARAMETER ( wParam ); WORD wID = LOWORD(wParam); WORD wEvent = HIWORD(wParam); UNREFERENCED_PARAMETER ( wEvent ); switch ( wID ) { case ID_ABOUT: { cDlgAbout d; d.make_dlg(); } break; case ID_ACTIVE_WINDOW_TRACKING_SETTINGS: { cDlgSettingsActiveWindowTracking d; d.make_dlg (); } break; case ID_APPEARANCE_SETTINGS: { cDlgSettingsAppearance d; d.make_dlg (); } break; case ID_CLEAR: PostMessage ( DlgMonitor.hwnd, WM_COMMAND, ID_CLEAR, ID_CLEAR ); break; case ID_CONNECTION_SETTINGS: { cDlgSettingsConnection d; d.make_dlg (); } break; case ID_CREATE_DESKTOP_SHORTCUT: create_click_once_shortcut (); break; case ID_EXIT: DestroyWindow(hwnd); break; case ID_MOUSEOVER_SETTINGS: { cDlgMouseOver d; d.make_dlg (); } break; case ID_PERFORMANCE_SETTINGS: { cDlgSettingsPerformance d; d.make_dlg (); } break; case ID_PREDEFINED_HOTKEYS: { cFigPredefinedHotkeys * p = g_FigMgr.get_predefined_hotkeys(); cDlgFigPredefinedHotkeys d; d.make_dlg ( p ); } break; case ID_SHOW_APP_LOG: show_app_data_file ( L"mojo.log.txt" ); break; case ID_SHOW_APP_SETTINGS: show_app_data_file ( L"mojo.settings.txt" ); break; case ID_SHOW_ENGINE_LOG: show_app_data_file ( L"mojo_engine.log.txt" ); break; case ID_SHOW_ENGINE_SETTINGS: show_app_data_file ( L"mojo_engine.settings.txt" ); break; case ID_SHOW_INSTALLATION_DIRECTORY: { cStrW s1, s2; s1 = L"Location of Mojo's executable files:\n\n"; get_module_directory ( & s2 ); s1 += s2; message_box ( s1.cstr() ); } break; case ID_SHOW_LICENSE_DIALOG: { cDlgLicense d; d.make_dlg(); } break; case ID_TEST: ::test (); break; case ID_TEST_SET_TRIGGER: { cDlgSetTrigger d; mojo::cTrigger t; d.make_dlg(&t); } case ID_TOGGLE_BROADCAST: toggle_broadcast (); break; case ID_TOGGLE_HOTKEYS: toggle_hotkeys (); message_box ( L"Hotkeys aren't implemented yet." ); break; case ID_TOGGLE_MOUSEOVER: toggle_mouseover (); break; case ID_VIEW_COMPUTERS: g_Settings.uView = computers; set_view(); break; case ID_VIEW_MONITOR: g_Settings.uView = monitor; set_view(); break; case ID_VIEW_TOONS: g_Settings.uView = toons; set_view(); break; case ID_VIEW_WOWS: g_Settings.uView = wows; set_view(); break; #if 0 case ID_RESTORE_DEFAULT_SETTINGS: g_Settings.restore_defaults(); break; case ID_SETTINGS_MOUSEOVER: { cDlgMouseOver d; d.make_dlg(); } break; case ID_HIDE_HOTKEYNET: set_tray_icon (); ShowWindow ( g_hwnd, SW_HIDE ); break; case ID_TOGGLE_SHOW_STATE: ShowWindow ( g_hwnd, IsWindowVisible(g_hwnd) ? SW_HIDE : SW_RESTORE ); break; case ID_TOGGLE_HOTKEYS: toggle_hotkeys(); break; case ID_DEBUG: debug(); break; case ID_ASK_QUESTION: show_forum(); break; case ID_REPORT_BUG: report_bug (); break; case ID_INSTRUCTIONS: show_instructions (); break; case ID_SETTINGS_CONNECTION: { cDlgSettingsConnection d; d.make_dlg(); } break; case ID_SETTINGS_SECURITY: { cDlgSettingsSecurity d; d.make_dlg(); } break; case ID_SETTINGS_START_UP: { cDlgSettingsStartUp d; d.make_dlg(); } break; case ID_SETTINGS_DISPLAY: { cDlgSettingsDisplay d; d.make_dlg(); } break; case ID_INSTALLATION_OPTIONS: installation_options (); break; case ID_CREATE_SHORTCUT: create_clickonce_shortcut (); break; case ID_CREATE_SCRIPT: if ( create_script () ) load_script_sub(); break; case ID_OPEN_DEBUG_LOG: open_text_file ( g_Log.filename() ); break; case ID_LOAD_SCRIPT: g_Monitor.clear(); load_script(); break; case ID_RELOAD_SCRIPT: g_Monitor.clear(); load_script_sub (); break; case ID_EDIT_SCRIPT: edit_script(); break; case IDM_ABOUT: { cDlgMessageBox d; d.make_dlg(); } break; #endif } }
asmlinkage notrace void trap_c(struct pt_regs *fp) { #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON int j; #endif #ifdef CONFIG_BFIN_PSEUDODBG_INSNS int opcode; #endif unsigned int cpu = raw_smp_processor_id(); const char *strerror = NULL; int sig = 0; siginfo_t info; unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; trace_buffer_save(j); #if defined(CONFIG_DEBUG_MMRS) || defined(CONFIG_DEBUG_MMRS_MODULE) last_seqstat = (u32)fp->seqstat; #endif /* Important - be very careful dereferncing pointers - will lead to * double faults if the stack has become corrupt */ /* trap_c() will be called for exceptions. During exceptions * processing, the pc value should be set with retx value. * With this change we can cleanup some code in signal.c- TODO */ fp->orig_pc = fp->retx; /* printk("exception: 0x%x, ipend=%x, reti=%x, retx=%x\n", trapnr, fp->ipend, fp->pc, fp->retx); */ /* send the appropriate signal to the user program */ switch (trapnr) { /* This table works in conjunction with the one in ./mach-common/entry.S * Some exceptions are handled there (in assembly, in exception space) * Some are handled here, (in C, in interrupt space) * Some, like CPLB, are handled in both, where the normal path is * handled in assembly/exception space, and the error path is handled * here */ /* 0x00 - Linux Syscall, getting here is an error */ /* 0x01 - userspace gdb breakpoint, handled here */ case VEC_EXCPT01: info.si_code = TRAP_ILLTRAP; sig = SIGTRAP; CHK_DEBUGGER_TRAP_MAYBE(); /* Check if this is a breakpoint in kernel space */ if (kernel_mode_regs(fp)) goto traps_done; else break; /* 0x03 - User Defined, userspace stack overflow */ case VEC_EXCPT03: info.si_code = SEGV_STACKFLOW; sig = SIGSEGV; strerror = KERN_NOTICE EXC_0x03(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; /* 0x02 - KGDB initial connection and break signal trap */ case VEC_EXCPT02: #ifdef CONFIG_KGDB info.si_code = TRAP_ILLTRAP; sig = SIGTRAP; CHK_DEBUGGER_TRAP(); goto traps_done; #endif /* 0x04 - User Defined */ /* 0x05 - User Defined */ /* 0x06 - User Defined */ /* 0x07 - User Defined */ /* 0x08 - User Defined */ /* 0x09 - User Defined */ /* 0x0A - User Defined */ /* 0x0B - User Defined */ /* 0x0C - User Defined */ /* 0x0D - User Defined */ /* 0x0E - User Defined */ /* 0x0F - User Defined */ /* If we got here, it is most likely that someone was trying to use a * custom exception handler, and it is not actually installed properly */ case VEC_EXCPT04 ... VEC_EXCPT15: info.si_code = ILL_ILLPARAOP; sig = SIGILL; strerror = KERN_NOTICE EXC_0x04(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; /* 0x10 HW Single step, handled here */ case VEC_STEP: info.si_code = TRAP_STEP; sig = SIGTRAP; CHK_DEBUGGER_TRAP_MAYBE(); /* Check if this is a single step in kernel space */ if (kernel_mode_regs(fp)) goto traps_done; else break; /* 0x11 - Trace Buffer Full, handled here */ case VEC_OVFLOW: info.si_code = TRAP_TRACEFLOW; sig = SIGTRAP; strerror = KERN_NOTICE EXC_0x11(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; /* 0x12 - Reserved, Caught by default */ /* 0x13 - Reserved, Caught by default */ /* 0x14 - Reserved, Caught by default */ /* 0x15 - Reserved, Caught by default */ /* 0x16 - Reserved, Caught by default */ /* 0x17 - Reserved, Caught by default */ /* 0x18 - Reserved, Caught by default */ /* 0x19 - Reserved, Caught by default */ /* 0x1A - Reserved, Caught by default */ /* 0x1B - Reserved, Caught by default */ /* 0x1C - Reserved, Caught by default */ /* 0x1D - Reserved, Caught by default */ /* 0x1E - Reserved, Caught by default */ /* 0x1F - Reserved, Caught by default */ /* 0x20 - Reserved, Caught by default */ /* 0x21 - Undefined Instruction, handled here */ case VEC_UNDEF_I: #ifdef CONFIG_BUG if (kernel_mode_regs(fp)) { switch (report_bug(fp->pc, fp)) { case BUG_TRAP_TYPE_NONE: break; case BUG_TRAP_TYPE_WARN: dump_bfin_trace_buffer(); fp->pc += 2; goto traps_done; case BUG_TRAP_TYPE_BUG: /* call to panic() will dump trace, and it is * off at this point, so it won't be clobbered */ panic("BUG()"); } } #endif #ifdef CONFIG_BFIN_PSEUDODBG_INSNS /* * Support for the fake instructions, if the instruction fails, * then just execute a illegal opcode failure (like normal). * Don't support these instructions inside the kernel */ if (!kernel_mode_regs(fp) && get_instruction(&opcode, (unsigned short *)fp->pc)) { if (execute_pseudodbg_assert(fp, opcode)) goto traps_done; if (execute_pseudodbg(fp, opcode)) goto traps_done; } #endif info.si_code = ILL_ILLOPC; sig = SIGILL; strerror = KERN_NOTICE EXC_0x21(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; /* 0x22 - Illegal Instruction Combination, handled here */ case VEC_ILGAL_I: info.si_code = ILL_ILLPARAOP; sig = SIGILL; strerror = KERN_NOTICE EXC_0x22(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; /* 0x23 - Data CPLB protection violation, handled here */ case VEC_CPLB_VL: info.si_code = ILL_CPLB_VI; sig = SIGSEGV; strerror = KERN_NOTICE EXC_0x23(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; /* 0x24 - Data access misaligned, handled here */ case VEC_MISALI_D: info.si_code = BUS_ADRALN; sig = SIGBUS; strerror = KERN_NOTICE EXC_0x24(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; /* 0x25 - Unrecoverable Event, handled here */ case VEC_UNCOV: info.si_code = ILL_ILLEXCPT; sig = SIGILL; strerror = KERN_NOTICE EXC_0x25(KERN_NOTICE); CHK_DEBUGGER_TRAP_MAYBE(); break; /* 0x26 - Data CPLB Miss, normal case is handled in _cplb_hdr, error case is handled here */ case VEC_CPLB_M: info.si_code = BUS_ADRALN; sig = SIGBUS; strerror = KERN_NOTICE EXC_0x26(KERN_NOTICE); break; /* 0x27 - Data CPLB Multiple Hits - Linux Trap Zero, handled here */ case VEC_CPLB_MHIT: info.si_code = ILL_CPLB_MULHIT; sig = SIGSEGV; #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO if (