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<<HPT_ORDER), (1<<HPT_ORDER)))
 		die("Can't allocate %d bytes for HPT\n", (1<<HPT_ORDER));
 
-	kvm->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;
 }
