From: Andrew Cooper Date: Wed, 12 Jan 2022 13:54:12 +0000 (+0000) Subject: x86/hvm: Improve hvm_set_guest_pat() code generation X-Git-Tag: archive/raspbian/4.17.0-1+rpi1^2~33^2~1152 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=9ce0a5e207f3968e65d0af33a15bee5bdf5c8a7f;p=xen.git x86/hvm: Improve hvm_set_guest_pat() code generation This is a fastpath on virtual vmentry/exit, and forcing guest_pat to be spilled to the stack is bad. Performing the shift in a register is far more efficient. Drop the (IMO useless) log message. MSR_PAT only gets altered on boot, and a bad value will be entirely evident in the ensuing #GP backtrace. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index b0ee49a61a..10ee4e9570 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -299,13 +299,13 @@ void hvm_get_guest_pat(struct vcpu *v, u64 *guest_pat) *guest_pat = v->arch.hvm.pat_cr; } -int hvm_set_guest_pat(struct vcpu *v, u64 guest_pat) +int hvm_set_guest_pat(struct vcpu *v, uint64_t guest_pat) { - int i; - uint8_t *value = (uint8_t *)&guest_pat; + unsigned int i; + uint64_t tmp; - for ( i = 0; i < 8; i++ ) - switch ( value[i] ) + for ( i = 0, tmp = guest_pat; i < 8; i++, tmp >>= 8 ) + switch ( tmp & 0xff ) { case PAT_TYPE_UC_MINUS: case PAT_TYPE_UNCACHABLE: @@ -315,8 +315,6 @@ int hvm_set_guest_pat(struct vcpu *v, u64 guest_pat) case PAT_TYPE_WRTHROUGH: break; default: - HVM_DBG_LOG(DBG_LEVEL_MSR, "invalid guest PAT: %"PRIx64"\n", - guest_pat); return 0; }