From 7d953e82632229ca1de8df5ede76d391b04645f8 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 24 Jan 2017 12:36:30 +0100 Subject: [PATCH] x86/PVH: only set accessed/busy bits for present segments MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Commit 366ff5f1b3 ("x86: segment attribute handling adjustments" went a little too far: We must not do such adjustments for non-present segments. Reported-by: Roger Pau Monné Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper Reviewed-by: Roger Pau Monné Tested-by: Roger Pau Monné --- xen/arch/x86/domain.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 5a4e7f9166..71c0e3cd73 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1374,8 +1374,10 @@ int arch_set_info_hvm_guest(struct vcpu *v, const vcpu_hvm_context_t *ctx) #define SEG(s, r) ({ \ s = (struct segment_register){ .base = (r)->s ## _base, \ .limit = (r)->s ## _limit, \ - .attr.bytes = (r)->s ## _ar | \ - (x86_seg_##s != x86_seg_tr ? 1 : 2) }; \ + .attr.bytes = (r)->s ## _ar }; \ + /* Set accessed / busy bit for present segments. */ \ + if ( s.attr.fields.p ) \ + s.attr.fields.type |= (x86_seg_##s != x86_seg_tr ? 1 : 2); \ check_segment(&s, x86_seg_ ## s); }) rc = SEG(cs, regs); -- 2.30.2