1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2023 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker use base::errno_result;
6*bb4ee6a4SAndroid Build Coastguard Worker use base::error;
7*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_with_mut_ref;
8*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_with_ref;
9*bb4ee6a4SAndroid Build Coastguard Worker use base::Error;
10*bb4ee6a4SAndroid Build Coastguard Worker use base::Result;
11*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::*;
12*bb4ee6a4SAndroid Build Coastguard Worker use libc::ENXIO;
13*bb4ee6a4SAndroid Build Coastguard Worker
14*bb4ee6a4SAndroid Build Coastguard Worker use super::Config;
15*bb4ee6a4SAndroid Build Coastguard Worker use super::Kvm;
16*bb4ee6a4SAndroid Build Coastguard Worker use super::KvmVcpu;
17*bb4ee6a4SAndroid Build Coastguard Worker use super::KvmVm;
18*bb4ee6a4SAndroid Build Coastguard Worker use crate::ClockState;
19*bb4ee6a4SAndroid Build Coastguard Worker use crate::DeviceKind;
20*bb4ee6a4SAndroid Build Coastguard Worker use crate::Hypervisor;
21*bb4ee6a4SAndroid Build Coastguard Worker use crate::IrqSourceChip;
22*bb4ee6a4SAndroid Build Coastguard Worker use crate::ProtectionType;
23*bb4ee6a4SAndroid Build Coastguard Worker use crate::VcpuExit;
24*bb4ee6a4SAndroid Build Coastguard Worker use crate::VcpuRegister;
25*bb4ee6a4SAndroid Build Coastguard Worker use crate::VcpuRiscv64;
26*bb4ee6a4SAndroid Build Coastguard Worker use crate::VmCap;
27*bb4ee6a4SAndroid Build Coastguard Worker use crate::VmRiscv64;
28*bb4ee6a4SAndroid Build Coastguard Worker
29*bb4ee6a4SAndroid Build Coastguard Worker impl KvmVm {
30*bb4ee6a4SAndroid Build Coastguard Worker /// Does platform specific initialization for the KvmVm.
init_arch(&self, _cfg: &Config) -> Result<()>31*bb4ee6a4SAndroid Build Coastguard Worker pub fn init_arch(&self, _cfg: &Config) -> Result<()> {
32*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
33*bb4ee6a4SAndroid Build Coastguard Worker }
34*bb4ee6a4SAndroid Build Coastguard Worker
35*bb4ee6a4SAndroid Build Coastguard Worker /// Whether running under pKVM.
is_pkvm(&self) -> bool36*bb4ee6a4SAndroid Build Coastguard Worker pub fn is_pkvm(&self) -> bool {
37*bb4ee6a4SAndroid Build Coastguard Worker false
38*bb4ee6a4SAndroid Build Coastguard Worker }
39*bb4ee6a4SAndroid Build Coastguard Worker
40*bb4ee6a4SAndroid Build Coastguard Worker /// Checks if a particular `VmCap` is available, or returns None if arch-independent
41*bb4ee6a4SAndroid Build Coastguard Worker /// Vm.check_capability() should handle the check.
check_capability_arch(&self, _c: VmCap) -> Option<bool>42*bb4ee6a4SAndroid Build Coastguard Worker pub fn check_capability_arch(&self, _c: VmCap) -> Option<bool> {
43*bb4ee6a4SAndroid Build Coastguard Worker None
44*bb4ee6a4SAndroid Build Coastguard Worker }
45*bb4ee6a4SAndroid Build Coastguard Worker
46*bb4ee6a4SAndroid Build Coastguard Worker /// Returns the params to pass to KVM_CREATE_DEVICE for a `kind` device on this arch, or None to
47*bb4ee6a4SAndroid Build Coastguard Worker /// let the arch-independent `KvmVm::create_device` handle it.
get_device_params_arch(&self, kind: DeviceKind) -> Option<kvm_create_device>48*bb4ee6a4SAndroid Build Coastguard Worker pub fn get_device_params_arch(&self, kind: DeviceKind) -> Option<kvm_create_device> {
49*bb4ee6a4SAndroid Build Coastguard Worker match kind {
50*bb4ee6a4SAndroid Build Coastguard Worker DeviceKind::RiscvAia => Some(kvm_create_device {
51*bb4ee6a4SAndroid Build Coastguard Worker type_: kvm_device_type_KVM_DEV_TYPE_RISCV_AIA,
52*bb4ee6a4SAndroid Build Coastguard Worker fd: 0,
53*bb4ee6a4SAndroid Build Coastguard Worker flags: 0,
54*bb4ee6a4SAndroid Build Coastguard Worker }),
55*bb4ee6a4SAndroid Build Coastguard Worker _ => None,
56*bb4ee6a4SAndroid Build Coastguard Worker }
57*bb4ee6a4SAndroid Build Coastguard Worker }
58*bb4ee6a4SAndroid Build Coastguard Worker
59*bb4ee6a4SAndroid Build Coastguard Worker /// Arch-specific implementation of `Vm::get_pvclock`. Always returns an error on riscv64.
get_pvclock_arch(&self) -> Result<ClockState>60*bb4ee6a4SAndroid Build Coastguard Worker pub fn get_pvclock_arch(&self) -> Result<ClockState> {
61*bb4ee6a4SAndroid Build Coastguard Worker Err(Error::new(ENXIO))
62*bb4ee6a4SAndroid Build Coastguard Worker }
63*bb4ee6a4SAndroid Build Coastguard Worker
64*bb4ee6a4SAndroid Build Coastguard Worker /// Arch-specific implementation of `Vm::set_pvclock`. Always returns an error on riscv64.
set_pvclock_arch(&self, _state: &ClockState) -> Result<()>65*bb4ee6a4SAndroid Build Coastguard Worker pub fn set_pvclock_arch(&self, _state: &ClockState) -> Result<()> {
66*bb4ee6a4SAndroid Build Coastguard Worker Err(Error::new(ENXIO))
67*bb4ee6a4SAndroid Build Coastguard Worker }
68*bb4ee6a4SAndroid Build Coastguard Worker }
69*bb4ee6a4SAndroid Build Coastguard Worker
70*bb4ee6a4SAndroid Build Coastguard Worker impl Kvm {
71*bb4ee6a4SAndroid Build Coastguard Worker // The riscv machine type is always 0. Protected VMs are not supported, yet.
get_vm_type(&self, protection_type: ProtectionType) -> Result<u32>72*bb4ee6a4SAndroid Build Coastguard Worker pub fn get_vm_type(&self, protection_type: ProtectionType) -> Result<u32> {
73*bb4ee6a4SAndroid Build Coastguard Worker if protection_type == ProtectionType::Unprotected {
74*bb4ee6a4SAndroid Build Coastguard Worker Ok(0)
75*bb4ee6a4SAndroid Build Coastguard Worker } else {
76*bb4ee6a4SAndroid Build Coastguard Worker error!("Protected mode is not supported on riscv64.");
77*bb4ee6a4SAndroid Build Coastguard Worker Err(Error::new(libc::EINVAL))
78*bb4ee6a4SAndroid Build Coastguard Worker }
79*bb4ee6a4SAndroid Build Coastguard Worker }
80*bb4ee6a4SAndroid Build Coastguard Worker
81*bb4ee6a4SAndroid Build Coastguard Worker /// Get the size of guest physical addresses in bits.
get_guest_phys_addr_bits(&self) -> u882*bb4ee6a4SAndroid Build Coastguard Worker pub fn get_guest_phys_addr_bits(&self) -> u8 {
83*bb4ee6a4SAndroid Build Coastguard Worker // assume sv48 addressing
84*bb4ee6a4SAndroid Build Coastguard Worker 48
85*bb4ee6a4SAndroid Build Coastguard Worker }
86*bb4ee6a4SAndroid Build Coastguard Worker }
87*bb4ee6a4SAndroid Build Coastguard Worker
88*bb4ee6a4SAndroid Build Coastguard Worker impl VmRiscv64 for KvmVm {
get_hypervisor(&self) -> &dyn Hypervisor89*bb4ee6a4SAndroid Build Coastguard Worker fn get_hypervisor(&self) -> &dyn Hypervisor {
90*bb4ee6a4SAndroid Build Coastguard Worker &self.kvm
91*bb4ee6a4SAndroid Build Coastguard Worker }
92*bb4ee6a4SAndroid Build Coastguard Worker
create_vcpu(&self, id: usize) -> Result<Box<dyn VcpuRiscv64>>93*bb4ee6a4SAndroid Build Coastguard Worker fn create_vcpu(&self, id: usize) -> Result<Box<dyn VcpuRiscv64>> {
94*bb4ee6a4SAndroid Build Coastguard Worker // create_vcpu is declared separately for each arch so it can return the arch-apropriate
95*bb4ee6a4SAndroid Build Coastguard Worker // vcpu type. But all use the same implementation in KvmVm::create_vcpu.
96*bb4ee6a4SAndroid Build Coastguard Worker Ok(Box::new(self.create_kvm_vcpu(id)?))
97*bb4ee6a4SAndroid Build Coastguard Worker }
98*bb4ee6a4SAndroid Build Coastguard Worker }
99*bb4ee6a4SAndroid Build Coastguard Worker
100*bb4ee6a4SAndroid Build Coastguard Worker impl KvmVcpu {
101*bb4ee6a4SAndroid Build Coastguard Worker /// Handles a `KVM_EXIT_SYSTEM_EVENT` with event type `KVM_SYSTEM_EVENT_RESET` with the given
102*bb4ee6a4SAndroid Build Coastguard Worker /// event flags and returns the appropriate `VcpuExit` value for the run loop to handle.
103*bb4ee6a4SAndroid Build Coastguard Worker ///
104*bb4ee6a4SAndroid Build Coastguard Worker /// `event_flags` should be one or more of the `KVM_SYSTEM_EVENT_RESET_FLAG_*` values defined by
105*bb4ee6a4SAndroid Build Coastguard Worker /// KVM.
system_event_reset(&self, _event_flags: u64) -> Result<VcpuExit>106*bb4ee6a4SAndroid Build Coastguard Worker pub fn system_event_reset(&self, _event_flags: u64) -> Result<VcpuExit> {
107*bb4ee6a4SAndroid Build Coastguard Worker Ok(VcpuExit::SystemEventReset)
108*bb4ee6a4SAndroid Build Coastguard Worker }
109*bb4ee6a4SAndroid Build Coastguard Worker
110*bb4ee6a4SAndroid Build Coastguard Worker #[inline]
handle_vm_exit_arch(&self, run: &mut kvm_run) -> Option<VcpuExit>111*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) fn handle_vm_exit_arch(&self, run: &mut kvm_run) -> Option<VcpuExit> {
112*bb4ee6a4SAndroid Build Coastguard Worker match run.exit_reason {
113*bb4ee6a4SAndroid Build Coastguard Worker KVM_EXIT_RISCV_SBI => {
114*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: Safe because we trust the kernel to correctly fill in the union
115*bb4ee6a4SAndroid Build Coastguard Worker let extension_id = unsafe { run.__bindgen_anon_1.riscv_sbi.extension_id };
116*bb4ee6a4SAndroid Build Coastguard Worker let function_id = unsafe { run.__bindgen_anon_1.riscv_sbi.function_id };
117*bb4ee6a4SAndroid Build Coastguard Worker let args = unsafe { run.__bindgen_anon_1.riscv_sbi.args };
118*bb4ee6a4SAndroid Build Coastguard Worker Some(VcpuExit::Sbi {
119*bb4ee6a4SAndroid Build Coastguard Worker extension_id,
120*bb4ee6a4SAndroid Build Coastguard Worker function_id,
121*bb4ee6a4SAndroid Build Coastguard Worker args,
122*bb4ee6a4SAndroid Build Coastguard Worker })
123*bb4ee6a4SAndroid Build Coastguard Worker }
124*bb4ee6a4SAndroid Build Coastguard Worker KVM_EXIT_RISCV_CSR => {
125*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: Safe because we trust the kernel to correctly fill in the union
126*bb4ee6a4SAndroid Build Coastguard Worker let csr_num = unsafe { run.__bindgen_anon_1.riscv_csr.csr_num };
127*bb4ee6a4SAndroid Build Coastguard Worker let new_value = unsafe { run.__bindgen_anon_1.riscv_csr.new_value };
128*bb4ee6a4SAndroid Build Coastguard Worker let write_mask = unsafe { run.__bindgen_anon_1.riscv_csr.write_mask };
129*bb4ee6a4SAndroid Build Coastguard Worker let ret_value = unsafe { run.__bindgen_anon_1.riscv_csr.ret_value };
130*bb4ee6a4SAndroid Build Coastguard Worker Some(VcpuExit::RiscvCsr {
131*bb4ee6a4SAndroid Build Coastguard Worker csr_num,
132*bb4ee6a4SAndroid Build Coastguard Worker new_value,
133*bb4ee6a4SAndroid Build Coastguard Worker write_mask,
134*bb4ee6a4SAndroid Build Coastguard Worker ret_value,
135*bb4ee6a4SAndroid Build Coastguard Worker })
136*bb4ee6a4SAndroid Build Coastguard Worker }
137*bb4ee6a4SAndroid Build Coastguard Worker _ => None,
138*bb4ee6a4SAndroid Build Coastguard Worker }
139*bb4ee6a4SAndroid Build Coastguard Worker }
140*bb4ee6a4SAndroid Build Coastguard Worker }
141*bb4ee6a4SAndroid Build Coastguard Worker
142*bb4ee6a4SAndroid Build Coastguard Worker impl VcpuRiscv64 for KvmVcpu {
set_one_reg(&self, reg: VcpuRegister, data: u64) -> Result<()>143*bb4ee6a4SAndroid Build Coastguard Worker fn set_one_reg(&self, reg: VcpuRegister, data: u64) -> Result<()> {
144*bb4ee6a4SAndroid Build Coastguard Worker let data_ref = &data as *const u64;
145*bb4ee6a4SAndroid Build Coastguard Worker let onereg = kvm_one_reg {
146*bb4ee6a4SAndroid Build Coastguard Worker id: vcpu_reg_id(reg),
147*bb4ee6a4SAndroid Build Coastguard Worker addr: data_ref as u64,
148*bb4ee6a4SAndroid Build Coastguard Worker };
149*bb4ee6a4SAndroid Build Coastguard Worker // Safe because we allocated the struct and we know the kernel will read exactly the size of
150*bb4ee6a4SAndroid Build Coastguard Worker // the struct.
151*bb4ee6a4SAndroid Build Coastguard Worker let ret = unsafe { ioctl_with_ref(self, KVM_SET_ONE_REG, &onereg) };
152*bb4ee6a4SAndroid Build Coastguard Worker if ret == 0 {
153*bb4ee6a4SAndroid Build Coastguard Worker Ok(())
154*bb4ee6a4SAndroid Build Coastguard Worker } else {
155*bb4ee6a4SAndroid Build Coastguard Worker errno_result()
156*bb4ee6a4SAndroid Build Coastguard Worker }
157*bb4ee6a4SAndroid Build Coastguard Worker }
158*bb4ee6a4SAndroid Build Coastguard Worker
get_one_reg(&self, reg: VcpuRegister) -> Result<u64>159*bb4ee6a4SAndroid Build Coastguard Worker fn get_one_reg(&self, reg: VcpuRegister) -> Result<u64> {
160*bb4ee6a4SAndroid Build Coastguard Worker let mut val: u64 = 0;
161*bb4ee6a4SAndroid Build Coastguard Worker let onereg = kvm_one_reg {
162*bb4ee6a4SAndroid Build Coastguard Worker id: vcpu_reg_id(reg),
163*bb4ee6a4SAndroid Build Coastguard Worker addr: (&mut val as *mut u64) as u64,
164*bb4ee6a4SAndroid Build Coastguard Worker };
165*bb4ee6a4SAndroid Build Coastguard Worker
166*bb4ee6a4SAndroid Build Coastguard Worker // Safe because we allocated the struct and we know the kernel will read exactly the size of
167*bb4ee6a4SAndroid Build Coastguard Worker // the struct.
168*bb4ee6a4SAndroid Build Coastguard Worker let ret = unsafe { ioctl_with_ref(self, KVM_GET_ONE_REG, &onereg) };
169*bb4ee6a4SAndroid Build Coastguard Worker if ret == 0 {
170*bb4ee6a4SAndroid Build Coastguard Worker Ok(val)
171*bb4ee6a4SAndroid Build Coastguard Worker } else {
172*bb4ee6a4SAndroid Build Coastguard Worker errno_result()
173*bb4ee6a4SAndroid Build Coastguard Worker }
174*bb4ee6a4SAndroid Build Coastguard Worker }
175*bb4ee6a4SAndroid Build Coastguard Worker }
176*bb4ee6a4SAndroid Build Coastguard Worker
177*bb4ee6a4SAndroid Build Coastguard Worker // Returns the id used for call to `KVM_[GET|SET]_ONE_REG`.
vcpu_reg_id(reg: VcpuRegister) -> u64178*bb4ee6a4SAndroid Build Coastguard Worker fn vcpu_reg_id(reg: VcpuRegister) -> u64 {
179*bb4ee6a4SAndroid Build Coastguard Worker fn id_from_reg(reg_type: u32, index: u64) -> u64 {
180*bb4ee6a4SAndroid Build Coastguard Worker reg_type as u64 | index | KVM_REG_RISCV as u64 | KVM_REG_SIZE_U64
181*bb4ee6a4SAndroid Build Coastguard Worker }
182*bb4ee6a4SAndroid Build Coastguard Worker
183*bb4ee6a4SAndroid Build Coastguard Worker match reg {
184*bb4ee6a4SAndroid Build Coastguard Worker VcpuRegister::Config(r) => id_from_reg(KVM_REG_RISCV_CONFIG, r as u64),
185*bb4ee6a4SAndroid Build Coastguard Worker VcpuRegister::Core(r) => id_from_reg(KVM_REG_RISCV_CORE, r as u64),
186*bb4ee6a4SAndroid Build Coastguard Worker VcpuRegister::Timer(r) => id_from_reg(KVM_REG_RISCV_TIMER, r as u64),
187*bb4ee6a4SAndroid Build Coastguard Worker }
188*bb4ee6a4SAndroid Build Coastguard Worker }
189*bb4ee6a4SAndroid Build Coastguard Worker
190*bb4ee6a4SAndroid Build Coastguard Worker // This function translates an IrqSrouceChip to the kvm u32 equivalent. It has a different
191*bb4ee6a4SAndroid Build Coastguard Worker // implementation between the architectures because the irqchip KVM constants are not defined on all
192*bb4ee6a4SAndroid Build Coastguard Worker // of them.
chip_to_kvm_chip(chip: IrqSourceChip) -> u32193*bb4ee6a4SAndroid Build Coastguard Worker pub(super) fn chip_to_kvm_chip(chip: IrqSourceChip) -> u32 {
194*bb4ee6a4SAndroid Build Coastguard Worker match chip {
195*bb4ee6a4SAndroid Build Coastguard Worker // Riscv does not have a constant for this, but the default routing
196*bb4ee6a4SAndroid Build Coastguard Worker // setup seems to set this to 0
197*bb4ee6a4SAndroid Build Coastguard Worker IrqSourceChip::Aia => 0,
198*bb4ee6a4SAndroid Build Coastguard Worker _ => {
199*bb4ee6a4SAndroid Build Coastguard Worker error!("Invalid IrqChipSource for Riscv {:?}", chip);
200*bb4ee6a4SAndroid Build Coastguard Worker 0
201*bb4ee6a4SAndroid Build Coastguard Worker }
202*bb4ee6a4SAndroid Build Coastguard Worker }
203*bb4ee6a4SAndroid Build Coastguard Worker }
204*bb4ee6a4SAndroid Build Coastguard Worker
205*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(test)]
206*bb4ee6a4SAndroid Build Coastguard Worker mod tests {
207*bb4ee6a4SAndroid Build Coastguard Worker use super::*;
208*bb4ee6a4SAndroid Build Coastguard Worker use crate::CoreRegister;
209*bb4ee6a4SAndroid Build Coastguard Worker
210*bb4ee6a4SAndroid Build Coastguard Worker #[test]
reg_id()211*bb4ee6a4SAndroid Build Coastguard Worker fn reg_id() {
212*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
213*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::Pc)),
214*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0000
215*bb4ee6a4SAndroid Build Coastguard Worker );
216*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
217*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::Ra)),
218*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0001
219*bb4ee6a4SAndroid Build Coastguard Worker );
220*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
221*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::Sp)),
222*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0002
223*bb4ee6a4SAndroid Build Coastguard Worker );
224*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
225*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::Gp)),
226*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0003
227*bb4ee6a4SAndroid Build Coastguard Worker );
228*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
229*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::Tp)),
230*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0004
231*bb4ee6a4SAndroid Build Coastguard Worker );
232*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
233*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::T0)),
234*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0005
235*bb4ee6a4SAndroid Build Coastguard Worker );
236*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
237*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::T1)),
238*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0006
239*bb4ee6a4SAndroid Build Coastguard Worker );
240*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
241*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::T2)),
242*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0007
243*bb4ee6a4SAndroid Build Coastguard Worker );
244*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
245*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S0)),
246*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0008
247*bb4ee6a4SAndroid Build Coastguard Worker );
248*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
249*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S1)),
250*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0009
251*bb4ee6a4SAndroid Build Coastguard Worker );
252*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
253*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::A0)),
254*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_000a
255*bb4ee6a4SAndroid Build Coastguard Worker );
256*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
257*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::A1)),
258*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_000b
259*bb4ee6a4SAndroid Build Coastguard Worker );
260*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
261*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::A2)),
262*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_000c
263*bb4ee6a4SAndroid Build Coastguard Worker );
264*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
265*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::A3)),
266*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_000d
267*bb4ee6a4SAndroid Build Coastguard Worker );
268*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
269*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::A4)),
270*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_000e
271*bb4ee6a4SAndroid Build Coastguard Worker );
272*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
273*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::A5)),
274*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_000f
275*bb4ee6a4SAndroid Build Coastguard Worker );
276*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
277*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::A6)),
278*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0010
279*bb4ee6a4SAndroid Build Coastguard Worker );
280*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
281*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::A7)),
282*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0011
283*bb4ee6a4SAndroid Build Coastguard Worker );
284*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
285*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S2)),
286*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0012
287*bb4ee6a4SAndroid Build Coastguard Worker );
288*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
289*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S3)),
290*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0013
291*bb4ee6a4SAndroid Build Coastguard Worker );
292*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
293*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S4)),
294*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0014
295*bb4ee6a4SAndroid Build Coastguard Worker );
296*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
297*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S5)),
298*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0015
299*bb4ee6a4SAndroid Build Coastguard Worker );
300*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
301*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S6)),
302*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0016
303*bb4ee6a4SAndroid Build Coastguard Worker );
304*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
305*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S7)),
306*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0017
307*bb4ee6a4SAndroid Build Coastguard Worker );
308*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
309*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S8)),
310*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0018
311*bb4ee6a4SAndroid Build Coastguard Worker );
312*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
313*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S9)),
314*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0019
315*bb4ee6a4SAndroid Build Coastguard Worker );
316*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
317*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S10)),
318*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_001a
319*bb4ee6a4SAndroid Build Coastguard Worker );
320*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
321*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::S11)),
322*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_001b
323*bb4ee6a4SAndroid Build Coastguard Worker );
324*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
325*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::T3)),
326*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_001c
327*bb4ee6a4SAndroid Build Coastguard Worker );
328*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
329*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::T4)),
330*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_001d
331*bb4ee6a4SAndroid Build Coastguard Worker );
332*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
333*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::T5)),
334*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_001e
335*bb4ee6a4SAndroid Build Coastguard Worker );
336*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
337*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::T6)),
338*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_001f
339*bb4ee6a4SAndroid Build Coastguard Worker );
340*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(
341*bb4ee6a4SAndroid Build Coastguard Worker vcpu_reg_id(VcpuRegister::Core(CoreRegister::Mode)),
342*bb4ee6a4SAndroid Build Coastguard Worker 0x8030_0000_0200_0020
343*bb4ee6a4SAndroid Build Coastguard Worker );
344*bb4ee6a4SAndroid Build Coastguard Worker }
345*bb4ee6a4SAndroid Build Coastguard Worker }
346