From 46a8cbbb7f55e92943cc26266edd98c774edadac Mon Sep 17 00:00:00 2001 From: Andreas Sandberg Date: Tue, 18 Jun 2013 16:10:22 +0200 Subject: x86: Add helper functions to access rflags The rflags register is spread across several different registers. Most of the flags are stored in MISCREG_RFLAGS, but some are stored in microcode registers. When accessing RFLAGS, we need to reconstruct it from these registers. This changeset adds two functions, X86ISA::getRFlags() and X86ISA::setRFlags(), that take care of this magic. --- src/arch/x86/utility.hh | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/arch/x86/utility.hh') diff --git a/src/arch/x86/utility.hh b/src/arch/x86/utility.hh index f3b0d3fa1..6fc802f2f 100644 --- a/src/arch/x86/utility.hh +++ b/src/arch/x86/utility.hh @@ -105,6 +105,35 @@ namespace X86ISA return 0; } + + /** + * Reconstruct the rflags register from the internal gem5 register + * state. + * + * gem5 stores rflags in several different registers to avoid + * pipeline dependencies. In order to get the true rflags value, + * we can't simply read the value of MISCREG_RFLAGS. Instead, we + * need to read out various state from microcode registers and + * merge that with MISCREG_RFLAGS. + * + * @param tc Thread context to read rflags from. + * @return rflags as seen by the guest. + */ + uint64_t getRFlags(ThreadContext *tc); + + /** + * Set update the rflags register and internal gem5 state. + * + * @note This function does not update MISCREG_M5_REG. You might + * need to update this register by writing anything to + * MISCREG_M5_REG with side-effects. + * + * @see X86ISA::getRFlags() + * + * @param tc Thread context to update + * @param val New rflags value to store in TC + */ + void setRFlags(ThreadContext *tc, uint64_t val); } #endif // __ARCH_X86_UTILITY_HH__ -- cgit v1.2.3