byte_swap.hh was removed from arch/alpha/, and replaced by sim/byteswap.hh. The new file uses LittleEndianGuest and BigEndianGuest namespaces to allow selecting the appropriate functions.
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
This commit is contained in:
parent
3d2773195c
commit
2939a7089a
12 changed files with 166 additions and 17 deletions
|
@ -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
|
||||
|
|
|
@ -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__)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
141
sim/byteswap.hh
Normal file
141
sim/byteswap.hh
Normal file
|
@ -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__
|
|
@ -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");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue