From c2270cd8a662cb8046bcde090db60a933b69d0ed Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sun, 15 Nov 2015 12:22:30 -0800 Subject: [PATCH] sim: cr16: switch to common sim-reg This is mostly to get us off the weird cr16 specific memory functions, but it's also a good clean up to move to the common core. --- sim/cr16/ChangeLog | 14 +++++++++++ sim/cr16/Makefile.in | 1 + sim/cr16/interp.c | 59 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/sim/cr16/ChangeLog b/sim/cr16/ChangeLog index 86d730bf1b7..360b2347a17 100644 --- a/sim/cr16/ChangeLog +++ b/sim/cr16/ChangeLog @@ -1,3 +1,17 @@ +2015-11-15 Mike Frysinger + + * Makefile.in (SIM_OBJS): Add sim-reg.o. + * interp.c (cr16_reg_fetch, cr16_reg_store): Add prototypes. + (sim_open): Call CPU_REG_FETCH/CPU_REG_STORE. + (cr16_extract_unsigned_integer, cr16_store_unsigned_integer): + New helper functions. + (sim_fetch_register): Rename to ... + (cr16_reg_fetch): ... this. Use cr16_store_unsigned_integer + to write out the updated register values. + (sim_store_register): Rename to ... + (cr16_reg_store): ... this. Use cr16_extract_unsigned_integer + to read in the updated register values. + 2015-11-15 Mike Frysinger * interp.c (sim_open): Delete sim_create_inferior call. diff --git a/sim/cr16/Makefile.in b/sim/cr16/Makefile.in index 5d1632d973c..07fa819edc2 100644 --- a/sim/cr16/Makefile.in +++ b/sim/cr16/Makefile.in @@ -20,6 +20,7 @@ SIM_OBJS = \ $(SIM_NEW_COMMON_OBJS) \ sim-hload.o \ + sim-reg.o \ interp.o \ table.o \ simops.o \ diff --git a/sim/cr16/interp.c b/sim/cr16/interp.c index 278a5abb07b..981cff46323 100644 --- a/sim/cr16/interp.c +++ b/sim/cr16/interp.c @@ -758,6 +758,9 @@ free_state (SIM_DESC sd) sim_state_free (sd); } +static int cr16_reg_fetch (SIM_CPU *, int, unsigned char *, int); +static int cr16_reg_store (SIM_CPU *, int, unsigned char *, int); + SIM_DESC trace_sd = NULL; SIM_DESC @@ -824,6 +827,8 @@ sim_open (SIM_OPEN_KIND kind, struct host_callback_struct *cb, struct bfd *abfd, { SIM_CPU *cpu = STATE_CPU (sd, i); + CPU_REG_FETCH (cpu) = cr16_reg_fetch; + CPU_REG_STORE (cpu) = cr16_reg_store; CPU_PC_FETCH (cpu) = cr16_pc_get; CPU_PC_STORE (cpu) = cr16_pc_set; } @@ -1178,8 +1183,38 @@ sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc) stop_simulator = 0; } -int -sim_fetch_register (SIM_DESC sd, int rn, unsigned char *memory, int length) +static uint32 +cr16_extract_unsigned_integer (unsigned char *addr, int len) +{ + uint32 retval; + unsigned char * p; + unsigned char * startaddr = (unsigned char *)addr; + unsigned char * endaddr = startaddr + len; + + retval = 0; + + for (p = endaddr; p > startaddr;) + retval = (retval << 8) | *--p; + + return retval; +} + +static void +cr16_store_unsigned_integer (unsigned char *addr, int len, uint32 val) +{ + unsigned char *p; + unsigned char *startaddr = addr; + unsigned char *endaddr = startaddr + len; + + for (p = startaddr; p < endaddr;) + { + *p++ = val & 0xff; + val >>= 8; + } +} + +static int +cr16_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *memory, int length) { int size; switch ((enum sim_cr16_regs) rn) @@ -1196,15 +1231,14 @@ sim_fetch_register (SIM_DESC sd, int rn, unsigned char *memory, int length) case SIM_CR16_R9_REGNUM: case SIM_CR16_R10_REGNUM: case SIM_CR16_R11_REGNUM: - WRITE_16 (memory, GPR (rn - SIM_CR16_R0_REGNUM)); + cr16_store_unsigned_integer (memory, 2, GPR (rn - SIM_CR16_R0_REGNUM)); size = 2; break; case SIM_CR16_R12_REGNUM: case SIM_CR16_R13_REGNUM: case SIM_CR16_R14_REGNUM: case SIM_CR16_R15_REGNUM: - //WRITE_32 (memory, GPR (rn - SIM_CR16_R0_REGNUM)); - write_longword (memory, GPR (rn - SIM_CR16_R0_REGNUM)); + cr16_store_unsigned_integer (memory, 4, GPR (rn - SIM_CR16_R0_REGNUM)); size = 4; break; case SIM_CR16_PC_REGNUM: @@ -1218,8 +1252,7 @@ sim_fetch_register (SIM_DESC sd, int rn, unsigned char *memory, int length) case SIM_CR16_DSR_REGNUM: case SIM_CR16_CAR0_REGNUM: case SIM_CR16_CAR1_REGNUM: - //WRITE_32 (memory, CREG (rn - SIM_CR16_PC_REGNUM)); - write_longword (memory, CREG (rn - SIM_CR16_PC_REGNUM)); + cr16_store_unsigned_integer (memory, 4, CREG (rn - SIM_CR16_PC_REGNUM)); size = 4; break; default: @@ -1228,9 +1261,9 @@ sim_fetch_register (SIM_DESC sd, int rn, unsigned char *memory, int length) } return size; } - -int -sim_store_register (SIM_DESC sd, int rn, unsigned char *memory, int length) + +static int +cr16_reg_store (SIM_CPU *cpu, int rn, unsigned char *memory, int length) { int size; switch ((enum sim_cr16_regs) rn) @@ -1247,14 +1280,14 @@ sim_store_register (SIM_DESC sd, int rn, unsigned char *memory, int length) case SIM_CR16_R9_REGNUM: case SIM_CR16_R10_REGNUM: case SIM_CR16_R11_REGNUM: - SET_GPR (rn - SIM_CR16_R0_REGNUM, READ_16 (memory)); + SET_GPR (rn - SIM_CR16_R0_REGNUM, cr16_extract_unsigned_integer (memory, 2)); size = 2; break; case SIM_CR16_R12_REGNUM: case SIM_CR16_R13_REGNUM: case SIM_CR16_R14_REGNUM: case SIM_CR16_R15_REGNUM: - SET_GPR32 (rn - SIM_CR16_R0_REGNUM, get_longword (memory)); + SET_GPR32 (rn - SIM_CR16_R0_REGNUM, cr16_extract_unsigned_integer (memory, 2)); size = 4; break; case SIM_CR16_PC_REGNUM: @@ -1268,7 +1301,7 @@ sim_store_register (SIM_DESC sd, int rn, unsigned char *memory, int length) case SIM_CR16_DSR_REGNUM: case SIM_CR16_CAR0_REGNUM: case SIM_CR16_CAR1_REGNUM: - SET_CREG (rn - SIM_CR16_PC_REGNUM, get_longword (memory)); + SET_CREG (rn - SIM_CR16_PC_REGNUM, cr16_extract_unsigned_integer (memory, 4)); size = 4; break; default: -- 2.30.2