byte_swap.hh was removed from arch/alpha/, and replaced by sim/byteswap.hh. The new...
authorGabe Black <gblack@eecs.umich.edu>
Fri, 3 Feb 2006 05:16:44 +0000 (00:16 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 3 Feb 2006 05:16:44 +0000 (00:16 -0500)
arch/alpha/alpha_linux_process.cc:
arch/alpha/alpha_tru64_process.cc:
    Added the endianness namespace. This may change.
cpu/exec_context.hh:
    Changed the include path for byteswap, and forced LittleEndianness for lack of a better solution.
cpu/o3/alpha_cpu.hh:
    Forced LittleEndianness, for lack of a better solution.
cpu/o3/alpha_cpu_impl.hh:
    Cleared away some commented out code.
cpu/o3/fetch_impl.hh:
    Changed the include patch for byteswap, and forced LittleEndianness for lack of a better solution.
cpu/simple/cpu.cc:
    Added an include for byteswap.hh, and fixed the SimpleCPU to LittleEndian. This cpu only does alpha, so that's fine.
dev/disk_image.cc:
    Changed the include path of byteswap.hh
kern/freebsd/freebsd_system.cc:
kern/linux/linux_system.cc:
    Added an include for byteswap.hh, and forced LittleEndianness for lack of a better solution.
sim/system.cc:
    Forced LittleEndianness for lack of a better solution.

--HG--
extra : convert_revision : b95d3e1265a825e04bd77622a3ac09fbac6bd206

12 files changed:
arch/alpha/alpha_linux_process.cc
arch/alpha/alpha_tru64_process.cc
cpu/exec_context.hh
cpu/o3/alpha_cpu.hh
cpu/o3/alpha_cpu_impl.hh
cpu/o3/fetch_impl.hh
cpu/simple/cpu.cc
dev/disk_image.cc
kern/freebsd/freebsd_system.cc
kern/linux/linux_system.cc
sim/byteswap.hh [new file with mode: 0644]
sim/system.cc

index 83b0b5e5a11b4bb259ab12f453d1e206a02aa38c..16cbf38418dd1827f75e919bd55f9cf5beaa5c97 100644 (file)
@@ -26,6 +26,9 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+namespace LittleEndian {}
+using namespace LittleEndian;
+
 #include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>     // for host open() flags
index b7a1c7d5920f0f41cb4f65ec0145a9d36fa0087b..d57054dfd5d4c7cf049fe45a3ad03d2e76dddb7e 100644 (file)
@@ -26,6 +26,9 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+namespace LittleEndian {}
+using namespace LittleEndian;
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #if defined(__OpenBSD__)
index 6f38a69604ee78b4e64de92b7e1371cbf779a8c2..2bde053b2e54add825d9b9e7d946390940478092 100644 (file)
@@ -34,7 +34,7 @@
 #include "mem/mem_req.hh"
 #include "sim/host.hh"
 #include "sim/serialize.hh"
-#include "targetarch/byte_swap.hh"
+#include "sim/byteswap.hh"
 
 // forward declaration: see functional_memory.hh
 class FunctionalMemory;
@@ -269,7 +269,7 @@ class ExecContext
 
         Fault error;
         error = mem->read(req, data);
-        data = gtoh(data);
+        data = LittleEndianGuest::gtoh(data);
         return error;
     }
 
@@ -319,7 +319,7 @@ class ExecContext
         }
 
 #endif
-        return mem->write(req, (T)htog(data));
+        return mem->write(req, (T)LittleEndianGuest::htog(data));
     }
 
     virtual bool misspeculating();
index cba57d18985fab3ee42cfe6d31be832d7b5796e2..164da4968d149130afa3329665eec6f114366621 100644 (file)
@@ -220,7 +220,7 @@ class AlphaFullCPU : public FullO3CPU<Impl>
 
         Fault error;
         error = this->mem->read(req, data);
-        data = gtoh(data);
+        data = LittleEndianGuest::gtoh(data);
         return error;
     }
 
@@ -277,7 +277,7 @@ class AlphaFullCPU : public FullO3CPU<Impl>
 
 #endif
 
-        return this->mem->write(req, (T)htog(data));
+        return this->mem->write(req, (T)LittleEndianGuest::htog(data));
     }
 
     template <class T>
index 2a764740b828be2f7499319923b88e3468ea3b15..3b16975a92243979952c8a5f636baa7d341f6fb7 100644 (file)
@@ -42,9 +42,6 @@
 #if FULL_SYSTEM
 #include "arch/alpha/osfpal.hh"
 #include "arch/alpha/isa_traits.hh"
-//#include "arch/alpha/ev5.hh"
-
-//using namespace EV5;
 #endif
 
 template <class Impl>
index c943fd36a9890bd7b0fa4f5c6ab2d26c7241109f..1a8411cc1690e83a6f891a5610d6f5a301991c9c 100644 (file)
@@ -30,7 +30,7 @@
 #define OPCODE(X)                       (X >> 26) & 0x3f
 
 
-#include "arch/alpha/byte_swap.hh"
+#include "sim/byteswap.hh"
 #include "cpu/exetrace.hh"
 #include "mem/base_mem.hh"
 #include "mem/mem_interface.hh"
@@ -535,7 +535,7 @@ SimpleFetch<Impl>::fetch()
             assert(offset <= cacheBlkSize - instSize);
 
             // Get the instruction from the array of the cache line.
-            inst = gtoh(*reinterpret_cast<MachInst *>
+            inst = LittleEndianGuest::gtoh(*reinterpret_cast<MachInst *>
                         (&cacheData[offset]));
 
             // Create a new DynInst from the instruction fetched.
index a7f4fa49937c5a39b83f94b85a250fc81d9371d9..70217f0bb1dd5d6b42dc0a5894f9b21c57dbca38 100644 (file)
@@ -54,6 +54,7 @@
 #include "kern/kernel_stats.hh"
 #include "mem/base_mem.hh"
 #include "mem/mem_interface.hh"
+#include "sim/byteswap.hh"
 #include "sim/builder.hh"
 #include "sim/debug.hh"
 #include "sim/host.hh"
@@ -74,6 +75,8 @@
 #endif // FULL_SYSTEM
 
 using namespace std;
+//The SimpleCPU does alpha only
+using namespace LittleEndianGuest;
 
 
 SimpleCPU::TickEvent::TickEvent(SimpleCPU *c, int w)
index 106723c554d50ecacdd0f817d14d5b306fd3967b..447c54697db928f7faeb9586f0d5d54d3b8c2169 100644 (file)
@@ -46,7 +46,7 @@
 #include "dev/disk_image.hh"
 #include "sim/builder.hh"
 #include "sim/sim_exit.hh"
-#include "targetarch/byte_swap.hh"
+#include "sim/byteswap.hh"
 
 using namespace std;
 
index 283713d40d02286744908dc2112a5da251735dac..f3fe84e007e35ec9d35346c3dfb1398c6fb6fef0 100644 (file)
@@ -39,6 +39,7 @@
 #include "mem/functional/memory_control.hh"
 #include "mem/functional/physical.hh"
 #include "sim/builder.hh"
+#include "sim/byteswap.hh"
 #include "targetarch/vtophys.hh"
 
 #define TIMER_FREQUENCY 1193180
@@ -82,8 +83,8 @@ FreebsdSystem::doCalibrateClocks(ExecContext *xc)
     uint8_t *ppc = physmem->dma_addr(ppc_paddr, sizeof(uint32_t));
     uint8_t *timer = physmem->dma_addr(timer_paddr, sizeof(uint32_t));
 
-    *(uint32_t *)ppc = htog((uint32_t)Clock::Frequency);
-    *(uint32_t *)timer = htog((uint32_t)TIMER_FREQUENCY);
+    *(uint32_t *)ppc = LittleEndianGuest::htog((uint32_t)Clock::Frequency);
+    *(uint32_t *)timer = LittleEndianGuest::htog((uint32_t)TIMER_FREQUENCY);
 }
 
 
index 1144b9bdd4e686ce599eb394e55d9675363ba88c..26a4c0d3e39786dc1df79bfd75cffd99b7785698 100644 (file)
@@ -44,6 +44,7 @@
 #include "mem/functional/memory_control.hh"
 #include "mem/functional/physical.hh"
 #include "sim/builder.hh"
+#include "sim/byteswap.hh"
 #include "dev/platform.hh"
 #include "targetarch/arguments.hh"
 #include "targetarch/vtophys.hh"
@@ -100,7 +101,7 @@ LinuxSystem::LinuxSystem(Params *p)
         char *dp264_mv = (char *)physmem->dma_addr(paddr, sizeof(uint64_t));
 
         if (dp264_mv) {
-            *(uint32_t*)(dp264_mv+0x18) = htog((uint32_t)127);
+            *(uint32_t*)(dp264_mv+0x18) = LittleEndianGuest::htog((uint32_t)127);
         } else
             panic("could not translate dp264_mv addr\n");
 
diff --git a/sim/byteswap.hh b/sim/byteswap.hh
new file mode 100644 (file)
index 0000000..12d63b6
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2004 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+//The purpose of this file is to provide endainness conversion utility
+//functions. Depending on the endianness of the guest system, either
+//the LittleEndianGuest or BigEndianGuest namespace is used.
+
+#ifndef __SIM_BYTE_SWAP_HH__
+#define __SIM_BYTE_SWAP_HH__
+
+#include "sim/host.hh"
+
+// This lets us figure out what the byte order of the host system is
+#if defined(linux)
+#include <endian.h>
+#else
+#include <machine/endian.h>
+#endif
+
+//These functions actually perform the swapping for parameters
+//of various bit lengths
+static inline uint64_t
+swap_byte64(uint64_t x)
+{
+    return  (uint64_t)((((uint64_t)(x) & 0xff) << 56) |
+            ((uint64_t)(x) & 0xff00ULL) << 40 |
+            ((uint64_t)(x) & 0xff0000ULL) << 24 |
+            ((uint64_t)(x) & 0xff000000ULL) << 8 |
+            ((uint64_t)(x) & 0xff00000000ULL) >> 8 |
+            ((uint64_t)(x) & 0xff0000000000ULL) >> 24 |
+            ((uint64_t)(x) & 0xff000000000000ULL) >> 40 |
+            ((uint64_t)(x) & 0xff00000000000000ULL) >> 56) ;
+}
+
+static inline uint32_t
+swap_byte32(uint32_t x)
+{
+    return  (uint32_t)(((uint32_t)(x) & 0xff) << 24 |
+            ((uint32_t)(x) & 0xff00) << 8 | ((uint32_t)(x) & 0xff0000) >> 8 |
+            ((uint32_t)(x) & 0xff000000) >> 24);
+
+}
+
+static inline uint16_t
+swap_byte16(uint16_t x)
+{
+    return (uint16_t)(((uint16_t)(x) & 0xff) << 8 |
+                      ((uint16_t)(x) & 0xff00) >> 8);
+}
+
+//This lets the compiler figure out how to call the swap_byte functions above
+//for different data types.
+static inline uint64_t swap_byte(uint64_t x) {return swap_byte64(x);} \
+static inline int64_t swap_byte(int64_t x) {return swap_byte64((uint64_t)x);} \
+static inline uint32_t swap_byte(uint32_t x) {return swap_byte32(x);} \
+static inline int32_t swap_byte(int32_t x) {return swap_byte32((uint32_t)x);} \
+static inline uint16_t swap_byte(uint16_t x) {return swap_byte32(x);} \
+static inline int16_t swap_byte(int16_t x) {return swap_byte16((uint16_t)x);} \
+static inline uint8_t swap_byte(uint8_t x) {return x;} \
+static inline int8_t swap_byte(int8_t x) {return x;} \
+static inline double swap_byte(double x) {return swap_byte64((uint64_t)x);} \
+static inline float swap_byte(float x) {return swap_byte32((uint32_t)x);}
+
+//The conversion functions with fixed endianness on both ends don't need to
+//be in a namespace
+template <typename T> static inline T betole(T value) {return swap_byte(value);}
+template <typename T> static inline T letobe(T value) {return swap_byte(value);}
+
+//For conversions not involving the guest system, we can define the functions
+//conditionally based on the BYTE_ORDER macro and outside of the namespaces
+#if BYTE_ORDER == BIG_ENDIAN
+template <typename T> static inline T htole(T value) {return swap_byte(value);}
+template <typename T> static inline T letoh(T value) {return swap_byte(value);}
+template <typename T> static inline T htobe(T value) {return value;}
+template <typename T> static inline T betoh(T value) {return value;}
+#elif BYTE_ORDER == LITTLE_ENDIAN
+template <typename T> static inline T htole(T value) {return value;}
+template <typename T> static inline T letoh(T value) {return value;}
+template <typename T> static inline T htobe(T value) {return swap_byte(value);}
+template <typename T> static inline T betoh(T value) {return swap_byte(value);}
+#else
+        #error Invalid Endianess
+#endif
+
+namespace BigEndianGuest
+{
+        template <typename T>
+        static inline T gtole(T value) {return betole(value);}
+        template <typename T>
+        static inline T letog(T value) {return letobe(value);}
+        template <typename T>
+        static inline T gtobe(T value) {return value;}
+        template <typename T>
+        static inline T betog(T value) {return value;}
+        template <typename T>
+        static inline T htog(T value) {return htobe(value);}
+        template <typename T>
+        static inline T gtoh(T value) {return betoh(value);}
+}
+
+namespace LittleEndianGuest
+{
+        template <typename T>
+        static inline T gtole(T value) {return value;}
+        template <typename T>
+        static inline T letog(T value) {return value;}
+        template <typename T>
+        static inline T gtobe(T value) {return letobe(value);}
+        template <typename T>
+        static inline T betog(T value) {return betole(value);}
+        template <typename T>
+        static inline T htog(T value) {return htole(value);}
+        template <typename T>
+        static inline T gtoh(T value) {return letoh(value);}
+}
+#endif // __SIM_BYTE_SWAP_HH__
index 4bcc89c561c0f47cde3327bc826564d2ce06d19e..a69bf27f1bd2a475e1988cbc7e0d571ea41948c7 100644 (file)
@@ -152,8 +152,8 @@ System::System(Params *p)
         if (!hwrpb)
             panic("could not translate hwrpb addr\n");
 
-        *(uint64_t*)(hwrpb+0x50) = htog(params->system_type);
-        *(uint64_t*)(hwrpb+0x58) = htog(params->system_rev);
+        *(uint64_t*)(hwrpb+0x50) = LittleEndianGuest::htog(params->system_type);
+        *(uint64_t*)(hwrpb+0x58) = LittleEndianGuest::htog(params->system_rev);
     } else
         panic("could not find hwrpb\n");
 
@@ -249,7 +249,7 @@ System::setAlphaAccess(Addr access)
         if (!m5AlphaAccess)
             panic("could not translate m5AlphaAccess addr\n");
 
-        *m5AlphaAccess = htog(EV5::Phys2K0Seg(access));
+        *m5AlphaAccess = LittleEndianGuest::htog(EV5::Phys2K0Seg(access));
     } else
         panic("could not find m5AlphaAccess\n");
 }