vtophys.cc revision 5568:d14250d688d2
12929Sktlim@umich.edu/*
22929Sktlim@umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
32932Sktlim@umich.edu * All rights reserved.
42929Sktlim@umich.edu *
52929Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without
62929Sktlim@umich.edu * modification, are permitted provided that the following conditions are
72929Sktlim@umich.edu * met: redistributions of source code must retain the above copyright
82929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer;
92929Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright
102929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the
112929Sktlim@umich.edu * documentation and/or other materials provided with the distribution;
122929Sktlim@umich.edu * neither the name of the copyright holders nor the names of its
132929Sktlim@umich.edu * contributors may be used to endorse or promote products derived from
142929Sktlim@umich.edu * this software without specific prior written permission.
152929Sktlim@umich.edu *
162929Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172929Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182929Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192929Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202929Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212929Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222929Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232929Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242929Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252929Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262929Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272929Sktlim@umich.edu *
282932Sktlim@umich.edu * Authors: Nathan Binkert
292932Sktlim@umich.edu *          Steve Reinhardt
302932Sktlim@umich.edu *          Ali Saidi
312929Sktlim@umich.edu */
326007Ssteve.reinhardt@amd.com
337735SAli.Saidi@ARM.com#include <string>
342929Sktlim@umich.edu
352929Sktlim@umich.edu#include "arch/alpha/ev5.hh"
362929Sktlim@umich.edu#include "arch/alpha/vtophys.hh"
372929Sktlim@umich.edu#include "base/chunk_generator.hh"
382929Sktlim@umich.edu#include "base/trace.hh"
392929Sktlim@umich.edu#include "cpu/thread_context.hh"
402929Sktlim@umich.edu#include "mem/vport.hh"
418947Sandreas.hansson@arm.com
428947Sandreas.hansson@arm.comusing namespace std;
438947Sandreas.hansson@arm.com
442929Sktlim@umich.edunamespace AlphaISA {
452929Sktlim@umich.edu
462929Sktlim@umich.eduPageTableEntry
472929Sktlim@umich.edukernel_pte_lookup(FunctionalPort *mem, Addr ptbr, VAddr vaddr)
482929Sktlim@umich.edu{
492929Sktlim@umich.edu    Addr level1_pte = ptbr + vaddr.level1();
506007Ssteve.reinhardt@amd.com    PageTableEntry level1 = mem->read<uint64_t>(level1_pte);
516007Ssteve.reinhardt@amd.com    if (!level1.valid()) {
526007Ssteve.reinhardt@amd.com        DPRINTF(VtoPhys, "level 1 PTE not valid, va = %#\n", vaddr);
536007Ssteve.reinhardt@amd.com        return 0;
546007Ssteve.reinhardt@amd.com    }
556007Ssteve.reinhardt@amd.com
566007Ssteve.reinhardt@amd.com    Addr level2_pte = level1.paddr() + vaddr.level2();
576007Ssteve.reinhardt@amd.com    PageTableEntry level2 = mem->read<uint64_t>(level2_pte);
586007Ssteve.reinhardt@amd.com    if (!level2.valid()) {
596007Ssteve.reinhardt@amd.com        DPRINTF(VtoPhys, "level 2 PTE not valid, va = %#x\n", vaddr);
606007Ssteve.reinhardt@amd.com        return 0;
616007Ssteve.reinhardt@amd.com    }
626007Ssteve.reinhardt@amd.com
636007Ssteve.reinhardt@amd.com    Addr level3_pte = level2.paddr() + vaddr.level3();
646007Ssteve.reinhardt@amd.com    PageTableEntry level3 = mem->read<uint64_t>(level3_pte);
656007Ssteve.reinhardt@amd.com    if (!level3.valid()) {
669435SAndreas.Sandberg@ARM.com        DPRINTF(VtoPhys, "level 3 PTE not valid, va = %#x\n", vaddr);
679435SAndreas.Sandberg@ARM.com        return 0;
689435SAndreas.Sandberg@ARM.com    }
696007Ssteve.reinhardt@amd.com    return level3;
706007Ssteve.reinhardt@amd.com}
716007Ssteve.reinhardt@amd.com
726007Ssteve.reinhardt@amd.comAddr
736007Ssteve.reinhardt@amd.comvtophys(Addr vaddr)
746007Ssteve.reinhardt@amd.com{
756007Ssteve.reinhardt@amd.com    Addr paddr = 0;
766007Ssteve.reinhardt@amd.com    if (IsUSeg(vaddr))
776007Ssteve.reinhardt@amd.com        DPRINTF(VtoPhys, "vtophys: invalid vaddr %#x", vaddr);
786007Ssteve.reinhardt@amd.com    else if (IsK0Seg(vaddr))
792929Sktlim@umich.edu        paddr = K0Seg2Phys(vaddr);
802929Sktlim@umich.edu    else
812929Sktlim@umich.edu        panic("vtophys: ptbr is not set on virtual lookup");
826007Ssteve.reinhardt@amd.com
836007Ssteve.reinhardt@amd.com    DPRINTF(VtoPhys, "vtophys(%#x) -> %#x\n", vaddr, paddr);
846007Ssteve.reinhardt@amd.com
859781Sandreas.hansson@arm.com    return paddr;
866007Ssteve.reinhardt@amd.com}
876007Ssteve.reinhardt@amd.com
882929Sktlim@umich.eduAddr
892929Sktlim@umich.eduvtophys(ThreadContext *tc, Addr addr)
902929Sktlim@umich.edu{
912929Sktlim@umich.edu    VAddr vaddr = addr;
922929Sktlim@umich.edu    Addr ptbr = tc->readMiscRegNoEffect(IPR_PALtemp20);
936011Ssteve.reinhardt@amd.com    Addr paddr = 0;
946007Ssteve.reinhardt@amd.com    //@todo Andrew couldn't remember why he commented some of this code
956007Ssteve.reinhardt@amd.com    //so I put it back in. Perhaps something to do with gdb debugging?
966007Ssteve.reinhardt@amd.com    if (PcPAL(vaddr) && (vaddr < PalMax)) {
976007Ssteve.reinhardt@amd.com        paddr = vaddr & ~ULL(1);
986007Ssteve.reinhardt@amd.com    } else {
996007Ssteve.reinhardt@amd.com        if (IsK0Seg(vaddr)) {
1006007Ssteve.reinhardt@amd.com            paddr = K0Seg2Phys(vaddr);
1016007Ssteve.reinhardt@amd.com        } else if (!ptbr) {
1026007Ssteve.reinhardt@amd.com            paddr = vaddr;
1036007Ssteve.reinhardt@amd.com        } else {
1046007Ssteve.reinhardt@amd.com            PageTableEntry pte =
1056007Ssteve.reinhardt@amd.com                kernel_pte_lookup(tc->getPhysPort(), ptbr, vaddr);
1066007Ssteve.reinhardt@amd.com            if (pte.valid())
10710742Sandreas.hansson@arm.com                paddr = pte.paddr() | vaddr.offset();
10810742Sandreas.hansson@arm.com        }
10910384SCurtis.Dunham@arm.com    }
11010742Sandreas.hansson@arm.com
1116007Ssteve.reinhardt@amd.com
1129781Sandreas.hansson@arm.com    DPRINTF(VtoPhys, "vtophys(%#x) -> %#x\n", vaddr, paddr);
1139781Sandreas.hansson@arm.com
1149781Sandreas.hansson@arm.com    return paddr;
1159781Sandreas.hansson@arm.com}
1167735SAli.Saidi@ARM.com
1176011Ssteve.reinhardt@amd.com} // namespace AlphaISA
1186007Ssteve.reinhardt@amd.com
1199781Sandreas.hansson@arm.com