diff --git a/src/arch/arm/faults.cc b/src/arch/arm/faults.cc index e340d07ca5..ba5bcc940c 100644 --- a/src/arch/arm/faults.cc +++ b/src/arch/arm/faults.cc @@ -881,15 +881,15 @@ SupervisorCall::invoke(ThreadContext *tc, const StaticInstPtr &inst) return; } - // As of now, there isn't a 32 bit thumb version of this instruction. - assert(!machInst.bigThumb); - tc->getSystemPtr()->workload->syscall(tc); - // Advance the PC since that won't happen automatically. PCState pc = tc->pcState().as(); assert(inst); inst->advancePC(pc); tc->pcState(pc); + + // As of now, there isn't a 32 bit thumb version of this instruction. + assert(!machInst.bigThumb); + tc->getSystemPtr()->workload->syscall(tc); } bool diff --git a/src/arch/riscv/faults.cc b/src/arch/riscv/faults.cc index 129e76774e..eea42fe271 100644 --- a/src/arch/riscv/faults.cc +++ b/src/arch/riscv/faults.cc @@ -157,11 +157,12 @@ RiscvFault::invoke(ThreadContext *tc, const StaticInstPtr &inst) if (isInterrupt() && bits(tc->readMiscReg(tvec), 1, 0) == 1) addr += 4 * _code; pc_state.set(addr); + tc->pcState(pc_state); } else { - invokeSE(tc, inst); inst->advancePC(pc_state); + tc->pcState(pc_state); + invokeSE(tc, inst); } - tc->pcState(pc_state); } void diff --git a/src/arch/x86/linux/se_workload.cc b/src/arch/x86/linux/se_workload.cc index f5fa51976d..d280c7cd65 100644 --- a/src/arch/x86/linux/se_workload.cc +++ b/src/arch/x86/linux/se_workload.cc @@ -120,7 +120,7 @@ EmuLinux::syscall(ThreadContext *tc) Addr eip = pc.pc(); const auto &vsyscall = proc32->getVSyscallPage(); if (eip >= vsyscall.base && eip < vsyscall.base + vsyscall.size) { - pc.npc(vsyscall.base + vsyscall.vsysexitOffset); + pc.set(vsyscall.base + vsyscall.vsysexitOffset); tc->pcState(pc); } syscallDescs32.get(rax)->doSyscall(tc); diff --git a/src/sim/faults.cc b/src/sim/faults.cc index 98778f27a4..115c0ed187 100644 --- a/src/sim/faults.cc +++ b/src/sim/faults.cc @@ -71,11 +71,12 @@ UnimpFault::invoke(ThreadContext *tc, const StaticInstPtr &inst) void SESyscallFault::invoke(ThreadContext *tc, const StaticInstPtr &inst) { - tc->getSystemPtr()->workload->syscall(tc); // Move the PC forward since that doesn't happen automatically. std::unique_ptr pc(tc->pcState().clone()); inst->advancePC(*pc); tc->pcState(*pc); + + tc->getSystemPtr()->workload->syscall(tc); } void diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index a74aabfe55..546ae751c3 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -1703,9 +1703,6 @@ cloneFunc(SyscallDesc *desc, ThreadContext *tc, RegVal flags, RegVal newStack, desc->returnInto(ctc, 0); - std::unique_ptr cpc(tc->pcState().clone()); - cpc->advance(); - ctc->pcState(*cpc); ctc->activate(); if (flags & OS::TGT_CLONE_VFORK) { @@ -2267,9 +2264,6 @@ execveFunc(SyscallDesc *desc, ThreadContext *tc, new_p->init(); new_p->initState(); tc->activate(); - std::unique_ptr pc_state(tc->pcState().clone()); - pc_state->advance(); - tc->pcState(*pc_state); return SyscallReturn(); }