@@ -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)
{
@@ -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;
@@ -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;
@@ -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;