xref: /kvmtool/arm/aarch32/kvm-cpu.c (revision 7c0e8b0c5560ce2f500fa4d7ba7865e7360e7991)
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 	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, &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, &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, &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, &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, &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, &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, &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, &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, &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, &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, &reg) < 0)
109 		die("KVM_GET_ONE_REG failed (LR_svc)");
110 	dprintf(debug_fd, " LR_svc:  0x%x\n", data);
111 }
112