From dbde1502cd089ae4eb2fac032348a5524f199939 Mon Sep 17 00:00:00 2001 From: Nilay Vaish Date: Mon, 11 Jul 2011 16:52:52 -0500 Subject: X86: implements copyRegs() function This patch implements the copyRegs() function for the x86 architecture. The patch assumes that no side effects other than TLB invalidation need to be considered while copying the registers. This may not hold true in future. --- src/arch/x86/utility.cc | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src/arch/x86') diff --git a/src/arch/x86/utility.cc b/src/arch/x86/utility.cc index 756e9d526..29c770f3d 100644 --- a/src/arch/x86/utility.cc +++ b/src/arch/x86/utility.cc @@ -1,5 +1,6 @@ /* * Copyright (c) 2007 The Hewlett-Packard Development Company + * Copyright (c) 2011 Advanced Micro Devices, Inc. * All rights reserved. * * The license below extends only to copyright in the software and shall @@ -42,9 +43,8 @@ #if FULL_SYSTEM #include "arch/x86/interrupts.hh" #endif -#include "arch/x86/regs/int.hh" -#include "arch/x86/regs/misc.hh" -#include "arch/x86/regs/segment.hh" +#include "arch/x86/registers.hh" +#include "arch/x86/tlb.hh" #include "arch/x86/utility.hh" #include "arch/x86/x86_traits.hh" #include "cpu/base.hh" @@ -214,7 +214,9 @@ void startupCPU(ThreadContext *tc, int cpuId) void copyMiscRegs(ThreadContext *src, ThreadContext *dest) { - warn("copyMiscRegs is naively implemented for x86\n"); + // This function assumes no side effects other than TLB invalidation + // need to be considered while copying state. That will likely not be + // true in the future. for (int i = 0; i < NUM_MISCREGS; ++i) { if ( ( i != MISCREG_CR1 && !(i > MISCREG_CR4 && i < MISCREG_CR8) && @@ -223,16 +225,21 @@ copyMiscRegs(ThreadContext *src, ThreadContext *dest) } dest->setMiscRegNoEffect(i, src->readMiscRegNoEffect(i)); } + + dest->getITBPtr()->invalidateAll(); + dest->getDTBPtr()->invalidateAll(); } void copyRegs(ThreadContext *src, ThreadContext *dest) { - panic("copyRegs not implemented for x86!\n"); //copy int regs + for (int i = 0; i < NumIntRegs; ++i) + dest->setIntReg(i, src->readIntReg(i)); //copy float regs + for (int i = 0; i < NumFloatRegs; ++i) + dest->setFloatRegBits(i, src->readFloatRegBits(i)); copyMiscRegs(src, dest); - dest->pcState(src->pcState()); } -- cgit v1.2.3