aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote-arc.c
diff options
context:
space:
mode:
authorKung Hsu <kung@cygnus>1995-03-01 01:39:12 +0000
committerKung Hsu <kung@cygnus>1995-03-01 01:39:12 +0000
commitabed6bc2e16f4253cfe464db18a2aefcda871a80 (patch)
tree8b23e1266e1ff0e42db7a9150a94ce0efd4ab5f9 /gdb/remote-arc.c
parentcb58e516f932657c5eca5ed830f5d83e57904e97 (diff)
downloadgdb-abed6bc2e16f4253cfe464db18a2aefcda871a80.zip
gdb-abed6bc2e16f4253cfe464db18a2aefcda871a80.tar.gz
gdb-abed6bc2e16f4253cfe464db18a2aefcda871a80.tar.bz2
* arc-tdep.c (_initialize_arc_tdep): set tm_print_insn according to
processor. * remote-arc.c (arc_wait): when a processor stops, stop other two processors too. * remote-arc.c (switch_command): switch tm_print_insn.
Diffstat (limited to 'gdb/remote-arc.c')
-rw-r--r--gdb/remote-arc.c66
1 files changed, 43 insertions, 23 deletions
diff --git a/gdb/remote-arc.c b/gdb/remote-arc.c
index 98e7a57..90ddf3c 100644
--- a/gdb/remote-arc.c
+++ b/gdb/remote-arc.c
@@ -101,7 +101,7 @@ interrupt_query PARAMS ((void));
extern struct target_ops arc_ops; /* Forward decl */
-static int aux_reg_map[3][30] = AUX_REG_MAP;
+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
@@ -450,6 +450,8 @@ arc_wait (pid, status)
{
unsigned char buf[PBUFSIZ];
int thread_num = -1;
+ unsigned char cmd;
+ int proc;
status->kind = TARGET_WAITKIND_EXITED;
status->value.integer = 0;
@@ -465,8 +467,33 @@ arc_wait (pid, status)
break;
status->kind = TARGET_WAITKIND_STOPPED;
}
- arc_xfer_reg (curr_processor, 1, 1, 0, &status_reg);
+ if ((curr_processor != HOST_PROCESSOR) &&
+ !(cntl_reg & cntl_reg_halt_bit[HOST_PROCESSOR]))
+ {
+ cmd = cntl_reg | cntl_reg_halt_bit[HOST_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[HOST_PROCESSOR])
+ break;
+ }
+ }
+
+ for (proc = AUDIO_PROCESSOR ; proc <= GRAPHIC_PROCESSOR; proc++)
+ {
+ if ((cntl_reg & cntl_reg_halt_bit[proc]))
+ continue;
+ cmd = cntl_reg | cntl_reg_halt_bit[proc];
+ arc_xfer_cntlreg (0, &cmd);
+ }
+
+ arc_xfer_reg (curr_processor, 1, 1, 0, &status_reg);
return inferior_pid;
}
@@ -919,9 +946,8 @@ switch_command (args, fromtty)
char *args;
int fromtty;
{
- unsigned char cmd;
- int proc;
struct target_waitstatus status;
+ int proc;
if (strncmp (args, "audio", 3) == 0)
proc = 0;
@@ -930,28 +956,22 @@ switch_command (args, fromtty)
else if (strncmp (args, "host", 4) == 0)
proc = 2;
- if (cntl_reg & cntl_reg_halt_bit[proc])
+ curr_processor = proc;
+
+ switch (proc)
{
- curr_processor = proc;
- return;
+ case 0:
+ tm_print_insn = arc_get_disassembler (bfd_mach_arc_audio);
+ break;
+ case 1:
+ tm_print_insn = arc_get_disassembler (bfd_mach_arc_graphics);
+ break;
+ case 2:
+ tm_print_insn = arc_get_disassembler (bfd_mach_arc_host);
+ break;
}
- if ((proc != HOST_PROCESSOR) &&
- !(cntl_reg & cntl_reg_halt_bit[HOST_PROCESSOR]))
- {
- cmd = cntl_reg | cntl_reg_halt_bit[HOST_PROCESSOR];
- arc_xfer_cntlreg (0, &cmd);
- curr_processor = HOST_PROCESSOR;
- arc_wait (inferior_pid, &status);
- }
- if (!(cntl_reg & cntl_reg_halt_bit[proc]))
- {
- cmd = cntl_reg | cntl_reg_halt_bit[proc];
- arc_xfer_cntlreg (0, &cmd);
- curr_processor = proc;
- arc_wait (inferior_pid, &status);
- arc_fetch_registers (-1);
- }
+ return;
}