151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  arch/cris/arch-v32/kernel/kgdb.c
351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  CRIS v32 version by Orjan Friberg, Axis Communications AB.
551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  S390 version
751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
1051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  Originally written by Glenn Engel, Lake Stevens Instrument Division
1151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
1251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  Contributed by HP Systems
1351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
1451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  Modified for SPARC by Stu Grossman, Cygnus Support.
1551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
1651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  Modified for Linux/MIPS (and MIPS in general) by Andreas Busse
1751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  Send complaints, suggestions etc. to <andy@waldorf-gmbh.de>
1851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
1951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  Copyright (C) 1995 Andreas Busse
2051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
2151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
2251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* FIXME: Check the documentation. */
2351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
2451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
2551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  kgdb usage notes:
2651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  -----------------
2751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
2851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * If you select CONFIG_ETRAX_KGDB in the configuration, the kernel will be
2951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * built with different gcc flags: "-g" is added to get debug infos, and
3051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * "-fomit-frame-pointer" is omitted to make debugging easier. Since the
3151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * resulting kernel will be quite big (approx. > 7 MB), it will be stripped
3251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * before compresion. Such a kernel will behave just as usually, except if
3351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * given a "debug=<device>" command line option. (Only serial devices are
3451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * allowed for <device>, i.e. no printers or the like; possible values are
3551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * machine depedend and are the same as for the usual debug device, the one
3651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * for logging kernel messages.) If that option is given and the device can be
3751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * initialized, the kernel will connect to the remote gdb in trap_init(). The
3851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * serial parameters are fixed to 8N1 and 115200 bps, for easyness of
3951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * implementation.
4051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
4151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * To start a debugging session, start that gdb with the debugging kernel
4251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * image (the one with the symbols, vmlinux.debug) named on the command line.
4351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * This file will be used by gdb to get symbol and debugging infos about the
4451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * kernel. Next, select remote debug mode by
4551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    target remote <device>
4651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * where <device> is the name of the serial device over which the debugged
4751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * machine is connected. Maybe you have to adjust the baud rate by
4851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    set remotebaud <rate>
4951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * or also other parameters with stty:
5051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    shell stty ... </dev/...
5151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * If the kernel to debug has already booted, it waited for gdb and now
5251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * connects, and you'll see a breakpoint being reported. If the kernel isn't
5351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * running yet, start it now. The order of gdb and the kernel doesn't matter.
5451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Another thing worth knowing about in the getting-started phase is how to
5551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * debug the remote protocol itself. This is activated with
5651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    set remotedebug 1
5751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * gdb will then print out each packet sent or received. You'll also get some
5851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * messages about the gdb stub on the console of the debugged machine.
5951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
6051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * If all that works, you can use lots of the usual debugging techniques on
6151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * the kernel, e.g. inspecting and changing variables/memory, setting
6251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * breakpoints, single stepping and so on. It's also possible to interrupt the
6351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * debugged kernel by pressing C-c in gdb. Have fun! :-)
6451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
6551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * The gdb stub is entered (and thus the remote gdb gets control) in the
6651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * following situations:
6751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
6851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - If breakpoint() is called. This is just after kgdb initialization, or if
6951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    a breakpoint() call has been put somewhere into the kernel source.
7051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    (Breakpoints can of course also be set the usual way in gdb.)
7151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    In eLinux, we call breakpoint() in init/main.c after IRQ initialization.
7251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
7351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - If there is a kernel exception, i.e. bad_super_trap() or die_if_kernel()
7451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    are entered. All the CPU exceptions are mapped to (more or less..., see
7551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    the hard_trap_info array below) appropriate signal, which are reported
7651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    to gdb. die_if_kernel() is usually called after some kind of access
7751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    error and thus is reported as SIGSEGV.
7851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
7951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - When panic() is called. This is reported as SIGABRT.
8051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
8151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - If C-c is received over the serial line, which is treated as
8251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    SIGINT.
8351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
8451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Of course, all these signals are just faked for gdb, since there is no
8551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * signal concept as such for the kernel. It also isn't possible --obviously--
8651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * to set signal handlers from inside gdb, or restart the kernel with a
8751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * signal.
8851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
8951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Current limitations:
9051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
9151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - While the kernel is stopped, interrupts are disabled for safety reasons
9251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    (i.e., variables not changing magically or the like). But this also
9351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    means that the clock isn't running anymore, and that interrupts from the
9451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    hardware may get lost/not be served in time. This can cause some device
9551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    errors...
9651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
9751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - When single-stepping, only one instruction of the current thread is
9851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    executed, but interrupts are allowed for that time and will be serviced
9951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    if pending. Be prepared for that.
10051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
10151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - All debugging happens in kernel virtual address space. There's no way to
10251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    access physical memory not mapped in kernel space, or to access user
10351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    space. A way to work around this is using get_user_long & Co. in gdb
10451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    expressions, but only for the current process.
10551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
10651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - Interrupting the kernel only works if interrupts are currently allowed,
10751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    and the interrupt of the serial line isn't blocked by some other means
10851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    (IPL too high, disabled, ...)
10951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
11051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  - The gdb stub is currently not reentrant, i.e. errors that happen therein
11151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    (e.g. accessing invalid memory) may not be caught correctly. This could
11251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    be removed in future by introducing a stack of struct registers.
11351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
11451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
11551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
11651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
11751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  To enable debugger support, two things need to happen.  One, a
11851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  call to kgdb_init() is necessary in order to allow any breakpoints
11951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  or error conditions to be properly intercepted and reported to gdb.
12051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  Two, a breakpoint needs to be generated to begin communication.  This
12151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *  is most easily accomplished by a call to breakpoint().
12251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
12351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    The following gdb commands are supported:
12451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
12551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * command          function                               Return value
12651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
12751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    g             return the value of the CPU registers  hex data or ENN
12851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    G             set the value of the CPU registers     OK or ENN
12951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
13051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA      hex data or ENN
13151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA      OK or ENN
13251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
13351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    c             Resume at current address              SNN   ( signal NN)
13451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    cAA..AA       Continue at address AA..AA             SNN
13551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
13651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    s             Step one instruction                   SNN
13751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    sAA..AA       Step one instruction from AA..AA       SNN
13851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
13951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    k             kill
14051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
14151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    ?             What was the last sigval ?             SNN   (signal NN)
14251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
14351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *    bBB..BB	    Set baud rate to BB..BB		   OK or BNN, then sets
14451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *							   baud rate
14551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
14651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * All commands and responses are sent with a packet which includes a
14751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * checksum.  A packet consists of
14851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
14951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * $<packet info>#<checksum>.
15051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
15151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * where
15251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * <packet info> :: <characters representing the command or response>
15351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * <checksum>    :: < two hex digits computed as modulo 256 sum of <packetinfo>>
15451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
15551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * When a packet is received, it is first acknowledged with either '+' or '-'.
15651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * '+' indicates a successful transfer.  '-' indicates a failed transfer.
15751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
15851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Example:
15951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
16051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Host:                  Reply:
16151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * $m0,10#2a               +$00010203040506070809101112131415#42
16251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
16351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
16451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
16551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
16651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <linux/string.h>
16751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <linux/signal.h>
16851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <linux/kernel.h>
16951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <linux/delay.h>
17051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <linux/linkage.h>
17151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <linux/reboot.h>
17251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
17351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <asm/setup.h>
17451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <asm/ptrace.h>
17551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
17651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#include <asm/irq.h>
177ab43d14dab1c112b74aae1c2d684a19a26c34c43Jesper Nilsson#include <hwregs/reg_map.h>
178ab43d14dab1c112b74aae1c2d684a19a26c34c43Jesper Nilsson#include <hwregs/reg_rdwr.h>
179ab43d14dab1c112b74aae1c2d684a19a26c34c43Jesper Nilsson#include <hwregs/intr_vect_defs.h>
180ab43d14dab1c112b74aae1c2d684a19a26c34c43Jesper Nilsson#include <hwregs/ser_defs.h>
18151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
18251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* From entry.S. */
18351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikextern void gdb_handle_exception(void);
18451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* From kgdb_asm.S. */
18551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikextern void kgdb_handle_exception(void);
18651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
18751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int kgdb_started = 0;
18851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
18951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/********************************* Register image ****************************/
19051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
19151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starviktypedef
19251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstruct register_image
19351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
19451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	                      /* Offset */
19551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r0;    /* 0x00 */
19651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r1;    /* 0x04 */
19751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r2;    /* 0x08 */
19851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r3;    /* 0x0C */
19951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r4;    /* 0x10 */
20051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r5;    /* 0x14 */
20151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r6;    /* 0x18 */
20251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r7;    /* 0x1C */
20351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r8;    /* 0x20; Frame pointer (if any) */
20451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r9;    /* 0x24 */
20551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r10;   /* 0x28 */
20651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r11;   /* 0x2C */
20751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r12;   /* 0x30 */
20851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   r13;   /* 0x34 */
20951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   sp;    /* 0x38; R14, Stack pointer */
21051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   acr;   /* 0x3C; R15, Address calculation register. */
21151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
21251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned char  bz;    /* 0x40; P0, 8-bit zero register */
21351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned char  vr;    /* 0x41; P1, Version register (8-bit) */
21451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   pid;   /* 0x42; P2, Process ID */
21551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned char  srs;   /* 0x46; P3, Support register select (8-bit) */
21651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        unsigned short wz;    /* 0x47; P4, 16-bit zero register */
21751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   exs;   /* 0x49; P5, Exception status */
21851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   eda;   /* 0x4D; P6, Exception data address */
21951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   mof;   /* 0x51; P7, Multiply overflow register */
22051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   dz;    /* 0x55; P8, 32-bit zero register */
22151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   ebp;   /* 0x59; P9, Exception base pointer */
22251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   erp;   /* 0x5D; P10, Exception return pointer. Contains the PC we are interested in. */
22351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   srp;   /* 0x61; P11, Subroutine return pointer */
22451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   nrp;   /* 0x65; P12, NMI return pointer */
22551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   ccs;   /* 0x69; P13, Condition code stack */
22651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   usp;   /* 0x6D; P14, User mode stack pointer */
22751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   spc;   /* 0x71; P15, Single step PC */
22851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   pc;    /* 0x75; Pseudo register (for the most part set to ERP). */
22951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
23051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik} registers;
23151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
23251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starviktypedef
23351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstruct bp_register_image
23451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
23551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Support register bank 0. */
23651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s0_0;
23751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s1_0;
23851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s2_0;
23951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s3_0;
24051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s4_0;
24151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s5_0;
24251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s6_0;
24351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s7_0;
24451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s8_0;
24551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s9_0;
24651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s10_0;
24751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s11_0;
24851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s12_0;
24951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s13_0;
25051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s14_0;
25151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s15_0;
25251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
25351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Support register bank 1. */
25451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s0_1;
25551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s1_1;
25651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s2_1;
25751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s3_1;
25851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s4_1;
25951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s5_1;
26051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s6_1;
26151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s7_1;
26251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s8_1;
26351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s9_1;
26451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s10_1;
26551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s11_1;
26651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s12_1;
26751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s13_1;
26851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s14_1;
26951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s15_1;
27051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
27151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Support register bank 2. */
27251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s0_2;
27351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s1_2;
27451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s2_2;
27551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s3_2;
27651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s4_2;
27751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s5_2;
27851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s6_2;
27951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s7_2;
28051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s8_2;
28151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s9_2;
28251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s10_2;
28351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s11_2;
28451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s12_2;
28551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s13_2;
28651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s14_2;
28751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s15_2;
28851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
28951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Support register bank 3. */
29051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s0_3; /* BP_CTRL */
29151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s1_3; /* BP_I0_START */
29251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s2_3; /* BP_I0_END */
29351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s3_3; /* BP_D0_START */
29451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s4_3; /* BP_D0_END */
29551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s5_3; /* BP_D1_START */
29651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s6_3; /* BP_D1_END */
29751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s7_3; /* BP_D2_START */
29851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s8_3; /* BP_D2_END */
29951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s9_3; /* BP_D3_START */
30051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s10_3; /* BP_D3_END */
30151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s11_3; /* BP_D4_START */
30251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s12_3; /* BP_D4_END */
30351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s13_3; /* BP_D5_START */
30451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s14_3; /* BP_D5_END */
30551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int   s15_3; /* BP_RESERVED */
30651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
30751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik} support_registers;
30851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
30951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikenum register_name
31051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
31151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	R0,  R1,  R2,  R3,
31251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	R4,  R5,  R6,  R7,
31351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	R8,  R9,  R10, R11,
31451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	R12, R13, SP,  ACR,
31551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
31651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	BZ,  VR,  PID, SRS,
31751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	WZ,  EXS, EDA, MOF,
31851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	DZ,  EBP, ERP, SRP,
31951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	NRP, CCS, USP, SPC,
32051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	PC,
32151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
32251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	S0,  S1,  S2,  S3,
32351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	S4,  S5,  S6,  S7,
32451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	S8,  S9,  S10, S11,
32551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	S12, S13, S14, S15
32651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
32751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik};
32851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
32951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* The register sizes of the registers in register_name. An unimplemented register
33051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   is designated by size 0 in this array. */
33151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int register_size[] =
33251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
33351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
33451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
33551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
33651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
33751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
33851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	1, 1, 4, 1,
33951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	2, 4, 4, 4,
34051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
34151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
34251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
34351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4,
34451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
34551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
34651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
34751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4, 4,
34851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	4, 4, 4
34951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
35051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik};
35151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
35251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Contains the register image of the kernel.
35351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   (Global so that they can be reached from assembler code.) */
35451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikregisters reg;
35551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starviksupport_registers sreg;
35651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
35751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/************** Prototypes for local library functions ***********************/
35851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
35951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Copy of strcpy from libc. */
36051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic char *gdb_cris_strcpy(char *s1, const char *s2);
36151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
36251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Copy of strlen from libc. */
36351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int gdb_cris_strlen(const char *s);
36451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
36551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Copy of memchr from libc. */
36651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void *gdb_cris_memchr(const void *s, int c, int n);
36751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
36851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Copy of strtol from libc. Does only support base 16. */
36951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int gdb_cris_strtol(const char *s, char **endptr, int base);
37051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
37151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/********************** Prototypes for local functions. **********************/
37251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
37351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Write a value to a specified register regno in the register image
37451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   of the current thread. */
37551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int write_register(int regno, char *val);
37651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
37751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Read a value from a specified register in the register image. Returns the
37851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   status of the read operation. The register value is returned in valptr. */
37951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int read_register(char regno, unsigned int *valptr);
38051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Serial port, reads one character. ETRAX 100 specific. from debugport.c */
38251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikint getDebugChar(void);
38351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Serial port, writes one character. ETRAX 100 specific. from debugport.c */
38551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid putDebugChar(int val);
38651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Returns the integer equivalent of a hexadecimal character. */
38851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int hex(char ch);
38951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
39051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Convert the memory, pointed to by mem into hexadecimal representation.
39151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   Put the result in buf, and return a pointer to the last character
39251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   in buf (null). */
39351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic char *mem2hex(char *buf, unsigned char *mem, int count);
39451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
39551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Convert the array, in hexadecimal representation, pointed to by buf into
39651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   binary representation. Put the result in mem, and return a pointer to
39751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   the character after the last byte written. */
39851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic unsigned char *hex2mem(unsigned char *mem, char *buf, int count);
39951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
40051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Put the content of the array, in binary representation, pointed to by buf
40151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   into memory pointed to by mem, and return a pointer to
40251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   the character after the last byte written. */
40351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic unsigned char *bin2mem(unsigned char *mem, unsigned char *buf, int count);
40451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
40551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Await the sequence $<data>#<checksum> and store <data> in the array buffer
40651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   returned. */
40751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void getpacket(char *buffer);
40851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
40951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Send $<data>#<checksum> from the <data> in the array buffer. */
41051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void putpacket(char *buffer);
41151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
41251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Build and send a response packet in order to inform the host the
41351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   stub is stopped. */
41451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void stub_is_stopped(int sigval);
41551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
41651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* All expected commands are sent from remote.c. Send a response according
41751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   to the description in remote.c. Not static since it needs to be reached
41851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   from assembler code. */
41951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid handle_exception(int sigval);
42051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
42151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Performs a complete re-start from scratch. ETRAX specific. */
42251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void kill_restart(void);
42351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
42451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/******************** Prototypes for global functions. ***********************/
42551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
42651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* The string str is prepended with the GDB printout token and sent. */
42751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid putDebugString(const unsigned char *str, int len);
42851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
42951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* A static breakpoint to be used at startup. */
43051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid breakpoint(void);
43151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
43251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Avoid warning as the internal_stack is not used in the C-code. */
43351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define USEDVAR(name)    { if (name) { ; } }
43451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define USEDFUN(name) { void (*pf)(void) = (void *)name; USEDVAR(pf) }
43551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
43651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/********************************** Packet I/O ******************************/
43751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* BUFMAX defines the maximum number of characters in
43851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   inbound/outbound buffers */
43951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* FIXME: How do we know it's enough? */
44051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define BUFMAX 512
44151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
44251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Run-length encoding maximum length. Send 64 at most. */
44351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define RUNLENMAX 64
44451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
44551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* The inbound/outbound buffers used in packet I/O */
44651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic char input_buffer[BUFMAX];
44751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic char output_buffer[BUFMAX];
44851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
44951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Error and warning messages. */
45051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikenum error_type
45151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
45251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	SUCCESS, E01, E02, E03, E04, E05, E06,
45351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik};
45451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
45551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic char *error_message[] =
45651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
45751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	"",
45851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	"E01 Set current or general thread - H[c,g] - internal error.",
45951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	"E02 Change register content - P - cannot change read-only register.",
46051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	"E03 Thread is not alive.", /* T, not used. */
46151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	"E04 The command is not supported - [s,C,S,!,R,d,r] - internal error.",
46251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	"E05 Change register content - P - the register is not implemented..",
46351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	"E06 Change memory content - M - internal error.",
46451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik};
46551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
46651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/********************************** Breakpoint *******************************/
46751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Use an internal stack in the breakpoint and interrupt response routines.
46851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   FIXME: How do we know the size of this stack is enough?
46951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   Global so it can be reached from assembler code. */
47051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define INTERNAL_STACK_SIZE 1024
47151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikchar internal_stack[INTERNAL_STACK_SIZE];
47251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
47351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Due to the breakpoint return pointer, a state variable is needed to keep
47451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   track of whether it is a static (compiled) or dynamic (gdb-invoked)
47551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   breakpoint to be handled. A static breakpoint uses the content of register
47651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   ERP as it is whereas a dynamic breakpoint requires subtraction with 2
47751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   in order to execute the instruction. The first breakpoint is static; all
47851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   following are assumed to be dynamic. */
47951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int dynamic_bp = 0;
48051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
48151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/********************************* String library ****************************/
48251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Single-step over library functions creates trap loops. */
48351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
48451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Copy char s2[] to s1[]. */
48551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic char*
48651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikgdb_cris_strcpy(char *s1, const char *s2)
48751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
48851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	char *s = s1;
48951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
49051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	for (s = s1; (*s++ = *s2++) != '\0'; )
49151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		;
49251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return s1;
49351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
49451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
49551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Find length of s[]. */
49651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int
49751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikgdb_cris_strlen(const char *s)
49851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
49951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	const char *sc;
50051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
50151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	for (sc = s; *sc != '\0'; sc++)
50251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		;
50351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return (sc - s);
50451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
50551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
50651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Find first occurrence of c in s[n]. */
50751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void*
50851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikgdb_cris_memchr(const void *s, int c, int n)
50951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
51051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	const unsigned char uc = c;
51151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	const unsigned char *su;
51251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
51351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	for (su = s; 0 < n; ++su, --n)
51451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (*su == uc)
51551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			return (void *)su;
51651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return NULL;
51751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
51851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/******************************* Standard library ****************************/
51951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Single-step over library functions creates trap loops. */
52051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Convert string to long. */
52151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int
52251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikgdb_cris_strtol(const char *s, char **endptr, int base)
52351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
52451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	char *s1;
52551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	char *sd;
52651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int x = 0;
52751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
52842a9a58361d3b65f4a7c2ad280cc1ec9b657e7d2Harvey Harrison	for (s1 = (char*)s; (sd = gdb_cris_memchr(hex_asc, *s1, base)) != NULL; ++s1)
52942a9a58361d3b65f4a7c2ad280cc1ec9b657e7d2Harvey Harrison		x = x * base + (sd - hex_asc);
53051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
53151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        if (endptr) {
53251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                /* Unconverted suffix is stored in endptr unless endptr is NULL. */
53351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                *endptr = s1;
53451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        }
53551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
53651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return x;
53751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
53851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
53951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/********************************* Register image ****************************/
54051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
54151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Write a value to a specified register in the register image of the current
54251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   thread. Returns status code SUCCESS, E02 or E05. */
54351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int
54451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikwrite_register(int regno, char *val)
54551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
54651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int status = SUCCESS;
54751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
54851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        if (regno >= R0 && regno <= ACR) {
54951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Consecutive 32-bit registers. */
55051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		hex2mem((unsigned char *)&reg.r0 + (regno - R0) * sizeof(unsigned int),
55151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			val, sizeof(unsigned int));
55251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
55351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno == BZ || regno == VR || regno == WZ || regno == DZ) {
55451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Read-only registers. */
55551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		status = E02;
55651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
55751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno == PID) {
55851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* 32-bit register. (Even though we already checked SRS and WZ, we cannot
55951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   combine this with the EXS - SPC write since SRS and WZ have different size.) */
56051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		hex2mem((unsigned char *)&reg.pid, val, sizeof(unsigned int));
56151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
56251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno == SRS) {
56351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* 8-bit register. */
56451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		hex2mem((unsigned char *)&reg.srs, val, sizeof(unsigned char));
56551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
56651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno >= EXS && regno <= SPC) {
56751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Consecutive 32-bit registers. */
56851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		hex2mem((unsigned char *)&reg.exs + (regno - EXS) * sizeof(unsigned int),
56951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			 val, sizeof(unsigned int));
57051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
57151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik       } else if (regno == PC) {
57251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik               /* Pseudo-register. Treat as read-only. */
57351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik               status = E02;
57451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
57551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik       } else if (regno >= S0 && regno <= S15) {
57651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik               /* 32-bit registers. */
57751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik               hex2mem((unsigned char *)&sreg.s0_0 + (reg.srs * 16 * sizeof(unsigned int)) + (regno - S0) * sizeof(unsigned int), val, sizeof(unsigned int));
57851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else {
57951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Non-existing register. */
58051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		status = E05;
58151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
58251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return status;
58351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
58451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
58551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Read a value from a specified register in the register image. Returns the
58651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   value in the register or -1 for non-implemented registers. */
58751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int
58851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikread_register(char regno, unsigned int *valptr)
58951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
59051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int status = SUCCESS;
59151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
59251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* We read the zero registers from the register struct (instead of just returning 0)
59351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   to catch errors. */
59451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
59551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (regno >= R0 && regno <= ACR) {
59651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Consecutive 32-bit registers. */
59751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*valptr = *(unsigned int *)((char *)&reg.r0 + (regno - R0) * sizeof(unsigned int));
59851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
59951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno == BZ || regno == VR) {
60051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Consecutive 8-bit registers. */
60151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*valptr = (unsigned int)(*(unsigned char *)
60251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                         ((char *)&reg.bz + (regno - BZ) * sizeof(char)));
60351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
60451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno == PID) {
60551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* 32-bit register. */
60651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*valptr =  *(unsigned int *)((char *)&reg.pid);
60751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
60851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno == SRS) {
60951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* 8-bit register. */
61051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*valptr = (unsigned int)(*(unsigned char *)((char *)&reg.srs));
61151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
61251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno == WZ) {
61351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* 16-bit register. */
61451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*valptr = (unsigned int)(*(unsigned short *)(char *)&reg.wz);
61551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
61651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno >= EXS && regno <= PC) {
61751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Consecutive 32-bit registers. */
61851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*valptr = *(unsigned int *)((char *)&reg.exs + (regno - EXS) * sizeof(unsigned int));
61951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
62051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (regno >= S0 && regno <= S15) {
62151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Consecutive 32-bit registers, located elsewhere. */
62251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*valptr = *(unsigned int *)((char *)&sreg.s0_0 + (reg.srs * 16 * sizeof(unsigned int)) + (regno - S0) * sizeof(unsigned int));
62351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
62451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else {
62551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Non-existing register. */
62651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		status = E05;
62751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
62851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return status;
62951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
63051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
63151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
63251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/********************************** Packet I/O ******************************/
63351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Returns the integer equivalent of a hexadecimal character. */
63451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic int
63551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikhex(char ch)
63651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
63751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if ((ch >= 'a') && (ch <= 'f'))
63851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		return (ch - 'a' + 10);
63951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if ((ch >= '0') && (ch <= '9'))
64051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		return (ch - '0');
64151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if ((ch >= 'A') && (ch <= 'F'))
64251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		return (ch - 'A' + 10);
64351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return -1;
64451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
64551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
64651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Convert the memory, pointed to by mem into hexadecimal representation.
64751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   Put the result in buf, and return a pointer to the last character
64851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   in buf (null). */
64951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
65051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic char *
65151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikmem2hex(char *buf, unsigned char *mem, int count)
65251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
65351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int i;
65451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int ch;
65551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
65651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        if (mem == NULL) {
65751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Invalid address, caught by 'm' packet handler. */
65851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                for (i = 0; i < count; i++) {
65951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                        *buf++ = '0';
66051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                        *buf++ = '0';
66151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                }
66251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        } else {
66351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                /* Valid mem address. */
66451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		for (i = 0; i < count; i++) {
66551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			ch = *mem++;
66650e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko			buf = hex_byte_pack(buf, ch);
66751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
66851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        }
66951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        /* Terminate properly. */
67051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*buf = '\0';
67151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return buf;
67251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
67351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
67451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Same as mem2hex, but puts it in network byte order. */
67551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic char *
67651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikmem2hex_nbo(char *buf, unsigned char *mem, int count)
67751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
67851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int i;
67951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int ch;
68051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
68151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	mem += count - 1;
68251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	for (i = 0; i < count; i++) {
68351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		ch = *mem--;
68450e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko		buf = hex_byte_pack(buf, ch);
68551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        }
68651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
68751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        /* Terminate properly. */
68851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*buf = '\0';
68951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return buf;
69051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
69151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
69251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Convert the array, in hexadecimal representation, pointed to by buf into
69351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   binary representation. Put the result in mem, and return a pointer to
69451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   the character after the last byte written. */
69551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic unsigned char*
69651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikhex2mem(unsigned char *mem, char *buf, int count)
69751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
69851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int i;
69951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned char ch;
70051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	for (i = 0; i < count; i++) {
70151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		ch = hex (*buf++) << 4;
70251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		ch = ch + hex (*buf++);
70351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*mem++ = ch;
70451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
70551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return mem;
70651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
70751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
70851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Put the content of the array, in binary representation, pointed to by buf
70951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   into memory pointed to by mem, and return a pointer to the character after
71051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   the last byte written.
71151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   Gdb will escape $, #, and the escape char (0x7d). */
71251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic unsigned char*
71351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikbin2mem(unsigned char *mem, unsigned char *buf, int count)
71451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
71551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int i;
71651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned char *next;
71751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	for (i = 0; i < count; i++) {
71851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Check for any escaped characters. Be paranoid and
71951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   only unescape chars that should be escaped. */
72051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (*buf == 0x7d) {
72151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			next = buf + 1;
72251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (*next == 0x3 || *next == 0x4 || *next == 0x5D) {
72351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				 /* #, $, ESC */
72451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				buf++;
72551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				*buf += 0x20;
72651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
72751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
72851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		*mem++ = *buf++;
72951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
73051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return mem;
73151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
73251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
73351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Await the sequence $<data>#<checksum> and store <data> in the array buffer
73451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   returned. */
73551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void
73651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikgetpacket(char *buffer)
73751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
73851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned char checksum;
73951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned char xmitcsum;
74051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int i;
74151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int count;
74251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	char ch;
74351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
74451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	do {
74551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		while((ch = getDebugChar ()) != '$')
74651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Wait for the start character $ and ignore all other characters */;
74751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		checksum = 0;
74851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		xmitcsum = -1;
74951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		count = 0;
75051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Read until a # or the end of the buffer is reached */
75151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		while (count < BUFMAX) {
75251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			ch = getDebugChar();
75351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (ch == '#')
75451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
75551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			checksum = checksum + ch;
75651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			buffer[count] = ch;
75751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			count = count + 1;
75851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
75951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
76051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (count >= BUFMAX)
76151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			continue;
76251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
76351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		buffer[count] = 0;
76451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
76551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (ch == '#') {
76651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			xmitcsum = hex(getDebugChar()) << 4;
76751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			xmitcsum += hex(getDebugChar());
76851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (checksum != xmitcsum) {
76951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Wrong checksum */
77051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				putDebugChar('-');
77151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			} else {
77251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Correct checksum */
77351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				putDebugChar('+');
77451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* If sequence characters are received, reply with them */
77551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				if (buffer[2] == ':') {
77651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					putDebugChar(buffer[0]);
77751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					putDebugChar(buffer[1]);
77851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* Remove the sequence characters from the buffer */
77951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					count = gdb_cris_strlen(buffer);
78051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					for (i = 3; i <= count; i++)
78151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						buffer[i - 3] = buffer[i];
78251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
78351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
78451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
78551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} while (checksum != xmitcsum);
78651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
78751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
78851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Send $<data>#<checksum> from the <data> in the array buffer. */
78951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
79051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void
79151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikputpacket(char *buffer)
79251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
79351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int checksum;
79451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int runlen;
79551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int encode;
79651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
79751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	do {
79851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		char *src = buffer;
79951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		putDebugChar('$');
80051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		checksum = 0;
80151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		while (*src) {
80251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Do run length encoding */
80351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			putDebugChar(*src);
80451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			checksum += *src;
80551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			runlen = 0;
80651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			while (runlen < RUNLENMAX && *src == src[runlen]) {
80751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				runlen++;
80851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
80951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (runlen > 3) {
81051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Got a useful amount */
81151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				putDebugChar ('*');
81251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				checksum += '*';
81351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				encode = runlen + ' ' - 4;
81451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				putDebugChar(encode);
81551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				checksum += encode;
81651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				src += runlen;
81751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			} else {
81851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				src++;
81951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
82051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
82151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		putDebugChar('#');
82242a9a58361d3b65f4a7c2ad280cc1ec9b657e7d2Harvey Harrison		putDebugChar(hex_asc_hi(checksum));
82342a9a58361d3b65f4a7c2ad280cc1ec9b657e7d2Harvey Harrison		putDebugChar(hex_asc_lo(checksum));
82451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} while(kgdb_started && (getDebugChar() != '+'));
82551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
82651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
82751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* The string str is prepended with the GDB printout token and sent. Required
82851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   in traditional implementations. */
82951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid
83051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael StarvikputDebugString(const unsigned char *str, int len)
83151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
83251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Move SPC forward if we are single-stepping. */
83351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("spchere:");
83451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("move $spc, $r10");
83551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("cmp.d spchere, $r10");
83651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("bne nosstep");
83751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("nop");
83851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("move.d spccont, $r10");
83951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("move $r10, $spc");
84051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("nosstep:");
84151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
84251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        output_buffer[0] = 'O';
84351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        mem2hex(&output_buffer[1], (unsigned char *)str, len);
84451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        putpacket(output_buffer);
84551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
84651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	asm("spccont:");
84751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
84851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
84951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/********************************** Handle exceptions ************************/
85051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Build and send a response packet in order to inform the host the
85151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   stub is stopped. TAAn...:r...;n...:r...;n...:r...;
85251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                    AA = signal number
85351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                    n... = register number (hex)
85451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                    r... = register contents
85551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                    n... = `thread'
85651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                    r... = thread process ID.  This is a hex integer.
85751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                    n... = other string not starting with valid hex digit.
85851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                    gdb should ignore this n,r pair and go on to the next.
85951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                    This way we can extend the protocol. */
86051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void
86151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstub_is_stopped(int sigval)
86251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
86351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	char *ptr = output_buffer;
86451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned int reg_cont;
86551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
86651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Send trap type (converted to signal) */
86751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
86851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*ptr++ = 'T';
86950e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko	ptr = hex_byte_pack(ptr, sigval);
87051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
87151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (((reg.exs & 0xff00) >> 8) == 0xc) {
87251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
87351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Some kind of hardware watchpoint triggered. Find which one
87451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   and determine its type (read/write/access).  */
87551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		int S, bp, trig_bits = 0, rw_bits = 0;
87651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		int trig_mask = 0;
87751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		unsigned int *bp_d_regs = &sreg.s3_3;
87851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* In a lot of cases, the stopped data address will simply be EDA.
87951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   In some cases, we adjust it to match the watched data range.
88051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   (We don't want to change the actual EDA though). */
88151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		unsigned int stopped_data_address;
88251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* The S field of EXS. */
88351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		S = (reg.exs & 0xffff0000) >> 16;
88451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
88551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (S & 1) {
88651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Instruction watchpoint. */
88751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* FIXME: Check against, and possibly adjust reported EDA. */
88851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		} else {
88951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Data watchpoint.  Find the one that triggered. */
89051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			for (bp = 0; bp < 6; bp++) {
89151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
89251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Dx_RD, Dx_WR in the S field of EXS for this BP. */
89351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				int bitpos_trig = 1 + bp * 2;
89451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Dx_BPRD, Dx_BPWR in BP_CTRL for this BP. */
89551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				int bitpos_config = 2 + bp * 4;
89651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
89751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Get read/write trig bits for this BP. */
89851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				trig_bits = (S & (3 << bitpos_trig)) >> bitpos_trig;
89951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
90051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Read/write config bits for this BP. */
90151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				rw_bits = (sreg.s0_3 & (3 << bitpos_config)) >> bitpos_config;
90251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				if (trig_bits) {
90351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* Sanity check: the BP shouldn't trigger for accesses
90451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					   that it isn't configured for. */
90551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					if ((rw_bits == 0x1 && trig_bits != 0x1) ||
90651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					    (rw_bits == 0x2 && trig_bits != 0x2))
90751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						panic("Invalid r/w trigging for this BP");
90851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
90951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* Mark this BP as trigged for future reference. */
91051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					trig_mask |= (1 << bp);
91151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
91251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					if (reg.eda >= bp_d_regs[bp * 2] &&
91351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					    reg.eda <= bp_d_regs[bp * 2 + 1]) {
91425985edcedea6396277003854657b5f3cb31a628Lucas De Marchi						/* EDA within range for this BP; it must be the one
91551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						   we're looking for. */
91651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						stopped_data_address = reg.eda;
91751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						break;
91851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					}
91951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
92051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
92151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (bp < 6) {
92251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Found a trigged BP with EDA within its configured data range. */
92351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			} else if (trig_mask) {
92451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Something triggered, but EDA doesn't match any BP's range. */
92551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				for (bp = 0; bp < 6; bp++) {
92651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* Dx_BPRD, Dx_BPWR in BP_CTRL for this BP. */
92751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					int bitpos_config = 2 + bp * 4;
92851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
92951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* Read/write config bits for this BP (needed later). */
93051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					rw_bits = (sreg.s0_3 & (3 << bitpos_config)) >> bitpos_config;
93151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
93251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					if (trig_mask & (1 << bp)) {
93351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						/* EDA within 31 bytes of the configured start address? */
93451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						if (reg.eda + 31 >= bp_d_regs[bp * 2]) {
93551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							/* Changing the reported address to match
93651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							   the start address of the first applicable BP. */
93751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							stopped_data_address = bp_d_regs[bp * 2];
93851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							break;
93951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						} else {
94051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							/* We continue since we might find another useful BP. */
94151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							printk("EDA doesn't match trigged BP's range");
94251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						}
94351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					}
94451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
94551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
94651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
94751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* No match yet? */
94851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			BUG_ON(bp >= 6);
94951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Note that we report the type according to what the BP is configured
95051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   for (otherwise we'd never report an 'awatch'), not according to how
95151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   it trigged. We did check that the trigged bits match what the BP is
95251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   configured for though. */
95351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (rw_bits == 0x1) {
95451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* read */
95551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				strncpy(ptr, "rwatch", 6);
95651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				ptr += 6;
95751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			} else if (rw_bits == 0x2) {
95851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* write */
95951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				strncpy(ptr, "watch", 5);
96051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				ptr += 5;
96151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			} else if (rw_bits == 0x3) {
96251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* access */
96351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				strncpy(ptr, "awatch", 6);
96451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				ptr += 6;
96551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			} else {
96651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				panic("Invalid r/w bits for this BP.");
96751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
96851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
96951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			*ptr++ = ':';
97051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Note that we don't read_register(EDA, ...) */
97151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			ptr = mem2hex_nbo(ptr, (unsigned char *)&stopped_data_address, register_size[EDA]);
97251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			*ptr++ = ';';
97351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
97451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
97551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Only send PC, frame and stack pointer. */
97651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	read_register(PC, &reg_cont);
97750e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko	ptr = hex_byte_pack(ptr, PC);
97851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*ptr++ = ':';
97951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	ptr = mem2hex(ptr, (unsigned char *)&reg_cont, register_size[PC]);
98051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*ptr++ = ';';
98151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
98251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	read_register(R8, &reg_cont);
98350e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko	ptr = hex_byte_pack(ptr, R8);
98451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*ptr++ = ':';
98551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	ptr = mem2hex(ptr, (unsigned char *)&reg_cont, register_size[R8]);
98651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*ptr++ = ';';
98751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
98851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	read_register(SP, &reg_cont);
98950e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko	ptr = hex_byte_pack(ptr, SP);
99051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*ptr++ = ':';
99151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	ptr = mem2hex(ptr, (unsigned char *)&reg_cont, register_size[SP]);
99251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*ptr++ = ';';
99351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
99451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Send ERP as well; this will save us an entire register fetch in some cases. */
99551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        read_register(ERP, &reg_cont);
99650e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko	ptr = hex_byte_pack(ptr, ERP);
99751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        *ptr++ = ':';
99851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        ptr = mem2hex(ptr, (unsigned char *)&reg_cont, register_size[ERP]);
99951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik        *ptr++ = ';';
100051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
100151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* null-terminate and send it off */
100251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	*ptr = 0;
100351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	putpacket(output_buffer);
100451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
100551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
100651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Returns the size of an instruction that has a delay slot. */
100751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
100851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikint insn_size(unsigned long pc)
100951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
101051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	unsigned short opcode = *(unsigned short *)pc;
101151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	int size = 0;
101251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
101351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	switch ((opcode & 0x0f00) >> 8) {
101451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	case 0x0:
101551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	case 0x9:
101651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	case 0xb:
101751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		size = 2;
101851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		break;
101951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	case 0xe:
102051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	case 0xf:
102151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		size = 6;
102251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		break;
102351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	case 0xd:
102451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Could be 4 or 6; check more bits. */
102551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if ((opcode & 0xff) == 0xff)
102651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			size = 4;
102751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		else
102851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			size = 6;
102951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		break;
103051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	default:
103151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		panic("Couldn't find size of opcode 0x%x at 0x%lx\n", opcode, pc);
103251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
103351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
103451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	return size;
103551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
103651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
103751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid register_fixup(int sigval)
103851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
103951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Compensate for ACR push at the beginning of exception handler. */
104051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	reg.sp += 4;
104151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
104251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Standard case. */
104351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	reg.pc = reg.erp;
104451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (reg.erp & 0x1) {
104551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Delay slot bit set.  Report as stopped on proper instruction.  */
104651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (reg.spc) {
104751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Rely on SPC if set. */
104851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			reg.pc = reg.spc;
104951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		} else {
105051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Calculate the PC from the size of the instruction
105151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   that the delay slot we're in belongs to. */
105251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			reg.pc += insn_size(reg.erp & ~1) - 1 ;
105351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
105451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
105551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
105651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if ((reg.exs & 0x3) == 0x0) {
105751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Bits 1 - 0 indicate the type of memory operation performed
105851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   by the interrupted instruction. 0 means no memory operation,
105951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   and EDA is undefined in that case. We zero it to avoid confusion. */
106051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		reg.eda = 0;
106151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
106251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
106351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (sigval == SIGTRAP) {
106451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Break 8, single step or hardware breakpoint exception. */
106551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
106651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Check IDX field of EXS. */
106751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (((reg.exs & 0xff00) >> 8) == 0x18) {
106851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
106951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Break 8. */
107051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
107151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                        /* Static (compiled) breakpoints must return to the next instruction
107251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   in order to avoid infinite loops (default value of ERP). Dynamic
107351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   (gdb-invoked) must subtract the size of the break instruction from
107451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   the ERP so that the instruction that was originally in the break
107551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   instruction's place will be run when we return from the exception. */
107651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (!dynamic_bp) {
107751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Assuming that all breakpoints are dynamic from now on. */
107851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				dynamic_bp = 1;
107951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			} else {
108051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
108151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Only if not in a delay slot. */
108251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				if (!(reg.erp & 0x1)) {
108351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					reg.erp -= 2;
108451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					reg.pc -= 2;
108551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
108651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
108751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
108851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		} else if (((reg.exs & 0xff00) >> 8) == 0x3) {
108951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Single step. */
109051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Don't fiddle with S1. */
109151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
109251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		} else if (((reg.exs & 0xff00) >> 8) == 0xc) {
109351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
109451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Hardware watchpoint exception. */
109551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
109651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* SPC has been updated so that we will get a single step exception
109751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   when we return, but we don't want that. */
109851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			reg.spc = 0;
109951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
110051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Don't fiddle with S1. */
110151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
110251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
110351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else if (sigval == SIGINT) {
110451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Nothing special. */
110551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
110651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
110751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
110851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void insert_watchpoint(char type, int addr, int len)
110951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
111051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Breakpoint/watchpoint types (GDB terminology):
111151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   0 = memory breakpoint for instructions
111251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   (not supported; done via memory write instead)
111351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   1 = hardware breakpoint for instructions (supported)
111451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   2 = write watchpoint (supported)
111551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   3 = read watchpoint (supported)
111651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   4 = access watchpoint (supported) */
111751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
111851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (type < '1' || type > '4') {
111951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		output_buffer[0] = 0;
112051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		return;
112151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
112251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
112351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Read watchpoints are set as access watchpoints, because of GDB's
112451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   inability to deal with pure read watchpoints. */
112551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (type == '3')
112651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		type = '4';
112751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
112851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (type == '1') {
112951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Hardware (instruction) breakpoint. */
113051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Bit 0 in BP_CTRL holds the configuration for I0. */
113151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (sreg.s0_3 & 0x1) {
113251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Already in use. */
113351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			gdb_cris_strcpy(output_buffer, error_message[E04]);
113451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			return;
113551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
113651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Configure. */
113751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		sreg.s1_3 = addr;
113851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		sreg.s2_3 = (addr + len - 1);
113951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		sreg.s0_3 |= 1;
114051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else {
114151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		int bp;
114251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		unsigned int *bp_d_regs = &sreg.s3_3;
114351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
114451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* The watchpoint allocation scheme is the simplest possible.
114551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   For example, if a region is watched for read and
114651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   a write watch is requested, a new watchpoint will
114751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   be used. Also, if a watch for a region that is already
114851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   covered by one or more existing watchpoints, a new
114951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   watchpoint will be used. */
115051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
115151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* First, find a free data watchpoint. */
115251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		for (bp = 0; bp < 6; bp++) {
115351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Each data watchpoint's control registers occupy 2 bits
115451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   (hence the 3), starting at bit 2 for D0 (hence the 2)
115551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			   with 4 bits between for each watchpoint (yes, the 4). */
115651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (!(sreg.s0_3 & (0x3 << (2 + (bp * 4))))) {
115751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
115851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
115951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
116051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
116151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (bp > 5) {
116251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* We're out of watchpoints. */
116351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			gdb_cris_strcpy(output_buffer, error_message[E04]);
116451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			return;
116551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
116651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
116751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Configure the control register first. */
116851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (type == '3' || type == '4') {
116951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Trigger on read. */
117051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			sreg.s0_3 |= (1 << (2 + bp * 4));
117151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
117251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (type == '2' || type == '4') {
117351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Trigger on write. */
117451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			sreg.s0_3 |= (2 << (2 + bp * 4));
117551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
117651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
117751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Ugly pointer arithmetics to configure the watched range. */
117851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		bp_d_regs[bp * 2] = addr;
117951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		bp_d_regs[bp * 2 + 1] = (addr + len - 1);
118051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
118151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
118251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Set the S1 flag to enable watchpoints. */
118351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	reg.ccs |= (1 << (S_CCS_BITNR + CCS_SHIFT));
118451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	gdb_cris_strcpy(output_buffer, "OK");
118551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
118651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
118751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void remove_watchpoint(char type, int addr, int len)
118851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
118951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Breakpoint/watchpoint types:
119051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   0 = memory breakpoint for instructions
119151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   (not supported; done via memory write instead)
119251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   1 = hardware breakpoint for instructions (supported)
119351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   2 = write watchpoint (supported)
119451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   3 = read watchpoint (supported)
119551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   4 = access watchpoint (supported) */
119651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (type < '1' || type > '4') {
119751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		output_buffer[0] = 0;
119851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		return;
119951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
120051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
120151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Read watchpoints are set as access watchpoints, because of GDB's
120251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   inability to deal with pure read watchpoints. */
120351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (type == '3')
120451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		type = '4';
120551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
120651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	if (type == '1') {
120751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Hardware breakpoint. */
120851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Bit 0 in BP_CTRL holds the configuration for I0. */
120951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (!(sreg.s0_3 & 0x1)) {
121051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* Not in use. */
121151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			gdb_cris_strcpy(output_buffer, error_message[E04]);
121251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			return;
121351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
121451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Deconfigure. */
121551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		sreg.s1_3 = 0;
121651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		sreg.s2_3 = 0;
121751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		sreg.s0_3 &= ~1;
121851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	} else {
121951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		int bp;
122051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		unsigned int *bp_d_regs = &sreg.s3_3;
122151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Try to find a watchpoint that is configured for the
122251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   specified range, then check that read/write also matches. */
122351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
122451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Ugly pointer arithmetic, since I cannot rely on a
122551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   single switch (addr) as there may be several watchpoints with
122651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   the same start address for example. */
122751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
122851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		for (bp = 0; bp < 6; bp++) {
122951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			if (bp_d_regs[bp * 2] == addr &&
123051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			    bp_d_regs[bp * 2 + 1] == (addr + len - 1)) {
123151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Matching range. */
123251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				int bitpos = 2 + bp * 4;
123351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				int rw_bits;
123451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
123551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Read/write bits for this BP. */
123651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				rw_bits = (sreg.s0_3 & (0x3 << bitpos)) >> bitpos;
123751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
123851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				if ((type == '3' && rw_bits == 0x1) ||
123951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				    (type == '2' && rw_bits == 0x2) ||
124051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				    (type == '4' && rw_bits == 0x3)) {
124151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* Read/write matched. */
124251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					break;
124351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
124451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
124551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
124651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
124751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		if (bp > 5) {
124851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			/* No watchpoint matched. */
124951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			gdb_cris_strcpy(output_buffer, error_message[E04]);
125051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			return;
125151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
125251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
125351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		/* Found a matching watchpoint. Now, deconfigure it by
125451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   both disabling read/write in bp_ctrl and zeroing its
125551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		   start/end addresses. */
125651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		sreg.s0_3 &= ~(3 << (2 + (bp * 4)));
125751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		bp_d_regs[bp * 2] = 0;
125851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		bp_d_regs[bp * 2 + 1] = 0;
125951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
126051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
126151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Note that we don't clear the S1 flag here. It's done when continuing.  */
126251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	gdb_cris_strcpy(output_buffer, "OK");
126351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
126451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
126551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
126651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
126751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* All expected commands are sent from remote.c. Send a response according
126851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik   to the description in remote.c. */
126951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid
127051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikhandle_exception(int sigval)
127151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
127251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Avoid warning of not used. */
127351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
127451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	USEDFUN(handle_exception);
127551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	USEDVAR(internal_stack[0]);
127651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
127751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	register_fixup(sigval);
127851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
127951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Send response. */
128051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	stub_is_stopped(sigval);
128151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
128251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	for (;;) {
128351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		output_buffer[0] = '\0';
128451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		getpacket(input_buffer);
128551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		switch (input_buffer[0]) {
128651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'g':
128751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Read registers: g
128851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: Each byte of register data is described by two hex digits.
128951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Registers are in the internal order for GDB, and the bytes
129051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   in a register  are in the same order the machine uses.
129151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: void. */
129251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			{
129351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				char *buf;
129451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* General and special registers. */
129551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				buf = mem2hex(output_buffer, (char *)&reg, sizeof(registers));
129651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Support registers. */
129751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* -1 because of the null termination that mem2hex adds. */
129851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				mem2hex(buf,
129951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					(char *)&sreg + (reg.srs * 16 * sizeof(unsigned int)),
130051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					16 * sizeof(unsigned int));
130151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
130251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			}
130351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'G':
130451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Write registers. GXX..XX
130551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Each byte of register data  is described by two hex digits.
130651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: OK
130751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: void. */
130851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* General and special registers. */
130951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				hex2mem((char *)&reg, &input_buffer[1], sizeof(registers));
131051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Support registers. */
131151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				hex2mem((char *)&sreg + (reg.srs * 16 * sizeof(unsigned int)),
131251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					&input_buffer[1] + sizeof(registers),
131351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					16 * sizeof(unsigned int));
131451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				gdb_cris_strcpy(output_buffer, "OK");
131551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
131651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
131751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'P':
131851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Write register. Pn...=r...
131951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Write register n..., hex value without 0x, with value r...,
132051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   which contains a hex value without 0x and two hex digits
132151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   for each byte in the register (target byte order). P1f=11223344 means
132251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   set register 31 to 44332211.
132351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: OK
132451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: E02, E05 */
132551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				{
132651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					char *suffix;
132751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					int regno = gdb_cris_strtol(&input_buffer[1], &suffix, 16);
132851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					int status;
132951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
133051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					status = write_register(regno, suffix+1);
133151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
133251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					switch (status) {
133351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						case E02:
133451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							/* Do not support read-only registers. */
133551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							gdb_cris_strcpy(output_buffer, error_message[E02]);
133651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							break;
133751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						case E05:
133851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							/* Do not support non-existing registers. */
133951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							gdb_cris_strcpy(output_buffer, error_message[E05]);
134051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							break;
134151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						default:
134251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							/* Valid register number. */
134351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							gdb_cris_strcpy(output_buffer, "OK");
134451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							break;
134551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					}
134651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
134751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
134851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
134951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'm':
135051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Read from memory. mAA..AA,LLLL
135151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   AA..AA is the address and LLLL is the length.
135251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: XX..XX is the memory content.  Can be fewer bytes than
135351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   requested if only part of the data may be read. m6000120a,6c means
135451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   retrieve 108 byte from base address 6000120a.
135551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: void. */
135651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				{
135751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                        char *suffix;
135851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					unsigned char *addr = (unsigned char *)gdb_cris_strtol(&input_buffer[1],
135951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                                                                               &suffix, 16);
136051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					int len = gdb_cris_strtol(suffix+1, 0, 16);
136151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
136251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* Bogus read (i.e. outside the kernel's
136351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					   segment)? . */
136451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					if (!((unsigned int)addr >= 0xc0000000 &&
136551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					      (unsigned int)addr < 0xd0000000))
136651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						addr = NULL;
136751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
136851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                        mem2hex(output_buffer, addr, len);
136951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                }
137051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
137151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
137251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'X':
137351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Write to memory. XAA..AA,LLLL:XX..XX
137451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   AA..AA is the start address,  LLLL is the number of bytes, and
137551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   XX..XX is the binary data.
137651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: OK
137751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: void. */
137851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'M':
137951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Write to memory. MAA..AA,LLLL:XX..XX
138051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   AA..AA is the start address,  LLLL is the number of bytes, and
138151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   XX..XX is the hexadecimal data.
138251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: OK
138351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: void. */
138451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				{
138551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					char *lenptr;
138651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					char *dataptr;
138751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					unsigned char *addr = (unsigned char *)gdb_cris_strtol(&input_buffer[1],
138851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik										      &lenptr, 16);
138951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					int len = gdb_cris_strtol(lenptr+1, &dataptr, 16);
139051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					if (*lenptr == ',' && *dataptr == ':') {
139151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						if (input_buffer[0] == 'M') {
139251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							hex2mem(addr, dataptr + 1, len);
139351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						} else /* X */ {
139451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik							bin2mem(addr, dataptr + 1, len);
139551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						}
139651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						gdb_cris_strcpy(output_buffer, "OK");
139751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					}
139851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					else {
139951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik						gdb_cris_strcpy(output_buffer, error_message[E06]);
140051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					}
140151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
140251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
140351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
140451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'c':
140551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Continue execution. cAA..AA
140651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   AA..AA is the address where execution is resumed. If AA..AA is
140751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   omitted, resume at the present address.
140851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: return to the executing thread.
140951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: will never know. */
141051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
141151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				if (input_buffer[1] != '\0') {
141251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* FIXME: Doesn't handle address argument. */
141351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					gdb_cris_strcpy(output_buffer, error_message[E04]);
141451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					break;
141551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
141651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
141751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Before continuing, make sure everything is set up correctly. */
141851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
141951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Set the SPC to some unlikely value.  */
142051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				reg.spc = 0;
142151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Set the S1 flag to 0 unless some watchpoint is enabled (since setting
142251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   S1 to 0 would also disable watchpoints). (Note that bits 26-31 in BP_CTRL
142351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   are reserved, so don't check against those). */
142451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				if ((sreg.s0_3 & 0x3fff) == 0) {
142551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					reg.ccs &= ~(1 << (S_CCS_BITNR + CCS_SHIFT));
142651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
142751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
142851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				return;
142951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
143051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 's':
143151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Step. sAA..AA
143251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   AA..AA is the address where execution is resumed. If AA..AA is
143351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   omitted, resume at the present address. Success: return to the
143451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   executing thread. Failure: will never know. */
143551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
143651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				if (input_buffer[1] != '\0') {
143751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					/* FIXME: Doesn't handle address argument. */
143851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					gdb_cris_strcpy(output_buffer, error_message[E04]);
143951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik					break;
144051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				}
144151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
144251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Set the SPC to PC, which is where we'll return
144351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   (deduced previously). */
144451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				reg.spc = reg.pc;
144551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
144651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Set the S1 (first stacked, not current) flag, which will
144751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   kick into action when we rfe. */
144851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				reg.ccs |= (1 << (S_CCS_BITNR + CCS_SHIFT));
144951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				return;
145051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
145151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                       case 'Z':
145251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
145351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                               /* Insert breakpoint or watchpoint, Ztype,addr,length.
145451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                  Remote protocol says: A remote target shall return an empty string
145551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                  for an unrecognized breakpoint or watchpoint packet type. */
145651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                               {
145751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       char *lenptr;
145851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       char *dataptr;
145951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       int addr = gdb_cris_strtol(&input_buffer[3], &lenptr, 16);
146051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       int len = gdb_cris_strtol(lenptr + 1, &dataptr, 16);
146151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       char type = input_buffer[1];
146251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
146351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				       insert_watchpoint(type, addr, len);
146451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       break;
146551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                               }
146651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
146751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                       case 'z':
146851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                               /* Remove breakpoint or watchpoint, Ztype,addr,length.
146951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                  Remote protocol says: A remote target shall return an empty string
147051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                  for an unrecognized breakpoint or watchpoint packet type. */
147151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                               {
147251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       char *lenptr;
147351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       char *dataptr;
147451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       int addr = gdb_cris_strtol(&input_buffer[3], &lenptr, 16);
147551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       int len = gdb_cris_strtol(lenptr + 1, &dataptr, 16);
147651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       char type = input_buffer[1];
147751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
147851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       remove_watchpoint(type, addr, len);
147951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                                       break;
148051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik                               }
148151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
148251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
148351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case '?':
148451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* The last signal which caused a stop. ?
148551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: SAA, where AA is the signal number.
148651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: void. */
148751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				output_buffer[0] = 'S';
148842a9a58361d3b65f4a7c2ad280cc1ec9b657e7d2Harvey Harrison				output_buffer[1] = hex_asc_hi(sigval);
148942a9a58361d3b65f4a7c2ad280cc1ec9b657e7d2Harvey Harrison				output_buffer[2] = hex_asc_lo(sigval);
149051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				output_buffer[3] = 0;
149151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
149251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
149351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'D':
149451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Detach from host. D
149551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: OK, and return to the executing thread.
149651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: will never know */
149751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				putpacket("OK");
149851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				return;
149951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
150051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'k':
150151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'r':
150251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* kill request or reset request.
150351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Success: restart of target.
150451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Failure: will never know. */
150551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				kill_restart();
150651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
150751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
150851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'C':
150951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'S':
151051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case '!':
151151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'R':
151251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			case 'd':
151351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* Continue with signal sig. Csig;AA..AA
151451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Step with signal sig. Ssig;AA..AA
151551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Use the extended remote protocol. !
151651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Restart the target system. R0
151751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Toggle debug flag. d
151851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Search backwards. tAA:PP,MM
151951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   Not supported: E04 */
152051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
152151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* FIXME: What's the difference between not supported
152251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   and ignored (below)? */
152351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				gdb_cris_strcpy(output_buffer, error_message[E04]);
152451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
152551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
152651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik			default:
152751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				/* The stub should ignore other request and send an empty
152851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   response ($#<checksum>). This way we can extend the protocol and GDB
152951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				   can tell whether the stub it is talking to uses the old or the new. */
153051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				output_buffer[0] = 0;
153151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik				break;
153251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		}
153351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		putpacket(output_buffer);
153451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	}
153551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
153651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
153751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid
153851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikkgdb_init(void)
153951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
154051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	reg_intr_vect_rw_mask intr_mask;
154151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	reg_ser_rw_intr_mask ser_intr_mask;
154251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
154351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Configure the kgdb serial port. */
154451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#if defined(CONFIG_ETRAX_KGDB_PORT0)
154551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Note: no shortcut registered (not handled by multiple_interrupt).
154651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   See entry.S.  */
154751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	set_exception_vector(SER0_INTR_VECT, kgdb_handle_exception);
154851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Enable the ser irq in the global config. */
154951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	intr_mask = REG_RD(intr_vect, regi_irq, rw_mask);
155051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	intr_mask.ser0 = 1;
155151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	REG_WR(intr_vect, regi_irq, rw_mask, intr_mask);
155251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
155351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	ser_intr_mask = REG_RD(ser, regi_ser0, rw_intr_mask);
1554f2bbc96a40988f0bb2e67ef21579116870b53c14Jesper Nilsson	ser_intr_mask.dav = regk_ser_yes;
155551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	REG_WR(ser, regi_ser0, rw_intr_mask, ser_intr_mask);
155651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#elif defined(CONFIG_ETRAX_KGDB_PORT1)
155751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Note: no shortcut registered (not handled by multiple_interrupt).
155851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   See entry.S.  */
155951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	set_exception_vector(SER1_INTR_VECT, kgdb_handle_exception);
156051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Enable the ser irq in the global config. */
156151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	intr_mask = REG_RD(intr_vect, regi_irq, rw_mask);
156251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	intr_mask.ser1 = 1;
156351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	REG_WR(intr_vect, regi_irq, rw_mask, intr_mask);
156451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
156551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	ser_intr_mask = REG_RD(ser, regi_ser1, rw_intr_mask);
1566f2bbc96a40988f0bb2e67ef21579116870b53c14Jesper Nilsson	ser_intr_mask.dav = regk_ser_yes;
156751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	REG_WR(ser, regi_ser1, rw_intr_mask, ser_intr_mask);
156851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#elif defined(CONFIG_ETRAX_KGDB_PORT2)
156951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Note: no shortcut registered (not handled by multiple_interrupt).
157051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   See entry.S.  */
157151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	set_exception_vector(SER2_INTR_VECT, kgdb_handle_exception);
157251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Enable the ser irq in the global config. */
157351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	intr_mask = REG_RD(intr_vect, regi_irq, rw_mask);
157451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	intr_mask.ser2 = 1;
157551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	REG_WR(intr_vect, regi_irq, rw_mask, intr_mask);
157651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
157751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	ser_intr_mask = REG_RD(ser, regi_ser2, rw_intr_mask);
1578f2bbc96a40988f0bb2e67ef21579116870b53c14Jesper Nilsson	ser_intr_mask.dav = regk_ser_yes;
157951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	REG_WR(ser, regi_ser2, rw_intr_mask, ser_intr_mask);
158051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#elif defined(CONFIG_ETRAX_KGDB_PORT3)
158151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Note: no shortcut registered (not handled by multiple_interrupt).
158251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	   See entry.S.  */
158351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	set_exception_vector(SER3_INTR_VECT, kgdb_handle_exception);
158451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	/* Enable the ser irq in the global config. */
158551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	intr_mask = REG_RD(intr_vect, regi_irq, rw_mask);
158651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	intr_mask.ser3 = 1;
158751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	REG_WR(intr_vect, regi_irq, rw_mask, intr_mask);
158851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
158951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	ser_intr_mask = REG_RD(ser, regi_ser3, rw_intr_mask);
1590f2bbc96a40988f0bb2e67ef21579116870b53c14Jesper Nilsson	ser_intr_mask.dav = regk_ser_yes;
159151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	REG_WR(ser, regi_ser3, rw_intr_mask, ser_intr_mask);
159251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#endif
159351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
159451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
159551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Performs a complete re-start from scratch. */
159651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikstatic void
159751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikkill_restart(void)
159851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
159951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	machine_restart("");
160051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
160151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
160251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/* Use this static breakpoint in the start-up only. */
160351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
160451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikvoid
160551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikbreakpoint(void)
160651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik{
160751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	kgdb_started = 1;
160851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	dynamic_bp = 0;     /* This is a static, not a dynamic breakpoint. */
160951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	__asm__ volatile ("break 8"); /* Jump to kgdb_handle_breakpoint. */
161051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik}
161151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
161251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/****************************** End of file **********************************/
1613