# Node ID d4162e1b1c563c10e9e60e0f2d654f24231d0284 # Parent 9eca72a2358db57594733ca3a30b700cbe7044ce diff --git a/src/SConscript b/src/SConscript --- a/src/SConscript +++ b/src/SConscript @@ -385,6 +385,7 @@ #define THE_ISA ${{define(target_isa)}} #define TheISA ${{namespace(target_isa)}} #define THE_ISA_STR "${{target_isa}}" +#define ISAPseudoInst ${{namespace(target_isa)}}PseudoInst #endif // __CONFIG_THE_ISA_HH__''') diff --git a/src/arch/SConscript b/src/arch/SConscript --- a/src/arch/SConscript +++ b/src/arch/SConscript @@ -55,6 +55,7 @@ mmapped_ipr.hh mt.hh process.hh + pseudo_inst.hh registers.hh remote_gdb.hh stacktrace.hh diff --git a/src/arch/alpha/SConscript b/src/arch/alpha/SConscript --- a/src/arch/alpha/SConscript +++ b/src/arch/alpha/SConscript @@ -47,6 +47,7 @@ Source('osfpal.cc') Source('pagetable.cc') Source('process.cc') + Source('pseudo_inst.cc') Source('regredir.cc') Source('remote_gdb.cc') Source('stacktrace.cc') diff --git a/src/arch/arm/SConscript b/src/arch/arm/SConscript --- a/src/arch/arm/SConscript +++ b/src/arch/arm/SConscript @@ -68,6 +68,7 @@ Source('miscregs.cc') Source('nativetrace.cc') Source('process.cc') + Source('pseudo_inst.cc') Source('remote_gdb.cc') Source('stacktrace.cc') Source('system.cc') diff --git a/src/arch/arm/pseudo_inst.hh b/src/arch/arm/pseudo_inst.hh new file mode 100644 --- /dev/null +++ b/src/arch/arm/pseudo_inst.hh @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2014 Advanced Micro Devices, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Alexandru Dutu + */ + +#ifndef __ARCH_ARM_PSEUDO_INST_HH__ +#define __ARCH_ARM_PSEUDO_INST_HH__ + +class ThreadContext; + +namespace ArmISAPseudoInst { + void m5syscall(ThreadContext *tc); + void m5pagefault(ThreadContext *tc); +} + +#endif // __ARCH_ARM_PSEUDO_INST_HH__ + diff --git a/src/arch/arm/pseudo_inst.cc b/src/arch/arm/pseudo_inst.cc new file mode 100644 --- /dev/null +++ b/src/arch/arm/pseudo_inst.cc @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2014 Advanced Micro Devices, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Alexandru Dutu + */ + +#include "arch/arm/pseudo_inst.hh" +#include "debug/PseudoInst.hh" +#include "sim/process.hh" + +using namespace ArmISA; + +namespace ArmISAPseudoInst { + +// +// This function is executed when the simulation is executing the syscall +// handler in System Emulation mode. +// +void +m5syscall(ThreadContext *tc) +{ + panic("m5syscall not implemented for ARM ISA"); +} + +// +// This function is executed when the simulation is executing the pagefault +// handler in System Emulation mode. +// +void +m5pagefault(ThreadContext *tc) +{ + panic("m5pagefault not implemented for ARM ISA"); +} + +} // namespace ArmISAPseudoInst diff --git a/src/arch/mips/SConscript b/src/arch/mips/SConscript --- a/src/arch/mips/SConscript +++ b/src/arch/mips/SConscript @@ -45,6 +45,7 @@ Source('linux/system.cc') Source('pagetable.cc') Source('process.cc') + Source('pseudo_inst.cc') Source('remote_gdb.cc') Source('stacktrace.cc') Source('system.cc') diff --git a/src/arch/power/SConscript b/src/arch/power/SConscript --- a/src/arch/power/SConscript +++ b/src/arch/power/SConscript @@ -47,6 +47,7 @@ Source('isa.cc') Source('pagetable.cc') Source('process.cc') + Source('pseudo_inst.cc') Source('stacktrace.cc') Source('tlb.cc') Source('utility.cc') diff --git a/src/arch/sparc/SConscript b/src/arch/sparc/SConscript --- a/src/arch/sparc/SConscript +++ b/src/arch/sparc/SConscript @@ -43,6 +43,7 @@ Source('nativetrace.cc') Source('pagetable.cc') Source('process.cc') + Source('pseudo_inst.cc') Source('remote_gdb.cc') Source('solaris/process.cc') Source('solaris/solaris.cc') diff --git a/src/arch/x86/SConscript b/src/arch/x86/SConscript --- a/src/arch/x86/SConscript +++ b/src/arch/x86/SConscript @@ -65,6 +65,7 @@ Source('pagetable.cc') Source('pagetable_walker.cc') Source('process.cc') + Source('pseudo_inst.cc') Source('remote_gdb.cc') Source('stacktrace.cc') Source('system.cc') diff --git a/src/arch/x86/pseudo_inst.hh b/src/arch/x86/pseudo_inst.hh new file mode 100644 --- /dev/null +++ b/src/arch/x86/pseudo_inst.hh @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2014 Advanced Micro Devices, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Alexandru Dutu + */ + +#ifndef __ARCH_X86_PSEUDO_INST_HH__ +#define __ARCH_X86_PSEUDO_INST_HH__ + +class ThreadContext; + +namespace X86ISAPseudoInst { + void m5syscall(ThreadContext *tc); + void m5pagefault(ThreadContext *tc); +} + +#endif // __ARCH_X86_PSEUDO_INST_HH__ diff --git a/src/arch/x86/pseudo_inst.cc b/src/arch/x86/pseudo_inst.cc new file mode 100644 --- /dev/null +++ b/src/arch/x86/pseudo_inst.cc @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2014 Advanced Micro Devices, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Alexandru Dutu + */ + +#include "arch/x86/pseudo_inst.hh" +#include "debug/PseudoInst.hh" +#include "sim/process.hh" + +using namespace X86ISA; + +namespace X86ISAPseudoInst { + +// +// This function is executed when the simulation is executing the syscall +// handler in System Emulation mode. +// +void +m5syscall(ThreadContext *tc) +{ + DPRINTF(PseudoInst, "PseudoInst::m5syscall()\n"); + + tc->syscall( tc->readIntReg(INTREG_RAX) ); + MiscReg rflags = tc->readMiscReg(MISCREG_RFLAGS); + rflags &= ~(1<<16); + tc->setMiscReg(MISCREG_RFLAGS, rflags); +} + +// +// This function is executed when the simulation is executing the pagefault +// handler in System Emulation mode. +// +void +m5pagefault(ThreadContext *tc) +{ + DPRINTF(PseudoInst, "PseudoInst::m5pagefault()\n"); + + Process *p = tc->getProcessPtr(); + if ( !p->fixupStackFault(tc->readMiscReg(MISCREG_CR2)) ) { + panic("Page fault at %#x ", tc->readMiscReg(MISCREG_CR2)); + } +} + +} // namespace X86ISAPseudoInst diff --git a/src/arch/x86/tlb.cc b/src/arch/x86/tlb.cc --- a/src/arch/x86/tlb.cc +++ b/src/arch/x86/tlb.cc @@ -231,15 +231,22 @@ { Addr paddr = req->getPaddr(); - // Check for an access to the local APIC - if (FullSystem) { + AddrRange m5opRange(0xFFFF0000, 0xFFFFFFFF); + + if (m5opRange.contains(paddr)) { + if (m5opRange.contains(paddr)) { + req->setFlags(Request::MMAPPED_IPR | Request::GENERIC_IPR); + req->setPaddr(GenericISA::iprAddressPseudoInst( + (paddr >> 8) & 0xFF, + paddr & 0xFF)); + } + } else if (FullSystem) { + // Check for an access to the local APIC LocalApicBase localApicBase = tc->readMiscRegNoEffect(MISCREG_APIC_BASE); AddrRange apicRange(localApicBase.base * PageBytes, (localApicBase.base + 1) * PageBytes - 1); - AddrRange m5opRange(0xFFFF0000, 0xFFFFFFFF); - if (apicRange.contains(paddr)) { // The Intel developer's manuals say the below restrictions apply, // but the linux kernel, because of a compiler optimization, breaks @@ -256,11 +263,6 @@ req->setFlags(Request::UNCACHEABLE); req->setPaddr(x86LocalAPICAddress(tc->contextId(), paddr - apicRange.start())); - } else if (m5opRange.contains(paddr)) { - req->setFlags(Request::MMAPPED_IPR | Request::GENERIC_IPR); - req->setPaddr(GenericISA::iprAddressPseudoInst( - (paddr >> 8) & 0xFF, - paddr & 0xFF)); } } diff --git a/src/arch/x86/utility.cc b/src/arch/x86/utility.cc --- a/src/arch/x86/utility.cc +++ b/src/arch/x86/utility.cc @@ -52,9 +52,7 @@ uint64_t getArgument(ThreadContext *tc, int &number, uint16_t size, bool fp) { - if (!FullSystem) { - panic("getArgument() only implemented for full system mode.\n"); - } else if (fp) { + if (fp) { panic("getArgument(): Floating point arguments not implemented\n"); } else if (size != 8) { panic("getArgument(): Can only handle 64-bit arguments.\n"); diff --git a/src/cpu/kvm/base.cc b/src/cpu/kvm/base.cc --- a/src/cpu/kvm/base.cc +++ b/src/cpu/kvm/base.cc @@ -85,8 +85,14 @@ panic("KVM: Failed to determine host page size (%i)\n", errno); - thread = new SimpleThread(this, 0, params->system, - params->itb, params->dtb, params->isa[0]); + if (FullSystem) + thread = new SimpleThread(this, 0, params->system, params->itb, params->dtb, + params->isa[0]); + else + thread = new SimpleThread(this, /* thread_num */ 0, params->system, + params->workload[0], params->itb, + params->dtb, params->isa[0]); + thread->setStatus(ThreadContext::Halted); tc = thread->getTC(); threadContexts.push_back(tc); @@ -1011,6 +1017,7 @@ const Cycles ipr_delay(write ? TheISA::handleIprWrite(tc, &pkt) : TheISA::handleIprRead(tc, &pkt)); + threadContextDirty = true; return clockPeriod() * ipr_delay; } else { // Temporarily lock and migrate to the event queue of the diff --git a/src/sim/pseudo_inst.cc b/src/sim/pseudo_inst.cc --- a/src/sim/pseudo_inst.cc +++ b/src/sim/pseudo_inst.cc @@ -52,6 +52,7 @@ #include "arch/kernel_stats.hh" #include "arch/utility.hh" #include "arch/vtophys.hh" +#include "arch/pseudo_inst.hh" #include "base/debug.hh" #include "base/output.hh" #include "config/the_isa.hh" @@ -64,6 +65,7 @@ #include "debug/WorkItems.hh" #include "params/BaseCPU.hh" #include "sim/full_system.hh" +#include "sim/process.hh" #include "sim/pseudo_inst.hh" #include "sim/serialize.hh" #include "sim/sim_events.hh" @@ -77,6 +79,7 @@ using namespace Stats; using namespace TheISA; +using namespace ISAPseudoInst; namespace PseudoInst { @@ -198,6 +201,15 @@ warn("Unimplemented m5 op (0x%x)\n", func); break; + /* SE mode functions */ + case 0x60: // syscall_func + m5syscall(tc); + break; + + case 0x61: // pagefault_func + m5pagefault(tc); + break; + default: warn("Unhandled m5 op: 0x%x\n", func); break; diff --git a/src/sim/system.cc b/src/sim/system.cc --- a/src/sim/system.cc +++ b/src/sim/system.cc @@ -319,6 +319,16 @@ { Addr return_addr = pagePtr << PageShift; pagePtr += npages; + + Addr next_return_addr = pagePtr << PageShift; + + AddrRange m5opRange(0xffff0000, 0xffffffff); + if (m5opRange.contains(next_return_addr)) { + warn("Reached m5ops MMIO region\n"); + return_addr = 0xffffffff; + pagePtr = 0xffffffff >> PageShift; + } + if ((pagePtr << PageShift) > physmem.totalSize()) fatal("Out of memory, please increase size of physical memory."); return return_addr; diff --git a/util/m5/m5ops.h b/util/m5/m5ops.h --- a/util/m5/m5ops.h +++ b/util/m5/m5ops.h @@ -54,8 +54,8 @@ #define addsymbol_func 0x53 #define panic_func 0x54 -#define reserved2_func 0x56 // Reserved for user -#define reserved3_func 0x57 // Reserved for user +#define syscall_func 0x56 // Reserved for user +#define pagefault_func 0x57 // Reserved for user #define reserved4_func 0x58 // Reserved for user #define reserved5_func 0x59 // Reserved for user