uint64_t mask;
} MTRRVar;
+#define CPU_NB_EREGS64 32
#define CPU_NB_REGS64 16
#define CPU_NB_REGS32 8
#ifdef TARGET_X86_64
+#define CPU_NB_EREGS CPU_NB_EREGS64
#define CPU_NB_REGS CPU_NB_REGS64
#else
+#define CPU_NB_EREGS CPU_NB_REGS32
#define CPU_NB_REGS CPU_NB_REGS32
#endif
typedef struct CPUArchState {
/* standard registers */
- target_ulong regs[CPU_NB_REGS];
+ target_ulong regs[CPU_NB_EREGS];
target_ulong eip;
target_ulong eflags; /* eflags register. During CPU emulation, CC
flags and DF are set to zero because they are
float_status mmx_status; /* for 3DNow! float ops */
float_status sse_status;
uint32_t mxcsr;
- ZMMReg xmm_regs[CPU_NB_REGS == 8 ? 8 : 32] QEMU_ALIGNED(16);
+ ZMMReg xmm_regs[CPU_NB_EREGS] QEMU_ALIGNED(16);
ZMMReg xmm_t0 QEMU_ALIGNED(16);
MMXReg mmx_t0;
memcpy(tiledata, &env->xtiledata, sizeof(env->xtiledata));
}
+
+ e = &x86_ext_save_areas[XSTATE_APX_BIT];
+ if (e->size && e->offset && buflen) {
+ XSaveAPX *apx = buf + e->offset;
+
+ memcpy(apx, &env->regs[CPU_NB_REGS],
+ sizeof(env->regs[CPU_NB_REGS]) * (CPU_NB_EREGS - CPU_NB_REGS));
+ }
#endif
}
memcpy(&env->xtiledata, tiledata, sizeof(env->xtiledata));
}
+
+ e = &x86_ext_save_areas[XSTATE_APX_BIT];
+ if (e->size && e->offset) {
+ const XSaveAPX *apx = buf + e->offset;
+
+ memcpy(&env->regs[CPU_NB_REGS], apx,
+ sizeof(env->regs[CPU_NB_REGS]) * (CPU_NB_EREGS - CPU_NB_REGS));
+ }
#endif
}