From patchwork Wed May 4 19:43:53 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 754672 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.3) with ESMTP id p44JiZx7024390 for ; Wed, 4 May 2011 19:44:35 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755627Ab1EDToa (ORCPT ); Wed, 4 May 2011 15:44:30 -0400 Received: from fmmailgate03.web.de ([217.72.192.234]:40781 "EHLO fmmailgate03.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755587Ab1EDToT (ORCPT ); Wed, 4 May 2011 15:44:19 -0400 Received: from smtp04.web.de ( [172.20.0.225]) by fmmailgate03.web.de (Postfix) with ESMTP id 2C82218E02781; Wed, 4 May 2011 21:44:18 +0200 (CEST) Received: from [88.64.22.120] (helo=localhost.localdomain) by smtp04.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #2) id 1QHhzd-0006mo-03; Wed, 04 May 2011 21:44:18 +0200 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org Subject: [PATCH 19/19] qemu-kvm: x86: Use kvm_arch_init Date: Wed, 4 May 2011 21:43:53 +0200 Message-Id: <9601b9b71e839217947c4e6e74436bfcbc6049f0.1304538230.git.jan.kiszka@web.de> X-Mailer: git-send-email 1.7.1 In-Reply-To: References: In-Reply-To: References: X-Sender: jan.kiszka@web.de X-Provags-ID: V01U2FsdGVkX1/9zvzvW35nH2V0RIOVAXC2tKAPxNkVozfQC1Aq ptvp6WrIg3NhHon/+IKjtA6kuIUnsuw4Qv/ee6KsvYMOOphvAo 7m2B5T6Po= Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Wed, 04 May 2011 19:44:35 +0000 (UTC) From: Jan Kiszka Fold the qemu-kvm specific bits of kvm_arch_create into upstream's kvm_arch_init and call that service directly. This nicely obsolete quite a few more functions. Signed-off-by: Jan Kiszka --- qemu-kvm-x86.c | 145 ----------------------------------------------------- qemu-kvm.c | 2 +- qemu-kvm.h | 13 +---- target-i386/kvm.c | 23 +++++++-- 4 files changed, 20 insertions(+), 163 deletions(-) diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c index ece5a8e..6c3a0a9 100644 --- a/qemu-kvm-x86.c +++ b/qemu-kvm-x86.c @@ -23,83 +23,6 @@ #include "kvm.h" #include "hw/apic.h" -#define MSR_IA32_TSC 0x10 - -extern unsigned int kvm_shadow_memory; - -static int kvm_set_tss_addr(kvm_context_t kvm, unsigned long addr) -{ - int r; - - r = kvm_vm_ioctl(kvm_state, KVM_SET_TSS_ADDR, addr); - if (r < 0) { - fprintf(stderr, "kvm_set_tss_addr: %m\n"); - return r; - } - return 0; -} - -static int kvm_init_tss(kvm_context_t kvm) -{ - int r; - - r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR); - if (r > 0) { - /* - * this address is 3 pages before the bios, and the bios should present - * as unavaible memory - */ - r = kvm_set_tss_addr(kvm, 0xfeffd000); - if (r < 0) { - fprintf(stderr, "kvm_init_tss: unable to set tss addr\n"); - return r; - } - } else { - fprintf(stderr, "kvm does not support KVM_CAP_SET_TSS_ADDR\n"); - } - return 0; -} - -static int kvm_set_identity_map_addr(kvm_context_t kvm, uint64_t addr) -{ -#ifdef KVM_CAP_SET_IDENTITY_MAP_ADDR - int r; - - r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_SET_IDENTITY_MAP_ADDR); - if (r > 0) { - r = kvm_vm_ioctl(kvm_state, KVM_SET_IDENTITY_MAP_ADDR, &addr); - if (r == -1) { - fprintf(stderr, "kvm_set_identity_map_addr: %m\n"); - return -errno; - } - return 0; - } -#endif - return -ENOSYS; -} - -static int kvm_init_identity_map_page(kvm_context_t kvm) -{ -#ifdef KVM_CAP_SET_IDENTITY_MAP_ADDR - int r; - - r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_SET_IDENTITY_MAP_ADDR); - if (r > 0) { - /* - * this address is 4 pages before the bios, and the bios should present - * as unavaible memory - */ - r = kvm_set_identity_map_addr(kvm, 0xfeffc000); - if (r < 0) { - fprintf(stderr, "kvm_init_identity_map_page: " - "unable to set identity mapping addr\n"); - return r; - } - } -#endif - return 0; -} - static int kvm_create_pit(kvm_context_t kvm) { #ifdef KVM_CAP_PIT @@ -124,55 +47,6 @@ static int kvm_create_pit(kvm_context_t kvm) return 0; } -int kvm_arch_create(kvm_context_t kvm) -{ - struct utsname utsname; - int r = 0; - - r = kvm_init_tss(kvm); - if (r < 0) { - return r; - } - - r = kvm_init_identity_map_page(kvm); - if (r < 0) { - return r; - } - - /* - * Tell fw_cfg to notify the BIOS to reserve the range. - */ - if (e820_add_entry(0xfeffc000, 0x4000, E820_RESERVED) < 0) { - perror("e820_add_entry() table is full"); - exit(1); - } - - r = kvm_create_pit(kvm); - if (r < 0) { - return r; - } - - uname(&utsname); - lm_capable_kernel = strcmp(utsname.machine, "x86_64") == 0; - - if (kvm_shadow_memory) { - kvm_set_shadow_pages(kvm_context, kvm_shadow_memory); - } - - /* initialize has_msr_star/has_msr_hsave_pa */ - r = kvm_get_supported_msrs(kvm_state); - if (r < 0) { - return r; - } - - r = kvm_set_boot_cpu_id(0); - if (r < 0 && r != -ENOSYS) { - return r; - } - - return 0; -} - #ifdef KVM_EXIT_TPR_ACCESS static int kvm_handle_tpr_access(CPUState *env) @@ -319,25 +193,6 @@ static void kvm_set_cr8(CPUState *env, uint64_t cr8) env->kvm_run->cr8 = cr8; } -int kvm_set_shadow_pages(kvm_context_t kvm, unsigned int nrshadow_pages) -{ -#ifdef KVM_CAP_MMU_SHADOW_CACHE_CONTROL - int r; - - r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, - KVM_CAP_MMU_SHADOW_CACHE_CONTROL); - if (r > 0) { - r = kvm_vm_ioctl(kvm_state, KVM_SET_NR_MMU_PAGES, nrshadow_pages); - if (r < 0) { - fprintf(stderr, "kvm_set_shadow_pages: %m\n"); - return r; - } - return 0; - } -#endif - return -1; -} - #ifdef KVM_CAP_VAPIC static int kvm_enable_tpr_access_reporting(CPUState *env) { diff --git a/qemu-kvm.c b/qemu-kvm.c index 3001392..cf02ceb 100644 --- a/qemu-kvm.c +++ b/qemu-kvm.c @@ -1382,7 +1382,7 @@ static int kvm_create_context(void) return -1; } - r = kvm_arch_create(kvm_context); + r = kvm_arch_init(kvm_state); if (r < 0) { kvm_finalize(kvm_state); return r; diff --git a/qemu-kvm.h b/qemu-kvm.h index 1644582..8b3ce9c 100644 --- a/qemu-kvm.h +++ b/qemu-kvm.h @@ -64,8 +64,6 @@ typedef struct kvm_context *kvm_context_t; #include "kvm.h" -int kvm_arch_create(kvm_context_t kvm); - int kvm_arch_run(CPUState *env); int handle_halt(CPUState *env); @@ -124,16 +122,6 @@ int kvm_is_ready_for_interrupt_injection(CPUState *env); * \return 0 on success */ int kvm_inject_irq(CPUState *env, unsigned irq); - - -/*! - * \brief Setting the number of shadow pages to be allocated to the vm - * - * \param kvm pointer to kvm_context - * \param nrshadow_pages number of pages to be allocated - */ -int kvm_set_shadow_pages(kvm_context_t kvm, unsigned int nrshadow_pages); - #endif int kvm_set_irq_level(kvm_context_t kvm, int irq, int level, int *status); @@ -449,6 +437,7 @@ extern int kvm_pit; extern int kvm_pit_reinject; extern int kvm_nested; extern kvm_context_t kvm_context; +extern unsigned int kvm_shadow_memory; struct ioperm_data { unsigned long start_port; diff --git a/target-i386/kvm.c b/target-i386/kvm.c index bbc324b..a8b5c6d 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -197,7 +197,6 @@ typedef struct HWPoisonPage { static QLIST_HEAD(, HWPoisonPage) hwpoison_page_list = QLIST_HEAD_INITIALIZER(hwpoison_page_list); -#ifdef OBSOLETE_KVM_IMPL static void kvm_unpoison_all(void *param) { HWPoisonPage *page, *next_page; @@ -208,7 +207,6 @@ static void kvm_unpoison_all(void *param) qemu_free(page); } } -#endif #ifdef KVM_CAP_MCE static void kvm_hwpoison_page_add(ram_addr_t ram_addr) @@ -603,7 +601,7 @@ static int kvm_get_supported_msrs(KVMState *s) return ret; } -#ifdef OBSOLETE_KVM_IMPL +static int kvm_create_pit(kvm_context_t kvm); int kvm_arch_init(KVMState *s) { @@ -655,11 +653,26 @@ int kvm_arch_init(KVMState *s) } qemu_register_reset(kvm_unpoison_all, NULL); + ret = kvm_create_pit(&s->kvm_context); + if (ret < 0) { + return ret; + } + + if (kvm_shadow_memory) { + ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, kvm_shadow_memory); + if (ret < 0) { + return ret; + } + } + + ret = kvm_set_boot_cpu_id(0); + if (ret < 0 && ret != -ENOSYS) { + return ret; + } + return 0; } -#endif - static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs) { lhs->selector = rhs->selector;