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