xref: /kvmtool/kvm-cpu.c (revision 5c3d55fa6f0e4a7591f7edc4dea1ad695d6e1935)
1*5c3d55faSPekka Enberg #include "kvm/kvm-cpu.h"
2*5c3d55faSPekka Enberg 
3*5c3d55faSPekka Enberg #include "kvm/util.h"
4*5c3d55faSPekka Enberg #include "kvm/kvm.h"
5*5c3d55faSPekka Enberg 
6*5c3d55faSPekka Enberg #include <sys/ioctl.h>
7*5c3d55faSPekka Enberg #include <sys/mman.h>
8*5c3d55faSPekka Enberg #include <stdlib.h>
9*5c3d55faSPekka Enberg #include <errno.h>
10*5c3d55faSPekka Enberg #include <stdio.h>
11*5c3d55faSPekka Enberg 
12*5c3d55faSPekka Enberg static inline bool is_in_protected_mode(struct kvm_cpu *self)
13*5c3d55faSPekka Enberg {
14*5c3d55faSPekka Enberg 	return self->sregs.cr0 & 0x01;
15*5c3d55faSPekka Enberg }
16*5c3d55faSPekka Enberg 
17*5c3d55faSPekka Enberg static inline uint64_t ip_to_flat(struct kvm_cpu *self, uint64_t ip)
18*5c3d55faSPekka Enberg {
19*5c3d55faSPekka Enberg 	uint64_t cs;
20*5c3d55faSPekka Enberg 
21*5c3d55faSPekka Enberg 	/*
22*5c3d55faSPekka Enberg 	 * NOTE! We should take code segment base address into account here.
23*5c3d55faSPekka Enberg 	 * Luckily it's usually zero because Linux uses flat memory model.
24*5c3d55faSPekka Enberg 	 */
25*5c3d55faSPekka Enberg 	if (is_in_protected_mode(self))
26*5c3d55faSPekka Enberg 		return ip;
27*5c3d55faSPekka Enberg 
28*5c3d55faSPekka Enberg 	cs = self->sregs.cs.selector;
29*5c3d55faSPekka Enberg 
30*5c3d55faSPekka Enberg 	return ip + (cs << 4);
31*5c3d55faSPekka Enberg }
32*5c3d55faSPekka Enberg 
33*5c3d55faSPekka Enberg static inline uint32_t selector_to_base(uint16_t selector)
34*5c3d55faSPekka Enberg {
35*5c3d55faSPekka Enberg 	/*
36*5c3d55faSPekka Enberg 	 * KVM on Intel requires 'base' to be 'selector * 16' in real mode.
37*5c3d55faSPekka Enberg 	 */
38*5c3d55faSPekka Enberg 	return (uint32_t)selector * 16;
39*5c3d55faSPekka Enberg }
40*5c3d55faSPekka Enberg 
41*5c3d55faSPekka Enberg static struct kvm_cpu *kvm_cpu__new(struct kvm *kvm)
42*5c3d55faSPekka Enberg {
43*5c3d55faSPekka Enberg 	struct kvm_cpu *self;
44*5c3d55faSPekka Enberg 
45*5c3d55faSPekka Enberg 	self		= calloc(1, sizeof *self);
46*5c3d55faSPekka Enberg 	if (!self)
47*5c3d55faSPekka Enberg 		return NULL;
48*5c3d55faSPekka Enberg 
49*5c3d55faSPekka Enberg 	self->kvm	= kvm;
50*5c3d55faSPekka Enberg 
51*5c3d55faSPekka Enberg 	return self;
52*5c3d55faSPekka Enberg }
53*5c3d55faSPekka Enberg 
54*5c3d55faSPekka Enberg void kvm_cpu__delete(struct kvm_cpu *self)
55*5c3d55faSPekka Enberg {
56*5c3d55faSPekka Enberg 	if (self->msrs)
57*5c3d55faSPekka Enberg 		free(self->msrs);
58*5c3d55faSPekka Enberg 
59*5c3d55faSPekka Enberg 	free(self);
60*5c3d55faSPekka Enberg }
61*5c3d55faSPekka Enberg 
62*5c3d55faSPekka Enberg struct kvm_cpu *kvm_cpu__init(struct kvm *kvm)
63*5c3d55faSPekka Enberg {
64*5c3d55faSPekka Enberg 	struct kvm_cpu *self;
65*5c3d55faSPekka Enberg 	int mmap_size;
66*5c3d55faSPekka Enberg 
67*5c3d55faSPekka Enberg 	self		= kvm_cpu__new(kvm);
68*5c3d55faSPekka Enberg 	if (!self)
69*5c3d55faSPekka Enberg 		return NULL;
70*5c3d55faSPekka Enberg 
71*5c3d55faSPekka Enberg 	self->vcpu_fd = ioctl(self->kvm->vm_fd, KVM_CREATE_VCPU, 0);
72*5c3d55faSPekka Enberg 	if (self->vcpu_fd < 0)
73*5c3d55faSPekka Enberg 		die_perror("KVM_CREATE_VCPU ioctl");
74*5c3d55faSPekka Enberg 
75*5c3d55faSPekka Enberg 	mmap_size = ioctl(self->kvm->sys_fd, KVM_GET_VCPU_MMAP_SIZE, 0);
76*5c3d55faSPekka Enberg 	if (mmap_size < 0)
77*5c3d55faSPekka Enberg 		die_perror("KVM_GET_VCPU_MMAP_SIZE ioctl");
78*5c3d55faSPekka Enberg 
79*5c3d55faSPekka Enberg 	self->kvm_run = mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, MAP_SHARED, self->vcpu_fd, 0);
80*5c3d55faSPekka Enberg 	if (self->kvm_run == MAP_FAILED)
81*5c3d55faSPekka Enberg 		die("unable to mmap vcpu fd");
82*5c3d55faSPekka Enberg 
83*5c3d55faSPekka Enberg 	return self;
84*5c3d55faSPekka Enberg }
85*5c3d55faSPekka Enberg 
86*5c3d55faSPekka Enberg void kvm_cpu__enable_singlestep(struct kvm_cpu *self)
87*5c3d55faSPekka Enberg {
88*5c3d55faSPekka Enberg 	struct kvm_guest_debug debug = {
89*5c3d55faSPekka Enberg 		.control	= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP,
90*5c3d55faSPekka Enberg 	};
91*5c3d55faSPekka Enberg 
92*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_SET_GUEST_DEBUG, &debug) < 0)
93*5c3d55faSPekka Enberg 		warning("KVM_SET_GUEST_DEBUG failed");
94*5c3d55faSPekka Enberg }
95*5c3d55faSPekka Enberg 
96*5c3d55faSPekka Enberg static struct kvm_msrs *kvm_msrs__new(size_t nmsrs)
97*5c3d55faSPekka Enberg {
98*5c3d55faSPekka Enberg 	struct kvm_msrs *self = calloc(1, sizeof(*self) + (sizeof(struct kvm_msr_entry) * nmsrs));
99*5c3d55faSPekka Enberg 
100*5c3d55faSPekka Enberg 	if (!self)
101*5c3d55faSPekka Enberg 		die("out of memory");
102*5c3d55faSPekka Enberg 
103*5c3d55faSPekka Enberg 	return self;
104*5c3d55faSPekka Enberg }
105*5c3d55faSPekka Enberg 
106*5c3d55faSPekka Enberg #define MSR_IA32_TIME_STAMP_COUNTER	0x10
107*5c3d55faSPekka Enberg 
108*5c3d55faSPekka Enberg #define MSR_IA32_SYSENTER_CS		0x174
109*5c3d55faSPekka Enberg #define MSR_IA32_SYSENTER_ESP		0x175
110*5c3d55faSPekka Enberg #define MSR_IA32_SYSENTER_EIP		0x176
111*5c3d55faSPekka Enberg 
112*5c3d55faSPekka Enberg #define MSR_IA32_STAR			0xc0000081
113*5c3d55faSPekka Enberg #define MSR_IA32_LSTAR			0xc0000082
114*5c3d55faSPekka Enberg #define MSR_IA32_CSTAR			0xc0000083
115*5c3d55faSPekka Enberg #define MSR_IA32_FMASK			0xc0000084
116*5c3d55faSPekka Enberg #define MSR_IA32_KERNEL_GS_BASE		0xc0000102
117*5c3d55faSPekka Enberg 
118*5c3d55faSPekka Enberg #define KVM_MSR_ENTRY(_index, _data)	\
119*5c3d55faSPekka Enberg 	(struct kvm_msr_entry) { .index = _index, .data = _data }
120*5c3d55faSPekka Enberg 
121*5c3d55faSPekka Enberg static void kvm_cpu__setup_msrs(struct kvm_cpu *self)
122*5c3d55faSPekka Enberg {
123*5c3d55faSPekka Enberg 	unsigned long ndx = 0;
124*5c3d55faSPekka Enberg 
125*5c3d55faSPekka Enberg 	self->msrs = kvm_msrs__new(100);
126*5c3d55faSPekka Enberg 
127*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_SYSENTER_CS,	0x0);
128*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_SYSENTER_ESP,	0x0);
129*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_SYSENTER_EIP,	0x0);
130*5c3d55faSPekka Enberg #ifdef CONFIG_X86_64
131*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_STAR,		0x0);
132*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_CSTAR,		0x0);
133*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_KERNEL_GS_BASE,	0x0);
134*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_FMASK,		0x0);
135*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_LSTAR,		0x0);
136*5c3d55faSPekka Enberg #endif
137*5c3d55faSPekka Enberg 	self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_TIME_STAMP_COUNTER,	0x0);
138*5c3d55faSPekka Enberg 
139*5c3d55faSPekka Enberg 	self->msrs->nmsrs	= ndx;
140*5c3d55faSPekka Enberg 
141*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_SET_MSRS, self->msrs) < 0)
142*5c3d55faSPekka Enberg 		die_perror("KVM_SET_MSRS failed");
143*5c3d55faSPekka Enberg }
144*5c3d55faSPekka Enberg 
145*5c3d55faSPekka Enberg static void kvm_cpu__setup_fpu(struct kvm_cpu *self)
146*5c3d55faSPekka Enberg {
147*5c3d55faSPekka Enberg 	self->fpu = (struct kvm_fpu) {
148*5c3d55faSPekka Enberg 		.fcw		= 0x37f,
149*5c3d55faSPekka Enberg 		.mxcsr		= 0x1f80,
150*5c3d55faSPekka Enberg 	};
151*5c3d55faSPekka Enberg 
152*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_SET_FPU, &self->fpu) < 0)
153*5c3d55faSPekka Enberg 		die_perror("KVM_SET_FPU failed");
154*5c3d55faSPekka Enberg }
155*5c3d55faSPekka Enberg 
156*5c3d55faSPekka Enberg static void kvm_cpu__setup_regs(struct kvm_cpu *self)
157*5c3d55faSPekka Enberg {
158*5c3d55faSPekka Enberg 	self->regs = (struct kvm_regs) {
159*5c3d55faSPekka Enberg 		/* We start the guest in 16-bit real mode  */
160*5c3d55faSPekka Enberg 		.rflags		= 0x0000000000000002ULL,
161*5c3d55faSPekka Enberg 
162*5c3d55faSPekka Enberg 		.rip		= self->kvm->boot_ip,
163*5c3d55faSPekka Enberg 		.rsp		= self->kvm->boot_sp,
164*5c3d55faSPekka Enberg 		.rbp		= self->kvm->boot_sp,
165*5c3d55faSPekka Enberg 	};
166*5c3d55faSPekka Enberg 
167*5c3d55faSPekka Enberg 	if (self->regs.rip > USHRT_MAX)
168*5c3d55faSPekka Enberg 		die("ip 0x%" PRIx64 " is too high for real mode", (uint64_t) self->regs.rip);
169*5c3d55faSPekka Enberg 
170*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_SET_REGS, &self->regs) < 0)
171*5c3d55faSPekka Enberg 		die_perror("KVM_SET_REGS failed");
172*5c3d55faSPekka Enberg }
173*5c3d55faSPekka Enberg 
174*5c3d55faSPekka Enberg static void kvm_cpu__setup_sregs(struct kvm_cpu *self)
175*5c3d55faSPekka Enberg {
176*5c3d55faSPekka Enberg 
177*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_GET_SREGS, &self->sregs) < 0)
178*5c3d55faSPekka Enberg 		die_perror("KVM_GET_SREGS failed");
179*5c3d55faSPekka Enberg 
180*5c3d55faSPekka Enberg 	self->sregs.cs.selector	= self->kvm->boot_selector;
181*5c3d55faSPekka Enberg 	self->sregs.cs.base	= selector_to_base(self->kvm->boot_selector);
182*5c3d55faSPekka Enberg 	self->sregs.ss.selector	= self->kvm->boot_selector;
183*5c3d55faSPekka Enberg 	self->sregs.ss.base	= selector_to_base(self->kvm->boot_selector);
184*5c3d55faSPekka Enberg 	self->sregs.ds.selector	= self->kvm->boot_selector;
185*5c3d55faSPekka Enberg 	self->sregs.ds.base	= selector_to_base(self->kvm->boot_selector);
186*5c3d55faSPekka Enberg 	self->sregs.es.selector	= self->kvm->boot_selector;
187*5c3d55faSPekka Enberg 	self->sregs.es.base	= selector_to_base(self->kvm->boot_selector);
188*5c3d55faSPekka Enberg 	self->sregs.fs.selector	= self->kvm->boot_selector;
189*5c3d55faSPekka Enberg 	self->sregs.fs.base	= selector_to_base(self->kvm->boot_selector);
190*5c3d55faSPekka Enberg 	self->sregs.gs.selector	= self->kvm->boot_selector;
191*5c3d55faSPekka Enberg 	self->sregs.gs.base	= selector_to_base(self->kvm->boot_selector);
192*5c3d55faSPekka Enberg 
193*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_SET_SREGS, &self->sregs) < 0)
194*5c3d55faSPekka Enberg 		die_perror("KVM_SET_SREGS failed");
195*5c3d55faSPekka Enberg }
196*5c3d55faSPekka Enberg 
197*5c3d55faSPekka Enberg /**
198*5c3d55faSPekka Enberg  * kvm_cpu__reset_vcpu - reset virtual CPU to a known state
199*5c3d55faSPekka Enberg  */
200*5c3d55faSPekka Enberg void kvm_cpu__reset_vcpu(struct kvm_cpu *self)
201*5c3d55faSPekka Enberg {
202*5c3d55faSPekka Enberg 	kvm_cpu__setup_sregs(self);
203*5c3d55faSPekka Enberg 	kvm_cpu__setup_regs(self);
204*5c3d55faSPekka Enberg 	kvm_cpu__setup_fpu(self);
205*5c3d55faSPekka Enberg 	kvm_cpu__setup_msrs(self);
206*5c3d55faSPekka Enberg }
207*5c3d55faSPekka Enberg 
208*5c3d55faSPekka Enberg static void print_dtable(const char *name, struct kvm_dtable *dtable)
209*5c3d55faSPekka Enberg {
210*5c3d55faSPekka Enberg 	printf(" %s                 %016" PRIx64 "  %08" PRIx16 "\n",
211*5c3d55faSPekka Enberg 		name, (uint64_t) dtable->base, (uint16_t) dtable->limit);
212*5c3d55faSPekka Enberg }
213*5c3d55faSPekka Enberg 
214*5c3d55faSPekka Enberg static void print_segment(const char *name, struct kvm_segment *seg)
215*5c3d55faSPekka Enberg {
216*5c3d55faSPekka Enberg 	printf(" %s       %04" PRIx16 "      %016" PRIx64 "  %08" PRIx32 "  %02" PRIx8 "    %x %x   %x  %x %x %x %x\n",
217*5c3d55faSPekka Enberg 		name, (uint16_t) seg->selector, (uint64_t) seg->base, (uint32_t) seg->limit,
218*5c3d55faSPekka Enberg 		(uint8_t) seg->type, seg->present, seg->dpl, seg->db, seg->s, seg->l, seg->g, seg->avl);
219*5c3d55faSPekka Enberg }
220*5c3d55faSPekka Enberg 
221*5c3d55faSPekka Enberg void kvm_cpu__show_registers(struct kvm_cpu *self)
222*5c3d55faSPekka Enberg {
223*5c3d55faSPekka Enberg 	unsigned long cr0, cr2, cr3;
224*5c3d55faSPekka Enberg 	unsigned long cr4, cr8;
225*5c3d55faSPekka Enberg 	unsigned long rax, rbx, rcx;
226*5c3d55faSPekka Enberg 	unsigned long rdx, rsi, rdi;
227*5c3d55faSPekka Enberg 	unsigned long rbp,  r8,  r9;
228*5c3d55faSPekka Enberg 	unsigned long r10, r11, r12;
229*5c3d55faSPekka Enberg 	unsigned long r13, r14, r15;
230*5c3d55faSPekka Enberg 	unsigned long rip, rsp;
231*5c3d55faSPekka Enberg 	struct kvm_sregs sregs;
232*5c3d55faSPekka Enberg 	unsigned long rflags;
233*5c3d55faSPekka Enberg 	struct kvm_regs regs;
234*5c3d55faSPekka Enberg 	int i;
235*5c3d55faSPekka Enberg 
236*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_GET_REGS, &regs) < 0)
237*5c3d55faSPekka Enberg 		die("KVM_GET_REGS failed");
238*5c3d55faSPekka Enberg 
239*5c3d55faSPekka Enberg 	rflags = regs.rflags;
240*5c3d55faSPekka Enberg 
241*5c3d55faSPekka Enberg 	rip = regs.rip; rsp = regs.rsp;
242*5c3d55faSPekka Enberg 	rax = regs.rax; rbx = regs.rbx; rcx = regs.rcx;
243*5c3d55faSPekka Enberg 	rdx = regs.rdx; rsi = regs.rsi; rdi = regs.rdi;
244*5c3d55faSPekka Enberg 	rbp = regs.rbp; r8  = regs.r8;  r9  = regs.r9;
245*5c3d55faSPekka Enberg 	r10 = regs.r10; r11 = regs.r11; r12 = regs.r12;
246*5c3d55faSPekka Enberg 	r13 = regs.r13; r14 = regs.r14; r15 = regs.r15;
247*5c3d55faSPekka Enberg 
248*5c3d55faSPekka Enberg 	printf("Registers:\n");
249*5c3d55faSPekka Enberg 	printf(" rip: %016lx   rsp: %016lx flags: %016lx\n", rip, rsp, rflags);
250*5c3d55faSPekka Enberg 	printf(" rax: %016lx   rbx: %016lx   rcx: %016lx\n", rax, rbx, rcx);
251*5c3d55faSPekka Enberg 	printf(" rdx: %016lx   rsi: %016lx   rdi: %016lx\n", rdx, rsi, rdi);
252*5c3d55faSPekka Enberg 	printf(" rbp: %016lx   r8:  %016lx   r9:  %016lx\n", rbp, r8,  r9);
253*5c3d55faSPekka Enberg 	printf(" r10: %016lx   r11: %016lx   r12: %016lx\n", r10, r11, r12);
254*5c3d55faSPekka Enberg 	printf(" r13: %016lx   r14: %016lx   r15: %016lx\n", r13, r14, r15);
255*5c3d55faSPekka Enberg 
256*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_GET_SREGS, &sregs) < 0)
257*5c3d55faSPekka Enberg 		die("KVM_GET_REGS failed");
258*5c3d55faSPekka Enberg 
259*5c3d55faSPekka Enberg 	cr0 = sregs.cr0; cr2 = sregs.cr2; cr3 = sregs.cr3;
260*5c3d55faSPekka Enberg 	cr4 = sregs.cr4; cr8 = sregs.cr8;
261*5c3d55faSPekka Enberg 
262*5c3d55faSPekka Enberg 	printf(" cr0: %016lx   cr2: %016lx   cr3: %016lx\n", cr0, cr2, cr3);
263*5c3d55faSPekka Enberg 	printf(" cr4: %016lx   cr8: %016lx\n", cr4, cr8);
264*5c3d55faSPekka Enberg 	printf("Segment registers:\n");
265*5c3d55faSPekka Enberg 	printf(" register  selector  base              limit     type  p dpl db s l g avl\n");
266*5c3d55faSPekka Enberg 	print_segment("cs ", &sregs.cs);
267*5c3d55faSPekka Enberg 	print_segment("ss ", &sregs.ss);
268*5c3d55faSPekka Enberg 	print_segment("ds ", &sregs.ds);
269*5c3d55faSPekka Enberg 	print_segment("es ", &sregs.es);
270*5c3d55faSPekka Enberg 	print_segment("fs ", &sregs.fs);
271*5c3d55faSPekka Enberg 	print_segment("gs ", &sregs.gs);
272*5c3d55faSPekka Enberg 	print_segment("tr ", &sregs.tr);
273*5c3d55faSPekka Enberg 	print_segment("ldt", &sregs.ldt);
274*5c3d55faSPekka Enberg 	print_dtable("gdt", &sregs.gdt);
275*5c3d55faSPekka Enberg 	print_dtable("idt", &sregs.idt);
276*5c3d55faSPekka Enberg 	printf(" [ efer: %016" PRIx64 "  apic base: %016" PRIx64 "  nmi: %s ]\n",
277*5c3d55faSPekka Enberg 		(uint64_t) sregs.efer, (uint64_t) sregs.apic_base,
278*5c3d55faSPekka Enberg 		(self->kvm->nmi_disabled ? "disabled" : "enabled"));
279*5c3d55faSPekka Enberg 	printf("Interrupt bitmap:\n");
280*5c3d55faSPekka Enberg 	printf(" ");
281*5c3d55faSPekka Enberg 	for (i = 0; i < (KVM_NR_INTERRUPTS + 63) / 64; i++)
282*5c3d55faSPekka Enberg 		printf("%016" PRIx64 " ", (uint64_t) sregs.interrupt_bitmap[i]);
283*5c3d55faSPekka Enberg 	printf("\n");
284*5c3d55faSPekka Enberg }
285*5c3d55faSPekka Enberg 
286*5c3d55faSPekka Enberg void kvm_cpu__show_code(struct kvm_cpu *self)
287*5c3d55faSPekka Enberg {
288*5c3d55faSPekka Enberg 	unsigned int code_bytes = 64;
289*5c3d55faSPekka Enberg 	unsigned int code_prologue = code_bytes * 43 / 64;
290*5c3d55faSPekka Enberg 	unsigned int code_len = code_bytes;
291*5c3d55faSPekka Enberg 	unsigned char c;
292*5c3d55faSPekka Enberg 	unsigned int i;
293*5c3d55faSPekka Enberg 	uint8_t *ip;
294*5c3d55faSPekka Enberg 
295*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_GET_REGS, &self->regs) < 0)
296*5c3d55faSPekka Enberg 		die("KVM_GET_REGS failed");
297*5c3d55faSPekka Enberg 
298*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_GET_SREGS, &self->sregs) < 0)
299*5c3d55faSPekka Enberg 		die("KVM_GET_SREGS failed");
300*5c3d55faSPekka Enberg 
301*5c3d55faSPekka Enberg 	ip = guest_flat_to_host(self->kvm, ip_to_flat(self, self->regs.rip) - code_prologue);
302*5c3d55faSPekka Enberg 
303*5c3d55faSPekka Enberg 	printf("Code: ");
304*5c3d55faSPekka Enberg 
305*5c3d55faSPekka Enberg 	for (i = 0; i < code_len; i++, ip++) {
306*5c3d55faSPekka Enberg 		if (!host_ptr_in_ram(self->kvm, ip))
307*5c3d55faSPekka Enberg 			break;
308*5c3d55faSPekka Enberg 
309*5c3d55faSPekka Enberg 		c = *ip;
310*5c3d55faSPekka Enberg 
311*5c3d55faSPekka Enberg 		if (ip == guest_flat_to_host(self->kvm, ip_to_flat(self, self->regs.rip)))
312*5c3d55faSPekka Enberg 			printf("<%02x> ", c);
313*5c3d55faSPekka Enberg 		else
314*5c3d55faSPekka Enberg 			printf("%02x ", c);
315*5c3d55faSPekka Enberg 	}
316*5c3d55faSPekka Enberg 
317*5c3d55faSPekka Enberg 	printf("\n");
318*5c3d55faSPekka Enberg 
319*5c3d55faSPekka Enberg 	printf("Stack:\n");
320*5c3d55faSPekka Enberg 	kvm__dump_mem(self->kvm, self->regs.rsp, 32);
321*5c3d55faSPekka Enberg }
322*5c3d55faSPekka Enberg 
323*5c3d55faSPekka Enberg void kvm_cpu__show_page_tables(struct kvm_cpu *self)
324*5c3d55faSPekka Enberg {
325*5c3d55faSPekka Enberg 	uint64_t *pte1;
326*5c3d55faSPekka Enberg 	uint64_t *pte2;
327*5c3d55faSPekka Enberg 	uint64_t *pte3;
328*5c3d55faSPekka Enberg 	uint64_t *pte4;
329*5c3d55faSPekka Enberg 
330*5c3d55faSPekka Enberg 	if (!is_in_protected_mode(self))
331*5c3d55faSPekka Enberg 		return;
332*5c3d55faSPekka Enberg 
333*5c3d55faSPekka Enberg 	if (ioctl(self->vcpu_fd, KVM_GET_SREGS, &self->sregs) < 0)
334*5c3d55faSPekka Enberg 		die("KVM_GET_SREGS failed");
335*5c3d55faSPekka Enberg 
336*5c3d55faSPekka Enberg 	pte4	= guest_flat_to_host(self->kvm, self->sregs.cr3);
337*5c3d55faSPekka Enberg 	if (!host_ptr_in_ram(self->kvm, pte4))
338*5c3d55faSPekka Enberg 		return;
339*5c3d55faSPekka Enberg 
340*5c3d55faSPekka Enberg 	pte3	= guest_flat_to_host(self->kvm, (*pte4 & ~0xfff));
341*5c3d55faSPekka Enberg 	if (!host_ptr_in_ram(self->kvm, pte3))
342*5c3d55faSPekka Enberg 		return;
343*5c3d55faSPekka Enberg 
344*5c3d55faSPekka Enberg 	pte2	= guest_flat_to_host(self->kvm, (*pte3 & ~0xfff));
345*5c3d55faSPekka Enberg 	if (!host_ptr_in_ram(self->kvm, pte2))
346*5c3d55faSPekka Enberg 		return;
347*5c3d55faSPekka Enberg 
348*5c3d55faSPekka Enberg 	pte1	= guest_flat_to_host(self->kvm, (*pte2 & ~0xfff));
349*5c3d55faSPekka Enberg 	if (!host_ptr_in_ram(self->kvm, pte1))
350*5c3d55faSPekka Enberg 		return;
351*5c3d55faSPekka Enberg 
352*5c3d55faSPekka Enberg 	printf("Page Tables:\n");
353*5c3d55faSPekka Enberg 	if (*pte2 & (1 << 7))
354*5c3d55faSPekka Enberg 		printf(" pte4: %016" PRIx64 "   pte3: %016" PRIx64
355*5c3d55faSPekka Enberg 			"   pte2: %016" PRIx64 "\n",
356*5c3d55faSPekka Enberg 			*pte4, *pte3, *pte2);
357*5c3d55faSPekka Enberg 	else
358*5c3d55faSPekka Enberg 		printf(" pte4: %016" PRIx64 "   pte3: %016" PRIx64 "   pte2: %016"
359*5c3d55faSPekka Enberg 			PRIx64 "   pte1: %016" PRIx64 "\n",
360*5c3d55faSPekka Enberg 			*pte4, *pte3, *pte2, *pte1);
361*5c3d55faSPekka Enberg }
362*5c3d55faSPekka Enberg 
363*5c3d55faSPekka Enberg void kvm_cpu__run(struct kvm_cpu *self)
364*5c3d55faSPekka Enberg {
365*5c3d55faSPekka Enberg 	int err;
366*5c3d55faSPekka Enberg 
367*5c3d55faSPekka Enberg 	err = ioctl(self->vcpu_fd, KVM_RUN, 0);
368*5c3d55faSPekka Enberg 	if (err && (errno != EINTR && errno != EAGAIN))
369*5c3d55faSPekka Enberg 		die_perror("KVM_RUN failed");
370*5c3d55faSPekka Enberg }
371