xref: /kvmtool/main.c (revision fe806d65705f0e96ea6a82c369d3d2511bc716fd)
1ae1fae34SPekka Enberg #include "kvm/kvm.h"
2ae1fae34SPekka Enberg 
37fb218bdSPekka Enberg #include "util.h"
47fb218bdSPekka Enberg 
5ae1fae34SPekka Enberg #include <inttypes.h>
6ae1fae34SPekka Enberg #include <stdint.h>
7ae1fae34SPekka Enberg #include <stdlib.h>
8ae1fae34SPekka Enberg #include <stdio.h>
9ae1fae34SPekka Enberg 
10ae1fae34SPekka Enberg static void usage(char *argv[])
11ae1fae34SPekka Enberg {
12ae1fae34SPekka Enberg 	fprintf(stderr, "  usage: %s <kernel-image>\n", argv[0]);
13ae1fae34SPekka Enberg 	exit(1);
14ae1fae34SPekka Enberg }
15ae1fae34SPekka Enberg 
16ae1fae34SPekka Enberg int main(int argc, char *argv[])
17ae1fae34SPekka Enberg {
18ae1fae34SPekka Enberg 	const char *kernel_filename;
19ae1fae34SPekka Enberg 	struct kvm *kvm;
20ae1fae34SPekka Enberg 
21ae1fae34SPekka Enberg 	if (argc < 2)
22ae1fae34SPekka Enberg 		usage(argv);
23ae1fae34SPekka Enberg 
24ae1fae34SPekka Enberg 	kernel_filename = argv[1];
25ae1fae34SPekka Enberg 
26ae1fae34SPekka Enberg 	kvm = kvm__init();
27ae1fae34SPekka Enberg 
287fb218bdSPekka Enberg 	if (!kvm__load_kernel(kvm, kernel_filename))
297fb218bdSPekka Enberg 		die("unable to load kernel %s", kernel_filename);
30ae1fae34SPekka Enberg 
317fb218bdSPekka Enberg 	kvm__reset_vcpu(kvm);
32ae1fae34SPekka Enberg 
33ae1fae34SPekka Enberg 	kvm__enable_singlestep(kvm);
34ae1fae34SPekka Enberg 
35ae1fae34SPekka Enberg 	for (;;) {
36ae1fae34SPekka Enberg 		kvm__run(kvm);
37ae1fae34SPekka Enberg 
38ae1fae34SPekka Enberg 		switch (kvm->kvm_run->exit_reason) {
39*fe806d65SPekka Enberg 		case KVM_EXIT_DEBUG:
40*fe806d65SPekka Enberg 			kvm__show_registers(kvm);
41*fe806d65SPekka Enberg 			kvm__show_code(kvm);
42*fe806d65SPekka Enberg 			break;
43ae1fae34SPekka Enberg 		case KVM_EXIT_IO:
44ae1fae34SPekka Enberg 			kvm__emulate_io(kvm,
45ae1fae34SPekka Enberg 					kvm->kvm_run->io.port,
46ae1fae34SPekka Enberg 					(uint8_t *)kvm->kvm_run + kvm->kvm_run->io.data_offset,
47ae1fae34SPekka Enberg 					kvm->kvm_run->io.direction,
48ae1fae34SPekka Enberg 					kvm->kvm_run->io.size,
49ae1fae34SPekka Enberg 					kvm->kvm_run->io.count);
50ae1fae34SPekka Enberg 			goto exit_kvm;
51ae1fae34SPekka Enberg 			break;
52ae1fae34SPekka Enberg 		default:
53ae1fae34SPekka Enberg 			goto exit_kvm;
54ae1fae34SPekka Enberg 		}
55ae1fae34SPekka Enberg 	}
56ae1fae34SPekka Enberg 
57ae1fae34SPekka Enberg exit_kvm:
58ae1fae34SPekka Enberg 	fprintf(stderr, "KVM exit reason: %" PRIu32 " (\"%s\")\n",
59ae1fae34SPekka Enberg 		kvm->kvm_run->exit_reason, kvm_exit_reasons[kvm->kvm_run->exit_reason]);
60ae1fae34SPekka Enberg 
61ae1fae34SPekka Enberg 	kvm__show_registers(kvm);
62ae1fae34SPekka Enberg 	kvm__show_code(kvm);
63ae1fae34SPekka Enberg 
64ae1fae34SPekka Enberg 	return 0;
65ae1fae34SPekka Enberg }
66