13348Sbinkertn@umich.edu/*
211013Sandreas.sandberg@arm.com * Copyright (c) 2015 ARM Limited
311013Sandreas.sandberg@arm.com * All rights reserved
411013Sandreas.sandberg@arm.com *
511013Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall
611013Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual
711013Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating
811013Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software
911013Sandreas.sandberg@arm.com * licensed hereunder.  You may use the software subject to the license
1011013Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated
1111013Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software,
1211013Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form.
1311013Sandreas.sandberg@arm.com *
143348Sbinkertn@umich.edu * Copyright (c) 2006 The Regents of The University of Michigan
153348Sbinkertn@umich.edu * All rights reserved.
163348Sbinkertn@umich.edu *
173348Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without
183348Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are
193348Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright
203348Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer;
213348Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright
223348Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the
233348Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution;
243348Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its
253348Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from
263348Sbinkertn@umich.edu * this software without specific prior written permission.
273348Sbinkertn@umich.edu *
283348Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
293348Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
303348Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
313348Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
323348Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
333348Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
343348Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
353348Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
363348Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
373348Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
383348Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
393348Sbinkertn@umich.edu *
403348Sbinkertn@umich.edu * Authors: Ali Saidi
413348Sbinkertn@umich.edu *          Nathan Binkert
4211013Sandreas.sandberg@arm.com *          Andreas Sandberg
433348Sbinkertn@umich.edu */
443348Sbinkertn@umich.edu
453348Sbinkertn@umich.edu#include "arch/isa_traits.hh"
463348Sbinkertn@umich.edu#include "mem/packet.hh"
473348Sbinkertn@umich.edu#include "sim/byteswap.hh"
483348Sbinkertn@umich.edu
493348Sbinkertn@umich.edu#ifndef __MEM_PACKET_ACCESS_HH__
503348Sbinkertn@umich.edu#define __MEM_PACKET_ACCESS_HH__
513348Sbinkertn@umich.edu
523348Sbinkertn@umich.edutemplate <typename T>
533348Sbinkertn@umich.eduinline T
5411013Sandreas.sandberg@arm.comPacket::getRaw() const
553348Sbinkertn@umich.edu{
565764Snate@binkert.org    assert(flags.isSet(STATIC_DATA|DYNAMIC_DATA));
573348Sbinkertn@umich.edu    assert(sizeof(T) <= size);
5811013Sandreas.sandberg@arm.com    return *(T*)data;
593348Sbinkertn@umich.edu}
603348Sbinkertn@umich.edu
613348Sbinkertn@umich.edutemplate <typename T>
623348Sbinkertn@umich.eduinline void
6311013Sandreas.sandberg@arm.comPacket::setRaw(T v)
643348Sbinkertn@umich.edu{
655764Snate@binkert.org    assert(flags.isSet(STATIC_DATA|DYNAMIC_DATA));
663348Sbinkertn@umich.edu    assert(sizeof(T) <= size);
6711295Sstever@gmail.com    *(T*)data = v;
683348Sbinkertn@umich.edu}
693348Sbinkertn@umich.edu
7011013Sandreas.sandberg@arm.com
7111013Sandreas.sandberg@arm.comtemplate <typename T>
7211013Sandreas.sandberg@arm.cominline T
7311013Sandreas.sandberg@arm.comPacket::getBE() const
7411013Sandreas.sandberg@arm.com{
7511013Sandreas.sandberg@arm.com    return betoh(getRaw<T>());
7611013Sandreas.sandberg@arm.com}
7711013Sandreas.sandberg@arm.com
7811013Sandreas.sandberg@arm.comtemplate <typename T>
7911013Sandreas.sandberg@arm.cominline T
8011013Sandreas.sandberg@arm.comPacket::getLE() const
8111013Sandreas.sandberg@arm.com{
8211013Sandreas.sandberg@arm.com    return letoh(getRaw<T>());
8311013Sandreas.sandberg@arm.com}
8411013Sandreas.sandberg@arm.com
8511013Sandreas.sandberg@arm.comtemplate <typename T>
8611013Sandreas.sandberg@arm.cominline T
8711013Sandreas.sandberg@arm.comPacket::get(ByteOrder endian) const
8811013Sandreas.sandberg@arm.com{
8911013Sandreas.sandberg@arm.com    switch (endian) {
9011013Sandreas.sandberg@arm.com      case BigEndianByteOrder:
9111013Sandreas.sandberg@arm.com        return getBE<T>();
9211013Sandreas.sandberg@arm.com
9311013Sandreas.sandberg@arm.com      case LittleEndianByteOrder:
9411013Sandreas.sandberg@arm.com        return getLE<T>();
9511013Sandreas.sandberg@arm.com
9611013Sandreas.sandberg@arm.com      default:
9711013Sandreas.sandberg@arm.com        panic("Illegal byte order in Packet::get()\n");
9811013Sandreas.sandberg@arm.com    };
9911013Sandreas.sandberg@arm.com}
10011013Sandreas.sandberg@arm.com
10113347Sgabeblack@google.com#if THE_ISA != NULL_ISA
10211013Sandreas.sandberg@arm.comtemplate <typename T>
10311013Sandreas.sandberg@arm.cominline T
10411013Sandreas.sandberg@arm.comPacket::get() const
10511013Sandreas.sandberg@arm.com{
10611013Sandreas.sandberg@arm.com    return TheISA::gtoh(getRaw<T>());
10711013Sandreas.sandberg@arm.com}
10813347Sgabeblack@google.com#endif
10911013Sandreas.sandberg@arm.com
11011013Sandreas.sandberg@arm.comtemplate <typename T>
11111013Sandreas.sandberg@arm.cominline void
11211013Sandreas.sandberg@arm.comPacket::setBE(T v)
11311013Sandreas.sandberg@arm.com{
11411013Sandreas.sandberg@arm.com    setRaw(htobe(v));
11511013Sandreas.sandberg@arm.com}
11611013Sandreas.sandberg@arm.com
11711013Sandreas.sandberg@arm.comtemplate <typename T>
11811013Sandreas.sandberg@arm.cominline void
11911013Sandreas.sandberg@arm.comPacket::setLE(T v)
12011013Sandreas.sandberg@arm.com{
12111013Sandreas.sandberg@arm.com    setRaw(htole(v));
12211013Sandreas.sandberg@arm.com}
12311013Sandreas.sandberg@arm.com
12411013Sandreas.sandberg@arm.comtemplate <typename T>
12511013Sandreas.sandberg@arm.cominline void
12611013Sandreas.sandberg@arm.comPacket::set(T v, ByteOrder endian)
12711013Sandreas.sandberg@arm.com{
12811013Sandreas.sandberg@arm.com    switch (endian) {
12911013Sandreas.sandberg@arm.com      case BigEndianByteOrder:
13011013Sandreas.sandberg@arm.com        return setBE<T>(v);
13111013Sandreas.sandberg@arm.com
13211013Sandreas.sandberg@arm.com      case LittleEndianByteOrder:
13311013Sandreas.sandberg@arm.com        return setLE<T>(v);
13411013Sandreas.sandberg@arm.com
13511013Sandreas.sandberg@arm.com      default:
13611013Sandreas.sandberg@arm.com        panic("Illegal byte order in Packet::set()\n");
13711013Sandreas.sandberg@arm.com    };
13811013Sandreas.sandberg@arm.com}
13911013Sandreas.sandberg@arm.com
14013347Sgabeblack@google.com#if THE_ISA != NULL_ISA
14111013Sandreas.sandberg@arm.comtemplate <typename T>
14211013Sandreas.sandberg@arm.cominline void
14311013Sandreas.sandberg@arm.comPacket::set(T v)
14411013Sandreas.sandberg@arm.com{
14511013Sandreas.sandberg@arm.com    setRaw(TheISA::htog(v));
14611013Sandreas.sandberg@arm.com}
14713347Sgabeblack@google.com#endif
14811013Sandreas.sandberg@arm.com
1493348Sbinkertn@umich.edu#endif //__MEM_PACKET_ACCESS_HH__
150