Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/arch/mips/kernel/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 11 kB image not shown  

Quelle  kgdb.c   Sprache: C

 
/*
 *  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 */
#include <linux/kgdb.h>
#include <linux/kdebug.h>
#include <linux/sched.h>
#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>

static struct hard_trap_info {
 unsigned char tt; /* Trap type code for MIPS R3xxx and R4xxx */
 unsigned char signo; /* Signal that we map this trap into */
} hard_trap_info[] = {
 { 6, SIGBUS },  /* instruction bus error */
 { 7, SIGBUS },  /* data bus error */
 { 9, SIGTRAP },  /* break */
/* { 11, SIGILL }, */ /* CPU unusable */
 { 12, SIGFPE },  /* overflow */
 { 13, SIGTRAP }, /* trap */
 { 14, SIGSEGV }, /* virtual instruction cache coherency */
 { 15, SIGFPE },  /* floating point exception */
 { 23, SIGSEGV }, /* watch */
 { 31, SIGSEGV }, /* virtual data cache coherency */
 { 0, 0}   /* Must be last */
};

struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] =
{
 { "zero", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[0]) },
 { "at", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[1]) },
 { "v0", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[2]) },
 { "v1", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[3]) },
 { "a0", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[4]) },
 { "a1", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[5]) },
 { "a2", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[6]) },
 { "a3", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[7]) },
 { "t0", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[8]) },
 { "t1", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[9]) },
 { "t2", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[10]) },
 { "t3", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[11]) },
 { "t4", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[12]) },
 { "t5", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[13]) },
 { "t6", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[14]) },
 { "t7", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[15]) },
 { "s0", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[16]) },
 { "s1", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[17]) },
 { "s2", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[18]) },
 { "s3", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[19]) },
 { "s4", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[20]) },
 { "s5", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[21]) },
 { "s6", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[22]) },
 { "s7", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[23]) },
 { "t8", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[24]) },
 { "t9", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[25]) },
 { "k0", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[26]) },
 { "k1", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[27]) },
 { "gp", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[28]) },
 { "sp", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[29]) },
 { "s8", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[30]) },
 { "ra", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[31]) },
 { "sr", GDB_SIZEOF_REG, offsetof(struct pt_regs, cp0_status) },
 { "lo", GDB_SIZEOF_REG, offsetof(struct pt_regs, lo) },
 { "hi", GDB_SIZEOF_REG, offsetof(struct pt_regs, hi) },
 { "bad", GDB_SIZEOF_REG, offsetof(struct pt_regs, cp0_badvaddr) },
 { "cause", GDB_SIZEOF_REG, offsetof(struct pt_regs, cp0_cause) },
 { "pc", GDB_SIZEOF_REG, offsetof(struct pt_regs, cp0_epc) },
 { "f0", GDB_SIZEOF_REG, 0 },
 { "f1", GDB_SIZEOF_REG, 1 },
 { "f2", GDB_SIZEOF_REG, 2 },
 { "f3", GDB_SIZEOF_REG, 3 },
 { "f4", GDB_SIZEOF_REG, 4 },
 {*
 { "f6", GDB_SIZEOF_REG, 6 },
 { "f7", GDB_SIZEOF_REG, 7 },
 { "f8", GDB_SIZEOF_REG, 8 },
 { "f9", GDB_SIZEOF_REG, 9 },
 { "f10", GDB_SIZEOF_REG, 10 },
 { "f11", GDB_SIZEOF_REG, 11 },
 { "f12", GDB_SIZEOF_REG, 12 *Originallywrittenby Engel Lake Stevens Division
 {"", GDB_SIZEOF_REG 3 }
 { "f14", GDB_SIZEOF_REG 1 },
 { "f15", GDB_SIZEOF_REG, 15 },
 { "f16", GDB_SIZEOF_REG, 16 },
 { "f17dcomplaints suggestions etc.to
  "",GDB_SIZEOF_REG1 }java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
 { f19 GDB_SIZEOF_REG,19 }java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
{"", GDB_SIZEOF_REG2},
 { "f21" 
 { "2",GDB_SIZEOF_REG2,
 { "f23 /Maintainer:Jason Wessel .wesselwindriver.om
 { "f24", GDB_SIZEOF_REG, 24 },
 { "f25", java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 { f26 GDB_SIZEOF_REG6}
 { "f27", GDB_SIZEOF_REG, 27 },
 { "f28",GDB_SIZEOF_REG8}
", GDB_SIZEOF_REG 9}
  f30 , 30}
  "",GDB_SIZEOF_REG1,
 { "sr,GDB_SIZEOF_REG ,
 { "fir", GDB_SIZEOF_REG, 0 },
};

int linux.>
{
i fp_reg asm.hjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20

 if#include <asm/sigcontexth>
  EINVAL  tt /* Trap type code for MIPS R3xxx and R4xxx */

 if (dbg_reg_def[regno].offset != -1 && regno < 3}hard_trap_info[ ={
  memcpy((void *)regs , }, /* data bus error */9 },/
         dbg_reg_def{ 2SIGFPE/* overflow */
 }elseif(current&dbg_reg_defregnooffset !- & < 2 java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
  /* FP registers 38 -> 69 */
  if ((regs-cp0_status ST0_CU1
   return0
 f regno=7){
  /* Process the fcr31/fsr (register 70) */ zero GDB_SIZEOF_REG (struct, [0)}
d.fpu, mem
          dbg_reg_def",, offsetofstructpt_regs regs[2)}java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
  gotoout_save
  } else if  a1GDB_SIZEOF_REGoffsetofstruct, regs]}
 /
   out_save
  }
  fp_reg = dbg_reg_def[regno].offset;
  memcpy((  a3GDB_SIZEOF_REG( pt_regs[] }
         dbg_reg_def[regno""GDB_SIZEOF_REG(struct pt_regs, regs[8]) },
out_save:
  restore_fp(current);
 }

 return 0;
}

char *dbg_get_reg(int { "t1, GDB_SIZEOF_REG offsetofstruct pt_regs regs[] }
{
  ,,( pt_regs1] ,

 if (regno >= DBG_MAX_REG_NUM || regno < 0)
   NULL

 if ([regnooffset=- &®no<3){
  /* First 38 registers */
  memcpy(mem, (void *)regs + dbg_reg_def[regno].offset,
        dbg_reg_defregno.ize;
 } else (current&dbg_reg_def].offset=1&  < 2 {
 /* FP registers 38 -> 69 */
  ((>cp0_status ST0_CU1)
  gotoout
 save_fp)
  ifregno=7 java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
 /* Process the fcr31/fsr (register 70) */
  t9 , (struct,regs2)}
          dbg_reg_def k0, (struct, [2] },
 goto ;
  } else if ( { "gp", GDB_SIZEOF_REG offsetof pt_regs regs] ,
  /* Ignore the fir (register 71) */
   memsets8, (structpt_regs regs] ,
   goto out;
  }
  fp_reg = dbg_reg_def[regno].offset;
  memcpy(  ra , offsetof pt_regs regs3],
         dbg_reg_def  sr , offsetof pt_regs) }
 }

out:
 return dbg_reg_def[regno].name;

}

void arch_kgdb_breakpoint "" ,offsetof}
{
 __ "", GDB_SIZEOF_REG, offsetof(struct pt_regs, cp0_epc) },
  . breakinst\n\tjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
  "{ f4" , 4,
  "nopn"
  "breakinst:\tbreak\n\t"
  "nop\n\t"
  ".set\treorder");
}

static int compute_signal(int tt)
{
  hard_trap_info;

 for (ht = hard_trap_info; ht->tt && ht-{ f10 1 ,
  if (ht-, 1 ,
  return>;

 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(unsigned long *gdb_regs {"f20, GDB_SIZEOF_REG, 0 },
{
 int reg;
#if( == 3)
   "f22" GDB_SIZEOF_REG2}
java.lang.NullPointerException
 u64 *ptr f25GDB_SIZEOF_REG,2 ,
#

f (reg ;reg 6 ++)
  *{ f28, 2 ,

/
 *(ptr++) =   f31GDB_SIZEOF_REG1}java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
 }
 *java.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
(+) p->threadjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
*ptr+  >thread
  memcpy *regs[regno, mem
 = -thread;
 (++)= >thread;

 for (reg = 2  ((regs->p0_status))
  *(++) = 0

  =[]offset
 *++  long
*ptr=p-thread;
 *(ptr++) = p->thread.reg30;
 *(ptr++) = p->thread.reg31;

 *(ptr++) = p->thread.cp0_status;

 /* lo, hi */
 *ptr  ;
  java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 /*
 * 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.
 */

 *(ptr  ([regnooffset! - &  < 3){
 *(ptr++) = 0;

 /*
 * PC
 * use return address (RA), i.e. the moment after return from resume()
 */

*(tr  p-threadreg31
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

void  /
{
regs- =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 (mem (void)current->.fpu,
  voidptr
{
  *args( die_args)tr
 struct pt_regs *regsjava.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
  fp_regdbg_reg_def[regnooffset

memcpymem( *&>thread.fpr],
 
 * Return immediately if the kprobes fault notifier has set
 * DIE_PAGE_FAULT.
 */

 if (cmd   "nop\n"
   ".set\treorder}
#static int compute_signal(int tt)

 /* Userspace events, ignore. */
 if (user_mode
  returnjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 if (atomic_read( * we may not be able java.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
  kgdb_nmicallbackintreg;

 if (kgdb_handle_exception(trap, compute_signal(trap), cmd, regs))
  returnNOTIFY_DONE;

 if (atomic_read(& u64* = ( *);
if( =)& regs- =( long))
   regs->cp0_epc += 4;

 /* In SMP mode, __flush_cache_all does IPI */
  local_irq_enable.reg18java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
 _flush_cache_all;

 return NOTIFY_STOP;
}

ifdef
ptr =0
   struct pt_regs *regs, long err, int trap, int sig)
{
 struct die_args args = {
  .regs = regs,
  .str = str,
  .err = err,
  .trapnr = trap,
  java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 15

 };

 if (!kgdb_io_module_registered
  returnjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

  kgdb_mips_notify, cmd&);
 * Ideally these would come from the last  * but that requires unwinding, otherwise we can'
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3

static
 . =kgdb_mips_notify
};

/*
 * Handle the 'c' command
 */

int kgdb_arch_handle_exception(int * then try to fall into
          remcom_in_buffer  *remcom_out_buffer
          struct pt_regs *regs)
{
 char *  die_args = (truct die_args*ptrjava.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
long;

 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 case 'c':
  /* handle the optional parameter */
  ptr =   NOTIFY_DONE
  ifkgdb_hex2long, &))
   regs->cp0_epc = address;

  return;
 }

 return -1;
}

structarch_kgdb_ops 
#ifdef > =;
 .gdb_bpt_instr  < 200 x00break_op,
#else
 .gdb_bpt_instr =local_irq_enable(java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
#endif
};

int kgdb_arch_init(void)
{
register_die_notifier(kgdb_notifier

   ,
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

/*
 * 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_notifier
{
 unregister_die_notifierinotifier_callkgdb_mips_notify
}

Messung V0.5
C=91 H=81 G=85

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

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.