From patchwork Mon Dec 16 09:57:14 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 3352821 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 177E7C0D4A for ; Mon, 16 Dec 2013 09:58:21 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id F264820270 for ; Mon, 16 Dec 2013 09:58:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A8E4120378 for ; Mon, 16 Dec 2013 09:58:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753243Ab3LPJ6L (ORCPT ); Mon, 16 Dec 2013 04:58:11 -0500 Received: from david.siemens.de ([192.35.17.14]:28096 "EHLO david.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753190Ab3LPJ5k (ORCPT ); Mon, 16 Dec 2013 04:57:40 -0500 Received: from mail1.siemens.de (localhost [127.0.0.1]) by david.siemens.de (8.13.6/8.13.6) with ESMTP id rBG9vVB3025051; Mon, 16 Dec 2013 10:57:31 +0100 Received: from mchn199C.mchp.siemens.de.com ([146.254.78.38]) by mail1.siemens.de (8.14.3/8.14.3) with SMTP id rBG9vTC3007502; Mon, 16 Dec 2013 10:57:30 +0100 From: Jan Kiszka To: Gleb Natapov , Paolo Bonzini Cc: kvm , Arthur Chunqi Li Subject: [PATCH 01/15] VMX: Fix initialization of GDT, IDT and TR descriptors Date: Mon, 16 Dec 2013 10:57:14 +0100 Message-Id: <5615e8708779a040a6f6cc7bd44b704ac50df29e.1387187847.git.jan.kiszka@siemens.com> X-Mailer: git-send-email 1.8.1.1.298.ge7eed54 In-Reply-To: References: In-Reply-To: References: Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP We were loading the addresses of the descriptor pointers, not the addresses they are pointing to. By declaring the pointers with the proper type, we can also save some castings + struct descr. Signed-off-by: Jan Kiszka --- x86/vmx.c | 26 ++++++++++++-------------- x86/vmx.h | 5 ----- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/x86/vmx.c b/x86/vmx.c index 31d7bd1..4c463fd 100644 --- a/x86/vmx.c +++ b/x86/vmx.c @@ -56,9 +56,9 @@ union vmx_ctrl_exit ctrl_exit_rev; union vmx_ctrl_ent ctrl_enter_rev; union vmx_ept_vpid ept_vpid; -extern u64 gdt64_desc[]; -extern u64 idt_descr[]; -extern u64 tss_descr[]; +extern struct descriptor_table_ptr gdt64_desc; +extern struct descriptor_table_ptr idt_descr; +extern struct descriptor_table_ptr tss_descr; extern void *vmx_return; extern void *entry_sysenter; extern void *guest_entry; @@ -368,9 +368,9 @@ static void init_vmcs_host(void) vmcs_write(HOST_SEL_FS, SEL_KERN_DATA_64); vmcs_write(HOST_SEL_GS, SEL_KERN_DATA_64); vmcs_write(HOST_SEL_TR, SEL_TSS_RUN); - vmcs_write(HOST_BASE_TR, (u64)tss_descr); - vmcs_write(HOST_BASE_GDTR, (u64)gdt64_desc); - vmcs_write(HOST_BASE_IDTR, (u64)idt_descr); + vmcs_write(HOST_BASE_TR, tss_descr.base); + vmcs_write(HOST_BASE_GDTR, gdt64_desc.base); + vmcs_write(HOST_BASE_IDTR, idt_descr.base); vmcs_write(HOST_BASE_FS, 0); vmcs_write(HOST_BASE_GS, 0); @@ -424,7 +424,7 @@ static void init_vmcs_guest(void) vmcs_write(GUEST_BASE_DS, 0); vmcs_write(GUEST_BASE_FS, 0); vmcs_write(GUEST_BASE_GS, 0); - vmcs_write(GUEST_BASE_TR, (u64)tss_descr); + vmcs_write(GUEST_BASE_TR, tss_descr.base); vmcs_write(GUEST_BASE_LDTR, 0); vmcs_write(GUEST_LIMIT_CS, 0xFFFFFFFF); @@ -434,7 +434,7 @@ static void init_vmcs_guest(void) vmcs_write(GUEST_LIMIT_FS, 0xFFFFFFFF); vmcs_write(GUEST_LIMIT_GS, 0xFFFFFFFF); vmcs_write(GUEST_LIMIT_LDTR, 0xffff); - vmcs_write(GUEST_LIMIT_TR, ((struct descr *)tss_descr)->limit); + vmcs_write(GUEST_LIMIT_TR, tss_descr.limit); vmcs_write(GUEST_AR_CS, 0xa09b); vmcs_write(GUEST_AR_DS, 0xc093); @@ -446,12 +446,10 @@ static void init_vmcs_guest(void) vmcs_write(GUEST_AR_TR, 0x8b); /* 26.3.1.3 */ - vmcs_write(GUEST_BASE_GDTR, (u64)gdt64_desc); - vmcs_write(GUEST_BASE_IDTR, (u64)idt_descr); - vmcs_write(GUEST_LIMIT_GDTR, - ((struct descr *)gdt64_desc)->limit & 0xffff); - vmcs_write(GUEST_LIMIT_IDTR, - ((struct descr *)idt_descr)->limit & 0xffff); + vmcs_write(GUEST_BASE_GDTR, gdt64_desc.base); + vmcs_write(GUEST_BASE_IDTR, idt_descr.base); + vmcs_write(GUEST_LIMIT_GDTR, gdt64_desc.limit); + vmcs_write(GUEST_LIMIT_IDTR, idt_descr.limit); /* 26.3.1.4 */ vmcs_write(GUEST_RIP, (u64)(&guest_entry)); diff --git a/x86/vmx.h b/x86/vmx.h index 7d967eb..59d627a 100644 --- a/x86/vmx.h +++ b/x86/vmx.h @@ -95,11 +95,6 @@ union vmx_ept_vpid { }; }; -struct descr { - u16 limit; - u64 addr; -}; - enum Encoding { /* 16-Bit Control Fields */ VPID = 0x0000ul,