xref: /kvmtool/arm/aarch32/kvm-cpu.c (revision 30c31b664305a2a69f07d505f019618fd64afd58)
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, &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, &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, &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, &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, &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, &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, &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, &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, &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, &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, &reg) < 0)
103 		die("KVM_GET_ONE_REG failed (LR_svc)");
104 	dprintf(debug_fd, " LR_svc:  0x%x\n", data);
105 }
106