xref: /kvmtool/arm/aarch32/kvm-cpu.c (revision 61076240634dd372f691d577f6990b8121891ac9)
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 
58 	reg.addr = (u64)(unsigned long)&data;
59 
60 	printf("*pc:\n");
61 	reg.id = ARM_CORE_REG(usr_regs.ARM_pc);
62 	if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, &reg) < 0)
63 		die("KVM_GET_ONE_REG failed (show_code @ PC)");
64 
65 	kvm__dump_mem(vcpu->kvm, data, 32);
66 	printf("\n");
67 
68 	printf("*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);
75 	printf("\n");
76 }
77 
78 void kvm_cpu__show_registers(struct kvm_cpu *vcpu)
79 {
80 	struct kvm_one_reg reg;
81 	u32 data;
82 	int debug_fd = kvm_cpu__get_debug_fd();
83 
84 	reg.addr	= (u64)(unsigned long)&data;
85 	dprintf(debug_fd, "\n Registers:\n");
86 
87 	reg.id		= ARM_CORE_REG(usr_regs.ARM_pc);
88 	if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, &reg) < 0)
89 		die("KVM_GET_ONE_REG failed (pc)");
90 	dprintf(debug_fd, " PC:    0x%x\n", data);
91 
92 	reg.id		= ARM_CORE_REG(usr_regs.ARM_cpsr);
93 	if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, &reg) < 0)
94 		die("KVM_GET_ONE_REG failed (cpsr)");
95 	dprintf(debug_fd, " CPSR:  0x%x\n", data);
96 
97 	reg.id		= ARM_CORE_REG(svc_regs[0]);
98 	if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, &reg) < 0)
99 		die("KVM_GET_ONE_REG failed (SP_svc)");
100 	dprintf(debug_fd, " SP_svc:  0x%x\n", data);
101 
102 	reg.id		= ARM_CORE_REG(svc_regs[1]);
103 	if (ioctl(vcpu->vcpu_fd, KVM_GET_ONE_REG, &reg) < 0)
104 		die("KVM_GET_ONE_REG failed (LR_svc)");
105 	dprintf(debug_fd, " LR_svc:  0x%x\n", data);
106 }
107