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 /* Secondary cores are stopped awaiting PSCI wakeup */ 25 if (vcpu->cpu_id != 0) 26 return; 27 28 /* r0 = 0 */ 29 data = 0; 30 reg.id = ARM_CORE_REG(usr_regs.ARM_r0); 31 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 32 die_perror("KVM_SET_ONE_REG failed (r0)"); 33 34 /* r1 = machine type (-1) */ 35 data = -1; 36 reg.id = ARM_CORE_REG(usr_regs.ARM_r1); 37 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 38 die_perror("KVM_SET_ONE_REG failed (r1)"); 39 40 /* r2 = physical address of the device tree blob */ 41 data = kvm->arch.dtb_guest_start; 42 reg.id = ARM_CORE_REG(usr_regs.ARM_r2); 43 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 44 die_perror("KVM_SET_ONE_REG failed (r2)"); 45 46 /* pc = start of kernel image */ 47 data = kvm->arch.kern_guest_start; 48 reg.id = ARM_CORE_REG(usr_regs.ARM_pc); 49 if (ioctl(vcpu->vcpu_fd, KVM_SET_ONE_REG, ®) < 0) 50 die_perror("KVM_SET_ONE_REG failed (pc)"); 51 } 52 53 void kvm_cpu__show_code(struct kvm_cpu *vcpu) 54 { 55 struct kvm_one_reg reg; 56 u32 data; 57 int debug_fd = kvm_cpu__get_debug_fd(); 58 59 reg.addr = (u64)(unsigned long)&data; 60 61 dprintf(debug_fd, "\n*pc:\n"); 62 reg.id = ARM_CORE_REG(usr_regs.ARM_pc); 63 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 64 die("KVM_GET_ONE_REG failed (show_code @ PC)"); 65 66 kvm__dump_mem(vcpu->kvm, data, 32, debug_fd); 67 68 dprintf(debug_fd, "\n*lr (svc):\n"); 69 reg.id = ARM_CORE_REG(svc_regs[1]); 70 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 71 die("KVM_GET_ONE_REG failed (show_code @ LR_svc)"); 72 data &= ~0x1; 73 74 kvm__dump_mem(vcpu->kvm, data, 32, debug_fd); 75 } 76 77 void kvm_cpu__show_registers(struct kvm_cpu *vcpu) 78 { 79 struct kvm_one_reg reg; 80 u32 data; 81 int debug_fd = kvm_cpu__get_debug_fd(); 82 83 reg.addr = (u64)(unsigned long)&data; 84 dprintf(debug_fd, "\n Registers:\n"); 85 86 reg.id = ARM_CORE_REG(usr_regs.ARM_pc); 87 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 88 die("KVM_GET_ONE_REG failed (pc)"); 89 dprintf(debug_fd, " PC: 0x%x\n", data); 90 91 reg.id = ARM_CORE_REG(usr_regs.ARM_cpsr); 92 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 93 die("KVM_GET_ONE_REG failed (cpsr)"); 94 dprintf(debug_fd, " CPSR: 0x%x\n", data); 95 96 reg.id = ARM_CORE_REG(svc_regs[0]); 97 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 98 die("KVM_GET_ONE_REG failed (SP_svc)"); 99 dprintf(debug_fd, " SP_svc: 0x%x\n", data); 100 101 reg.id = ARM_CORE_REG(svc_regs[1]); 102 if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, ®) < 0) 103 die("KVM_GET_ONE_REG failed (LR_svc)"); 104 dprintf(debug_fd, " LR_svc: 0x%x\n", data); 105 } 106