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