Skip to content

Commit e6739ae

Browse files
liuwlauralt
authored andcommitted
ioctls: use u128 in get/set_one_reg
Arm's register size can go up to 128-bit. Signed-off-by: Wei Liu <[email protected]>
1 parent 9e98f95 commit e6739ae

File tree

3 files changed

+15
-15
lines changed

3 files changed

+15
-15
lines changed

src/ioctls/vcpu.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,11 +1196,11 @@ impl VcpuFd {
11961196
/// * `reg_id` - ID of the register for which we are setting the value.
11971197
/// * `data` - value for the specified register.
11981198
#[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
1199-
pub fn set_one_reg(&self, reg_id: u64, data: u64) -> Result<()> {
1200-
let data_ref = &data as *const u64;
1199+
pub fn set_one_reg(&self, reg_id: u64, data: u128) -> Result<()> {
1200+
let data_ptr = &data as *const _;
12011201
let onereg = kvm_one_reg {
12021202
id: reg_id,
1203-
addr: data_ref as u64,
1203+
addr: data_ptr as u64,
12041204
};
12051205
// This is safe because we allocated the struct and we know the kernel will read
12061206
// exactly the size of the struct.
@@ -1220,11 +1220,11 @@ impl VcpuFd {
12201220
///
12211221
/// * `reg_id` - ID of the register.
12221222
#[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
1223-
pub fn get_one_reg(&self, reg_id: u64) -> Result<u64> {
1223+
pub fn get_one_reg(&self, reg_id: u64) -> Result<u128> {
12241224
let mut reg_value = 0;
12251225
let mut onereg = kvm_one_reg {
12261226
id: reg_id,
1227-
addr: &mut reg_value as *mut u64 as u64,
1227+
addr: &mut reg_value as *mut _ as u64,
12281228
};
12291229

12301230
let ret = unsafe { ioctl_with_mut_ref(self, KVM_GET_ONE_REG(), &mut onereg) };
@@ -2074,15 +2074,15 @@ mod tests {
20742074

20752075
// Set the PC to the guest address where we loaded the code.
20762076
vcpu_fd
2077-
.set_one_reg(core_reg_base + 2 * 32, guest_addr)
2077+
.set_one_reg(core_reg_base + 2 * 32, guest_addr as u128)
20782078
.unwrap();
20792079

20802080
// Set x8 and x9 to the addresses the guest test code needs
20812081
vcpu_fd
2082-
.set_one_reg(core_reg_base + 2 * 8, guest_addr + 0x10000)
2082+
.set_one_reg(core_reg_base + 2 * 8, guest_addr as u128 + 0x10000)
20832083
.unwrap();
20842084
vcpu_fd
2085-
.set_one_reg(core_reg_base + 2 * 9, mmio_addr)
2085+
.set_one_reg(core_reg_base + 2 * 9, mmio_addr as u128)
20862086
.unwrap();
20872087

20882088
loop {
@@ -2416,7 +2416,7 @@ mod tests {
24162416
vm.get_preferred_target(&mut kvi)
24172417
.expect("Cannot get preferred target");
24182418
vcpu.vcpu_init(&kvi).expect("Cannot initialize vcpu");
2419-
let data: u64 = 0;
2419+
let data: u128 = 0;
24202420
let reg_id: u64 = 0;
24212421

24222422
assert!(vcpu.set_one_reg(reg_id, data).is_err());
@@ -2448,15 +2448,15 @@ mod tests {
24482448
const PSR_D_BIT: u64 = 0x0000_0200;
24492449
const PSTATE_FAULT_BITS_64: u64 =
24502450
PSR_MODE_EL1H | PSR_A_BIT | PSR_F_BIT | PSR_I_BIT | PSR_D_BIT;
2451-
let data: u64 = PSTATE_FAULT_BITS_64;
2451+
let data: u128 = PSTATE_FAULT_BITS_64 as u128;
24522452
const PSTATE_REG_ID: u64 = 0x6030_0000_0010_0042;
24532453
vcpu.set_one_reg(PSTATE_REG_ID, data)
24542454
.expect("Failed to set pstate register");
24552455

24562456
assert_eq!(
24572457
vcpu.get_one_reg(PSTATE_REG_ID)
24582458
.expect("Failed to get pstate register"),
2459-
PSTATE_FAULT_BITS_64
2459+
PSTATE_FAULT_BITS_64 as u128
24602460
);
24612461
}
24622462

src/ioctls/vm.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -796,8 +796,8 @@ impl VmFd {
796796
///
797797
/// let core_reg_base: u64 = 0x6030_0000_0010_0000;
798798
/// let mmio_addr: u64 = guest_addr + mem_size as u64;
799-
/// vcpu_fd.set_one_reg(core_reg_base + 2 * 32, guest_addr); // set PC
800-
/// vcpu_fd.set_one_reg(core_reg_base + 2 * 0, mmio_addr); // set X0
799+
/// vcpu_fd.set_one_reg(core_reg_base + 2 * 32, guest_addr as u128); // set PC
800+
/// vcpu_fd.set_one_reg(core_reg_base + 2 * 0, mmio_addr as u128); // set X0
801801
/// }
802802
///
803803
/// loop {

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@
156156
//!
157157
//! let core_reg_base: u64 = 0x6030_0000_0010_0000;
158158
//! let mmio_addr: u64 = guest_addr + mem_size as u64;
159-
//! vcpu_fd.set_one_reg(core_reg_base + 2 * 32, guest_addr); // set PC
160-
//! vcpu_fd.set_one_reg(core_reg_base + 2 * 0, mmio_addr); // set X0
159+
//! vcpu_fd.set_one_reg(core_reg_base + 2 * 32, guest_addr as u128); // set PC
160+
//! vcpu_fd.set_one_reg(core_reg_base + 2 * 0, mmio_addr as u128); // set X0
161161
//! }
162162
//!
163163
//! // 6. Run code on the vCPU.

0 commit comments

Comments
 (0)