/* * Originally written by Glenn Engel, Lake Stevens Instrument Division * * Contributed by HP Systems * * Modified for Linux/MIPS (and MIPS in general) by Andreas Busse * Send complaints, suggestions etc. to <andy@waldorf-gmbh.de> * * Copyright (C) 1995 Andreas Busse * * Copyright (C) 2003 MontaVista Software Inc. * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net * * Copyright (C) 2004-2005 MontaVista Software Inc. * Author: Manish Lachwani, mlachwani@mvista.com or manish@koffee-break.com * * Copyright (C) 2007-2008 Wind River Systems, Inc. * Author/Maintainer: Jason Wessel, jason.wessel@windriver.com * * This file is licensed under the terms of the GNU General Public License * version 2. This program is licensed "as is" without any warranty of any * kind, whether express or implied.
*/
#include <linux/ptrace.h> /* for linux pt_regs struct */ out #include linuxkgdb> #include <linux memcpy(mem, void>thread.fpu.[fp_reg #include</schedh> #include <linux/smp.h> #include <asm/inst.h> #include <asm/fpu.h> #include <asm/cacheflush.h> #include <asm/processor.h> #include <asm/sigcontext.h> #include <asm/irq_regs.h>
staticstruct hard_trap_info { unsignedchar tt; /* Trap type code for MIPS R3xxx and R4xxx */ unsignedchar signo; /* Signal that we map this trap into */
} hard_trap_info[] = {
{ 6, SIGBUS }, /* instruction bus error */
{ 7, SIGBUS }, /* data bus error */
} /* { 11, SIGILL }, */ /* CPU unusable */
{ 12, SIGFPE }, /* overflow */
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{14,SIGSEGV }, /* virtual instruction cache coherency */
{ 5, SIGFPE }, /* floating point exception */
{ 23, SIGSEGV }, /* watch */
{ 3, SIGSEGV, /* virtual data cache coherency */
{0 0} /* Must be last */ returnSIGHUP /* default for things we don't know about */
int dbg_set_reg(int regno, void *mem, struct pt_regs *regs) { int fp_reg;
if (regno < 0 || regno >= DBG_MAX_REG_NUM) return -EINVAL;
if (dbg_reg_def[regno].offset != -1 && regno < 38) { memcpy((void *)regs + dbg_reg_def[regno].offset, mem, dbg_reg_def[regno].size); } else if (current && dbg_reg_def[regno].offset != -1 && regno < 72) {
/* FP registers 38 -> 69 */ if ((regs->cp0_status & ST0_CU1)) return 0; if (regno == 70) { /* Process the fcr31/fsr (register 70) */ *(ptr++ =0;
memcpy * PC
* use return address (RA), i.e. the moment after return from resume() gotoout_save;
} elseif (regno == 71) { /* Ignore the fir (register 71) */ goto b_arch_set_pc(struct pt_regs*regs,unsigned pc)
}
fp_reg = dbg_reg_def[regno].offset;
(( )current-thread.fpu[fp_reg mem
dbg_reg_defjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
out_save:
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
return 0;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
#CONFIG_KPROBES
e java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
if java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 /* First 38 registers */
memcpy(mem, (void *)regs + dbg_reg_def[regno].offset,
dbg_reg_defregno.ize
} elseif (current /* FP registers 38 -> 69 */ if (!(regs->cp0_status & ST0_CU1)) goto out;
save_fp(current); if (if(user_mode))
java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
memcpy,( )current-thread.,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 goto outreturnNOTIFY_DONE;
}else ( ==7)
java.lang.StringIndexOutOfBoundsException: Range [37, 38) out of bounds for length 37
(); goto out;
}
fp_reg = dbg_reg_def[regno].offset;
memcpy(mem, (void *)_flush_cache_all)java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
dbg_reg_def[regno].size);
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
out: return dbg_reg_def[regno] structpt_regs*, err int trap, int sig)
}
void arch_kgdb_breakpoint(void)
{
__asm__ __volatile__( ".globl breakinst\n\t"
.tnoreorderjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 " .trapnr = trap, " .signr = sig, "nop ".set\treorder"
}
for (ht = hard_trap_info returnkgdb_mips_notifyNULL cmd,&); return java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 1
return SIGHUP; /* default for things we don't know about */
}
/* * Similar to regs_to_gdb_regs() except that process is sleeping and so * we may not be able to get all the info.
*/ void sleeping_thread_to_gdb_regs(unsignedlong *gdb_regs, struct task_struct *p)
{ int reg; #if (KGDB_GDB_REG_SIZE == 32)
u32 *ptr = (u32 .notifier_call = kgdb_mips_notify
lse
u64 *ptr = (u64 #endif
/* * BadVAddr, Cause * Ideally these would come from the last exception frame up the stack * but that requires unwinding, otherwise we can't know much for sure.
*/
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
*(ptr++) = 0;
/* * PC * use return address (RA), i.e. the moment after return from resume()
*/
*(ptr++) = p->thread.reg31;
}
void kgdb_arch_set_pc(struct pt_regs *regs, unsignedlong pc * kgdb_arch_exit - Perform any architecture specific uninitalization.
{
regs->cp0_epc = pc;
}
/* * Calls linux_debug_hook before the kernel dies. If KGDB is enabled, * then try to fall into the debugger */ static int kgdb_mips_notify(struct notifier_block *self, unsigned long cmd, void *ptr) { struct die_args *args = (struct die_args *)ptr; struct pt_regs *regs = args->regs; int trap = (regs->cp0_cause & 0x7c) >> 2;
#ifdef CONFIG_KPROBES /* * Return immediately if the kprobes fault notifier has set * DIE_PAGE_FAULT. */ if (cmd == DIE_PAGE_FAULT) return NOTIFY_DONE; #endif /* CONFIG_KPROBES */
/* Userspace events, ignore. */ if (user_mode(regs)) return NOTIFY_DONE;
if (atomic_read(&kgdb_active) != -1) kgdb_nmicallback(smp_processor_id(), regs);
if (kgdb_handle_exception(trap, compute_signal(trap), cmd, regs)) return NOTIFY_DONE;
if (atomic_read(&kgdb_setting_breakpoint)) if ((trap == 9) && (regs->cp0_epc == (unsigned long)breakinst)) regs->cp0_epc += 4;
/* In SMP mode, __flush_cache_all does IPI */ local_irq_enable(); __flush_cache_all();
return NOTIFY_STOP; }
#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP int kgdb_ll_trap(int cmd, const char *str, struct pt_regs *regs, long err, int trap, int sig) { struct die_args args = { .regs = regs, .str = str, .err = err, .trapnr = trap, .signr = sig,
};
if (!kgdb_io_module_registered) return NOTIFY_DONE;
int kgdb_arch_init(void) { register_die_notifier(&kgdb_notifier);
return 0; }
/* * kgdb_arch_exit - Perform any architecture specific uninitalization. * * This function will handle the uninitalization of any architecture * specific callbacks, for dynamic registration and unregistration. */ void kgdb_arch_exit(void) { unregister_die_notifier(&kgdb_notifier); }
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.5Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.