diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 02698e93a1..23e436d7db 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -2308,6 +2308,10 @@ static int cf_check hvmemul_read_cr( val = curr->arch.hvm.guest_cr[reg]; break; + case 8: + val = (vlapic_get_reg(vcpu_vlapic(curr), APIC_TASKPRI) & 0xf0) >> 4; + break; + default: return X86EMUL_UNHANDLEABLE; } @@ -2353,6 +2357,17 @@ static int cf_check hvmemul_write_cr( rc = hvm_set_cr4(val, true); break; + case 8: + if ( val & ~X86_CR8_VALID_MASK ) + { + rc = X86EMUL_EXCEPTION; + break; + } + + vlapic_set_reg(vcpu_vlapic(curr), APIC_TASKPRI, val << 4); + rc = X86EMUL_OKAY; + break; + default: rc = X86EMUL_UNHANDLEABLE; break; diff --git a/xen/arch/x86/include/asm/x86-defns.h b/xen/arch/x86/include/asm/x86-defns.h index 2493ec277f..8afa9826a3 100644 --- a/xen/arch/x86/include/asm/x86-defns.h +++ b/xen/arch/x86/include/asm/x86-defns.h @@ -76,6 +76,8 @@ #define X86_CR4_CET 0x00800000 /* Control-flow Enforcement Technology */ #define X86_CR4_PKS 0x01000000 /* Protection Key Supervisor */ +#define X86_CR8_VALID_MASK 0xf + /* * XSTATE component flags in XCR0 | MSR_XSS */