xref: /kvmtool/main.c (revision 6d1f350d0f34d204bf87e28158a024beffe625a3)
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 {
125645c7a9SCyrill Gorcunov 	fprintf(stderr, "  usage: %s [--kernel=]<kernel-image>\n",
135645c7a9SCyrill Gorcunov 		argv[0]);
14ae1fae34SPekka Enberg 	exit(1);
15ae1fae34SPekka Enberg }
16ae1fae34SPekka Enberg 
17ae1fae34SPekka Enberg int main(int argc, char *argv[])
18ae1fae34SPekka Enberg {
195645c7a9SCyrill Gorcunov 	const char *kernel_filename = NULL;
20*6d1f350dSCyrill Gorcunov 	const char *kernel_cmdline = NULL;
21ae1fae34SPekka Enberg 	struct kvm *kvm;
225645c7a9SCyrill Gorcunov 	int i;
23ae1fae34SPekka Enberg 
245645c7a9SCyrill Gorcunov 	for (i = 1; i < argc; i++) {
255645c7a9SCyrill Gorcunov 		if (!strncmp("--kernel=", argv[i], 9)) {
265645c7a9SCyrill Gorcunov 			kernel_filename = &argv[i][9];
275645c7a9SCyrill Gorcunov 			continue;
28*6d1f350dSCyrill Gorcunov 		} else if (!strncmp("--params=", argv[i], 9)) {
29*6d1f350dSCyrill Gorcunov 			kernel_cmdline = &argv[i][9];
30*6d1f350dSCyrill Gorcunov 			continue;
315645c7a9SCyrill Gorcunov 		} else {
325645c7a9SCyrill Gorcunov 			/* any unspecified arg is kernel image */
335645c7a9SCyrill Gorcunov 			if (argv[i][0] != '-')
345645c7a9SCyrill Gorcunov 				kernel_filename = argv[i];
355645c7a9SCyrill Gorcunov 			else
365645c7a9SCyrill Gorcunov 				warning("Unknown option: %s", argv[i]);
375645c7a9SCyrill Gorcunov 		}
385645c7a9SCyrill Gorcunov 	}
395645c7a9SCyrill Gorcunov 
405645c7a9SCyrill Gorcunov 	/* at least we should have kernel image passed */
415645c7a9SCyrill Gorcunov 	if (!kernel_filename)
42ae1fae34SPekka Enberg 		usage(argv);
43ae1fae34SPekka Enberg 
44ae1fae34SPekka Enberg 	kvm = kvm__init();
45ae1fae34SPekka Enberg 
46*6d1f350dSCyrill Gorcunov 	if (!kvm__load_kernel(kvm, kernel_filename, kernel_cmdline))
477fb218bdSPekka Enberg 		die("unable to load kernel %s", kernel_filename);
48ae1fae34SPekka Enberg 
497fb218bdSPekka Enberg 	kvm__reset_vcpu(kvm);
50ae1fae34SPekka Enberg 
51ae1fae34SPekka Enberg 	kvm__enable_singlestep(kvm);
52ae1fae34SPekka Enberg 
53ae1fae34SPekka Enberg 	for (;;) {
54ae1fae34SPekka Enberg 		kvm__run(kvm);
55ae1fae34SPekka Enberg 
56ae1fae34SPekka Enberg 		switch (kvm->kvm_run->exit_reason) {
57fe806d65SPekka Enberg 		case KVM_EXIT_DEBUG:
58fe806d65SPekka Enberg 			kvm__show_registers(kvm);
59fe806d65SPekka Enberg 			kvm__show_code(kvm);
60fe806d65SPekka Enberg 			break;
61ae1fae34SPekka Enberg 		case KVM_EXIT_IO:
62ae1fae34SPekka Enberg 			kvm__emulate_io(kvm,
63ae1fae34SPekka Enberg 					kvm->kvm_run->io.port,
64ae1fae34SPekka Enberg 					(uint8_t *)kvm->kvm_run + kvm->kvm_run->io.data_offset,
65ae1fae34SPekka Enberg 					kvm->kvm_run->io.direction,
66ae1fae34SPekka Enberg 					kvm->kvm_run->io.size,
67ae1fae34SPekka Enberg 					kvm->kvm_run->io.count);
68ae1fae34SPekka Enberg 			goto exit_kvm;
69ae1fae34SPekka Enberg 			break;
70ae1fae34SPekka Enberg 		default:
71ae1fae34SPekka Enberg 			goto exit_kvm;
72ae1fae34SPekka Enberg 		}
73ae1fae34SPekka Enberg 	}
74ae1fae34SPekka Enberg 
75ae1fae34SPekka Enberg exit_kvm:
76ae1fae34SPekka Enberg 	fprintf(stderr, "KVM exit reason: %" PRIu32 " (\"%s\")\n",
77ae1fae34SPekka Enberg 		kvm->kvm_run->exit_reason, kvm_exit_reasons[kvm->kvm_run->exit_reason]);
78ae1fae34SPekka Enberg 
79ae1fae34SPekka Enberg 	kvm__show_registers(kvm);
80ae1fae34SPekka Enberg 	kvm__show_code(kvm);
81ae1fae34SPekka Enberg 
82ae1fae34SPekka Enberg 	return 0;
83ae1fae34SPekka Enberg }
84