diff options
author | Stan Shebs <shebs@codesourcery.com> | 1997-09-16 02:27:10 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 1997-09-16 02:27:10 +0000 |
commit | 2bf15e13f581ffa37899c61c2a282cf168802bc2 (patch) | |
tree | 99461817a2cb90991604e43ab1d0ed737ebd5534 /gdb/remote-arc.c | |
parent | 5ed0a9a369ce0bbf0000ec0dba3a0a32c0537782 (diff) | |
download | gdb-2bf15e13f581ffa37899c61c2a282cf168802bc2.zip gdb-2bf15e13f581ffa37899c61c2a282cf168802bc2.tar.gz gdb-2bf15e13f581ffa37899c61c2a282cf168802bc2.tar.bz2 |
Remove/retain old ARC stuff as appropriate
Diffstat (limited to 'gdb/remote-arc.c')
-rw-r--r-- | gdb/remote-arc.c | 992 |
1 files changed, 0 insertions, 992 deletions
diff --git a/gdb/remote-arc.c b/gdb/remote-arc.c deleted file mode 100644 index ede95ad..0000000 --- a/gdb/remote-arc.c +++ /dev/null @@ -1,992 +0,0 @@ -/* Remote target communications for the ARC - Copyright 1995, 1997 Free Software Foundation, Inc. - -This file is part of GDB. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "gdb_string.h" -#include <fcntl.h> -#include "frame.h" -#include "inferior.h" -#include "bfd.h" -#include "symfile.h" -#include "target.h" -#include "wait.h" -#include "terminal.h" -#include "gdbcmd.h" -#include "objfiles.h" -#include "gdb-stabs.h" - -#include "dcache.h" - -#ifdef USG -#include <sys/types.h> -#endif - -#include <signal.h> -#include "serial.h" - -/* Prototypes for local functions */ - -static int -arc_write_bytes PARAMS ((CORE_ADDR memaddr, unsigned char *myaddr, int len)); - -static int -arc_read_bytes PARAMS ((CORE_ADDR memaddr, unsigned char *myaddr, int len)); - -static void -arc_files_info PARAMS ((struct target_ops *ignore)); - -static int -arc_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len, - int should_write, struct target_ops *target)); - -static void -arc_xfer_cntlreg PARAMS ((int rw, unsigned char *data)); - -static void -arc_prepare_to_store PARAMS ((void)); - -static void -arc_fetch_registers PARAMS ((int regno)); - -static void -arc_resume PARAMS ((int pid, int step, enum target_signal siggnal)); - -static int -arc_start_remote PARAMS ((char *dummy)); - -static void -arc_open PARAMS ((char *name, int from_tty)); - -static void -arc_close PARAMS ((int quitting)); - -static void -arc_store_registers PARAMS ((int regno)); - -static void -getpkt PARAMS ((char *buf, int len)); - -static int -putpkt PARAMS ((char *buf, int len)); - -static int arc_wait PARAMS ((int pid, struct target_waitstatus *status)); - -static void -arc_detach PARAMS ((char *args, int from_tty)); - -static void -arc_interrupt PARAMS ((int signo)); - -static void -arc_interrupt_twice PARAMS ((int signo)); - -static void -interrupt_query PARAMS ((void)); - -extern struct target_ops arc_ops; /* Forward decl */ - -static int aux_reg_map[3][31] = AUX_REG_MAP; - -/* This was 5 seconds, which is a long time to sit and wait. - Unless this is going though some terminal server or multiplexer or - other form of hairy serial connection, I would think 2 seconds would - be plenty. */ -static int remote_timeout = 2; - -#if 0 -int icache; -#endif - -/* Descriptor for I/O to remote machine. Initialize it to NULL so that - arc_open knows that we don't have a file open when the program - starts. */ -static serial_t arc_desc = NULL; - -#define UNUSED1_PROCESSOR 0 -#define UNUSED2_PROCESSOR 1 -#define UNUSED3_PROCESSOR 2 -static unsigned char cntl_reg_halt_bit[3] = { 0x08, 0x10, 0x20 }; -static unsigned char cntl_reg_step_bit[3] = { 0x01, 0x02, 0x04 }; - -static int curr_processor = UNUSED1_PROCESSOR; -static unsigned char cntl_reg = 0; -static unsigned int status_reg = 0; - -#define PBUFSIZ 32 -#define MAXBUFBYTES 32 - - -/* Clean up connection to a remote debugger. */ - -/* ARGSUSED */ -static void -arc_close (quitting) - int quitting; -{ - if (arc_desc) - SERIAL_CLOSE (arc_desc); - arc_desc = NULL; -} - -static int -arc_start_remote (dummy) - char *dummy; -{ - immediate_quit = 1; /* Allow user to interrupt it */ - arc_xfer_cntlreg (1, &cntl_reg); - immediate_quit = 0; - - start_remote (); /* Initialize gdb process mechanisms */ - return 1; -} - -/* Open a connection to a remote debugger. - NAME is the filename used for communication. */ - -static DCACHE *remote_dcache; - -static void -arc_open (name, from_tty) - char *name; - int from_tty; -{ - if (name == 0) - error ( -"To open a arc debug connection, you need to specify what parallel\n\ -device is attached to the remote system."); - - target_preopen (from_tty); - - unpush_target (&arc_ops); - - remote_dcache = dcache_init (arc_read_bytes, arc_write_bytes); - - arc_desc = SERIAL_OPEN (name); - if (!arc_desc) - perror_with_name (name); - - /* If there is something sitting in the buffer we might take it as a - response to a command, which would be bad. */ - SERIAL_FLUSH_INPUT (arc_desc); - - if (from_tty) - { - puts_filtered ("Remote debugging using "); - puts_filtered (name); - puts_filtered ("\n"); - } - push_target (&arc_ops); /* Switch to using remote target now */ - - /* Without this, some commands which require an active target (such as kill) - won't work. This variable serves (at least) double duty as both the pid - of the target process (if it has such), and as a flag indicating that a - target is active. These functions should be split out into seperate - variables, especially since GDB will someday have a notion of debugging - several processes. */ - - inferior_pid = 42000; - - /* Start the remote connection; if error (0), discard this target. - In particular, if the user quits, be sure to discard it - (we'd be in an inconsistent state otherwise). */ - if (!catch_errors (arc_start_remote, (char *)0, - "Couldn't establish connection to remote target\n", RETURN_MASK_ALL)) - pop_target(); -} - -/* arc_detach() - takes a program previously attached to and detaches it. - We better not have left any breakpoints - in the program or it'll die when it hits one. - Close the open connection to the remote debugger. - Use this when you want to detach and do something else - with your gdb. */ - -static void -arc_detach (args, from_tty) - char *args; - int from_tty; -{ - if (args) - error ("Argument given to \"detach\" when remotely debugging."); - - pop_target (); - if (from_tty) - puts_filtered ("Ending remote debugging.\n"); -} - -/* arc_set_addrreg - set addr reg from debug system. */ - -static void -arc_set_addrreg (addr) - unsigned int addr; -{ - unsigned char buf[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - - buf[0] = 0x0; - buf[4] = addr & 0xff; - buf[3] = (addr >> 8) & 0xff; - buf[2] = (addr >> 16) & 0xff; - buf[1] = (addr >> 24) & 0xff; - - putpkt (buf, 5); -} - -/* arc_xfer_datareg - read or write data reg from debug system. */ - -static void -arc_xfer_datareg (rw, aux, incr, data) - int rw; - int aux; - int incr; - unsigned int *data; -{ - unsigned char buf1[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - unsigned char buf2[5]; - unsigned int tmp; - - /* read or write data */ - buf1[0] = (aux ? 0x81 : 0x41); - if (incr) - buf1[0] += 0x20; - if (rw) /* read */ - { - buf1[0] += 0x10; - putpkt (buf1, 1); - getpkt (buf2, 4); - *data = *(int *)buf2; - } - else - { - tmp = *data; - buf1[4] = tmp & 0xff; - buf1[3] = (tmp >> 8) & 0xff; - buf1[2] = (tmp >> 16) & 0xff; - buf1[1] = (tmp >> 24) & 0xff; - putpkt (buf1, 5); - } -} - -/* arc_xfer_cntlreg - read or write control reg from debug system. */ - -static void -arc_xfer_cntlreg (rw, data) - int rw; - unsigned char *data; -{ - unsigned char buf[3] = {0x0, 0x0, 0x0}; - - if (rw) - { - buf[0] = 0x12; - putpkt (buf, 1); - getpkt (data, 1); - } - else - { - buf[0] = 0x02; - buf[1] = *data; - putpkt (buf, 2); - } -} - -/* arc_xfer_reg - read or write a reg to arc processors. */ - -static void -arc_xfer_reg (processor, rw, aux, regnum, data) - int processor; - int rw; - int aux; - int regnum; - unsigned int *data; -{ - unsigned int tmp; - - if (processor == UNUSED1_PROCESSOR) - { - /* write addr (regnum) */ - arc_set_addrreg (regnum); - arc_xfer_datareg (rw, aux, 0, data); - } - else - { - /* write addr register (aux r14) */ - arc_set_addrreg (0xe); - tmp = aux ? (regnum | 0x80000000) : regnum; - arc_xfer_datareg (0, 1, 0, tmp); - - /* read/write from data reg (aux reg 15/16) */ - arc_set_addrreg (/*processor == ??? ? 0x10 :*/ 0xf); - arc_xfer_datareg (rw, 1, 0, data); - } -} - - -/* Tell the remote machine to resume. */ - -static enum target_signal last_sent_signal = TARGET_SIGNAL_0; -int last_sent_step; - -static void -arc_resume (pid, step, siggnal) - int pid, step; - enum target_signal siggnal; -{ - unsigned int tmp; - - dcache_flush (remote_dcache); - - last_sent_signal = siggnal; - last_sent_step = step; - - /* don't know how to handle signal in ARC *** - if (siggnal != TARGET_SIGNAL_0) - { - buf[0] = step ? 'S' : 'C'; - buf[1] = tohex (((int)siggnal >> 4) & 0xf); - buf[2] = tohex ((int)siggnal & 0xf); - buf[3] = '\0'; - } - */ - - if (step) - { - /* write the step bit in control reg of debug system */ - unsigned char tmp_char = cntl_reg | cntl_reg_step_bit[curr_processor]; - arc_xfer_cntlreg (0, &tmp_char); - } - else - { - /* clear the halt bit in the status register */ - tmp = status_reg | 0x02000000; - arc_xfer_reg (curr_processor, 0, 1, 0, &tmp); - } -} - - -static void (*ofunc)(); - -/* Send to target to halt it. */ -static void -arc_interrupt (signo) - int signo; -{ - unsigned char buf[3] = {0x02, 0x0, 0x0}; - /* If this doesn't work, try more severe steps. */ - signal (signo, arc_interrupt_twice); - - if (remote_debug) - printf_unfiltered ("arc_interrupt called\n"); - - if (cntl_reg & cntl_reg_halt_bit[curr_processor]) - return; - - buf[1] = cntl_reg | cntl_reg_halt_bit[curr_processor]; - putpkt (buf, 2); - return; -} - -/* The user typed ^C twice. */ -static void -arc_interrupt_twice (signo) - int signo; -{ - signal (signo, ofunc); - - interrupt_query (); - - signal (signo, arc_interrupt); -} - -/* Ask the user what to do when an interrupt is received. */ - -static void -interrupt_query () -{ - target_terminal_ours (); - - if (query ("Interrupted while waiting for the program.\n\ -Give up (and stop debugging it)? ")) - { - target_mourn_inferior (); - return_to_top_level (RETURN_QUIT); - } - - target_terminal_inferior (); -} - -/* If nonzero, ignore the next kill. */ -int kill_kludge; - -/* Wait until the remote machine stops, then return, - storing status in STATUS just as `wait' would. - Returns "pid" (though it's not clear what, if anything, that - means in the case of this target). */ - -static int -arc_wait (pid, status) - int pid; - struct target_waitstatus *status; -{ - unsigned char buf[PBUFSIZ]; - int thread_num = -1; - unsigned char cmd; - int proc; - - status->kind = TARGET_WAITKIND_EXITED; - status->value.integer = 0; - - while (1) - { - unsigned char *p; - - ofunc = (void (*)()) signal (SIGINT, arc_interrupt); - arc_xfer_cntlreg (1, &cntl_reg); - signal (SIGINT, ofunc); - if (cntl_reg & cntl_reg_halt_bit[curr_processor]) - break; - status->kind = TARGET_WAITKIND_STOPPED; - } - -#if 0 - if ((curr_processor != UNUSED1_PROCESSOR) && - !(cntl_reg & cntl_reg_halt_bit[UNUSED1_PROCESSOR])) - { - cmd = cntl_reg | cntl_reg_halt_bit[UNUSED1_PROCESSOR]; - arc_xfer_cntlreg (0, &cmd); - while (1) - { - unsigned char *p; - - ofunc = (void (*)()) signal (SIGINT, arc_interrupt); - arc_xfer_cntlreg (1, &cntl_reg); - signal (SIGINT, ofunc); - if (cntl_reg & cntl_reg_halt_bit[UNUSED1_PROCESSOR]) - break; - } - } - - for (proc = UNUSED1_PROCESSOR ; proc <= UNUSED3_PROCESSOR; proc++) - { - if ((cntl_reg & cntl_reg_halt_bit[proc])) - continue; - cmd = cntl_reg | cntl_reg_halt_bit[proc]; - arc_xfer_cntlreg (0, &cmd); - } -#endif - - arc_xfer_reg (curr_processor, 1, 1, 0, &status_reg); - return inferior_pid; -} - -/* Number of bytes of registers this implements. */ -static int register_bytes_found; - -/* Read the remote registers into the block REGS. */ -/* Currently we just read all the registers, so we don't use regno. */ - -static void -arc_fetch_registers (regno) - int regno; -{ - int i; - char regs[REGISTER_BYTES]; - - /* Unimplemented registers read as all bits zero. */ - memset (regs, 0, REGISTER_BYTES); - - /* get core register */ - arc_set_addrreg (0); - for (i = 0; i < AUX_BEG_REGNUM; i++) - { - if (curr_processor == UNUSED1_PROCESSOR) - arc_xfer_datareg (1, 0, 1, ®s[REGISTER_BYTE(i)]); - else - arc_xfer_reg (curr_processor, 1, 0, regno, ®s[REGISTER_BYTE(i)]); - } - - /* get aux register */ - for (i = AUX_BEG_REGNUM; i < AUX_END_REGNUM; i++) - { - int auxregnum = aux_reg_map[curr_processor][i-AUX_BEG_REGNUM+1]; - if (auxregnum == -1) - continue; - arc_xfer_reg (curr_processor, 1, 1, auxregnum, ®s[REGISTER_BYTE(i)]); - } - /* copy from status register to pc */ - for (i = 1; i <= 3; i++) - registers[REGISTER_BYTE (PC_REGNUM)+i] = - registers[REGISTER_BYTE (STA_REGNUM)+i]; - -/* - if (i != register_bytes_found) - { - register_bytes_found = i; - if (!REGISTER_BYTES_OK (i)) - warning ("Remote reply is too short: %s", buf); - } -*/ - - for (i = 0; i < NUM_REGS; i++) - supply_register (i, ®s[REGISTER_BYTE(i)]); -} - -/* Prepare to store registers. Since we may send them all, - we have to read out the ones we don't want to change first. */ - -static void -arc_prepare_to_store () -{ - /* Make sure the entire registers array is valid. */ - read_register_bytes (0, (char *)NULL, REGISTER_BYTES); -} - -/* Store register REGNO, or all registers if REGNO == -1, from the contents - of REGISTERS. FIXME: ignores errors. */ - -static void -arc_store_registers (regno) - int regno; -{ - int i; - char *regp; - - /* Try storing a single register. */ - if (regno >= 0) - { - int isaux = (regno >= AUX_BEG_REGNUM ? 1 : 0); - - regp = ®isters[REGISTER_BYTE (regno)]; - arc_xfer_reg (curr_processor, 0, isaux, regno, regp); - } - - /* store core regs */ - arc_set_addrreg (0); - for (i = 0; i < AUX_BEG_REGNUM; i++) - { - regp = ®isters[REGISTER_BYTE (i)]; - if (curr_processor == UNUSED1_PROCESSOR) - arc_xfer_datareg (0, 0, 1, regp); - else - arc_xfer_reg (curr_processor, 0, 0, regno, regp); - } - - /* store aux regs */ - /* copy pc back to status register */ - for (i = 1; i <= 3; i++) - registers[REGISTER_BYTE (STA_REGNUM)+i] = - registers[REGISTER_BYTE (PC_REGNUM)+i]; - for (i = AUX_BEG_REGNUM; i <= AUX_END_REGNUM; i++) - { - int auxregnum = aux_reg_map[curr_processor][i-AUX_BEG_REGNUM+1]; - if (auxregnum == -1) - continue; - regp = ®isters[REGISTER_BYTE (i)]; - arc_xfer_reg (curr_processor, 0, 1, auxregnum, regp); - } - -} - -#if 0 -/* Use of the data cache is disabled because it loses for looking at - and changing hardware I/O ports and the like. Accepting `voltile' - would perhaps be one way to fix it, but a better way which would - win for more cases would be to use the executable file for the text - segment, like the `icache' code below but done cleanly (in some - target-independent place, perhaps in target_xfer_memory, perhaps - based on assigning each target a speed or perhaps by some simpler - mechanism). */ - -/* Read a word from remote address ADDR and return it. - This goes through the data cache. */ - -static int -arc_fetch_word (addr) - CORE_ADDR addr; -{ -#if 0 - if (icache) - { - extern CORE_ADDR text_start, text_end; - - if (addr >= text_start && addr < text_end) - { - int buffer; - xfer_core_file (addr, &buffer, sizeof (int)); - return buffer; - } - } -#endif - return dcache_fetch (remote_dcache, addr); -} - -/* Write a word WORD into remote address ADDR. - This goes through the data cache. */ - -static void -arc_store_word (addr, word) - CORE_ADDR addr; - int word; -{ - dcache_poke (remote_dcache, addr, word); -} -#endif /* 0 */ - - -/* Write memory data directly to the remote machine. - This does not inform the data cache; the data cache uses this. - MEMADDR is the address in the remote memory space. - MYADDR is the address of the buffer in our space. - LEN is the number of bytes. - - Returns number of bytes transferred, or 0 for error. */ - -static int -arc_write_bytes (memaddr, myaddr, len) - CORE_ADDR memaddr; - unsigned char *myaddr; - int len; -{ - char buf1[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - char buf2[6] = {0x21, 0x0, 0x0, 0x0, 0x0, 0x0}; - int i; - char *p; - - /* We send target system values byte by byte, in increasing byte addresses*/ - - buf1[4] = memaddr & 0xff; - buf1[3] = (memaddr >> 8) & 0xff; - buf1[2] = (memaddr >> 16) & 0xff; - buf1[1] = (memaddr >> 24) & 0xff; - putpkt (buf1, 5); - - for (i = 0; i < len; ) - { - buf2[1] = myaddr[i++]; - buf2[2] = myaddr[i++]; - buf2[3] = myaddr[i++]; - buf2[4] = myaddr[i++]; - putpkt (buf2, 5); - } - - return len; -} - -/* Read memory data directly from the remote machine. - This does not use the data cache; the data cache uses this. - MEMADDR is the address in the remote memory space. - MYADDR is the address of the buffer in our space. - LEN is the number of bytes. - - Returns number of bytes transferred, or 0 for error. */ - -static int -arc_read_bytes (memaddr, myaddr, len) - CORE_ADDR memaddr; - unsigned char *myaddr; - int len; -{ - unsigned char buf1[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - unsigned char buf2[3] = {0x31, 0x0, 0x0}; - unsigned char buf3[5]; - int i; - char *p; - - /* We send target system values byte by byte, in increasing byte addresses*/ - - buf1[4] = memaddr & 0xff; - buf1[3] = (memaddr >> 8) & 0xff; - buf1[2] = (memaddr >> 16) & 0xff; - buf1[1] = (memaddr >> 24) & 0xff; - putpkt (buf1, 5); - - for (i = 0; i < len; ) - { - putpkt (buf2, 2); - getpkt (buf3, 4); - myaddr[i++] = buf3[1]; - myaddr[i++] = buf3[2]; - myaddr[i++] = buf3[3]; - myaddr[i++] = buf3[4]; - } - - return i; -} - - -/* Read or write LEN bytes from inferior memory at MEMADDR, transferring - to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is - nonzero. Returns length of data written or read; 0 for error. */ - -/* ARGSUSED */ -static int -arc_xfer_memory(memaddr, myaddr, len, should_write, target) - CORE_ADDR memaddr; - char *myaddr; - int len; - int should_write; - struct target_ops *target; /* ignored */ -{ - int xfersize; - int bytes_xferred; - int total_xferred = 0; - - while (len > 0) - { - if (len > MAXBUFBYTES) - xfersize = MAXBUFBYTES; - else - xfersize = len; - - if (should_write) - bytes_xferred = arc_write_bytes (memaddr, - (unsigned char *)myaddr, xfersize); - else - bytes_xferred = arc_read_bytes (memaddr, - (unsigned char *)myaddr, xfersize); - - /* If we get an error, we are done xferring. */ - if (bytes_xferred == 0) - break; - - memaddr += bytes_xferred; - myaddr += bytes_xferred; - len -= bytes_xferred; - total_xferred += bytes_xferred; - } - return total_xferred; -} - - -static void -arc_files_info (ignore) - struct target_ops *ignore; -{ - puts_filtered ("Debugging a target over a serial line.\n"); -} - - -/* Read a single character from the remote end, masking it down to 7 bits. */ -static int -readchar () -{ - int ch; - - ch = SERIAL_READCHAR (arc_desc, 0); - - switch (ch) - { - case SERIAL_EOF: - error ("Remote connection closed"); - case SERIAL_ERROR: - perror_with_name ("Remote communication error"); - case SERIAL_TIMEOUT: - return ch; - default: - return ch & 0x7f; - } -} - -/* Send a packet to the remote machine, with error checking. - The data of the packet is in BUF. */ - -static int -putpkt (buf, len) - char *buf; - int len; -{ - int i = 0; - unsigned char csum = 0; - - while (i < len) - { - if (remote_debug) - { - printf_unfiltered ("Sending packet: %s...", buf); - gdb_flush(gdb_stdout); - } - if (SERIAL_WRITE (arc_desc, buf, i)) - perror_with_name ("putpkt: write failed"); - i++; - -#if 0 - /* This is wrong. If doing a long backtrace, the user should be - able to get out next time we call QUIT, without anything as violent - as interrupt_query. If we want to provide a way out of here - without getting to the next QUIT, it should be based on hitting - ^C twice as in arc_wait. */ - if (quit_flag) - { - quit_flag = 0; - interrupt_query (); - } -#endif - } -} - -/* Read a packet from the remote machine, with error checking, - and store it in BUF. BUF is expected to be of size PBUFSIZ. - If FOREVER, wait forever rather than timing out; this is used - while the target is executing user code. */ - -static void -getpkt (buf, len) - char *buf; - int len; -{ - int c; - int i; - - for (i = 0; i < len; i++) - { - c = readchar (); - if (c == SERIAL_ERROR) - { - if (remote_debug) - puts_filtered ("Read error.\n"); - } - } - buf[i] = '\0'; - - if (remote_debug) - fprintf_unfiltered (gdb_stderr, "Packet received: %s\n", buf); - if (i != len) - printf_unfiltered ("Ignoring packet error, continuing...\n"); -} - -static void -arc_kill () -{ - /* For some mysterious reason, wait_for_inferior calls kill instead of - mourn after it gets TARGET_WAITKIND_SIGNALLED. Work around it. */ - if (kill_kludge) - { - kill_kludge = 0; - target_mourn_inferior (); - return; - } - target_mourn_inferior (); -} - -static void -arc_mourn () -{ - unpush_target (&arc_ops); - generic_mourn_inferior (); -} - - - -static unsigned char big_break_insn[] = BIG_BREAKPOINT; -static unsigned char little_break_insn[] = LITTLE_BREAKPOINT; -#define BREAKPOINT_LEN (sizeof little_break_insn) - -/* Insert a breakpoint on targets that don't have any better breakpoint - support. We read the contents of the target location and stash it, - then overwrite it with a breakpoint instruction. ADDR is the target - location in the target machine. CONTENTS_CACHE is a pointer to - memory allocated for saving the target contents. It is guaranteed - by the caller to be long enough to save sizeof BREAKPOINT bytes (this - is accomplished via BREAKPOINT_MAX). */ - -static int -arc_insert_breakpoint (addr, contents_cache) - CORE_ADDR addr; - char *contents_cache; -{ - int val; - - val = target_read_memory (addr, contents_cache, BREAKPOINT_LEN); - if (val == 0) - { - if (TARGET_BYTE_ORDER == BIG_ENDIAN) - val = target_write_memory (addr, (char *) big_break_insn, - BREAKPOINT_LEN); - else - val = target_write_memory (addr, (char *) little_break_insn, - BREAKPOINT_LEN); - } - return val; -} - -static int -arc_remove_breakpoint (addr, contents_cache) - CORE_ADDR addr; - char *contents_cache; -{ - return target_write_memory (addr, contents_cache, BREAKPOINT_LEN); -} - -/* Define the target subroutine names */ - -struct target_ops arc_ops = { - "arc", /* to_shortname */ - "Remote target in arc-specific protocol", /* to_longname */ - "Use a remote computer via a parallel line, using a arc-specific protocol.\n\ -Specify the device it is connected to.", /* to_doc */ - arc_open, /* to_open */ - arc_close, /* to_close */ - NULL, /* to_attach */ - arc_detach, /* to_detach */ - arc_resume, /* to_resume */ - arc_wait, /* to_wait */ - arc_fetch_registers, /* to_fetch_registers */ - arc_store_registers, /* to_store_registers */ - arc_prepare_to_store, /* to_prepare_to_store */ - arc_xfer_memory, /* to_xfer_memory */ - arc_files_info, /* to_files_info */ - - arc_insert_breakpoint, /* to_insert_breakpoint */ - arc_remove_breakpoint, /* to_remove_breakpoint */ - - NULL, /* to_terminal_init */ - NULL, /* to_terminal_inferior */ - NULL, /* to_terminal_ours_for_output */ - NULL, /* to_terminal_ours */ - NULL, /* to_terminal_info */ - arc_kill, /* to_kill */ - generic_load, /* to_load */ - NULL, /* to_lookup_symbol */ - NULL, /* to_create_inferior */ - arc_mourn, /* to_mourn_inferior */ - 0, /* to_can_run */ - 0, /* to_notice_signals */ - 0, /* to_thread_alive */ - 0, /* to_stop */ - process_stratum, /* to_stratum */ - NULL, /* to_next */ - 1, /* to_has_all_memory */ - 1, /* to_has_memory */ - 1, /* to_has_stack */ - 1, /* to_has_registers */ - 1, /* to_has_execution */ - NULL, /* sections */ - NULL, /* sections_end */ - OPS_MAGIC /* to_magic */ -}; - -void -_initialize_remote_arc () -{ - add_target (&arc_ops); -} |