19897Sandreas@sandberg.pp.se/* 29897Sandreas@sandberg.pp.se * Copyright (c) 2013 Andreas Sandberg 39897Sandreas@sandberg.pp.se * All rights reserved. 49897Sandreas@sandberg.pp.se * 59897Sandreas@sandberg.pp.se * Redistribution and use in source and binary forms, with or without 69897Sandreas@sandberg.pp.se * modification, are permitted provided that the following conditions are 79897Sandreas@sandberg.pp.se * met: redistributions of source code must retain the above copyright 89897Sandreas@sandberg.pp.se * notice, this list of conditions and the following disclaimer; 99897Sandreas@sandberg.pp.se * redistributions in binary form must reproduce the above copyright 109897Sandreas@sandberg.pp.se * notice, this list of conditions and the following disclaimer in the 119897Sandreas@sandberg.pp.se * documentation and/or other materials provided with the distribution; 129897Sandreas@sandberg.pp.se * neither the name of the copyright holders nor the names of its 139897Sandreas@sandberg.pp.se * contributors may be used to endorse or promote products derived from 149897Sandreas@sandberg.pp.se * this software without specific prior written permission. 159897Sandreas@sandberg.pp.se * 169897Sandreas@sandberg.pp.se * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179897Sandreas@sandberg.pp.se * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189897Sandreas@sandberg.pp.se * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199897Sandreas@sandberg.pp.se * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209897Sandreas@sandberg.pp.se * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219897Sandreas@sandberg.pp.se * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229897Sandreas@sandberg.pp.se * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239897Sandreas@sandberg.pp.se * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249897Sandreas@sandberg.pp.se * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259897Sandreas@sandberg.pp.se * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269897Sandreas@sandberg.pp.se * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279897Sandreas@sandberg.pp.se * 289897Sandreas@sandberg.pp.se * Authors: Andreas Sandberg 299897Sandreas@sandberg.pp.se */ 309897Sandreas@sandberg.pp.se 319897Sandreas@sandberg.pp.se#include "arch/generic/mmapped_ipr.hh" 3211793Sbrandon.potter@amd.com 3313344Sgabeblack@google.com#include "arch/isa_traits.hh" 3413344Sgabeblack@google.com#include "config/the_isa.hh" 359897Sandreas@sandberg.pp.se#include "mem/packet.hh" 369897Sandreas@sandberg.pp.se#include "mem/packet_access.hh" 379897Sandreas@sandberg.pp.se#include "sim/pseudo_inst.hh" 389897Sandreas@sandberg.pp.se 399897Sandreas@sandberg.pp.seusing namespace GenericISA; 409897Sandreas@sandberg.pp.se 419897Sandreas@sandberg.pp.sestatic void 429897Sandreas@sandberg.pp.sehandlePseudoInst(ThreadContext *xc, Packet *pkt) 439897Sandreas@sandberg.pp.se{ 449897Sandreas@sandberg.pp.se const Addr offset(pkt->getAddr() & IPR_IN_CLASS_MASK); 459897Sandreas@sandberg.pp.se const uint8_t func((offset >> 8) & 0xFF); 469897Sandreas@sandberg.pp.se const uint8_t subfunc(offset & 0xFF); 479897Sandreas@sandberg.pp.se uint64_t ret; 489897Sandreas@sandberg.pp.se 499897Sandreas@sandberg.pp.se assert((offset >> 16) == 0); 509897Sandreas@sandberg.pp.se ret = PseudoInst::pseudoInst(xc, func, subfunc); 519897Sandreas@sandberg.pp.se if (pkt->isRead()) 5213234Sgabeblack@google.com pkt->set(ret, TheISA::GuestByteOrder); 539897Sandreas@sandberg.pp.se} 549897Sandreas@sandberg.pp.se 559897Sandreas@sandberg.pp.seCycles 569897Sandreas@sandberg.pp.seGenericISA::handleGenericIprRead(ThreadContext *xc, Packet *pkt) 579897Sandreas@sandberg.pp.se{ 589897Sandreas@sandberg.pp.se Addr va(pkt->getAddr()); 599911Sandreas@sandberg.pp.se Addr cls(va >> IPR_CLASS_SHIFT); 609897Sandreas@sandberg.pp.se 619897Sandreas@sandberg.pp.se switch (cls) { 629897Sandreas@sandberg.pp.se case IPR_CLASS_PSEUDO_INST: 639897Sandreas@sandberg.pp.se handlePseudoInst(xc, pkt); 649897Sandreas@sandberg.pp.se break; 659897Sandreas@sandberg.pp.se default: 669897Sandreas@sandberg.pp.se panic("Unhandled generic IPR read: 0x%x\n", va); 679897Sandreas@sandberg.pp.se } 689897Sandreas@sandberg.pp.se 699897Sandreas@sandberg.pp.se return Cycles(1); 709897Sandreas@sandberg.pp.se} 719897Sandreas@sandberg.pp.se 729897Sandreas@sandberg.pp.seCycles 739897Sandreas@sandberg.pp.seGenericISA::handleGenericIprWrite(ThreadContext *xc, Packet *pkt) 749897Sandreas@sandberg.pp.se{ 759897Sandreas@sandberg.pp.se Addr va(pkt->getAddr()); 769911Sandreas@sandberg.pp.se Addr cls(va >> IPR_CLASS_SHIFT); 779897Sandreas@sandberg.pp.se 789897Sandreas@sandberg.pp.se switch (cls) { 799897Sandreas@sandberg.pp.se case IPR_CLASS_PSEUDO_INST: 809897Sandreas@sandberg.pp.se handlePseudoInst(xc, pkt); 819897Sandreas@sandberg.pp.se break; 829897Sandreas@sandberg.pp.se default: 839897Sandreas@sandberg.pp.se panic("Unhandled generic IPR write: 0x%x\n", va); 849897Sandreas@sandberg.pp.se } 859897Sandreas@sandberg.pp.se 869897Sandreas@sandberg.pp.se return Cycles(1); 879897Sandreas@sandberg.pp.se} 88