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