From patchwork Wed Sep 5 08:31:37 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 1406441 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id C19EFDF264 for ; Wed, 5 Sep 2012 08:32:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757168Ab2IEIcJ (ORCPT ); Wed, 5 Sep 2012 04:32:09 -0400 Received: from mail-wg0-f44.google.com ([74.125.82.44]:38062 "EHLO mail-wg0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752976Ab2IEIb5 (ORCPT ); Wed, 5 Sep 2012 04:31:57 -0400 Received: by mail-wg0-f44.google.com with SMTP id dr13so387848wgb.1 for ; Wed, 05 Sep 2012 01:31:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=io+Qhsjz3t24m0C+A+3ba665ULhbAqSpVLDICswT068=; b=xALh/KKACPiB/C4aIuKySSBZCbkKo0cVs9NiwYCxu1WZw/hATmVYUfOvDiND9/YiAx GM002WOgzo/rjvUFeh//sBmJkZ5K/FZDtVKLUH3C5p1nFC1H9guukVS40nig/9CUqzg0 wctgkEbRenMqqlR7uzQCtbXpGHhRoA3LEeRINm/FZ65NN9IiV9+EZSwKtNdo5MBWlefv LzpAOFJOJF7hTUJx/ATdTgwQlt4+Ze5AJ8fJHqAZUhPuEgwRMtzs7zNXFgkBe1mvkyCI oSl0eveFWfhfkpYmgd2Vbx2EetN3ncjSuEzjIgduIy6bnoQJKf78k0gzqdKNcPkOj/Bn MbdQ== Received: by 10.216.131.170 with SMTP id m42mr11540354wei.82.1346833916300; Wed, 05 Sep 2012 01:31:56 -0700 (PDT) Received: from lappy.capriciverd.com (20.Red-80-59-140.staticIP.rima-tde.net. [80.59.140.20]) by mx.google.com with ESMTPS id q4sm27971068wix.9.2012.09.05.01.31.53 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 05 Sep 2012 01:31:55 -0700 (PDT) From: Sasha Levin To: penberg@kernel.org Cc: asias.hejun@gmail.com, mingo@elte.hu, gorcunov@openvz.org, kvm@vger.kernel.org, Sasha Levin Subject: [PATCH 03/33] kvm tools: split struct kvm into arch specific part Date: Wed, 5 Sep 2012 10:31:37 +0200 Message-Id: <1346833927-15740-4-git-send-email-levinsasha928@gmail.com> X-Mailer: git-send-email 1.7.12 In-Reply-To: <1346833927-15740-1-git-send-email-levinsasha928@gmail.com> References: <1346833927-15740-1-git-send-email-levinsasha928@gmail.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Move all the non-arch specific members into a generic struct, and the arch specific members into a arch specific kvm_arch. This prevents code duplication across different archs. Signed-off-by: Sasha Levin --- tools/kvm/include/kvm/kvm.h | 27 ++++++++++++++++++++ tools/kvm/powerpc/cpu_info.c | 2 +- tools/kvm/powerpc/include/kvm/kvm-arch.h | 24 +----------------- tools/kvm/powerpc/irq.c | 2 +- tools/kvm/powerpc/kvm-cpu.c | 6 ++--- tools/kvm/powerpc/kvm.c | 42 ++++++++++++++++---------------- tools/kvm/powerpc/spapr_pci.c | 2 +- tools/kvm/powerpc/xics.c | 24 +++++++++--------- tools/kvm/x86/bios.c | 6 ++--- tools/kvm/x86/boot.c | 6 ++--- tools/kvm/x86/include/kvm/kvm-arch.h | 26 +------------------- tools/kvm/x86/kvm-cpu.c | 30 +++++++++++------------ tools/kvm/x86/kvm.c | 12 ++++----- 13 files changed, 95 insertions(+), 114 deletions(-) diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h index 22a1b0e..50c1d10 100644 --- a/tools/kvm/include/kvm/kvm.h +++ b/tools/kvm/include/kvm/kvm.h @@ -31,6 +31,33 @@ struct kvm_ext { int code; }; +struct kvm { + struct kvm_arch arch; + int sys_fd; /* For system ioctls(), i.e. /dev/kvm */ + int vm_fd; /* For VM ioctls() */ + timer_t timerid; /* Posix timer for interrupts */ + + int nrcpus; /* Number of cpus to run */ + + u32 mem_slots; /* for KVM_SET_USER_MEMORY_REGION */ + + u64 ram_size; + void *ram_start; + u64 ram_pagesize; + + bool nmi_disabled; + + bool single_step; + + const char *vmlinux; + struct disk_image **disks; + int nr_disks; + + char *name; + + int vm_state; +}; + void kvm__set_dir(const char *fmt, ...); const char *kvm__get_dir(void); diff --git a/tools/kvm/powerpc/cpu_info.c b/tools/kvm/powerpc/cpu_info.c index 1f440a5..11ca14e 100644 --- a/tools/kvm/powerpc/cpu_info.c +++ b/tools/kvm/powerpc/cpu_info.c @@ -174,7 +174,7 @@ struct cpu_info *find_cpu_info(struct kvm *kvm) { struct cpu_info *info; unsigned int i; - u32 pvr = kvm->pvr; + u32 pvr = kvm->arch.pvr; for (info = NULL, i = 0; i < ARRAY_SIZE(host_pvr_info); i++) { if ((pvr & host_pvr_info[i].pvr_mask) == host_pvr_info[i].pvr) { diff --git a/tools/kvm/powerpc/include/kvm/kvm-arch.h b/tools/kvm/powerpc/include/kvm/kvm-arch.h index 316fe79..97181c4 100644 --- a/tools/kvm/powerpc/include/kvm/kvm-arch.h +++ b/tools/kvm/powerpc/include/kvm/kvm-arch.h @@ -43,36 +43,14 @@ struct spapr_phb; -struct kvm { - int sys_fd; /* For system ioctls(), i.e. /dev/kvm */ - int vm_fd; /* For VM ioctls() */ - timer_t timerid; /* Posix timer for interrupts */ - - int nrcpus; /* Number of cpus to run */ - - u32 mem_slots; /* for KVM_SET_USER_MEMORY_REGION */ - - u64 ram_size; - void *ram_start; - u64 ram_pagesize; - +struct kvm_arch { u64 sdr1; u32 pvr; - - bool nmi_disabled; - - bool single_step; - - const char *vmlinux; - struct disk_image **disks; - int nr_disks; unsigned long rtas_gra; unsigned long rtas_size; unsigned long fdt_gra; unsigned long initrd_gra; unsigned long initrd_size; - char *name; - int vm_state; struct icp_state *icp; struct spapr_phb *phb; }; diff --git a/tools/kvm/powerpc/irq.c b/tools/kvm/powerpc/irq.c index 7da4012..6d134c5 100644 --- a/tools/kvm/powerpc/irq.c +++ b/tools/kvm/powerpc/irq.c @@ -59,7 +59,7 @@ int irq__init(struct kvm *kvm) * are numbered 0..nrcpus. This may not really be true, * but it is OK currently. */ - kvm->icp = xics_system_init(XICS_IRQS, kvm->nrcpus); + kvm->arch.icp = xics_system_init(XICS_IRQS, kvm->nrcpus); return 0; } diff --git a/tools/kvm/powerpc/kvm-cpu.c b/tools/kvm/powerpc/kvm-cpu.c index 97fc759..755d11a 100644 --- a/tools/kvm/powerpc/kvm-cpu.c +++ b/tools/kvm/powerpc/kvm-cpu.c @@ -115,7 +115,7 @@ static void kvm_cpu__setup_regs(struct kvm_cpu *vcpu) if (vcpu->cpu_id == 0) { r->pc = KERNEL_START_ADDR; - r->gpr[3] = vcpu->kvm->fdt_gra; + r->gpr[3] = vcpu->kvm->arch.fdt_gra; r->gpr[5] = 0; } else { r->pc = KERNEL_SECONDARY_START_ADDR; @@ -142,8 +142,8 @@ static void kvm_cpu__setup_sregs(struct kvm_cpu *vcpu) if (ioctl(vcpu->vcpu_fd, KVM_GET_SREGS, &sregs) < 0) die("KVM_GET_SREGS failed"); - sregs.u.s.sdr1 = vcpu->kvm->sdr1; - sregs.pvr = vcpu->kvm->pvr; + sregs.u.s.sdr1 = vcpu->kvm->arch.sdr1; + sregs.pvr = vcpu->kvm->arch.pvr; if (ioctl(vcpu->vcpu_fd, KVM_SET_SREGS, &sregs) < 0) die("KVM_SET_SREGS failed"); diff --git a/tools/kvm/powerpc/kvm.c b/tools/kvm/powerpc/kvm.c index 83b8edd..e4f5315 100644 --- a/tools/kvm/powerpc/kvm.c +++ b/tools/kvm/powerpc/kvm.c @@ -108,18 +108,18 @@ void kvm__arch_init(struct kvm *kvm, const char *hugetlbfs_path, u64 ram_size) kvm->ram_size, errno); /* FDT goes at top of memory, RTAS just below */ - kvm->fdt_gra = kvm->ram_size - FDT_MAX_SIZE; + kvm->arch.fdt_gra = kvm->ram_size - FDT_MAX_SIZE; /* FIXME: Not all PPC systems have RTAS */ - kvm->rtas_gra = kvm->fdt_gra - RTAS_MAX_SIZE; + kvm->arch.rtas_gra = kvm->arch.fdt_gra - RTAS_MAX_SIZE; madvise(kvm->ram_start, kvm->ram_size, MADV_MERGEABLE); /* FIXME: SPAPR-PR specific; allocate a guest HPT. */ if (posix_memalign((void **)&hpt, (1<sdr1 = ((hpt + 0x3ffffULL) & ~0x3ffffULL) | (HPT_ORDER-18); + kvm->arch.sdr1 = ((hpt + 0x3ffffULL) & ~0x3ffffULL) | (HPT_ORDER-18); - kvm->pvr = mfpvr(); + kvm->arch.pvr = mfpvr(); /* FIXME: This is book3s-specific */ cap_ppc_rma = ioctl(kvm->sys_fd, KVM_CHECK_EXTENSION, KVM_CAP_PPC_RMA); @@ -193,10 +193,10 @@ int load_flat_binary(struct kvm *kvm, int fd_kernel, int fd_initrd, const char * pr_info("Loaded initrd to 0x%x (%ld bytes)", INITRD_LOAD_ADDR, p-i_start); - kvm->initrd_gra = INITRD_LOAD_ADDR; - kvm->initrd_size = p-i_start; + kvm->arch.initrd_gra = INITRD_LOAD_ADDR; + kvm->arch.initrd_size = p-i_start; } else { - kvm->initrd_size = 0; + kvm->arch.initrd_size = 0; } strncpy(kern_cmdline, kernel_cmdline, 2048); kern_cmdline[2047] = '\0'; @@ -301,8 +301,8 @@ static void setup_fdt(struct kvm *kvm) struct fdt_prop segment_page_sizes; u32 segment_sizes_1T[] = {0x1c, 0x28, 0xffffffff, 0xffffffff}; - /* Generate an appropriate DT at kvm->fdt_gra */ - void *fdt_dest = guest_flat_to_host(kvm, kvm->fdt_gra); + /* Generate an appropriate DT at kvm->arch.fdt_gra */ + void *fdt_dest = guest_flat_to_host(kvm, kvm->arch.fdt_gra); void *fdt = staging_fdt; _FDT(fdt_create(fdt, FDT_MAX_SIZE)); @@ -320,9 +320,9 @@ static void setup_fdt(struct kvm *kvm) /* This is what the kernel uses to switch 'We're an LPAR'! */ _FDT(fdt_property(fdt, "ibm,hypertas-functions", hypertas_prop_kvm, sizeof(hypertas_prop_kvm))); - _FDT(fdt_property_cell(fdt, "linux,rtas-base", kvm->rtas_gra)); - _FDT(fdt_property_cell(fdt, "linux,rtas-entry", kvm->rtas_gra)); - _FDT(fdt_property_cell(fdt, "rtas-size", kvm->rtas_size)); + _FDT(fdt_property_cell(fdt, "linux,rtas-base", kvm->arch.rtas_gra)); + _FDT(fdt_property_cell(fdt, "linux,rtas-entry", kvm->arch.rtas_gra)); + _FDT(fdt_property_cell(fdt, "rtas-size", kvm->arch.rtas_size)); /* Now add properties for all RTAS tokens: */ if (spapr_rtas_fdt_setup(kvm, fdt)) die("Couldn't create RTAS FDT properties\n"); @@ -334,10 +334,10 @@ static void setup_fdt(struct kvm *kvm) /* cmdline */ _FDT(fdt_property_string(fdt, "bootargs", kern_cmdline)); /* Initrd */ - if (kvm->initrd_size != 0) { - uint32_t ird_st_prop = cpu_to_be32(kvm->initrd_gra); - uint32_t ird_end_prop = cpu_to_be32(kvm->initrd_gra + - kvm->initrd_size); + if (kvm->arch.initrd_size != 0) { + uint32_t ird_st_prop = cpu_to_be32(kvm->arch.initrd_gra); + uint32_t ird_end_prop = cpu_to_be32(kvm->arch.initrd_gra + + kvm->arch.initrd_size); _FDT(fdt_property(fdt, "linux,initrd-start", &ird_st_prop, sizeof(ird_st_prop))); _FDT(fdt_property(fdt, "linux,initrd-end", @@ -384,7 +384,7 @@ static void setup_fdt(struct kvm *kvm) _FDT(fdt_property_string(fdt, "device_type", "cpu")); _FDT(fdt_property_cell(fdt, "reg", i)); - _FDT(fdt_property_cell(fdt, "cpu-version", kvm->pvr)); + _FDT(fdt_property_cell(fdt, "cpu-version", kvm->arch.pvr)); _FDT(fdt_property_cell(fdt, "dcache-block-size", cpu_info->d_bsize)); _FDT(fdt_property_cell(fdt, "icache-block-size", cpu_info->i_bsize)); @@ -484,7 +484,7 @@ static void setup_fdt(struct kvm *kvm) if (spapr_populate_pci_devices(kvm, PHANDLE_XICP, fdt_dest)) die("Fail populating PCI device nodes"); - _FDT(fdt_add_mem_rsv(fdt_dest, kvm->rtas_gra, kvm->rtas_size)); + _FDT(fdt_add_mem_rsv(fdt_dest, kvm->arch.rtas_gra, kvm->arch.rtas_size)); _FDT(fdt_pack(fdt_dest)); free(segment_page_sizes.value); @@ -503,17 +503,17 @@ int kvm__arch_setup_firmware(struct kvm *kvm) * c: 44 00 00 22 sc 1 * 10: 4e 80 00 20 blr */ - uint32_t *rtas = guest_flat_to_host(kvm, kvm->rtas_gra); + uint32_t *rtas = guest_flat_to_host(kvm, kvm->arch.rtas_gra); rtas[0] = 0x7c641b78; rtas[1] = 0x3c600000; rtas[2] = 0x6063f000; rtas[3] = 0x44000022; rtas[4] = 0x4e800020; - kvm->rtas_size = 20; + kvm->arch.rtas_size = 20; pr_info("Set up %ld bytes of RTAS at 0x%lx\n", - kvm->rtas_size, kvm->rtas_gra); + kvm->arch.rtas_size, kvm->arch.rtas_gra); /* Load SLOF */ diff --git a/tools/kvm/powerpc/spapr_pci.c b/tools/kvm/powerpc/spapr_pci.c index f9d29f0..b74790e 100644 --- a/tools/kvm/powerpc/spapr_pci.c +++ b/tools/kvm/powerpc/spapr_pci.c @@ -220,7 +220,7 @@ void spapr_create_phb(struct kvm *kvm, phb.io_addr = io_win_addr; phb.io_size = io_win_size; - kvm->phb = &phb; + kvm->arch.phb = &phb; } static uint32_t bar_to_ss(unsigned long bar) diff --git a/tools/kvm/powerpc/xics.c b/tools/kvm/powerpc/xics.c index 2d70d3c..1cf9558 100644 --- a/tools/kvm/powerpc/xics.c +++ b/tools/kvm/powerpc/xics.c @@ -302,7 +302,7 @@ static target_ulong h_cppr(struct kvm_cpu *vcpu, target_ulong cppr = args[0]; xics_dprintf("h_cppr(%lx)\n", cppr); - icp_set_cppr(vcpu->kvm->icp, vcpu->cpu_id, cppr); + icp_set_cppr(vcpu->kvm->arch.icp, vcpu->cpu_id, cppr); return H_SUCCESS; } @@ -313,18 +313,18 @@ static target_ulong h_ipi(struct kvm_cpu *vcpu, target_ulong mfrr = args[1]; xics_dprintf("h_ipi(%lx, %lx)\n", server, mfrr); - if (server >= vcpu->kvm->icp->nr_servers) { + if (server >= vcpu->kvm->arch.icp->nr_servers) { return H_PARAMETER; } - icp_set_mfrr(vcpu->kvm->icp, server, mfrr); + icp_set_mfrr(vcpu->kvm->arch.icp, server, mfrr); return H_SUCCESS; } static target_ulong h_xirr(struct kvm_cpu *vcpu, target_ulong opcode, target_ulong *args) { - uint32_t xirr = icp_accept(vcpu->kvm->icp->ss + vcpu->cpu_id); + uint32_t xirr = icp_accept(vcpu->kvm->arch.icp->ss + vcpu->cpu_id); xics_dprintf("h_xirr() = %x\n", xirr); args[0] = xirr; @@ -337,7 +337,7 @@ static target_ulong h_eoi(struct kvm_cpu *vcpu, target_ulong xirr = args[0]; xics_dprintf("h_eoi(%lx)\n", xirr); - icp_eoi(vcpu->kvm->icp, vcpu->cpu_id, xirr); + icp_eoi(vcpu->kvm->arch.icp, vcpu->cpu_id, xirr); return H_SUCCESS; } @@ -345,7 +345,7 @@ static void rtas_set_xive(struct kvm_cpu *vcpu, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - struct ics_state *ics = vcpu->kvm->icp->ics; + struct ics_state *ics = vcpu->kvm->arch.icp->ics; uint32_t nr, server, priority; if ((nargs != 3) || (nret != 1)) { @@ -373,7 +373,7 @@ static void rtas_get_xive(struct kvm_cpu *vcpu, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - struct ics_state *ics = vcpu->kvm->icp->ics; + struct ics_state *ics = vcpu->kvm->arch.icp->ics; uint32_t nr; if ((nargs != 1) || (nret != 3)) { @@ -397,7 +397,7 @@ static void rtas_int_off(struct kvm_cpu *vcpu, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - struct ics_state *ics = vcpu->kvm->icp->ics; + struct ics_state *ics = vcpu->kvm->arch.icp->ics; uint32_t nr; if ((nargs != 1) || (nret != 1)) { @@ -421,7 +421,7 @@ static void rtas_int_on(struct kvm_cpu *vcpu, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - struct ics_state *ics = vcpu->kvm->icp->ics; + struct ics_state *ics = vcpu->kvm->arch.icp->ics; uint32_t nr; if ((nargs != 1) || (nret != 1)) { @@ -443,8 +443,8 @@ static void rtas_int_on(struct kvm_cpu *vcpu, uint32_t token, void xics_cpu_register(struct kvm_cpu *vcpu) { - if (vcpu->cpu_id < vcpu->kvm->icp->nr_servers) - vcpu->kvm->icp->ss[vcpu->cpu_id].cpu = vcpu; + if (vcpu->cpu_id < vcpu->kvm->arch.icp->nr_servers) + vcpu->kvm->arch.icp->ss[vcpu->cpu_id].cpu = vcpu; else die("Setting invalid server for cpuid %ld\n", vcpu->cpu_id); } @@ -510,5 +510,5 @@ void kvm__irq_line(struct kvm *kvm, int irq, int level) * kvm_cpu__irq(vcpu, POWER7_EXT_IRQ, 1) */ xics_dprintf("Raising IRQ %d -> %d\n", irq, level); - ics_set_irq_msi(kvm->icp->ics, irq - kvm->icp->ics->offset, level); + ics_set_irq_msi(kvm->arch.icp->ics, irq - kvm->arch.icp->ics->offset, level); } diff --git a/tools/kvm/x86/bios.c b/tools/kvm/x86/bios.c index 0f1bd85..f05cc02 100644 --- a/tools/kvm/x86/bios.c +++ b/tools/kvm/x86/bios.c @@ -48,7 +48,7 @@ static void setup_irq_handler(struct kvm *kvm, struct irq_handler *handler) DIE_IF((handler->address - MB_BIOS_BEGIN) > 0xffffUL); - interrupt_table__set(&kvm->interrupt_table, &intr_desc, handler->irq); + interrupt_table__set(&kvm->arch.interrupt_table, &intr_desc, handler->irq); } /** @@ -163,12 +163,12 @@ void setup_bios(struct kvm *kvm) .segment = REAL_SEGMENT(MB_BIOS_BEGIN), .offset = address - MB_BIOS_BEGIN, }; - interrupt_table__setup(&kvm->interrupt_table, &intr_desc); + interrupt_table__setup(&kvm->arch.interrupt_table, &intr_desc); for (i = 0; i < ARRAY_SIZE(bios_irq_handlers); i++) setup_irq_handler(kvm, &bios_irq_handlers[i]); /* we almost done */ p = guest_flat_to_host(kvm, 0); - interrupt_table__copy(&kvm->interrupt_table, p, REAL_INTR_SIZE); + interrupt_table__copy(&kvm->arch.interrupt_table, p, REAL_INTR_SIZE); } diff --git a/tools/kvm/x86/boot.c b/tools/kvm/x86/boot.c index 93d9677..61535eb 100644 --- a/tools/kvm/x86/boot.c +++ b/tools/kvm/x86/boot.c @@ -33,9 +33,9 @@ bool kvm__load_firmware(struct kvm *kvm, const char *firmware_filename) while ((nr = read(fd, p, st.st_size)) > 0) p += nr; - kvm->boot_selector = BIOS_SELECTOR; - kvm->boot_ip = BIOS_IP; - kvm->boot_sp = BIOS_SP; + kvm->arch.boot_selector = BIOS_SELECTOR; + kvm->arch.boot_ip = BIOS_IP; + kvm->arch.boot_sp = BIOS_SP; return true; } diff --git a/tools/kvm/x86/include/kvm/kvm-arch.h b/tools/kvm/x86/include/kvm/kvm-arch.h index dd385d4..30086f4 100644 --- a/tools/kvm/x86/include/kvm/kvm-arch.h +++ b/tools/kvm/x86/include/kvm/kvm-arch.h @@ -23,36 +23,12 @@ #define KVM_PCI_MMIO_AREA (KVM_MMIO_START + 0x1000000) #define KVM_VIRTIO_MMIO_AREA (KVM_MMIO_START + 0x2000000) -struct kvm { - int sys_fd; /* For system ioctls(), i.e. /dev/kvm */ - int vm_fd; /* For VM ioctls() */ - timer_t timerid; /* Posix timer for interrupts */ - - int nrcpus; /* Number of cpus to run */ - - u32 mem_slots; /* for KVM_SET_USER_MEMORY_REGION */ - - u64 ram_size; - void *ram_start; - u64 ram_pagesize; - - bool nmi_disabled; - - bool single_step; - +struct kvm_arch { u16 boot_selector; u16 boot_ip; u16 boot_sp; struct interrupt_table interrupt_table; - - const char *vmlinux; - struct disk_image **disks; - int nr_disks; - - char *name; - - int vm_state; }; static inline void *guest_flat_to_host(struct kvm *kvm, unsigned long offset); /* In kvm.h */ diff --git a/tools/kvm/x86/kvm-cpu.c b/tools/kvm/x86/kvm-cpu.c index 2b3d973..dce1e1e 100644 --- a/tools/kvm/x86/kvm-cpu.c +++ b/tools/kvm/x86/kvm-cpu.c @@ -182,9 +182,9 @@ static void kvm_cpu__setup_regs(struct kvm_cpu *vcpu) /* We start the guest in 16-bit real mode */ .rflags = 0x0000000000000002ULL, - .rip = vcpu->kvm->boot_ip, - .rsp = vcpu->kvm->boot_sp, - .rbp = vcpu->kvm->boot_sp, + .rip = vcpu->kvm->arch.boot_ip, + .rsp = vcpu->kvm->arch.boot_sp, + .rbp = vcpu->kvm->arch.boot_sp, }; if (vcpu->regs.rip > USHRT_MAX) @@ -199,18 +199,18 @@ static void kvm_cpu__setup_sregs(struct kvm_cpu *vcpu) if (ioctl(vcpu->vcpu_fd, KVM_GET_SREGS, &vcpu->sregs) < 0) die_perror("KVM_GET_SREGS failed"); - vcpu->sregs.cs.selector = vcpu->kvm->boot_selector; - vcpu->sregs.cs.base = selector_to_base(vcpu->kvm->boot_selector); - vcpu->sregs.ss.selector = vcpu->kvm->boot_selector; - vcpu->sregs.ss.base = selector_to_base(vcpu->kvm->boot_selector); - vcpu->sregs.ds.selector = vcpu->kvm->boot_selector; - vcpu->sregs.ds.base = selector_to_base(vcpu->kvm->boot_selector); - vcpu->sregs.es.selector = vcpu->kvm->boot_selector; - vcpu->sregs.es.base = selector_to_base(vcpu->kvm->boot_selector); - vcpu->sregs.fs.selector = vcpu->kvm->boot_selector; - vcpu->sregs.fs.base = selector_to_base(vcpu->kvm->boot_selector); - vcpu->sregs.gs.selector = vcpu->kvm->boot_selector; - vcpu->sregs.gs.base = selector_to_base(vcpu->kvm->boot_selector); + vcpu->sregs.cs.selector = vcpu->kvm->arch.boot_selector; + vcpu->sregs.cs.base = selector_to_base(vcpu->kvm->arch.boot_selector); + vcpu->sregs.ss.selector = vcpu->kvm->arch.boot_selector; + vcpu->sregs.ss.base = selector_to_base(vcpu->kvm->arch.boot_selector); + vcpu->sregs.ds.selector = vcpu->kvm->arch.boot_selector; + vcpu->sregs.ds.base = selector_to_base(vcpu->kvm->arch.boot_selector); + vcpu->sregs.es.selector = vcpu->kvm->arch.boot_selector; + vcpu->sregs.es.base = selector_to_base(vcpu->kvm->arch.boot_selector); + vcpu->sregs.fs.selector = vcpu->kvm->arch.boot_selector; + vcpu->sregs.fs.base = selector_to_base(vcpu->kvm->arch.boot_selector); + vcpu->sregs.gs.selector = vcpu->kvm->arch.boot_selector; + vcpu->sregs.gs.base = selector_to_base(vcpu->kvm->arch.boot_selector); if (ioctl(vcpu->vcpu_fd, KVM_SET_SREGS, &vcpu->sregs) < 0) die_perror("KVM_SET_SREGS failed"); diff --git a/tools/kvm/x86/kvm.c b/tools/kvm/x86/kvm.c index 0a40fd5..e636d43 100644 --- a/tools/kvm/x86/kvm.c +++ b/tools/kvm/x86/kvm.c @@ -219,9 +219,9 @@ int load_flat_binary(struct kvm *kvm, int fd_kernel, int fd_initrd, const char * while ((nr = read(fd_kernel, p, 65536)) > 0) p += nr; - kvm->boot_selector = BOOT_LOADER_SELECTOR; - kvm->boot_ip = BOOT_LOADER_IP; - kvm->boot_sp = BOOT_LOADER_SP; + kvm->arch.boot_selector = BOOT_LOADER_SELECTOR; + kvm->arch.boot_ip = BOOT_LOADER_IP; + kvm->arch.boot_sp = BOOT_LOADER_SP; return true; } @@ -322,13 +322,13 @@ bool load_bzimage(struct kvm *kvm, int fd_kernel, kern_boot->hdr.ramdisk_size = initrd_stat.st_size; } - kvm->boot_selector = BOOT_LOADER_SELECTOR; + kvm->arch.boot_selector = BOOT_LOADER_SELECTOR; /* * The real-mode setup code starts at offset 0x200 of a bzImage. See * Documentation/x86/boot.txt for details. */ - kvm->boot_ip = BOOT_LOADER_IP + 0x200; - kvm->boot_sp = BOOT_LOADER_SP; + kvm->arch.boot_ip = BOOT_LOADER_IP + 0x200; + kvm->arch.boot_sp = BOOT_LOADER_SP; return true; }