|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/emul: Emulate %cr8 accesses
On 17.03.2025 19:40, Andrew Cooper wrote:
> Petr reports:
>
> (XEN) MMIO emulation failed (1): d12v1 64bit @ 0010:fffff8057ba7dfbf -> 45
> 0f 20 c2 ...
>
> during introspection.
>
> This is MOV %cr8, which is wired up for hvm_mov_{to,from}_cr(); the VMExit
> fastpaths, but not for the full emulation slowpaths. Wire %cr8 up in
> hvmemul_{read,write}_cr() too.
>
> Reported-by: Petr Beneš <w1benny@xxxxxxxxx>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Like in a few other cases I guess there's no good Fixes: tag to use, as the
omission must have been there basically forever.
> --- a/xen/arch/x86/hvm/emulate.c
> +++ b/xen/arch/x86/hvm/emulate.c
> @@ -2285,6 +2285,11 @@ static int cf_check hvmemul_read_cr(
> *val = current->arch.hvm.guest_cr[reg];
> TRACE(TRC_HVM_CR_READ64, reg, *val, *val >> 32);
> return X86EMUL_OKAY;
> +
> + case 8:
> + *val = (vlapic_get_reg(vcpu_vlapic(current), APIC_TASKPRI) & 0xf0)
> >> 4;
I think it would be nice to add a #define to apicdef.h that could be utilized to
use MASK_EXTR() here (and MASK_INSR() below). Otherwise even without such a
#define I'd like to ask that we use the two macros here.
> + return X86EMUL_OKAY;
> +
> default:
> break;
> }
> @@ -2325,6 +2330,11 @@ static int cf_check hvmemul_write_cr(
> rc = hvm_set_cr4(val, true);
> break;
>
> + case 8:
> + vlapic_set_reg(vcpu_vlapic(current), APIC_TASKPRI, ((val & 0x0f) <<
> 4));
> + rc = X86EMUL_OKAY;
> + break;
Both SDM and PM say #GP upon writes to reserved bits, without there being a
place
where it is said which bits are reserved. Don't we therefore need to treat bits
4
and up as must-be-zero, implying that all bits which have no meaning are
reserved?
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |