On 6/18/23 23:51, Paolo Bonzini wrote:
RDPID corresponds to a RDMSR(TSC_AUX); however, it is unprivileged
so for user-mode emulation we must provide the value that the kernel
places in the MSR.  For Linux, it is a combination of the current CPU
and the current NUMA node, both of which can be retrieved with getcpu(2).
For BSD, just return 0.

RDTSCP is reimplemented as RDTSC + RDPID ECX; the differences in terms
of serializability are not relevant to QEMU.

Signed-off-by: Paolo Bonzini<pbonz...@redhat.com>
---
  linux-user/i386/target_cpu.h   |  8 ++++++++
  linux-user/x86_64/target_cpu.h |  1 +
  target/i386/cpu.c              | 10 +++++++++-
  target/i386/helper.h           |  2 +-
  target/i386/tcg/misc_helper.c  | 21 +++++++++++++++------
  target/i386/tcg/translate.c    | 15 +++++++++++++--
  6 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/linux-user/i386/target_cpu.h b/linux-user/i386/target_cpu.h
index 52caf788cc3..3539f790222 100644
--- a/linux-user/i386/target_cpu.h
+++ b/linux-user/i386/target_cpu.h
@@ -54,4 +54,12 @@ static inline abi_ulong get_sp_from_cpustate(CPUX86State 
*state)
  {
      return state->regs[R_ESP];
  }
+
+static inline uint32_t get_cpunode(void)
+{
+    unsigned cpu, node;
+    getcpu(&cpu, &node);
+    return (node << 12) | (cpu & 0xfff);
+}
+

What is our minimum glibc version?  This requires 2.29.

Also, not especially fond of the placement. target/ including linux-user/ header isn't nice. Might as well just place these 3 lines in misc_helper.c to begin.

r~

Reply via email to