This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[PATCH]: Support memory bank switching for 68HC12 simulator
- From: Stephane Carrez <stcarrez at nerim dot fr>
- To: gdb-patches at sources dot redhat dot com
- Date: Tue, 13 Aug 2002 12:39:14 +0200
- Subject: [PATCH]: Support memory bank switching for 68HC12 simulator
Hi!
I've committed this patch to the HC11/HC12 simulator to support the
16K memory bank window at 0x8000.
Stephane
2002-08-13 Stephane Carrez <stcarrez@nerim.fr>
* dv-m68hc11.c (m68hc11cpu_io_read_buffer): Translate memory
bank window to some virtual address to read from extended memory.
(m68hc11cpu_io_write_buffer): Likewise for writing.
(attach_m68hc11_regs): When use_bank property is defined, attach
to the 68HC12 16K memory bank window.
* interp.c (sim_hw_configure): Create memory region for banked
memory.
Index: dv-m68hc11.c
===================================================================
RCS file: /cvs/src/src/sim/m68hc11/dv-m68hc11.c,v
retrieving revision 1.8
diff -u -p -r1.8 dv-m68hc11.c
--- dv-m68hc11.c 13 Aug 2002 08:10:45 -0000 1.8
+++ dv-m68hc11.c 13 Aug 2002 08:27:08 -0000
@@ -321,6 +321,13 @@ attach_m68hc11_regs (struct hw *me,
cpu->cpu_frequency = 8*1000*1000;
}
+ if (hw_find_property (me, "use_bank") != NULL)
+ hw_attach_address (hw_parent (me), 0,
+ exec_map,
+ 0x08000,
+ 0x04000,
+ me);
+
cpu_mode = "expanded";
if (hw_find_property (me, "mode") != NULL)
cpu_mode = hw_find_string_property (me, "mode");
@@ -836,6 +843,14 @@ m68hc11cpu_io_read_buffer (struct hw *me
sd = hw_system (me);
cpu = STATE_CPU (sd, 0);
+ if (base >= 0x8000 && base < 0xc000)
+ {
+ address_word virt_addr = phys_to_virt (cpu, base);
+ if (virt_addr != base)
+ return sim_core_read_buffer (sd, cpu, space, dest,
+ virt_addr, nr_bytes);
+ }
+
/* Handle reads for the sub-devices. */
base -= controller->attach_address;
result = sim_core_read_buffer (sd, cpu,
@@ -1075,6 +1090,14 @@ m68hc11cpu_io_write_buffer (struct hw *m
sd = hw_system (me);
cpu = STATE_CPU (sd, 0);
+
+ if (base >= 0x8000 && base < 0xc000)
+ {
+ address_word virt_addr = phys_to_virt (cpu, base);
+ if (virt_addr != base)
+ return sim_core_write_buffer (sd, cpu, space, source,
+ virt_addr, nr_bytes);
+ }
base -= controller->attach_address;
result = sim_core_write_buffer (sd, cpu,
io_map, source, base, nr_bytes);
Index: interp.c
===================================================================
RCS file: /cvs/src/src/sim/m68hc11/interp.c,v
retrieving revision 1.10
diff -u -p -r1.10 interp.c
--- interp.c 13 Aug 2002 08:10:45 -0000 1.10
+++ interp.c 13 Aug 2002 08:27:08 -0000
@@ -242,11 +242,14 @@ sim_hw_configure (SIM_DESC sd)
{
/* Allocate core external memory. */
sim_do_commandf (sd, "memory region 0x%lx@%d,0x%lx",
- 0x8000, M6811_RAM_LEVEL, 0x8000);
+ 0xC000, M6811_RAM_LEVEL, 0x4000);
sim_do_commandf (sd, "memory region 0x000@%d,0x8000",
M6811_RAM_LEVEL);
+ sim_do_commandf (sd, "memory region 0x01000000@%d,0x100000",
+ M6811_RAM_LEVEL);
sim_hw_parse (sd, "/m68hc12/reg 0x0 0x3FF");
+ sim_hw_parse (sd, "/m68hc12/use_bank 1");
}
if (!hw_tree_find_property (device_tree, "/m68hc12/m68hc12sio@1/reg"))