This commit was manufactured by cvs2svn to create branch
[external/binutils.git] / sim / common / sim-n-core.h
index 9691021..032569a 100644 (file)
@@ -1,22 +1,25 @@
-/*  This file is part of the program psim.
+/* The common simulator framework for GDB, the GNU Debugger.
 
-    Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au>
+   Copyright 2002 Free Software Foundation, Inc.
 
-    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.
+   Contributed by Andrew Cagney and Red Hat.
 
-    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.
-    */
+   This file is part of GDB.
+
+   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.  */
 
 
 #ifndef N
@@ -71,13 +74,13 @@ sim_core_trace_M (sim_cpu *cpu,
                  sim_cia cia,
                  int line_nr,
                  transfer_type type,
-                 sim_core_maps map,
+                 unsigned map,
                  address_word addr,
                  unsigned_M val,
                  int nr_bytes)
 {
-  char *transfer = (type == read_transfer ? "read" : "write");
-  char *direction = (type == read_transfer ? "->" : "<-");
+  const char *transfer = (type == read_transfer ? "read" : "write");
+  const char *direction = (type == read_transfer ? "->" : "<-");
 
   if (TRACE_DEBUG_P (cpu))
     trace_printf (CPU_STATE (cpu), cpu, "sim-n-core.h:%d: ", line_nr);
@@ -86,7 +89,7 @@ sim_core_trace_M (sim_cpu *cpu,
   trace_printf (CPU_STATE (cpu), cpu,
                "%s-%d %s:0x%08lx %s 0x%08lx%08lx%08lx%08lx\n",
                transfer, nr_bytes,
-               sim_core_map_to_str (map),
+               map_to_str (map),
                (unsigned long) addr,
                direction,
                (unsigned long) V4_16 (val, 0),
@@ -98,7 +101,7 @@ sim_core_trace_M (sim_cpu *cpu,
   trace_printf (CPU_STATE (cpu), cpu,
                "%s-%d %s:0x%08lx %s 0x%08lx%08lx\n",
                transfer, nr_bytes,
-               sim_core_map_to_str (map),
+               map_to_str (map),
                (unsigned long) addr,
                direction,
                (unsigned long) V4_8 (val, 0),
@@ -109,7 +112,7 @@ sim_core_trace_M (sim_cpu *cpu,
                "%s-%d %s:0x%08lx %s 0x%08lx\n",
                transfer,
                nr_bytes,
-               sim_core_map_to_str (map),
+               map_to_str (map),
                (unsigned long) addr,
                direction,
                (unsigned long) val);
@@ -119,7 +122,7 @@ sim_core_trace_M (sim_cpu *cpu,
                "%s-%d %s:0x%08lx %s 0x%04lx\n",
                transfer,
                nr_bytes,
-               sim_core_map_to_str (map),
+               map_to_str (map),
                (unsigned long) addr,
                direction,
                (unsigned long) val);
@@ -129,7 +132,7 @@ sim_core_trace_M (sim_cpu *cpu,
                "%s-%d %s:0x%08lx %s 0x%02lx\n",
                transfer,
                nr_bytes,
-               sim_core_map_to_str (map),
+               map_to_str (map),
                (unsigned long) addr,
                direction,
                (unsigned long) val);
@@ -146,7 +149,7 @@ sim_core_trace_M (sim_cpu *cpu,
 INLINE_SIM_CORE(unsigned_M)
 sim_core_read_aligned_N(sim_cpu *cpu,
                        sim_cia cia,
-                       sim_core_maps map,
+                       unsigned map,
                        address_word xaddr)
 {
   sim_cpu_core *cpu_core = CPU_CORE (cpu);
@@ -161,24 +164,38 @@ sim_core_read_aligned_N(sim_cpu *cpu,
 #endif
     addr = xaddr;
   mapping = sim_core_find_mapping (core, map, addr, N, read_transfer, 1 /*abort*/, cpu, cia);
+  do
+    {
 #if (WITH_DEVICES)
-  if (WITH_CALLBACK_MEMORY && mapping->device != NULL) {
-    unsigned_M data;
-    if (device_io_read_buffer (mapping->device, &data, mapping->space, addr, N, cpu, cia) != N)
-      device_error (mapping->device, "internal error - %s - io_read_buffer should not fail",
-                   XSTRING (sim_core_read_aligned_N));
-    val = T2H_M (data);
-  }
-  else
+      if (WITH_CALLBACK_MEMORY && mapping->device != NULL)
+       {
+         unsigned_M data;
+         if (device_io_read_buffer (mapping->device, &data, mapping->space, addr, N, CPU_STATE (cpu), cpu, cia) != N)
+           device_error (mapping->device, "internal error - %s - io_read_buffer should not fail",
+                         XSTRING (sim_core_read_aligned_N));
+         val = T2H_M (data);
+         break;
+       }
+#endif
+#if (WITH_HW)
+      if (WITH_CALLBACK_MEMORY && mapping->device != NULL)
+       {
+         unsigned_M data;
+         sim_cpu_hw_io_read_buffer (cpu, cia, mapping->device, &data, mapping->space, addr, N);
+         val = T2H_M (data);
+         break;
+       }
 #endif
-    val = T2H_M (*(unsigned_M*) sim_core_translate (mapping, addr));
+      val = T2H_M (*(unsigned_M*) sim_core_translate (mapping, addr));
+    }
+  while (0);
   PROFILE_COUNT_CORE (cpu, addr, N, map);
   if (TRACE_P (cpu, TRACE_CORE_IDX))
     sim_core_trace_M (cpu, cia, __LINE__, read_transfer, map, addr, val, N);
   return val;
 }
 #endif
-
+  
 /* TAGS: sim_core_read_unaligned_1 sim_core_read_unaligned_2 */
 /* TAGS: sim_core_read_unaligned_4 sim_core_read_unaligned_8 */
 /* TAGS: sim_core_read_unaligned_16 */
@@ -187,7 +204,7 @@ sim_core_read_aligned_N(sim_cpu *cpu,
 INLINE_SIM_CORE(unsigned_M)
 sim_core_read_unaligned_N(sim_cpu *cpu,
                          sim_cia cia,
-                         sim_core_maps map,
+                         unsigned map,
                          address_word addr)
 {
   int alignment = N - 1;
@@ -237,7 +254,7 @@ sim_core_read_unaligned_N(sim_cpu *cpu,
 INLINE_SIM_CORE(unsigned_M)
 sim_core_read_misaligned_N(sim_cpu *cpu,
                          sim_cia cia,
-                         sim_core_maps map,
+                         unsigned map,
                          address_word addr)
 {
   unsigned_M val = 0;
@@ -263,7 +280,7 @@ sim_core_read_misaligned_N(sim_cpu *cpu,
 INLINE_SIM_CORE(void)
 sim_core_write_aligned_N(sim_cpu *cpu,
                         sim_cia cia,
-                        sim_core_maps map,
+                        unsigned map,
                         address_word xaddr,
                         unsigned_M val)
 {
@@ -278,16 +295,29 @@ sim_core_write_aligned_N(sim_cpu *cpu,
 #endif
     addr = xaddr;
   mapping = sim_core_find_mapping (core, map, addr, N, write_transfer, 1 /*abort*/, cpu, cia);
+  do
+    {
 #if (WITH_DEVICES)
-  if (WITH_CALLBACK_MEMORY && mapping->device != NULL) {
-    unsigned_M data = H2T_M (val);
-    if (device_io_write_buffer (mapping->device, &data, mapping->space, addr, N, cpu, cia) != N)
-      device_error (mapping->device, "internal error - %s - io_write_buffer should not fail",
-                   XSTRING (sim_core_write_aligned_N));
-  }
-  else
+      if (WITH_CALLBACK_MEMORY && mapping->device != NULL)
+       {
+         unsigned_M data = H2T_M (val);
+         if (device_io_write_buffer (mapping->device, &data, mapping->space, addr, N, CPU_STATE (cpu), cpu, cia) != N)
+           device_error (mapping->device, "internal error - %s - io_write_buffer should not fail",
+                         XSTRING (sim_core_write_aligned_N));
+         break;
+       }
+#endif
+#if (WITH_HW)
+      if (WITH_CALLBACK_MEMORY && mapping->device != NULL)
+       {
+         unsigned_M data = H2T_M (val);
+         sim_cpu_hw_io_write_buffer (cpu, cia, mapping->device, &data, mapping->space, addr, N);
+         break;
+       }
 #endif
-    *(unsigned_M*) sim_core_translate (mapping, addr) = H2T_M (val);
+      *(unsigned_M*) sim_core_translate (mapping, addr) = H2T_M (val);
+    }
+  while (0);
   PROFILE_COUNT_CORE (cpu, addr, N, map);
   if (TRACE_P (cpu, TRACE_CORE_IDX))
     sim_core_trace_M (cpu, cia, __LINE__, write_transfer, map, addr, val, N);
@@ -302,7 +332,7 @@ sim_core_write_aligned_N(sim_cpu *cpu,
 INLINE_SIM_CORE(void)
 sim_core_write_unaligned_N(sim_cpu *cpu,
                           sim_cia cia,
-                          sim_core_maps map,
+                          unsigned map,
                           address_word addr,
                           unsigned_M val)
 {
@@ -354,7 +384,7 @@ sim_core_write_unaligned_N(sim_cpu *cpu,
 INLINE_SIM_CORE(void)
 sim_core_write_misaligned_N(sim_cpu *cpu,
                           sim_cia cia,
-                          sim_core_maps map,
+                          unsigned map,
                           address_word addr,
                           unsigned_M val)
 {