1 /* This file is part of the program psim.
3 Copyright 1994, 1995, 1996, 1998, 2003 Andrew Cagney
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 #include <signal.h> /* FIXME - should be machine dependant version */
28 #include "registers.h"
30 #undef printf_filtered /* blow away the mapping */
45 #include "gdb/callback.h"
46 #include "gdb/remote-sim.h"
47 #include "gdb/sim-ppc.h"
49 /* Define the rate at which the simulator should poll the host
51 #ifndef POLL_QUIT_INTERVAL
52 #define POLL_QUIT_INTERVAL 0x20
55 static int poll_quit_count
= POLL_QUIT_INTERVAL
;
57 /* Structures used by the simulator, for gdb just have static structures */
59 static psim
*simulator
;
60 static device
*root_device
;
61 static host_callback
*callbacks
;
64 sim_open (SIM_OPEN_KIND kind
,
65 host_callback
*callback
,
71 /* Note: The simulation is not created by sim_open() because
72 complete information is not yet available */
74 TRACE(trace_gdb
, ("sim_open called\n"));
76 if (root_device
!= NULL
)
77 sim_io_printf_filtered("Warning - re-open of simulator leaks memory\n");
78 root_device
= psim_tree();
81 psim_options(root_device
, argv
+ 1);
83 if (ppc_trace
[trace_opts
])
86 /* fudge our descriptor for now */
92 sim_close (SIM_DESC sd
, int quitting
)
94 TRACE(trace_gdb
, ("sim_close(quitting=%d) called\n", quitting
));
95 if (ppc_trace
[trace_print_info
] && simulator
!= NULL
)
96 psim_print_info (simulator
, ppc_trace
[trace_print_info
]);
101 sim_load (SIM_DESC sd
, char *prog
, bfd
*abfd
, int from_tty
)
103 TRACE(trace_gdb
, ("sim_load(prog=%s, from_tty=%d) called\n",
105 ASSERT(prog
!= NULL
);
107 /* create the simulator */
108 TRACE(trace_gdb
, ("sim_load() - first time, create the simulator\n"));
109 simulator
= psim_create(prog
, root_device
);
111 /* bring in all the data section */
112 psim_init(simulator
);
114 /* get the start address */
117 abfd
= bfd_openr (prog
, 0);
119 error ("psim: can't open \"%s\": %s\n",
120 prog
, bfd_errmsg (bfd_get_error ()));
121 if (!bfd_check_format (abfd
, bfd_object
))
123 const char *errmsg
= bfd_errmsg (bfd_get_error ());
125 error ("psim: \"%s\" is not an object file: %s\n",
136 sim_read (SIM_DESC sd
, SIM_ADDR mem
, unsigned char *buf
, int length
)
138 int result
= psim_read_memory(simulator
, MAX_NR_PROCESSORS
,
140 TRACE(trace_gdb
, ("sim_read(mem=0x%lx, buf=0x%lx, length=%d) = %d\n",
141 (long)mem
, (long)buf
, length
, result
));
147 sim_write (SIM_DESC sd
, SIM_ADDR mem
, unsigned char *buf
, int length
)
149 int result
= psim_write_memory(simulator
, MAX_NR_PROCESSORS
,
152 TRACE(trace_gdb
, ("sim_write(mem=0x%lx, buf=0x%lx, length=%d) = %d\n",
153 (long)mem
, (long)buf
, length
, result
));
158 /* A table mapping register numbers (as received from GDB) to register
159 names. This table does not handle special-purpose registers: the
160 SPR whose number is N is assigned the register number
161 sim_ppc_spr0_regnum + N. */
162 static const char *gdb_register_name_table
[] = {
164 /* General-purpose registers: 0 .. 31. */
165 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
166 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
167 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
168 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
170 /* Floating-point registers: 32 .. 63. */
171 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
172 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
173 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
174 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
176 /* Altivec registers: 64 .. 95. */
177 "vr0", "vr1", "vr2", "vr3", "vr4", "vr5", "vr6", "vr7",
178 "vr8", "vr9", "vr10", "vr11", "vr12", "vr13", "vr14", "vr15",
179 "vr16", "vr17", "vr18", "vr19", "vr20", "vr21", "vr22", "vr23",
180 "vr24", "vr25", "vr26", "vr27", "vr28", "vr29", "vr30", "vr31",
182 /* SPE APU GPR upper halves: 96 .. 127. */
183 "rh0", "rh1", "rh2", "rh3", "rh4", "rh5", "rh6", "rh7",
184 "rh8", "rh9", "rh10", "rh11", "rh12", "rh13", "rh14", "rh15",
185 "rh16", "rh17", "rh18", "rh19", "rh20", "rh21", "rh22", "rh23",
186 "rh24", "rh25", "rh26", "rh27", "rh28", "rh29", "rh30", "rh31",
188 /* SPE APU full 64-bit vector registers: 128 .. 159. */
189 "ev0", "ev1", "ev2", "ev3", "ev4", "ev5", "ev6", "ev7",
190 "ev8", "ev9", "ev10", "ev11", "ev12", "ev13", "ev14", "ev15",
191 "ev16", "ev17", "ev18", "ev19", "ev20", "ev21", "ev22", "ev23",
192 "ev24", "ev25", "ev26", "ev27", "ev28", "ev29", "ev30", "ev31",
194 /* Segment registers: 160 .. 175. */
195 "sr0", "sr1", "sr2", "sr3", "sr4", "sr5", "sr6", "sr7",
196 "sr8", "sr9", "sr10", "sr11", "sr12", "sr13", "sr14", "sr15",
198 /* Miscellaneous (not special-purpose!) registers: 176 .. 181. */
199 "pc", "ps", "cr", "fpscr", "acc", "vscr"
203 gdb_register_name_table_size
= (sizeof (gdb_register_name_table
)
204 / sizeof (gdb_register_name_table
[0])),
208 /* Return the name of the register whose number is REGNUM, or zero if
209 REGNUM is an invalid register number. */
211 gdb_register_name (int regnum
)
213 /* Is it a special-purpose register? */
214 if (sim_ppc_spr0_regnum
<= regnum
215 && regnum
< sim_ppc_spr0_regnum
+ sim_ppc_num_sprs
)
217 int spr
= regnum
- sim_ppc_spr0_regnum
;
218 if (spr_is_valid (spr
))
219 return spr_name (spr
);
224 /* Is it a valid non-SPR register number? */
225 else if (0 <= regnum
&& regnum
< gdb_register_name_table_size
)
226 return gdb_register_name_table
[regnum
];
228 /* Not a valid register number at all. */
235 sim_fetch_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
239 if (simulator
== NULL
) {
243 regname
= gdb_register_name (regno
);
245 /* Occasionally, GDB will pass invalid register numbers to us; it
246 wants us to ignore them. */
250 TRACE(trace_gdb
, ("sim_fetch_register(regno=%d(%s), buf=0x%lx)\n",
251 regno
, regname
, (long)buf
));
252 return psim_read_register(simulator
, MAX_NR_PROCESSORS
,
253 buf
, regname
, raw_transfer
);
258 sim_store_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
262 if (simulator
== NULL
)
265 regname
= gdb_register_name (regno
);
267 /* Occasionally, GDB will pass invalid register numbers to us; it
268 wants us to ignore them. */
272 TRACE(trace_gdb
, ("sim_store_register(regno=%d(%s), buf=0x%lx)\n",
273 regno
, regname
, (long)buf
));
274 return psim_write_register(simulator
, MAX_NR_PROCESSORS
,
275 buf
, regname
, raw_transfer
);
280 sim_info (SIM_DESC sd
, int verbose
)
282 TRACE(trace_gdb
, ("sim_info(verbose=%d) called\n", verbose
));
283 psim_print_info (simulator
, verbose
);
288 sim_create_inferior (SIM_DESC sd
,
293 unsigned_word entry_point
;
294 TRACE(trace_gdb
, ("sim_create_inferior(start_address=0x%x, ...)\n",
297 if (simulator
== NULL
)
298 error ("No program loaded");
301 entry_point
= bfd_get_start_address (abfd
);
303 entry_point
= 0xfff00000; /* ??? */
305 psim_init(simulator
);
306 psim_stack(simulator
, argv
, envp
);
308 ASSERT (psim_write_register(simulator
, -1 /* all start at same PC */,
309 &entry_point
, "pc", cooked_transfer
) > 0);
315 sim_stop_reason (SIM_DESC sd
, enum sim_stop
*reason
, int *sigrc
)
317 psim_status status
= psim_get_status(simulator
);
319 switch (status
.reason
) {
321 *reason
= sim_stopped
;
322 if (status
.signal
== 0)
325 *sigrc
= status
.signal
;
328 *reason
= sim_stopped
;
332 *reason
= sim_exited
;
333 *sigrc
= status
.signal
;
336 *reason
= sim_signalled
;
337 *sigrc
= status
.signal
;
341 TRACE(trace_gdb
, ("sim_stop_reason(reason=0x%lx(%ld), sigrc=0x%lx(%ld))\n",
342 (long)reason
, (long)*reason
, (long)sigrc
, (long)*sigrc
));
347 /* Run (or resume) the program. */
350 sim_stop (SIM_DESC sd
)
352 psim_stop (simulator
);
357 sim_resume (SIM_DESC sd
, int step
, int siggnal
)
359 TRACE(trace_gdb
, ("sim_resume(step=%d, siggnal=%d)\n",
364 psim_step (simulator
);
368 psim_run (simulator
);
373 sim_do_command (SIM_DESC sd
, char *cmd
)
375 TRACE(trace_gdb
, ("sim_do_commands(cmd=%s) called\n",
376 cmd
? cmd
: "(null)"));
378 char **argv
= buildargv(cmd
);
379 psim_command(root_device
, argv
);
385 /* Polling, if required */
388 sim_io_poll_quit (void)
390 if (callbacks
->poll_quit
!= NULL
&& poll_quit_count
-- < 0)
392 poll_quit_count
= POLL_QUIT_INTERVAL
;
393 if (callbacks
->poll_quit (callbacks
))
394 psim_stop (simulator
);
400 /* Map simulator IO operations onto the corresponding GDB I/O
403 NB: Only a limited subset of operations are mapped across. More
404 advanced operations (such as dup or write) must either be mapped to
405 one of the below calls or handled internally */
408 sim_io_read_stdin(char *buf
,
411 switch (CURRENT_STDIO
) {
413 return callbacks
->read_stdin(callbacks
, buf
, sizeof_buf
);
416 return callbacks
->read(callbacks
, 0, buf
, sizeof_buf
);
419 error("sim_io_read_stdin: unaccounted switch\n");
426 sim_io_write_stdout(const char *buf
,
429 switch (CURRENT_STDIO
) {
431 return callbacks
->write_stdout(callbacks
, buf
, sizeof_buf
);
434 return callbacks
->write(callbacks
, 1, buf
, sizeof_buf
);
437 error("sim_io_write_stdout: unaccounted switch\n");
444 sim_io_write_stderr(const char *buf
,
447 switch (CURRENT_STDIO
) {
449 /* NB: I think there should be an explicit write_stderr callback */
450 return callbacks
->write(callbacks
, 3, buf
, sizeof_buf
);
453 return callbacks
->write(callbacks
, 3, buf
, sizeof_buf
);
456 error("sim_io_write_stderr: unaccounted switch\n");
464 sim_io_printf_filtered(const char *fmt
,
469 /* format the message */
471 vsprintf(message
, fmt
, ap
);
474 if (strlen(message
) >= sizeof(message
))
475 error("sim_io_printf_filtered: buffer overflow\n");
476 callbacks
->printf_filtered(callbacks
, "%s", message
);
480 sim_io_flush_stdoutput(void)
482 switch (CURRENT_STDIO
) {
484 callbacks
->flush_stdout (callbacks
);
489 error("sim_io_read_stdin: unaccounted switch\n");
495 sim_io_error (SIM_DESC sd
, const char *fmt
, ...)
499 callbacks
->evprintf_filtered (callbacks
, fmt
, ap
);
501 callbacks
->error (callbacks
, "");
509 void *memory
= (void*)xmalloc(size
);
511 error("xmalloc failed\n");
512 memset(memory
, 0, size
);
516 void zfree(void *data
)