utility.cc (9920:028e4da64b42) utility.cc (9921:ee049bfce978)
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * Copyright (c) 2011 Advanced Micro Devices, Inc.
4 * All rights reserved.
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating

--- 230 unchanged lines hidden (view full) ---

239copyRegs(ThreadContext *src, ThreadContext *dest)
240{
241 //copy int regs
242 for (int i = 0; i < NumIntRegs; ++i)
243 dest->setIntReg(i, src->readIntReg(i));
244 //copy float regs
245 for (int i = 0; i < NumFloatRegs; ++i)
246 dest->setFloatRegBits(i, src->readFloatRegBits(i));
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * Copyright (c) 2011 Advanced Micro Devices, Inc.
4 * All rights reserved.
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating

--- 230 unchanged lines hidden (view full) ---

239copyRegs(ThreadContext *src, ThreadContext *dest)
240{
241 //copy int regs
242 for (int i = 0; i < NumIntRegs; ++i)
243 dest->setIntReg(i, src->readIntReg(i));
244 //copy float regs
245 for (int i = 0; i < NumFloatRegs; ++i)
246 dest->setFloatRegBits(i, src->readFloatRegBits(i));
247 // Will need to add condition-code regs when implemented
248 assert(NumCCRegs == 0);
247 //copy condition-code regs
248 for (int i = 0; i < NumCCRegs; ++i)
249 dest->setCCReg(i, src->readCCReg(i));
249 copyMiscRegs(src, dest);
250 dest->pcState(src->pcState());
251}
252
253void
254skipFunction(ThreadContext *tc)
255{
256 panic("Not implemented for x86\n");
257}
258
259uint64_t
260getRFlags(ThreadContext *tc)
261{
262 const uint64_t ncc_flags(tc->readMiscRegNoEffect(MISCREG_RFLAGS));
250 copyMiscRegs(src, dest);
251 dest->pcState(src->pcState());
252}
253
254void
255skipFunction(ThreadContext *tc)
256{
257 panic("Not implemented for x86\n");
258}
259
260uint64_t
261getRFlags(ThreadContext *tc)
262{
263 const uint64_t ncc_flags(tc->readMiscRegNoEffect(MISCREG_RFLAGS));
263 const uint64_t cc_flags(tc->readIntReg(X86ISA::INTREG_PSEUDO(0)));
264 const uint64_t cfof_bits(tc->readIntReg(X86ISA::INTREG_PSEUDO(1)));
265 const uint64_t df_bit(tc->readIntReg(X86ISA::INTREG_PSEUDO(2)));
264 const uint64_t cc_flags(tc->readIntReg(X86ISA::CCREG_ZAPS));
265 const uint64_t cfof_bits(tc->readIntReg(X86ISA::CCREG_CFOF));
266 const uint64_t df_bit(tc->readIntReg(X86ISA::CCREG_DF));
266 // ecf (PSEUDO(3)) & ezf (PSEUDO(4)) are only visible to
267 // microcode, so we can safely ignore them.
268
269 // Reconstruct the real rflags state, mask out internal flags, and
270 // make sure reserved bits have the expected values.
271 return ((ncc_flags | cc_flags | cfof_bits | df_bit) & 0x3F7FD5)
272 | 0x2;
273}
274
275void
276setRFlags(ThreadContext *tc, uint64_t val)
277{
267 // ecf (PSEUDO(3)) & ezf (PSEUDO(4)) are only visible to
268 // microcode, so we can safely ignore them.
269
270 // Reconstruct the real rflags state, mask out internal flags, and
271 // make sure reserved bits have the expected values.
272 return ((ncc_flags | cc_flags | cfof_bits | df_bit) & 0x3F7FD5)
273 | 0x2;
274}
275
276void
277setRFlags(ThreadContext *tc, uint64_t val)
278{
278 tc->setIntReg(X86ISA::INTREG_PSEUDO(0), val & ccFlagMask);
279 tc->setIntReg(X86ISA::INTREG_PSEUDO(1), val & cfofMask);
280 tc->setIntReg(X86ISA::INTREG_PSEUDO(2), val & DFBit);
279 tc->setIntReg(X86ISA::CCREG_ZAPS, val & ccFlagMask);
280 tc->setIntReg(X86ISA::CCREG_CFOF, val & cfofMask);
281 tc->setIntReg(X86ISA::CCREG_DF, val & DFBit);
281
282 // Internal microcode registers (ECF & EZF)
282
283 // Internal microcode registers (ECF & EZF)
283 tc->setIntReg(X86ISA::INTREG_PSEUDO(3), 0);
284 tc->setIntReg(X86ISA::INTREG_PSEUDO(4), 0);
284 tc->setIntReg(X86ISA::CCREG_ECF, 0);
285 tc->setIntReg(X86ISA::CCREG_EZF, 0);
285
286 // Update the RFLAGS misc reg with whatever didn't go into the
287 // magic registers.
288 tc->setMiscReg(MISCREG_RFLAGS, val & ~(ccFlagMask | cfofMask | DFBit));
289}
290
291uint8_t
292convX87TagsToXTags(uint16_t ftw)

--- 81 unchanged lines hidden ---
286
287 // Update the RFLAGS misc reg with whatever didn't go into the
288 // magic registers.
289 tc->setMiscReg(MISCREG_RFLAGS, val & ~(ccFlagMask | cfofMask | DFBit));
290}
291
292uint8_t
293convX87TagsToXTags(uint16_t ftw)

--- 81 unchanged lines hidden ---