1 #include "kvm/kvm-cpu.h" 2 #include "kvm/kvm.h" 3 4 #include <asm/ptrace.h> 5 6 #define ARM_CORE_REG(x) (KVM_REG_ARM | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | \ 7 KVM_REG_ARM_CORE_REG(x)) 8 9 void kvm_cpu__reset_vcpu(struct kvm_cpu *vcpu) 10 { 11 struct kvm *kvm = vcpu->kvm; 12 struct kvm_one_reg reg; 13 u32 data; 14 15 /* Who said future-proofing was a good idea? */ 16 reg.addr = (u64)(unsigned long)&data; 17 18 /* cpsr = IRQs/FIQs masked */ 19 data = PSR_I_BIT | PSR_F_BIT | SVC_MODE; 20 reg.id = ARM_CORE_REG(usr_regs.ARM_cpsr); 21 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 22 die_perror("KVM_SET_ONE_REG failed (cpsr)"); 23 24 if (vcpu->cpu_id == 0) { 25 /* r0 = 0 */ 26 data = 0; 27 reg.id = ARM_CORE_REG(usr_regs.ARM_r0); 28 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 29 die_perror("KVM_SET_ONE_REG failed (r0)"); 30 31 /* r1 = machine type (-1) */ 32 data = -1; 33 reg.id = ARM_CORE_REG(usr_regs.ARM_r1); 34 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 35 die_perror("KVM_SET_ONE_REG failed (r1)"); 36 37 /* r2 = physical address of the device tree blob */ 38 data = kvm->arch.dtb_guest_start; 39 reg.id = ARM_CORE_REG(usr_regs.ARM_r2); 40 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 41 die_perror("KVM_SET_ONE_REG failed (r2)"); 42 43 /* pc = start of kernel image */ 44 data = kvm->arch.kern_guest_start; 45 reg.id = ARM_CORE_REG(usr_regs.ARM_pc); 46 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 47 die_perror("KVM_SET_ONE_REG failed (pc)"); 48 49 } else { 50 /* Simply enter the pen */ 51 data = kvm->arch.smp_pen_guest_start; 52 reg.id = ARM_CORE_REG(usr_regs.ARM_pc); 53 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 54 die_perror("KVM_SET_ONE_REG failed (SMP pc)"); 55 } 56 } 57 58 void kvm_cpu__show_code(struct kvm_cpu *vcpu) 59 { 60 struct kvm_one_reg reg; 61 u32 data; 62 63 reg.addr = (u64)(unsigned long)&data; 64 65 printf("*pc:\n"); 66 reg.id = ARM_CORE_REG(usr_regs.ARM_pc); 67 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 68 die("KVM_GET_ONE_REG failed (show_code @ PC)"); 69 70 kvm__dump_mem(vcpu->kvm, data, 32); 71 printf("\n"); 72 73 printf("*lr (svc):\n"); 74 reg.id = ARM_CORE_REG(svc_regs[1]); 75 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 76 die("KVM_GET_ONE_REG failed (show_code @ LR_svc)"); 77 data &= ~0x1; 78 79 kvm__dump_mem(vcpu->kvm, data, 32); 80 printf("\n"); 81 } 82 83 void kvm_cpu__show_registers(struct kvm_cpu *vcpu) 84 { 85 struct kvm_one_reg reg; 86 u32 data; 87 int debug_fd = kvm_cpu__get_debug_fd(); 88 89 reg.addr = (u64)(unsigned long)&data; 90 dprintf(debug_fd, "\n Registers:\n"); 91 92 reg.id = ARM_CORE_REG(usr_regs.ARM_pc); 93 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 94 die("KVM_GET_ONE_REG failed (pc)"); 95 dprintf(debug_fd, " PC: 0x%x\n", data); 96 97 reg.id = ARM_CORE_REG(usr_regs.ARM_cpsr); 98 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 99 die("KVM_GET_ONE_REG failed (cpsr)"); 100 dprintf(debug_fd, " CPSR: 0x%x\n", data); 101 102 reg.id = ARM_CORE_REG(svc_regs[0]); 103 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 104 die("KVM_GET_ONE_REG failed (SP_svc)"); 105 dprintf(debug_fd, " SP_svc: 0x%x\n", data); 106 107 reg.id = ARM_CORE_REG(svc_regs[1]); 108 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 109 die("KVM_GET_ONE_REG failed (LR_svc)"); 110 dprintf(debug_fd, " LR_svc: 0x%x\n", data); 111 } 112