Skip to content

Commit 36e33e3

Browse files
roypatShadowCurse
authored andcommitted
refactor: stop using loops in byte_order.rs
Instead of copying the buffers byte-by-byte in a loop, just use copy_from_slice, which compiles to a memcpy. While we're at it, drop some unused function definitions. Also remove the special snowflake functions for dealing with i8 slices, and instead just use zerocopy to safely transmute these into u8 slices, on which the normal functions work. (cherry picked from commit 35d6afd) Signed-off-by: Patrick Roy <[email protected]>
1 parent af17eb1 commit 36e33e3

File tree

2 files changed

+9
-25
lines changed

2 files changed

+9
-25
lines changed

src/vmm/src/arch/x86_64/interrupts.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
use kvm_bindings::kvm_lapic_state;
99
use kvm_ioctls::VcpuFd;
10+
use zerocopy::IntoBytes;
1011

1112
use crate::utils::byte_order;
1213

@@ -28,13 +29,13 @@ const APIC_MODE_EXTINT: u32 = 0x7;
2829
fn get_klapic_reg(klapic: &kvm_lapic_state, reg_offset: usize) -> u32 {
2930
let range = reg_offset..reg_offset + 4;
3031
let reg = klapic.regs.get(range).expect("get_klapic_reg range");
31-
byte_order::read_le_u32_from_i8(reg)
32+
byte_order::read_le_u32(reg.as_bytes())
3233
}
3334

3435
fn set_klapic_reg(klapic: &mut kvm_lapic_state, reg_offset: usize, value: u32) {
3536
let range = reg_offset..reg_offset + 4;
3637
let reg = klapic.regs.get_mut(range).expect("set_klapic_reg range");
37-
byte_order::write_le_u32_to_i8(reg, value)
38+
byte_order::write_le_u32(reg.as_mut_bytes(), value);
3839
}
3940

4041
fn set_apic_delivery_mode(reg: u32, mode: u32) -> u32 {

src/vmm/src/utils/byte_order.rs

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@ macro_rules! generate_read_fn {
55
($fn_name: ident, $data_type: ty, $byte_type: ty, $type_size: expr, $endian_type: ident) => {
66
/// Read bytes from the slice
77
pub fn $fn_name(input: &[$byte_type]) -> $data_type {
8-
assert!($type_size == std::mem::size_of::<$data_type>());
9-
let mut array = [0u8; $type_size];
10-
#[allow(clippy::cast_sign_loss)]
11-
#[allow(clippy::cast_possible_wrap)]
12-
for (byte, read) in array.iter_mut().zip(input.iter().cloned()) {
13-
*byte = read as u8;
14-
}
8+
let mut array = [0u8; std::mem::size_of::<$data_type>()];
9+
let how_many = input.len().min(std::mem::size_of::<$data_type>());
10+
array[..how_many].copy_from_slice(&input[..how_many]);
1511
<$data_type>::$endian_type(array)
1612
}
1713
};
@@ -21,32 +17,21 @@ macro_rules! generate_write_fn {
2117
($fn_name: ident, $data_type: ty, $byte_type: ty, $endian_type: ident) => {
2218
/// Write bytes to the slice
2319
pub fn $fn_name(buf: &mut [$byte_type], n: $data_type) {
24-
#[allow(clippy::cast_sign_loss)]
25-
#[allow(clippy::cast_possible_wrap)]
26-
for (byte, read) in buf
27-
.iter_mut()
28-
.zip(<$data_type>::$endian_type(n).iter().cloned())
29-
{
30-
*byte = read as $byte_type;
31-
}
20+
let bytes = n.$endian_type();
21+
let how_much = buf.len().min(bytes.len());
22+
buf[..how_much].copy_from_slice(&bytes[..how_much]);
3223
}
3324
};
3425
}
3526

36-
generate_read_fn!(read_le_u16, u16, u8, 2, from_le_bytes);
3727
generate_read_fn!(read_le_u32, u32, u8, 4, from_le_bytes);
38-
generate_read_fn!(read_le_u32_from_i8, u32, i8, 4, from_le_bytes);
3928
generate_read_fn!(read_le_u64, u64, u8, 8, from_le_bytes);
40-
generate_read_fn!(read_le_i32, i32, i8, 4, from_le_bytes);
4129

4230
generate_read_fn!(read_be_u16, u16, u8, 2, from_be_bytes);
4331
generate_read_fn!(read_be_u32, u32, u8, 4, from_be_bytes);
4432

45-
generate_write_fn!(write_le_u16, u16, u8, to_le_bytes);
4633
generate_write_fn!(write_le_u32, u32, u8, to_le_bytes);
47-
generate_write_fn!(write_le_u32_to_i8, u32, i8, to_le_bytes);
4834
generate_write_fn!(write_le_u64, u64, u8, to_le_bytes);
49-
generate_write_fn!(write_le_i32, i32, i8, to_le_bytes);
5035

5136
generate_write_fn!(write_be_u16, u16, u8, to_be_bytes);
5237
generate_write_fn!(write_be_u32, u32, u8, to_be_bytes);
@@ -110,10 +95,8 @@ mod tests {
11095
};
11196
}
11297

113-
byte_order_test_read_write!(test_le_u16, write_le_u16, read_le_u16, false, u16);
11498
byte_order_test_read_write!(test_le_u32, write_le_u32, read_le_u32, false, u32);
11599
byte_order_test_read_write!(test_le_u64, write_le_u64, read_le_u64, false, u64);
116-
byte_order_test_read_write!(test_le_i32, write_le_i32, read_le_i32, false, i32);
117100
byte_order_test_read_write!(test_be_u16, write_be_u16, read_be_u16, true, u16);
118101
byte_order_test_read_write!(test_be_u32, write_be_u32, read_be_u32, true, u32);
119102
}

0 commit comments

Comments
 (0)