From 9b124fac8f8584ccfc2834ddbb52a5e63e76f437 Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Fri, 21 Jun 2013 11:04:34 +0200 Subject: [PATCH] sal/bochs: force eflags after writing The correct flags accessor methods should be used to write the flags register, since values (especially the arithmetic flags) might be cached. Change-Id: I338927cfdd1f111966be539668914c9256b54c8f --- src/core/sal/bochs/BochsCPU.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/core/sal/bochs/BochsCPU.cc b/src/core/sal/bochs/BochsCPU.cc index 3ba78a35..b52b93e7 100644 --- a/src/core/sal/bochs/BochsCPU.cc +++ b/src/core/sal/bochs/BochsCPU.cc @@ -10,8 +10,9 @@ regdata_t BochsCPU::getRegisterContent(const Register* reg) const assert(reg != NULL && "FATAL ERROR: reg-ptr cannot be NULL!"); // TODO: BX_CPU(0) *always* correct? - if (reg->getId() == RID_FLAGS) // EFLAGS register? - return static_cast(BX_CPU(id)->eflags); + if (reg->getId() == RID_FLAGS) { // EFLAGS register? + return static_cast(BX_CPU(id)->read_eflags()); + } #ifdef SIM_SUPPORT_64 if (reg->getId() == RID_PC) // program counter? @@ -32,13 +33,15 @@ void BochsCPU::setRegisterContent(const Register* reg, regdata_t value) // TODO: BX_CPU(0) *always* correct? if (reg->getId() == RID_FLAGS) { // EFLAGS register? - regdata_t* pData = reinterpret_cast(&(BX_CPU(id)->eflags)); + regdata_t regdata = getRegisterContent(reg); #ifdef SIM_SUPPORT_64 // We are in 64 bit mode: Just assign the lower 32 bits! - *pData = ((*pData) & 0xFFFFFFFF00000000ULL) | (value & 0xFFFFFFFFULL); + BX_CPU(id)->writeEFlags((regdata & 0xFFFFFFFF00000000ULL) | (value & 0xFFFFFFFFULL), + 0xffffffff); #else - *pData = value; + BX_CPU(id)->writeEFlags(value, 0xffffffff); #endif + BX_CPU(id)->force_flags(); return; }