mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
target-i386: implement PKE for TCG
Tested with kvm-unit-tests. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
cf7cc9291b
commit
0f70ed4759
7 changed files with 110 additions and 5 deletions
|
@ -1184,6 +1184,11 @@ static void do_xsave_bndcsr(CPUX86State *env, target_ulong addr, uintptr_t ra)
|
|||
cpu_stq_data_ra(env, addr + 8, env->bndcs_regs.sts, ra);
|
||||
}
|
||||
|
||||
static void do_xsave_pkru(CPUX86State *env, target_ulong addr, uintptr_t ra)
|
||||
{
|
||||
cpu_stq_data_ra(env, addr, env->pkru, ra);
|
||||
}
|
||||
|
||||
void helper_fxsave(CPUX86State *env, target_ulong ptr)
|
||||
{
|
||||
uintptr_t ra = GETPC();
|
||||
|
@ -1257,6 +1262,10 @@ static void do_xsave(CPUX86State *env, target_ulong ptr, uint64_t rfbm,
|
|||
target_ulong off = x86_ext_save_areas[XSTATE_BNDCSR_BIT].offset;
|
||||
do_xsave_bndcsr(env, ptr + off, ra);
|
||||
}
|
||||
if (opt & XSTATE_PKRU_MASK) {
|
||||
target_ulong off = x86_ext_save_areas[XSTATE_PKRU_BIT].offset;
|
||||
do_xsave_pkru(env, ptr + off, ra);
|
||||
}
|
||||
|
||||
/* Update the XSTATE_BV field. */
|
||||
old_bv = cpu_ldq_data_ra(env, ptr + 512, ra);
|
||||
|
@ -1339,6 +1348,11 @@ static void do_xrstor_bndcsr(CPUX86State *env, target_ulong addr, uintptr_t ra)
|
|||
env->bndcs_regs.sts = cpu_ldq_data_ra(env, addr + 8, ra);
|
||||
}
|
||||
|
||||
static void do_xrstor_pkru(CPUX86State *env, target_ulong addr, uintptr_t ra)
|
||||
{
|
||||
env->pkru = cpu_ldq_data_ra(env, addr, ra);
|
||||
}
|
||||
|
||||
void helper_fxrstor(CPUX86State *env, target_ulong ptr)
|
||||
{
|
||||
uintptr_t ra = GETPC();
|
||||
|
@ -1438,6 +1452,19 @@ void helper_xrstor(CPUX86State *env, target_ulong ptr, uint64_t rfbm)
|
|||
}
|
||||
cpu_sync_bndcs_hflags(env);
|
||||
}
|
||||
if (rfbm & XSTATE_PKRU_MASK) {
|
||||
uint64_t old_pkru = env->pkru;
|
||||
if (xstate_bv & XSTATE_PKRU_MASK) {
|
||||
target_ulong off = x86_ext_save_areas[XSTATE_PKRU_BIT].offset;
|
||||
do_xrstor_pkru(env, ptr + off, ra);
|
||||
} else {
|
||||
env->pkru = 0;
|
||||
}
|
||||
if (env->pkru != old_pkru) {
|
||||
CPUState *cs = CPU(x86_env_get_cpu(env));
|
||||
tlb_flush(cs, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t helper_xgetbv(CPUX86State *env, uint32_t ecx)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue