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 { 12*5645c7a9SCyrill Gorcunov fprintf(stderr, " usage: %s [--kernel=]<kernel-image>\n", 13*5645c7a9SCyrill Gorcunov argv[0]); 14ae1fae34SPekka Enberg exit(1); 15ae1fae34SPekka Enberg } 16ae1fae34SPekka Enberg 17ae1fae34SPekka Enberg int main(int argc, char *argv[]) 18ae1fae34SPekka Enberg { 19*5645c7a9SCyrill Gorcunov const char *kernel_filename = NULL; 20ae1fae34SPekka Enberg struct kvm *kvm; 21*5645c7a9SCyrill Gorcunov int i; 22ae1fae34SPekka Enberg 23*5645c7a9SCyrill Gorcunov for (i = 1; i < argc; i++) { 24*5645c7a9SCyrill Gorcunov if (!strncmp("--kernel=", argv[i], 9)) { 25*5645c7a9SCyrill Gorcunov kernel_filename = &argv[i][9]; 26*5645c7a9SCyrill Gorcunov continue; 27*5645c7a9SCyrill Gorcunov } else { 28*5645c7a9SCyrill Gorcunov /* any unspecified arg is kernel image */ 29*5645c7a9SCyrill Gorcunov if (argv[i][0] != '-') 30*5645c7a9SCyrill Gorcunov kernel_filename = argv[i]; 31*5645c7a9SCyrill Gorcunov else 32*5645c7a9SCyrill Gorcunov warning("Unknown option: %s", argv[i]); 33*5645c7a9SCyrill Gorcunov } 34*5645c7a9SCyrill Gorcunov } 35*5645c7a9SCyrill Gorcunov 36*5645c7a9SCyrill Gorcunov /* at least we should have kernel image passed */ 37*5645c7a9SCyrill Gorcunov if (!kernel_filename) 38ae1fae34SPekka Enberg usage(argv); 39ae1fae34SPekka Enberg 40ae1fae34SPekka Enberg kvm = kvm__init(); 41ae1fae34SPekka Enberg 427fb218bdSPekka Enberg if (!kvm__load_kernel(kvm, kernel_filename)) 437fb218bdSPekka Enberg die("unable to load kernel %s", kernel_filename); 44ae1fae34SPekka Enberg 457fb218bdSPekka Enberg kvm__reset_vcpu(kvm); 46ae1fae34SPekka Enberg 47ae1fae34SPekka Enberg kvm__enable_singlestep(kvm); 48ae1fae34SPekka Enberg 49ae1fae34SPekka Enberg for (;;) { 50ae1fae34SPekka Enberg kvm__run(kvm); 51ae1fae34SPekka Enberg 52ae1fae34SPekka Enberg switch (kvm->kvm_run->exit_reason) { 53fe806d65SPekka Enberg case KVM_EXIT_DEBUG: 54fe806d65SPekka Enberg kvm__show_registers(kvm); 55fe806d65SPekka Enberg kvm__show_code(kvm); 56fe806d65SPekka Enberg break; 57ae1fae34SPekka Enberg case KVM_EXIT_IO: 58ae1fae34SPekka Enberg kvm__emulate_io(kvm, 59ae1fae34SPekka Enberg kvm->kvm_run->io.port, 60ae1fae34SPekka Enberg (uint8_t *)kvm->kvm_run + kvm->kvm_run->io.data_offset, 61ae1fae34SPekka Enberg kvm->kvm_run->io.direction, 62ae1fae34SPekka Enberg kvm->kvm_run->io.size, 63ae1fae34SPekka Enberg kvm->kvm_run->io.count); 64ae1fae34SPekka Enberg goto exit_kvm; 65ae1fae34SPekka Enberg break; 66ae1fae34SPekka Enberg default: 67ae1fae34SPekka Enberg goto exit_kvm; 68ae1fae34SPekka Enberg } 69ae1fae34SPekka Enberg } 70ae1fae34SPekka Enberg 71ae1fae34SPekka Enberg exit_kvm: 72ae1fae34SPekka Enberg fprintf(stderr, "KVM exit reason: %" PRIu32 " (\"%s\")\n", 73ae1fae34SPekka Enberg kvm->kvm_run->exit_reason, kvm_exit_reasons[kvm->kvm_run->exit_reason]); 74ae1fae34SPekka Enberg 75ae1fae34SPekka Enberg kvm__show_registers(kvm); 76ae1fae34SPekka Enberg kvm__show_code(kvm); 77ae1fae34SPekka Enberg 78ae1fae34SPekka Enberg return 0; 79ae1fae34SPekka Enberg } 80