mmapped_ipr.cc revision 11793
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
339897Sandreas@sandberg.pp.se#include "mem/packet.hh"
349897Sandreas@sandberg.pp.se#include "mem/packet_access.hh"
359897Sandreas@sandberg.pp.se#include "sim/pseudo_inst.hh"
369897Sandreas@sandberg.pp.se
379897Sandreas@sandberg.pp.seusing namespace GenericISA;
389897Sandreas@sandberg.pp.se
399897Sandreas@sandberg.pp.sestatic void
409897Sandreas@sandberg.pp.sehandlePseudoInst(ThreadContext *xc, Packet *pkt)
419897Sandreas@sandberg.pp.se{
429897Sandreas@sandberg.pp.se    const Addr offset(pkt->getAddr() & IPR_IN_CLASS_MASK);
439897Sandreas@sandberg.pp.se    const uint8_t func((offset >> 8) & 0xFF);
449897Sandreas@sandberg.pp.se    const uint8_t subfunc(offset & 0xFF);
459897Sandreas@sandberg.pp.se    uint64_t ret;
469897Sandreas@sandberg.pp.se
479897Sandreas@sandberg.pp.se    assert((offset >> 16) == 0);
489897Sandreas@sandberg.pp.se    ret = PseudoInst::pseudoInst(xc, func, subfunc);
499897Sandreas@sandberg.pp.se    if (pkt->isRead())
509897Sandreas@sandberg.pp.se        pkt->set(ret);
519897Sandreas@sandberg.pp.se}
529897Sandreas@sandberg.pp.se
539897Sandreas@sandberg.pp.seCycles
549897Sandreas@sandberg.pp.seGenericISA::handleGenericIprRead(ThreadContext *xc, Packet *pkt)
559897Sandreas@sandberg.pp.se{
569897Sandreas@sandberg.pp.se    Addr va(pkt->getAddr());
579911Sandreas@sandberg.pp.se    Addr cls(va >> IPR_CLASS_SHIFT);
589897Sandreas@sandberg.pp.se
599897Sandreas@sandberg.pp.se    switch (cls) {
609897Sandreas@sandberg.pp.se    case IPR_CLASS_PSEUDO_INST:
619897Sandreas@sandberg.pp.se        handlePseudoInst(xc, pkt);
629897Sandreas@sandberg.pp.se        break;
639897Sandreas@sandberg.pp.se    default:
649897Sandreas@sandberg.pp.se        panic("Unhandled generic IPR read: 0x%x\n", va);
659897Sandreas@sandberg.pp.se    }
669897Sandreas@sandberg.pp.se
679897Sandreas@sandberg.pp.se    return Cycles(1);
689897Sandreas@sandberg.pp.se}
699897Sandreas@sandberg.pp.se
709897Sandreas@sandberg.pp.seCycles
719897Sandreas@sandberg.pp.seGenericISA::handleGenericIprWrite(ThreadContext *xc, Packet *pkt)
729897Sandreas@sandberg.pp.se{
739897Sandreas@sandberg.pp.se    Addr va(pkt->getAddr());
749911Sandreas@sandberg.pp.se    Addr cls(va >> IPR_CLASS_SHIFT);
759897Sandreas@sandberg.pp.se
769897Sandreas@sandberg.pp.se    switch (cls) {
779897Sandreas@sandberg.pp.se    case IPR_CLASS_PSEUDO_INST:
789897Sandreas@sandberg.pp.se        handlePseudoInst(xc, pkt);
799897Sandreas@sandberg.pp.se        break;
809897Sandreas@sandberg.pp.se    default:
819897Sandreas@sandberg.pp.se        panic("Unhandled generic IPR write: 0x%x\n", va);
829897Sandreas@sandberg.pp.se    }
839897Sandreas@sandberg.pp.se
849897Sandreas@sandberg.pp.se    return Cycles(1);
859897Sandreas@sandberg.pp.se}
86