diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2018-02-09 12:48:37 +0000 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2018-02-16 09:25:14 +0000 |
commit | b78f216c157c763c208d390b609f0cf70bb45576 (patch) | |
tree | 00298e1cf940585934932a3a9ef4207300fcb62d | |
parent | d5231d14af1fbc52c9325b51cacb86bf2fd91686 (diff) | |
download | gem5-b78f216c157c763c208d390b609f0cf70bb45576.tar.xz |
mem: Add PortProxy read/write helper with explicit endianness
Change-Id: Ia9a11ca68b2892dafd02f2c37324b99b35c77d34
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-by: Jack Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/8146
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
-rw-r--r-- | src/mem/port_proxy.hh | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/mem/port_proxy.hh b/src/mem/port_proxy.hh index e9ddeecbf..ac1873b3c 100644 --- a/src/mem/port_proxy.hh +++ b/src/mem/port_proxy.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 ARM Limited + * Copyright (c) 2011-2013, 2018 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -123,6 +123,20 @@ class PortProxy template <typename T> void write(Addr address, T data) const; + /** + * Read sizeof(T) bytes from address and return as object T. + * Performs selected endianness transform. + */ + template <typename T> + T readGtoH(Addr address, ByteOrder guest_byte_order) const; + + /** + * Write object T to address. Writes sizeof(T) bytes. + * Performs selected endianness transform. + */ + template <typename T> + void writeHtoG(Addr address, T data, ByteOrder guest_byte_order) const; + #if THE_ISA != NULL_ISA /** * Read sizeof(T) bytes from address and return as object T. @@ -157,6 +171,23 @@ PortProxy::write(Addr address, T data) const writeBlob(address, (uint8_t*)&data, sizeof(T)); } +template <typename T> +T +PortProxy::readGtoH(Addr address, ByteOrder byte_order) const +{ + T data; + readBlob(address, (uint8_t*)&data, sizeof(T)); + return gtoh(data, byte_order); +} + +template <typename T> +void +PortProxy::writeHtoG(Addr address, T data, ByteOrder byte_order) const +{ + data = htog(data, byte_order); + writeBlob(address, (uint8_t*)&data, sizeof(T)); +} + #if THE_ISA != NULL_ISA template <typename T> T |