Make find_thread_ptid lookup thread map instead of iterate
[deliverable/binutils-gdb.git] / sim / bfin / devices.c
index 1fa72b9aa40e22aab8948b4070f750046093f134..cf2013557f43e2c65e9e51459e01e71e625e40ff 100644 (file)
@@ -1,6 +1,6 @@
 /* Blackfin device support.
 
-   Copyright (C) 2010-2013 Free Software Foundation, Inc.
+   Copyright (C) 2010-2019 Free Software Foundation, Inc.
    Contributed by Analog Devices, Inc.
 
    This file is part of simulators.
 #include "dv-bfin_mmu.h"
 
 static void
-bfin_mmr_invalid (struct hw *me, SIM_CPU *cpu, address_word addr,
-                 unsigned nr_bytes, bool write)
+bfin_mmr_invalid (struct hw *me, address_word addr,
+                 unsigned nr_bytes, bool write, bool missing)
 {
-  if (!cpu)
-    cpu = hw_system_cpu (me);
+  SIM_CPU *cpu = hw_system_cpu (me);
+  const char *rw = write ? "write" : "read";
+  const char *reason =
+    missing ? "no such register" :
+              (addr & 3) ? "must be 32-bit aligned" : "invalid length";
 
   /* Only throw a fit if the cpu is doing the access.  DMA/GDB simply
      go unnoticed.  Not exactly hardware behavior, but close enough.  */
   if (!cpu)
     {
-      sim_io_eprintf (hw_system (me), "%s: invalid MMR access @ %#x\n",
-                     hw_path (me), addr);
+      sim_io_eprintf (hw_system (me),
+                     "%s: invalid MMR %s at %#x length %u: %s\n",
+                     hw_path (me), rw, addr, nr_bytes, reason);
       return;
     }
 
-  HW_TRACE ((me, "invalid MMR %s to 0x%08lx length %u",
-            write ? "write" : "read", (unsigned long) addr, nr_bytes));
+  HW_TRACE ((me, "invalid MMR %s at %#x length %u: %s",
+            rw, addr, nr_bytes, reason));
 
-  /* XXX: is this what hardware does ?  */
+  /* XXX: is this what hardware does ?  What about priority of unaligned vs
+     wrong length vs missing register ?  What about system-vs-core ?  */
+  /* XXX: We should move this addr check to a model property so we get the
+     same behavior regardless of where we map the model.  */
   if (addr >= BFIN_CORE_MMR_BASE)
     /* XXX: This should be setting up CPLB fault addrs ?  */
     mmu_process_fault (cpu, addr, write, false, false, true);
@@ -60,101 +67,30 @@ void
 dv_bfin_mmr_invalid (struct hw *me, address_word addr, unsigned nr_bytes,
                     bool write)
 {
-  bfin_mmr_invalid (me, NULL, addr, nr_bytes, write);
+  bfin_mmr_invalid (me, addr, nr_bytes, write, true);
 }
 
-void
+bool
 dv_bfin_mmr_require (struct hw *me, address_word addr, unsigned nr_bytes,
                     unsigned size, bool write)
 {
-  if (nr_bytes != size)
-    dv_bfin_mmr_invalid (me, addr, nr_bytes, write);
-}
-
-static bool
-bfin_mmr_check (struct hw *me, SIM_CPU *cpu, address_word addr,
-               unsigned nr_bytes, bool write)
-{
-  if (addr >= BFIN_CORE_MMR_BASE)
-    {
-      /* All Core MMRs are aligned 32bits.  */
-      if ((addr & 3) == 0 && nr_bytes == 4)
-       return true;
-    }
-  else if (addr >= BFIN_SYSTEM_MMR_BASE)
-    {
-      /* All System MMRs are 32bit aligned, but can be 16bits or 32bits.  */
-      if ((addr & 0x3) == 0 && (nr_bytes == 2 || nr_bytes == 4))
-       return true;
-    }
-  else
+  if ((addr & 0x3) == 0 && nr_bytes == size)
     return true;
 
-  /* Still here ?  Must be crap.  */
-  bfin_mmr_invalid (me, cpu, addr, nr_bytes, write);
-
+  bfin_mmr_invalid (me, addr, nr_bytes, write, false);
   return false;
 }
 
+/* For 32-bit memory mapped registers that allow 16-bit or 32-bit access.  */
 bool
-dv_bfin_mmr_check (struct hw *me, address_word addr, unsigned nr_bytes,
-                  bool write)
+dv_bfin_mmr_require_16_32 (struct hw *me, address_word addr, unsigned nr_bytes,
+                          bool write)
 {
-  return bfin_mmr_check (me, NULL, addr, nr_bytes, write);
-}
-
-int
-device_io_read_buffer (device *me, void *source, int space,
-                      address_word addr, unsigned nr_bytes,
-                      SIM_DESC sd, SIM_CPU *cpu, sim_cia cia)
-{
-  struct hw *dv_me = (struct hw *) me;
-
-  if (STATE_ENVIRONMENT (sd) != OPERATING_ENVIRONMENT)
-    return nr_bytes;
-
-  if (bfin_mmr_check (dv_me, cpu, addr, nr_bytes, false))
-    if (cpu)
-      {
-       sim_cpu_hw_io_read_buffer (cpu, cia, dv_me, source, space,
-                                  addr, nr_bytes);
-       return nr_bytes;
-      }
-    else
-      return sim_hw_io_read_buffer (sd, dv_me, source, space, addr, nr_bytes);
-  else
-    return 0;
-}
-
-int
-device_io_write_buffer (device *me, const void *source, int space,
-                       address_word addr, unsigned nr_bytes,
-                        SIM_DESC sd, SIM_CPU *cpu, sim_cia cia)
-{
-  struct hw *dv_me = (struct hw *) me;
-
-  if (STATE_ENVIRONMENT (sd) != OPERATING_ENVIRONMENT)
-    return nr_bytes;
-
-  if (bfin_mmr_check (dv_me, cpu, addr, nr_bytes, true))
-    if (cpu)
-      {
-       sim_cpu_hw_io_write_buffer (cpu, cia, dv_me, source, space,
-                                   addr, nr_bytes);
-       return nr_bytes;
-      }
-    else
-      return sim_hw_io_write_buffer (sd, dv_me, source, space, addr, nr_bytes);
-  else
-    return 0;
-}
+  if ((addr & 0x3) == 0 && (nr_bytes == 2 || nr_bytes == 4))
+    return true;
 
-void device_error (device *me, const char *message, ...)
-{
-  /* Don't bother doing anything here -- any place in common code that
-     calls device_error() follows it with sim_hw_abort().  Since the
-     device isn't bound to the system yet, we can't call any common
-     hardware error funcs on it or we'll hit a NULL pointer.  */
+  bfin_mmr_invalid (me, addr, nr_bytes, write, false);
+  return false;
 }
 
 unsigned int dv_get_bus_num (struct hw *me)
This page took 0.029876 seconds and 4 git commands to generate.