mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-28 22:40:24 +00:00
Extend xor-endian and per-cpu support in core module.
Allow negated test when watching value within core.
This commit is contained in:
parent
d82e4bf6cc
commit
2f2e6c5d5b
@ -1,3 +1,49 @@
|
||||
Tue May 27 14:32:00 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* sim-watch.c (schedule_watchpoint): Add is_within option so that
|
||||
inequality test is possible.
|
||||
(handle_watchpoint): Re-pass is_within arg.
|
||||
(watch_option_handler): When `!' prefix to pc-watchpoint arg pass
|
||||
0 to schedule_watchpoint's is_within arg.
|
||||
(sim_watchpoint_init): Re-pass is_within arg.
|
||||
|
||||
* sim-options.c (sim_print_help): Add is_command argument. Don't
|
||||
include -- prefix when called from the command line interpreter.
|
||||
|
||||
* sim-watch.c (schedule_watchpoint): Pass true is_within argument.
|
||||
|
||||
* sim-events.c (sim_events_watch_sim): Add is_within argument,
|
||||
zero indicates that the test should be reversed.
|
||||
(sim_events_watch_core): Ditto.
|
||||
(WATCH_CORE): Compare range against is_within.
|
||||
(WATCH_SIM): Ditto.
|
||||
|
||||
Tue May 27 12:48:03 1997 Andrew Cagney <cagney@b2.cygnus.com>
|
||||
|
||||
* sim-events.c (WATCH_CORE): Pass NULL cpu argument to
|
||||
sim_core_read_buffer. Check nr-bytes transfered.
|
||||
|
||||
* sim-core.h (sim_core_common): Define a new struct that contains
|
||||
the common data. to sd and cpu structures.
|
||||
* sim-core.c (sim_core_attach): Update.
|
||||
(sim_core_init): Update. Remember to copy initialized data to each
|
||||
cpu.
|
||||
(sim_core_find_mapping): Ditto.
|
||||
|
||||
* sim-core.c (sim_core_read_buffer): Add cpu argument.
|
||||
(sim_core_write_buffer): Ditto.
|
||||
|
||||
* sim-n-core.h (sim_core_read_unaligned_N): When mis-aligned
|
||||
transfer use xor version of read buffer.
|
||||
(sim_core_write_unaligned_N): Ditto for write.
|
||||
|
||||
* sim-core.c (sim_core_xor_read_buffer): New function implement
|
||||
xor-endian data read breaking transfer up into xor-endian sized
|
||||
blocks.
|
||||
(sim_core_xor_write_buffer): Ditto for write.
|
||||
(reverse_n): Reverse order of arbitrary number of bytes in buffer
|
||||
- needed for xor-endian transfers.
|
||||
|
||||
Fri May 23 14:24:31 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* sim-inline.h: Review description.
|
||||
|
@ -93,6 +93,7 @@ struct _sim_event {
|
||||
/* watch sim addr */
|
||||
void *host_addr;
|
||||
/* watch core/sim range */
|
||||
int is_within; /* 0/1 */
|
||||
unsigned ub;
|
||||
unsigned lb;
|
||||
unsigned64 ub64;
|
||||
@ -474,6 +475,7 @@ sim_events_watch_sim (SIM_DESC sd,
|
||||
void *host_addr,
|
||||
int nr_bytes,
|
||||
int byte_order,
|
||||
int is_within,
|
||||
unsigned64 lb,
|
||||
unsigned64 ub,
|
||||
sim_event_handler *handler,
|
||||
@ -526,6 +528,7 @@ sim_events_watch_sim (SIM_DESC sd,
|
||||
new_event->lb64 = lb;
|
||||
new_event->ub = ub;
|
||||
new_event->ub64 = ub;
|
||||
new_event->is_within = (is_within != 0);
|
||||
/* insert */
|
||||
new_event->next = events->watchpoints;
|
||||
events->watchpoints = new_event;
|
||||
@ -550,6 +553,7 @@ sim_events_watch_core (SIM_DESC sd,
|
||||
sim_core_maps core_map,
|
||||
int nr_bytes,
|
||||
int byte_order,
|
||||
int is_within,
|
||||
unsigned64 lb,
|
||||
unsigned64 ub,
|
||||
sim_event_handler *handler,
|
||||
@ -603,6 +607,7 @@ sim_events_watch_core (SIM_DESC sd,
|
||||
new_event->lb64 = lb;
|
||||
new_event->ub = ub;
|
||||
new_event->ub64 = ub;
|
||||
new_event->is_within = (is_within != 0);
|
||||
/* insert */
|
||||
new_event->next = events->watchpoints;
|
||||
events->watchpoints = new_event;
|
||||
@ -672,10 +677,13 @@ sim_watch_valid (SIM_DESC sd,
|
||||
|
||||
#define WATCH_CORE(N,OP,EXT) \
|
||||
{ \
|
||||
unsigned_##N word; \
|
||||
sim_core_read_buffer (sd, to_do->core_map, &word, to_do->core_addr, sizeof (word)); \
|
||||
unsigned_##N word = 0; \
|
||||
int nr_read = sim_core_read_buffer (sd, NULL, to_do->core_map, &word, to_do->core_addr, sizeof (word)); \
|
||||
OP (word); \
|
||||
return (word >= to_do->lb##EXT && word <= to_do->ub##EXT); \
|
||||
return (nr_read == sizeof (unsigned_##N) \
|
||||
&& (to_do->is_within \
|
||||
== (word >= to_do->lb##EXT \
|
||||
&& word <= to_do->ub##EXT))); \
|
||||
}
|
||||
case watch_core_targ_1: WATCH_CORE (1, T2H,);
|
||||
case watch_core_targ_2: WATCH_CORE (2, T2H,);
|
||||
@ -697,7 +705,9 @@ sim_watch_valid (SIM_DESC sd,
|
||||
{ \
|
||||
unsigned_##N word = *(unsigned_##N*)to_do->host_addr; \
|
||||
OP (word); \
|
||||
return (word >= to_do->lb##EXT && word <= to_do->ub##EXT); \
|
||||
return (to_do->is_within \
|
||||
== (word >= to_do->lb##EXT \
|
||||
&& word <= to_do->ub##EXT)); \
|
||||
}
|
||||
|
||||
case watch_sim_host_1: WATCH_SIM (1, word = ,);
|
||||
|
@ -43,7 +43,7 @@ sim_core_read_aligned_N(sim_cpu *cpu,
|
||||
unsigned_word xaddr)
|
||||
{
|
||||
sim_cpu_core *cpu_core = CPU_CORE (cpu);
|
||||
sim_core *core = &cpu_core->common;
|
||||
sim_core_common *core = &cpu_core->common;
|
||||
unsigned_N val;
|
||||
sim_core_mapping *mapping;
|
||||
address_word addr;
|
||||
@ -106,8 +106,8 @@ sim_core_read_unaligned_N(sim_cpu *cpu,
|
||||
case NONSTRICT_ALIGNMENT:
|
||||
{
|
||||
unsigned_N val;
|
||||
if (sim_core_read_buffer (CPU_STATE (cpu), map, &val, addr,
|
||||
sizeof(unsigned_N))
|
||||
if (sim_core_xor_read_buffer (CPU_STATE (cpu), cpu, map, &val, addr,
|
||||
sizeof(unsigned_N))
|
||||
!= sizeof(unsigned_N))
|
||||
SIM_CORE_SIGNAL (CPU_STATE (cpu), cpu, cia, map,
|
||||
sizeof (unsigned_N), addr,
|
||||
@ -139,7 +139,7 @@ sim_core_write_aligned_N(sim_cpu *cpu,
|
||||
unsigned_N val)
|
||||
{
|
||||
sim_cpu_core *cpu_core = CPU_CORE (cpu);
|
||||
sim_core *core = &cpu_core->common;
|
||||
sim_core_common *core = &cpu_core->common;
|
||||
sim_core_mapping *mapping;
|
||||
address_word addr;
|
||||
if (WITH_XOR_ENDIAN)
|
||||
@ -201,9 +201,9 @@ sim_core_write_unaligned_N(sim_cpu *cpu,
|
||||
break;
|
||||
case NONSTRICT_ALIGNMENT:
|
||||
{
|
||||
val = T2H_N(val);
|
||||
if (sim_core_write_buffer (CPU_STATE (cpu), map, &val, addr,
|
||||
sizeof(unsigned_N))
|
||||
unsigned_N val = H2T_N (val);
|
||||
if (sim_core_xor_write_buffer (CPU_STATE (cpu), cpu, map, &val, addr,
|
||||
sizeof(unsigned_N))
|
||||
!= sizeof(unsigned_N))
|
||||
SIM_CORE_SIGNAL (CPU_STATE (cpu), cpu, cia, map,
|
||||
sizeof (unsigned_N), addr,
|
||||
|
@ -239,7 +239,7 @@ standard_option_handler (sd, opt, arg, is_command)
|
||||
break;
|
||||
|
||||
case 'H':
|
||||
sim_print_help (sd);
|
||||
sim_print_help (sd, is_command);
|
||||
if (STATE_OPEN_KIND (sd) == SIM_OPEN_STANDALONE)
|
||||
exit (0);
|
||||
/* FIXME: 'twould be nice to do something similar if gdb. */
|
||||
@ -391,8 +391,9 @@ sim_parse_args (sd, argv)
|
||||
/* Print help messages for the options. */
|
||||
|
||||
void
|
||||
sim_print_help (sd)
|
||||
sim_print_help (sd, is_command)
|
||||
SIM_DESC sd;
|
||||
int is_command;
|
||||
{
|
||||
const struct option_list *ol;
|
||||
const OPTION *opt;
|
||||
@ -425,32 +426,35 @@ sim_print_help (sd)
|
||||
comma = 0;
|
||||
len = 2;
|
||||
|
||||
o = opt;
|
||||
do
|
||||
if (!is_command)
|
||||
{
|
||||
if (o->shortopt != '\0')
|
||||
o = opt;
|
||||
do
|
||||
{
|
||||
sim_io_printf (sd, "%s-%c", comma ? ", " : "", o->shortopt);
|
||||
len += (comma ? 2 : 0) + 2;
|
||||
if (o->arg != NULL)
|
||||
if (o->shortopt != '\0')
|
||||
{
|
||||
if (o->opt.has_arg == optional_argument)
|
||||
sim_io_printf (sd, "%s-%c", comma ? ", " : "", o->shortopt);
|
||||
len += (comma ? 2 : 0) + 2;
|
||||
if (o->arg != NULL)
|
||||
{
|
||||
sim_io_printf (sd, "[%s]", o->arg);
|
||||
len += 1 + strlen (o->arg) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sim_io_printf (sd, " %s", o->arg);
|
||||
len += 1 + strlen (o->arg);
|
||||
if (o->opt.has_arg == optional_argument)
|
||||
{
|
||||
sim_io_printf (sd, "[%s]", o->arg);
|
||||
len += 1 + strlen (o->arg) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sim_io_printf (sd, " %s", o->arg);
|
||||
len += 1 + strlen (o->arg);
|
||||
}
|
||||
}
|
||||
comma = 1;
|
||||
}
|
||||
comma = 1;
|
||||
++o;
|
||||
}
|
||||
++o;
|
||||
while (o->opt.name != NULL && o->doc == NULL);
|
||||
}
|
||||
while (o->opt.name != NULL && o->doc == NULL);
|
||||
|
||||
|
||||
o = opt;
|
||||
do
|
||||
{
|
||||
@ -461,11 +465,12 @@ sim_print_help (sd)
|
||||
name = o->opt.name;
|
||||
if (name != NULL)
|
||||
{
|
||||
sim_io_printf (sd, "%s--%s",
|
||||
sim_io_printf (sd, "%s%s%s",
|
||||
comma ? ", " : "",
|
||||
is_command ? "" : "--",
|
||||
name);
|
||||
len += ((comma ? 2 : 0)
|
||||
+ 2
|
||||
+ (is_command ? 0 : 2)
|
||||
+ strlen (name));
|
||||
if (o->arg != NULL)
|
||||
{
|
||||
|
@ -38,6 +38,7 @@ typedef enum {
|
||||
|
||||
typedef struct _sim_watch_point {
|
||||
watchpoint_action action;
|
||||
int is_within;
|
||||
long arg;
|
||||
sim_event *event;
|
||||
} sim_watch_point;
|
||||
|
@ -1,3 +1,7 @@
|
||||
Tue May 27 14:12:32 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* igen.h: Stop options and code gen type bit masks overlaping.
|
||||
|
||||
Fri May 23 12:01:08 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* gen-semantics.c (print_semantic_body): Incorrect test for
|
||||
|
144
sim/igen/igen.h
Normal file
144
sim/igen/igen.h
Normal file
@ -0,0 +1,144 @@
|
||||
/* This file is part of the program psim.
|
||||
|
||||
Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au>
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* What does the instruction look like - bit ordering, size, widths or offesets */
|
||||
extern int hi_bit_nr;
|
||||
extern int insn_bit_size;
|
||||
extern int insn_specifying_widths;
|
||||
|
||||
|
||||
/* what should global names be prefixed with? */
|
||||
extern const char *global_name_prefix;
|
||||
extern const char *global_uname_prefix;
|
||||
|
||||
|
||||
/* generation options: */
|
||||
|
||||
|
||||
enum {
|
||||
generate_with_direct_access = 0x1,
|
||||
generate_with_icache = 0x2,
|
||||
generate_with_semantic_icache = 0x4,
|
||||
generate_with_insn_in_icache = 0x8,
|
||||
|
||||
generate_with_semantic_returning_modified_nia_only = 0x010,
|
||||
generate_with_semantic_conditional_issue = 0x020,
|
||||
generate_with_idecode_slot_verification = 0x040,
|
||||
generate_with_semantic_delayed_branch = 0x080,
|
||||
generate_with_semantic_zero_r0 = 0x100
|
||||
};
|
||||
|
||||
|
||||
typedef enum {
|
||||
|
||||
/* Transfer control to an instructions semantic code using the the
|
||||
standard call/return mechanism */
|
||||
|
||||
generate_calls = 0x1000,
|
||||
|
||||
|
||||
/* Transfer control to an instructions semantic code using
|
||||
(computed) goto's instead of the more conventional call/return
|
||||
mechanism */
|
||||
|
||||
generate_jumps = 0x2000,
|
||||
|
||||
|
||||
} igen_code;
|
||||
|
||||
extern int code;
|
||||
|
||||
|
||||
|
||||
|
||||
extern int icache_size;
|
||||
|
||||
|
||||
/* Instruction expansion?
|
||||
|
||||
Should the semantic code for each instruction, when the oportunity
|
||||
arrises, be expanded according to the variable opcode files that
|
||||
the instruction decode process renders constant */
|
||||
|
||||
extern int generate_expanded_instructions;
|
||||
|
||||
|
||||
/* SMP?
|
||||
|
||||
Should the generated code include SMP support (>0) and if so, for
|
||||
how many processors? */
|
||||
|
||||
extern int generate_smp;
|
||||
|
||||
|
||||
|
||||
|
||||
/* Misc junk */
|
||||
|
||||
|
||||
|
||||
/* Function header definitions */
|
||||
|
||||
|
||||
/* Cache functions: */
|
||||
|
||||
extern int print_icache_function_formal
|
||||
(lf *file);
|
||||
|
||||
extern int print_icache_function_actual
|
||||
(lf *file);
|
||||
|
||||
extern int print_icache_function_type
|
||||
(lf *file);
|
||||
|
||||
extern int print_semantic_function_formal
|
||||
(lf *file);
|
||||
|
||||
extern int print_semantic_function_actual
|
||||
(lf *file);
|
||||
|
||||
extern int print_semantic_function_type
|
||||
(lf *file);
|
||||
|
||||
extern void print_my_defines
|
||||
(lf *file,
|
||||
insn_bits *expanded_bits,
|
||||
table_entry *file_entry);
|
||||
|
||||
extern void print_itrace
|
||||
(lf *file,
|
||||
table_entry *file_entry,
|
||||
int idecode);
|
||||
|
||||
|
||||
typedef enum {
|
||||
function_name_prefix_semantics,
|
||||
function_name_prefix_idecode,
|
||||
function_name_prefix_itable,
|
||||
function_name_prefix_icache,
|
||||
function_name_prefix_none
|
||||
} lf_function_name_prefixes;
|
||||
|
||||
extern int print_function_name
|
||||
(lf *file,
|
||||
const char *basename,
|
||||
insn_bits *expanded_bits,
|
||||
lf_function_name_prefixes prefix);
|
@ -1,3 +1,13 @@
|
||||
Tue May 27 14:22:23 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* interp.c (CoProcPresent): Add UNUSED attribute - not used by all
|
||||
mips architectures.
|
||||
|
||||
Tue May 27 14:22:23 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* interp.c (sim_do_command): Check for common commands if a
|
||||
simulator specific command fails.
|
||||
|
||||
Thu May 22 09:32:03 1997 Gavin Koch <gavin@cygnus.com>
|
||||
|
||||
* interp.c (sim_engine_run): ifdef out uses of simSTOP, simSTEP
|
||||
|
@ -1475,40 +1475,46 @@ sim_do_command (sd,cmd)
|
||||
|
||||
/* NOTE: Accessed from the GDB "sim" commmand: */
|
||||
for (cptr = sim_commands; cptr && cptr->name; cptr++)
|
||||
if (strncmp(cmd,cptr->name,strlen(cptr->name)) == 0) {
|
||||
cmd += strlen(cptr->name);
|
||||
switch (cptr->id) {
|
||||
case e_help: /* no arguments */
|
||||
{ /* no arguments */
|
||||
struct t_sim_command *lptr;
|
||||
callback->printf_filtered(callback,"List of MIPS simulator commands:\n");
|
||||
for (lptr = sim_commands; lptr->name; lptr++)
|
||||
callback->printf_filtered(callback,"%s %s\n",lptr->name,lptr->help);
|
||||
}
|
||||
if (strncmp (cmd, cptr->name, strlen(cptr->name)) == 0)
|
||||
{
|
||||
cmd += strlen(cptr->name);
|
||||
switch (cptr->id) {
|
||||
case e_help: /* no arguments */
|
||||
{ /* no arguments */
|
||||
struct t_sim_command *lptr;
|
||||
callback->printf_filtered(callback,"List of MIPS simulator commands:\n");
|
||||
for (lptr = sim_commands; lptr->name; lptr++)
|
||||
callback->printf_filtered(callback,"%s %s\n",lptr->name,lptr->help);
|
||||
sim_args_command (sd, "help");
|
||||
}
|
||||
break;
|
||||
|
||||
case e_setmemsize: /* memory size argument */
|
||||
{
|
||||
unsigned int newsize = (unsigned int)getnum(cmd);
|
||||
sim_size(newsize);
|
||||
}
|
||||
case e_setmemsize: /* memory size argument */
|
||||
{
|
||||
unsigned int newsize = (unsigned int)getnum(cmd);
|
||||
sim_size(newsize);
|
||||
}
|
||||
break;
|
||||
|
||||
case e_reset: /* no arguments */
|
||||
ColdReset();
|
||||
/* NOTE: See the comments in sim_open() relating to device
|
||||
initialisation. */
|
||||
break;
|
||||
case e_reset: /* no arguments */
|
||||
ColdReset();
|
||||
/* NOTE: See the comments in sim_open() relating to device
|
||||
initialisation. */
|
||||
break;
|
||||
|
||||
default:
|
||||
callback->printf_filtered(callback,"FATAL: Matched \"%s\", but failed to match command id %d.\n",cmd,cptr->id);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
callback->printf_filtered(callback,"FATAL: Matched \"%s\", but failed to match command id %d.\n",cmd,cptr->id);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!(cptr->name))
|
||||
callback->printf_filtered(callback,"Error: \"%s\" is not a valid MIPS simulator command.\n",cmd);
|
||||
{
|
||||
/* try for a common command when the sim specific lookup fails */
|
||||
if (sim_args_command (sd, cmd) != SIM_RC_OK)
|
||||
callback->printf_filtered(callback,"Error: \"%s\" is not a valid MIPS simulator command.\n",cmd);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@ -3887,7 +3893,7 @@ Convert(rm,op,from,to)
|
||||
|
||||
/*-- co-processor support routines ------------------------------------------*/
|
||||
|
||||
static int
|
||||
static int UNUSED
|
||||
CoProcPresent(coproc_number)
|
||||
unsigned int coproc_number;
|
||||
{
|
||||
|
@ -1,3 +1,8 @@
|
||||
Tue May 27 13:22:13 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* sim-calls.c (sim_read): Pass NULL cpu to sim_core_read_buffer.
|
||||
(sim_write): Ditto for write.
|
||||
|
||||
Tue May 20 09:33:31 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* sim-calls.c (sim_load): Set STATE_LOADED_P.
|
||||
|
@ -148,7 +148,7 @@ sim_kill (SIM_DESC sd)
|
||||
int
|
||||
sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
|
||||
{
|
||||
return sim_core_read_buffer (sd, sim_core_write_map,
|
||||
return sim_core_read_buffer (sd, NULL, sim_core_write_map,
|
||||
buf, mem, length);
|
||||
}
|
||||
|
||||
@ -156,7 +156,7 @@ sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
|
||||
int
|
||||
sim_write (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
|
||||
{
|
||||
return sim_core_write_buffer (sd, sim_core_write_map,
|
||||
return sim_core_write_buffer (sd, NULL, sim_core_write_map,
|
||||
buf, mem, length);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user