gdb-stub.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:22k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  arch/mips/kernel/gdb-stub.c
  3.  *
  4.  *  Originally written by Glenn Engel, Lake Stevens Instrument Division
  5.  *
  6.  *  Contributed by HP Systems
  7.  *
  8.  *  Modified for SPARC by Stu Grossman, Cygnus Support.
  9.  *
  10.  *  Modified for Linux/MIPS (and MIPS in general) by Andreas Busse
  11.  *  Send complaints, suggestions etc. to <andy@waldorf-gmbh.de>
  12.  *
  13.  *  Copyright (C) 1995 Andreas Busse
  14.  *
  15.  * $Id: gdb-stub.c,v 1.6 1999/05/01 22:40:35 ralf Exp $
  16.  */
  17. /*
  18.  *  To enable debugger support, two things need to happen.  One, a
  19.  *  call to set_debug_traps() is necessary in order to allow any breakpoints
  20.  *  or error conditions to be properly intercepted and reported to gdb.
  21.  *  Two, a breakpoint needs to be generated to begin communication.  This
  22.  *  is most easily accomplished by a call to breakpoint().  Breakpoint()
  23.  *  simulates a breakpoint by executing a BREAK instruction.
  24.  *
  25.  *
  26.  *    The following gdb commands are supported:
  27.  *
  28.  * command          function                               Return value
  29.  *
  30.  *    g             return the value of the CPU registers  hex data or ENN
  31.  *    G             set the value of the CPU registers     OK or ENN
  32.  *
  33.  *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA      hex data or ENN
  34.  *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA      OK or ENN
  35.  *
  36.  *    c             Resume at current address              SNN   ( signal NN)
  37.  *    cAA..AA       Continue at address AA..AA             SNN
  38.  *
  39.  *    s             Step one instruction                   SNN
  40.  *    sAA..AA       Step one instruction from AA..AA       SNN
  41.  *
  42.  *    k             kill
  43.  *
  44.  *    ?             What was the last sigval ?             SNN   (signal NN)
  45.  *
  46.  *    bBB..BB     Set baud rate to BB..BB    OK or BNN, then sets
  47.  *    baud rate
  48.  *
  49.  * All commands and responses are sent with a packet which includes a
  50.  * checksum.  A packet consists of
  51.  *
  52.  * $<packet info>#<checksum>.
  53.  *
  54.  * where
  55.  * <packet info> :: <characters representing the command or response>
  56.  * <checksum>    :: < two hex digits computed as modulo 256 sum of <packetinfo>>
  57.  *
  58.  * When a packet is received, it is first acknowledged with either '+' or '-'.
  59.  * '+' indicates a successful transfer.  '-' indicates a failed transfer.
  60.  *
  61.  * Example:
  62.  *
  63.  * Host:                  Reply:
  64.  * $m0,10#2a               +$00010203040506070809101112131415#42
  65.  *
  66.  * 
  67.  *  ==============
  68.  *  MORE EXAMPLES:
  69.  *  ==============
  70.  *
  71.  *  For reference -- the following are the steps that one
  72.  *  company took (RidgeRun Inc) to get remote gdb debugging
  73.  *  going. In this scenario the host machine was a PC and the
  74.  *  target platform was a Galileo EVB64120A MIPS evaluation
  75.  *  board.
  76.  *   
  77.  *  Step 1:
  78.  *  First download gdb-5.0.tar.gz from the internet.
  79.  *  and then build/install the package.
  80.  * 
  81.  *  Example:
  82.  *    $ tar zxf gdb-5.0.tar.gz
  83.  *    $ cd gdb-5.0
  84.  *    $ ./configure --target=mips-linux-elf
  85.  *    $ make
  86.  *    $ install
  87.  *    $ which mips-linux-elf-gdb
  88.  *    /usr/local/bin/mips-linux-elf-gdb
  89.  * 
  90.  *  Step 2:
  91.  *  Configure linux for remote debugging and build it.
  92.  * 
  93.  *  Example:
  94.  *    $ cd ~/linux
  95.  *    $ make menuconfig <go to "Kernel Hacking" and turn on remote debugging>
  96.  *    $ make dep; make vmlinux
  97.  * 
  98.  *  Step 3:
  99.  *  Download the kernel to the remote target and start
  100.  *  the kernel running. It will promptly halt and wait 
  101.  *  for the host gdb session to connect. It does this
  102.  *  since the "Kernel Hacking" option has defined 
  103.  *  CONFIG_REMOTE_DEBUG which in turn enables your calls
  104.  *  to:
  105.  *     set_debug_traps();
  106.  *     breakpoint();
  107.  * 
  108.  *  Step 4:
  109.  *  Start the gdb session on the host.
  110.  * 
  111.  *  Example:
  112.  *    $ mips-linux-elf-gdb vmlinux
  113.  *    (gdb) set remotebaud 115200
  114.  *    (gdb) target remote /dev/ttyS1
  115.  *    ...at this point you are connected to 
  116.  *       the remote target and can use gdb
  117.  *       in the normal fasion. Setting 
  118.  *       breakpoints, single stepping,
  119.  *       printing variables, etc.
  120.  *
  121.  */
  122. #include <linux/string.h>
  123. #include <linux/kernel.h>
  124. #include <linux/signal.h>
  125. #include <linux/sched.h>
  126. #include <linux/mm.h>
  127. #include <linux/console.h>
  128. #include <linux/init.h>
  129. #include <asm/asm.h>
  130. #include <asm/mipsregs.h>
  131. #include <asm/pgtable.h>
  132. #include <asm/system.h>
  133. #include <asm/gdb-stub.h>
  134. #include <asm/inst.h>
  135. /*
  136.  * external low-level support routines
  137.  */
  138. extern int putDebugChar(char c);    /* write a single character      */
  139. extern char getDebugChar(void);     /* read and return a single char */
  140. extern void trap_low(void);
  141. /*
  142.  * breakpoint and test functions
  143.  */
  144. extern void breakpoint(void);
  145. extern void breakinst(void);
  146. extern void adel(void);
  147. /*
  148.  * local prototypes
  149.  */
  150. static void getpacket(char *buffer);
  151. static void putpacket(char *buffer);
  152. static int computeSignal(int tt);
  153. static int hex(unsigned char ch);
  154. static int hexToInt(char **ptr, int *intValue);
  155. static unsigned char *mem2hex(char *mem, char *buf, int count, int may_fault);
  156. void handle_exception(struct gdb_regs *regs);
  157. /*
  158.  * BUFMAX defines the maximum number of characters in inbound/outbound buffers
  159.  * at least NUMREGBYTES*2 are needed for register packets
  160.  */
  161. #define BUFMAX 2048
  162. static char input_buffer[BUFMAX];
  163. static char output_buffer[BUFMAX];
  164. static int initialized; /* !0 means we've been initialized */
  165. static const char hexchars[]="0123456789abcdef";
  166. /* Used to prevent crashes in memory access.  Note that they'll crash anyway if
  167.    we haven't set up fault handlers yet... */
  168. int kgdb_read_byte(unsigned *address, unsigned *dest);
  169. int kgdb_write_byte(unsigned val, unsigned *dest);
  170. /*
  171.  * Convert ch from a hex digit to an int
  172.  */
  173. static int hex(unsigned char ch)
  174. {
  175. if (ch >= 'a' && ch <= 'f')
  176. return ch-'a'+10;
  177. if (ch >= '0' && ch <= '9')
  178. return ch-'0';
  179. if (ch >= 'A' && ch <= 'F')
  180. return ch-'A'+10;
  181. return -1;
  182. }
  183. /*
  184.  * scan for the sequence $<data>#<checksum>
  185.  */
  186. static void getpacket(char *buffer)
  187. {
  188. unsigned char checksum;
  189. unsigned char xmitcsum;
  190. int i;
  191. int count;
  192. unsigned char ch;
  193. do {
  194. /*
  195.  * wait around for the start character,
  196.  * ignore all other characters
  197.  */
  198. while ((ch = (getDebugChar() & 0x7f)) != '$') ;
  199. checksum = 0;
  200. xmitcsum = -1;
  201. count = 0;
  202. /*
  203.  * now, read until a # or end of buffer is found
  204.  */
  205. while (count < BUFMAX) {
  206. ch = getDebugChar() & 0x7f;
  207. if (ch == '#')
  208. break;
  209. checksum = checksum + ch;
  210. buffer[count] = ch;
  211. count = count + 1;
  212. }
  213. if (count >= BUFMAX)
  214. continue;
  215. buffer[count] = 0;
  216. if (ch == '#') {
  217. xmitcsum = hex(getDebugChar() & 0x7f) << 4;
  218. xmitcsum |= hex(getDebugChar() & 0x7f);
  219. if (checksum != xmitcsum)
  220. putDebugChar('-'); /* failed checksum */
  221. else {
  222. putDebugChar('+'); /* successful transfer */
  223. /*
  224.  * if a sequence char is present,
  225.  * reply the sequence ID
  226.  */
  227. if (buffer[2] == ':') {
  228. putDebugChar(buffer[0]);
  229. putDebugChar(buffer[1]);
  230. /*
  231.  * remove sequence chars from buffer
  232.  */
  233. count = strlen(buffer);
  234. for (i=3; i <= count; i++)
  235. buffer[i-3] = buffer[i];
  236. }
  237. }
  238. }
  239. }
  240. while (checksum != xmitcsum);
  241. }
  242. /*
  243.  * send the packet in buffer.
  244.  */
  245. static void putpacket(char *buffer)
  246. {
  247. unsigned char checksum;
  248. int count;
  249. unsigned char ch;
  250. /*
  251.  * $<packet info>#<checksum>.
  252.  */
  253. do {
  254. putDebugChar('$');
  255. checksum = 0;
  256. count = 0;
  257. while ((ch = buffer[count]) != 0) {
  258. if (!(putDebugChar(ch)))
  259. return;
  260. checksum += ch;
  261. count += 1;
  262. }
  263. putDebugChar('#');
  264. putDebugChar(hexchars[checksum >> 4]);
  265. putDebugChar(hexchars[checksum & 0xf]);
  266. }
  267. while ((getDebugChar() & 0x7f) != '+');
  268. }
  269. /*
  270.  * Convert the memory pointed to by mem into hex, placing result in buf.
  271.  * Return a pointer to the last char put in buf (null), in case of mem fault,
  272.  * return 0.
  273.  * may_fault is non-zero if we are reading from arbitrary memory, but is currently
  274.  * not used.
  275.  */
  276. static unsigned char *mem2hex(char *mem, char *buf, int count, int may_fault)
  277. {
  278. unsigned char ch;
  279. while (count-- > 0) {
  280. if (kgdb_read_byte(mem++, &ch) != 0)
  281. return 0;
  282. *buf++ = hexchars[ch >> 4];
  283. *buf++ = hexchars[ch & 0xf];
  284. }
  285. *buf = 0;
  286. return buf;
  287. }
  288. /*
  289.  * convert the hex array pointed to by buf into binary to be placed in mem
  290.  * return a pointer to the character AFTER the last byte written
  291.  * may_fault is non-zero if we are reading from arbitrary memory, but is currently
  292.  * not used.
  293.  */
  294. static char *hex2mem(char *buf, char *mem, int count, int may_fault)
  295. {
  296. int i;
  297. unsigned char ch;
  298. for (i=0; i<count; i++)
  299. {
  300. ch = hex(*buf++) << 4;
  301. ch |= hex(*buf++);
  302. if (kgdb_write_byte(ch, mem++) != 0)
  303. return 0;
  304. }
  305. return mem;
  306. }
  307. /*
  308.  * This table contains the mapping between SPARC hardware trap types, and
  309.  * signals, which are primarily what GDB understands.  It also indicates
  310.  * which hardware traps we need to commandeer when initializing the stub.
  311.  */
  312. static struct hard_trap_info {
  313. unsigned char tt; /* Trap type code for MIPS R3xxx and R4xxx */
  314. unsigned char signo; /* Signal that we map this trap into */
  315. } hard_trap_info[] = {
  316. { 6, SIGBUS }, /* instruction bus error */
  317. { 7, SIGBUS }, /* data bus error */
  318. { 9, SIGTRAP }, /* break */
  319. { 10, SIGILL }, /* reserved instruction */
  320. /* { 11, SIGILL }, */ /* CPU unusable */
  321. { 12, SIGFPE }, /* overflow */
  322. { 13, SIGTRAP }, /* trap */
  323. { 14, SIGSEGV }, /* virtual instruction cache coherency */
  324. { 15, SIGFPE }, /* floating point exception */
  325. { 23, SIGSEGV }, /* watch */
  326. { 31, SIGSEGV }, /* virtual data cache coherency */
  327. { 0, 0} /* Must be last */
  328. };
  329. /* Save the normal trap handlers for user-mode traps. */
  330. void *saved_vectors[32];
  331. /*
  332.  * Set up exception handlers for tracing and breakpoints
  333.  */
  334. void set_debug_traps(void)
  335. {
  336. struct hard_trap_info *ht;
  337. unsigned long flags;
  338. unsigned char c;
  339. save_and_cli(flags);
  340. for (ht = hard_trap_info; ht->tt && ht->signo; ht++)
  341. saved_vectors[ht->tt] = set_except_vector(ht->tt, trap_low);
  342.   
  343. putDebugChar('+'); /* 'hello world' */
  344. /*
  345.  * In case GDB is started before us, ack any packets
  346.  * (presumably "$?#xx") sitting there.
  347.  */
  348. while((c = getDebugChar()) != '$');
  349. while((c = getDebugChar()) != '#');
  350. c = getDebugChar(); /* eat first csum byte */
  351. c = getDebugChar(); /* eat second csum byte */
  352. putDebugChar('+'); /* ack it */
  353. initialized = 1;
  354. restore_flags(flags);
  355. }
  356. /*
  357.  * Convert the MIPS hardware trap type code to a Unix signal number.
  358.  */
  359. static int computeSignal(int tt)
  360. {
  361. struct hard_trap_info *ht;
  362. for (ht = hard_trap_info; ht->tt && ht->signo; ht++)
  363. if (ht->tt == tt)
  364. return ht->signo;
  365. return SIGHUP; /* default for things we don't know about */
  366. }
  367. /*
  368.  * While we find nice hex chars, build an int.
  369.  * Return number of chars processed.
  370.  */
  371. static int hexToInt(char **ptr, int *intValue)
  372. {
  373. int numChars = 0;
  374. int hexValue;
  375. *intValue = 0;
  376. while (**ptr) {
  377. hexValue = hex(**ptr);
  378. if (hexValue < 0)
  379. break;
  380. *intValue = (*intValue << 4) | hexValue;
  381. numChars ++;
  382. (*ptr)++;
  383. }
  384. return (numChars);
  385. }
  386. #if 0
  387. /*
  388.  * Print registers (on target console)
  389.  * Used only to debug the stub...
  390.  */
  391. void show_gdbregs(struct gdb_regs * regs)
  392. {
  393. /*
  394.  * Saved main processor registers
  395.  */
  396. printk("$0 : %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lxn",
  397.        regs->reg0, regs->reg1, regs->reg2, regs->reg3,
  398.                regs->reg4, regs->reg5, regs->reg6, regs->reg7);
  399. printk("$8 : %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lxn",
  400.        regs->reg8, regs->reg9, regs->reg10, regs->reg11,
  401.                regs->reg12, regs->reg13, regs->reg14, regs->reg15);
  402. printk("$16: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lxn",
  403.        regs->reg16, regs->reg17, regs->reg18, regs->reg19,
  404.                regs->reg20, regs->reg21, regs->reg22, regs->reg23);
  405. printk("$24: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lxn",
  406.        regs->reg24, regs->reg25, regs->reg26, regs->reg27,
  407.        regs->reg28, regs->reg29, regs->reg30, regs->reg31);
  408. /*
  409.  * Saved cp0 registers
  410.  */
  411. printk("epc  : %08lxnStatus: %08lxnCause : %08lxn",
  412.        regs->cp0_epc, regs->cp0_status, regs->cp0_cause);
  413. }
  414. #endif /* dead code */
  415. /*
  416.  * We single-step by setting breakpoints. When an exception
  417.  * is handled, we need to restore the instructions hoisted
  418.  * when the breakpoints were set.
  419.  *
  420.  * This is where we save the original instructions.
  421.  */
  422. static struct gdb_bp_save {
  423. unsigned int addr;
  424.         unsigned int val;
  425. } step_bp[2];
  426. #define BP 0x0000000d  /* break opcode */
  427. /*
  428.  * Set breakpoint instructions for single stepping.
  429.  */
  430. static void single_step(struct gdb_regs *regs)
  431. {
  432. union mips_instruction insn;
  433. unsigned int targ;
  434. int is_branch, is_cond, i;
  435. targ = regs->cp0_epc;
  436. insn.word = *(unsigned int *)targ;
  437. is_branch = is_cond = 0;
  438. switch (insn.i_format.opcode) {
  439. /*
  440.  * jr and jalr are in r_format format.
  441.  */
  442. case spec_op:
  443. switch (insn.r_format.func) {
  444. case jalr_op:
  445. case jr_op:
  446. targ = *(&regs->reg0 + insn.r_format.rs);
  447. is_branch = 1;
  448. break;
  449. }
  450. break;
  451. /*
  452.  * This group contains:
  453.  * bltz_op, bgez_op, bltzl_op, bgezl_op,
  454.  * bltzal_op, bgezal_op, bltzall_op, bgezall_op.
  455.  */
  456. case bcond_op:
  457. is_branch = is_cond = 1;
  458. targ += 4 + (insn.i_format.simmediate << 2);
  459. break;
  460. /*
  461.  * These are unconditional and in j_format.
  462.  */
  463. case jal_op:
  464. case j_op:
  465. is_branch = 1;
  466. targ += 4;
  467. targ >>= 28;
  468. targ <<= 28;
  469. targ |= (insn.j_format.target << 2);
  470. break;
  471. /*
  472.  * These are conditional.
  473.  */
  474. case beq_op:
  475. case beql_op:
  476. case bne_op:
  477. case bnel_op:
  478. case blez_op:
  479. case blezl_op:
  480. case bgtz_op:
  481. case bgtzl_op:
  482. case cop0_op:
  483. case cop1_op:
  484. case cop2_op:
  485. case cop1x_op:
  486. is_branch = is_cond = 1;
  487. targ += 4 + (insn.i_format.simmediate << 2);
  488. break;
  489. }
  490. if (is_branch) {
  491. i = 0;
  492. if (is_cond && targ != (regs->cp0_epc + 8)) {
  493. step_bp[i].addr = regs->cp0_epc + 8;
  494. step_bp[i++].val = *(unsigned *)(regs->cp0_epc + 8);
  495. *(unsigned *)(regs->cp0_epc + 8) = BP;
  496. }
  497. step_bp[i].addr = targ;
  498. step_bp[i].val  = *(unsigned *)targ;
  499. *(unsigned *)targ = BP;
  500. } else {
  501. step_bp[0].addr = regs->cp0_epc + 4;
  502. step_bp[0].val  = *(unsigned *)(regs->cp0_epc + 4);
  503. *(unsigned *)(regs->cp0_epc + 4) = BP;
  504. }
  505. }
  506. /*
  507.  *  If asynchronously interrupted by gdb, then we need to set a breakpoint
  508.  *  at the interrupted instruction so that we wind up stopped with a 
  509.  *  reasonable stack frame.
  510.  */
  511. static struct gdb_bp_save async_bp;
  512. void set_async_breakpoint(unsigned int epc)
  513. {
  514. async_bp.addr = epc;
  515. async_bp.val  = *(unsigned *)epc;
  516. *(unsigned *)epc = BP;
  517. flush_cache_all();
  518. }
  519. /*
  520.  * This function does all command processing for interfacing to gdb.  It
  521.  * returns 1 if you should skip the instruction at the trap address, 0
  522.  * otherwise.
  523.  */
  524. void handle_exception (struct gdb_regs *regs)
  525. {
  526. int trap; /* Trap type */
  527. int sigval;
  528. int addr;
  529. int length;
  530. char *ptr;
  531. unsigned long *stack;
  532. #if 0
  533. printk("in handle_exception()n");
  534. show_gdbregs(regs);
  535. #endif
  536. /*
  537.  * First check trap type. If this is CPU_UNUSABLE and CPU_ID is 1,
  538.  * the simply switch the FPU on and return since this is no error
  539.  * condition. kernel/traps.c does the same.
  540.  * FIXME: This doesn't work yet, so we don't catch CPU_UNUSABLE
  541.  * traps for now.
  542.  */
  543. trap = (regs->cp0_cause & 0x7c) >> 2;
  544. /* printk("trap=%dn",trap); */
  545. if (trap == 11) {
  546. if (((regs->cp0_cause >> CAUSEB_CE) & 3) == 1) {
  547. regs->cp0_status |= ST0_CU1;
  548. return;
  549. }
  550. }
  551. /*
  552.  * If we're in breakpoint() increment the PC
  553.  */
  554. if (trap == 9 && regs->cp0_epc == (unsigned long)breakinst)
  555. regs->cp0_epc += 4;
  556. /*
  557.  * If we were single_stepping, restore the opcodes hoisted
  558.  * for the breakpoint[s].
  559.  */
  560. if (step_bp[0].addr) {
  561. *(unsigned *)step_bp[0].addr = step_bp[0].val;
  562. step_bp[0].addr = 0;
  563.     
  564. if (step_bp[1].addr) {
  565. *(unsigned *)step_bp[1].addr = step_bp[1].val;
  566. step_bp[1].addr = 0;
  567. }
  568. }
  569. /*
  570.  * If we were interrupted asynchronously by gdb, then a
  571.  * breakpoint was set at the EPC of the interrupt so
  572.  * that we'd wind up here with an interesting stack frame.
  573.  */
  574. if (async_bp.addr) {
  575. *(unsigned *)async_bp.addr = async_bp.val;
  576. async_bp.addr = 0;
  577. }
  578. stack = (long *)regs->reg29; /* stack ptr */
  579. sigval = computeSignal(trap);
  580. /*
  581.  * reply to host that an exception has occurred
  582.  */
  583. ptr = output_buffer;
  584. /*
  585.  * Send trap type (converted to signal)
  586.  */
  587. *ptr++ = 'T';
  588. *ptr++ = hexchars[sigval >> 4];
  589. *ptr++ = hexchars[sigval & 0xf];
  590. /*
  591.  * Send Error PC
  592.  */
  593. *ptr++ = hexchars[REG_EPC >> 4];
  594. *ptr++ = hexchars[REG_EPC & 0xf];
  595. *ptr++ = ':';
  596. ptr = mem2hex((char *)&regs->cp0_epc, ptr, 4, 0);
  597. *ptr++ = ';';
  598. /*
  599.  * Send frame pointer
  600.  */
  601. *ptr++ = hexchars[REG_FP >> 4];
  602. *ptr++ = hexchars[REG_FP & 0xf];
  603. *ptr++ = ':';
  604. ptr = mem2hex((char *)&regs->reg30, ptr, 4, 0);
  605. *ptr++ = ';';
  606. /*
  607.  * Send stack pointer
  608.  */
  609. *ptr++ = hexchars[REG_SP >> 4];
  610. *ptr++ = hexchars[REG_SP & 0xf];
  611. *ptr++ = ':';
  612. ptr = mem2hex((char *)&regs->reg29, ptr, 4, 0);
  613. *ptr++ = ';';
  614. *ptr++ = 0;
  615. putpacket(output_buffer); /* send it off... */
  616. /*
  617.  * Wait for input from remote GDB
  618.  */
  619. while (1) {
  620. output_buffer[0] = 0;
  621. getpacket(input_buffer);
  622. switch (input_buffer[0])
  623. {
  624. case '?':
  625. output_buffer[0] = 'S';
  626. output_buffer[1] = hexchars[sigval >> 4];
  627. output_buffer[2] = hexchars[sigval & 0xf];
  628. output_buffer[3] = 0;
  629. break;
  630. case 'd':
  631. /* toggle debug flag */
  632. break;
  633. /*
  634.  * Return the value of the CPU registers
  635.  */
  636. case 'g':
  637. ptr = output_buffer;
  638. ptr = mem2hex((char *)&regs->reg0, ptr, 32*4, 0); /* r0...r31 */
  639. ptr = mem2hex((char *)&regs->cp0_status, ptr, 6*4, 0); /* cp0 */
  640. ptr = mem2hex((char *)&regs->fpr0, ptr, 32*4, 0); /* f0...31 */
  641. ptr = mem2hex((char *)&regs->cp1_fsr, ptr, 2*4, 0); /* cp1 */
  642. ptr = mem2hex((char *)&regs->frame_ptr, ptr, 2*4, 0); /* frp */
  643. ptr = mem2hex((char *)&regs->cp0_index, ptr, 16*4, 0); /* cp0 */
  644. break;
  645.   
  646. /*
  647.  * set the value of the CPU registers - return OK
  648.  * FIXME: Needs to be written
  649.  */
  650. case 'G':
  651. {
  652. #if 0
  653. unsigned long *newsp, psr;
  654. ptr = &input_buffer[1];
  655. hex2mem(ptr, (char *)registers, 16 * 4, 0); /* G & O regs */
  656. /*
  657.  * See if the stack pointer has moved. If so, then copy the
  658.  * saved locals and ins to the new location.
  659.  */
  660. newsp = (unsigned long *)registers[SP];
  661. if (sp != newsp)
  662. sp = memcpy(newsp, sp, 16 * 4);
  663. #endif
  664. strcpy(output_buffer,"OK");
  665.  }
  666. break;
  667. /*
  668.  * mAA..AA,LLLL  Read LLLL bytes at address AA..AA
  669.  */
  670. case 'm':
  671. ptr = &input_buffer[1];
  672. if (hexToInt(&ptr, &addr)
  673. && *ptr++ == ','
  674. && hexToInt(&ptr, &length)) {
  675. if (mem2hex((char *)addr, output_buffer, length, 1))
  676. break;
  677. strcpy (output_buffer, "E03");
  678. } else
  679. strcpy(output_buffer,"E01");
  680. break;
  681. /*
  682.  * MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK
  683.  */
  684. case 'M': 
  685. ptr = &input_buffer[1];
  686. if (hexToInt(&ptr, &addr)
  687. && *ptr++ == ','
  688. && hexToInt(&ptr, &length)
  689. && *ptr++ == ':') {
  690. if (hex2mem(ptr, (char *)addr, length, 1))
  691. strcpy(output_buffer, "OK");
  692. else
  693. strcpy(output_buffer, "E03");
  694. }
  695. else
  696. strcpy(output_buffer, "E02");
  697. break;
  698. /*
  699.  * cAA..AA    Continue at address AA..AA(optional)
  700.  */
  701. case 'c':    
  702. /* try to read optional parameter, pc unchanged if no parm */
  703. ptr = &input_buffer[1];
  704. if (hexToInt(&ptr, &addr))
  705. regs->cp0_epc = addr;
  706.   
  707. /*
  708.  * Need to flush the instruction cache here, as we may
  709.  * have deposited a breakpoint, and the icache probably
  710.  * has no way of knowing that a data ref to some location
  711.  * may have changed something that is in the instruction
  712.  * cache.
  713.  * NB: We flush both caches, just to be sure...
  714.  */
  715. flush_cache_all();
  716. return;
  717. /* NOTREACHED */
  718. break;
  719. /*
  720.  * kill the program
  721.  */
  722. case 'k' :
  723. break; /* do nothing */
  724. /*
  725.  * Reset the whole machine (FIXME: system dependent)
  726.  */
  727. case 'r':
  728. break;
  729. /*
  730.  * Step to next instruction
  731.  */
  732. case 's':
  733. /*
  734.  * There is no single step insn in the MIPS ISA, so we
  735.  * use breakpoints and continue, instead.
  736.  */
  737. single_step(regs);
  738. flush_cache_all();
  739. return;
  740. /* NOTREACHED */
  741. /*
  742.  * Set baud rate (bBB)
  743.  * FIXME: Needs to be written
  744.  */
  745. case 'b':
  746. {
  747. #if 0
  748. int baudrate;
  749. extern void set_timer_3();
  750. ptr = &input_buffer[1];
  751. if (!hexToInt(&ptr, &baudrate))
  752. {
  753. strcpy(output_buffer,"B01");
  754. break;
  755. }
  756. /* Convert baud rate to uart clock divider */
  757. switch (baudrate)
  758. {
  759. case 38400:
  760. baudrate = 16;
  761. break;
  762. case 19200:
  763. baudrate = 33;
  764. break;
  765. case 9600:
  766. baudrate = 65;
  767. break;
  768. default:
  769. baudrate = 0;
  770. strcpy(output_buffer,"B02");
  771. goto x1;
  772. }
  773. if (baudrate) {
  774. putpacket("OK"); /* Ack before changing speed */
  775. set_timer_3(baudrate); /* Set it */
  776. }
  777. #endif
  778. }
  779. break;
  780. } /* switch */
  781. /*
  782.  * reply to the request
  783.  */
  784. putpacket(output_buffer);
  785. } /* while */
  786. }
  787. /*
  788.  * This function will generate a breakpoint exception.  It is used at the
  789.  * beginning of a program to sync up with a debugger and can be used
  790.  * otherwise as a quick means to stop program execution and "break" into
  791.  * the debugger.
  792.  */
  793. void breakpoint(void)
  794. {
  795. if (!initialized)
  796. return;
  797. __asm__ __volatile__("
  798. .globl breakinst
  799. .set noreorder
  800. nop
  801. breakinst: break
  802. nop
  803. .set reorder
  804. ");
  805. }
  806. void adel(void)
  807. {
  808. __asm__ __volatile__("
  809. .globl adel
  810. la $8,0x80000001
  811. lw $9,0($8)
  812. ");
  813. }
  814. #ifdef CONFIG_GDB_CONSOLE
  815. void gdb_puts(const char *str)
  816. {
  817. int l = strlen(str);
  818. char outbuf[18];
  819. outbuf[0]='O';
  820. while(l) {
  821. int i = (l>8)?8:l;
  822. mem2hex((char *)str, &outbuf[1], i, 0);
  823. outbuf[(i*2)+1]=0;
  824. putpacket(outbuf); 
  825. str += i;
  826. l -= i;
  827. }
  828. }
  829. static kdev_t gdb_console_dev(struct console *con)
  830. {
  831. return MKDEV(1, 3); /* /dev/null */
  832. }
  833. static void gdb_console_write(struct console *con, const char *s, unsigned n)
  834. {
  835. gdb_puts(s);
  836. }
  837. static struct console gdb_console = {
  838. name: "gdb",
  839. write: gdb_console_write,
  840. device: gdb_console_dev,
  841. flags: CON_PRINTBUFFER,
  842. index: -1
  843. };
  844. __init void register_gdb_console(void)
  845. {
  846. register_console(&gdb_console);
  847. }
  848.      
  849. #endif