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