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 *)®.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 *)®.pid, val, sizeof(unsigned int)); 56151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 56251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik } else if (regno == SRS) { 56351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik /* 8-bit register. */ 56451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik hex2mem((unsigned char *)®.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 *)®.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 *)®.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 *)®.bz + (regno - BZ) * sizeof(char))); 60351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 60451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik } else if (regno == PID) { 60551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik /* 32-bit register. */ 60651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *valptr = *(unsigned int *)((char *)®.pid); 60751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 60851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik } else if (regno == SRS) { 60951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik /* 8-bit register. */ 61051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *valptr = (unsigned int)(*(unsigned char *)((char *)®.srs)); 61151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 61251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik } else if (regno == WZ) { 61351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik /* 16-bit register. */ 61451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *valptr = (unsigned int)(*(unsigned short *)(char *)®.wz); 61551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 61651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik } else if (regno >= EXS && regno <= PC) { 61751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik /* Consecutive 32-bit registers. */ 61851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *valptr = *(unsigned int *)((char *)®.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, ®_cont); 97750e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko ptr = hex_byte_pack(ptr, PC); 97851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *ptr++ = ':'; 97951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[PC]); 98051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *ptr++ = ';'; 98151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 98251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik read_register(R8, ®_cont); 98350e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko ptr = hex_byte_pack(ptr, R8); 98451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *ptr++ = ':'; 98551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[R8]); 98651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *ptr++ = ';'; 98751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik 98851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik read_register(SP, ®_cont); 98950e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko ptr = hex_byte_pack(ptr, SP); 99051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *ptr++ = ':'; 99151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik ptr = mem2hex(ptr, (unsigned char *)®_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, ®_cont); 99650e1499f468fd74c6db95deb2e1e6bfee578ae70Andy Shevchenko ptr = hex_byte_pack(ptr, ERP); 99751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *ptr++ = ':'; 99851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik ptr = mem2hex(ptr, (unsigned char *)®_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 *)®, 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 *)®, &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