Skip to content

Commit 894e45e

Browse files
authored
Merge branch 'main' into audit/ignore_paste_warning
2 parents 2968b46 + dd0d932 commit 894e45e

File tree

5 files changed

+13
-39
lines changed

5 files changed

+13
-39
lines changed

.buildkite/pipeline_pr.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
if not pipeline.args.no_kani and (
5252
not changed_files
5353
or any(x.suffix in [".rs", ".toml", ".lock"] for x in changed_files)
54+
or any(x.parent.name == "devctr" for x in changed_files)
5455
):
5556
kani_grp = pipeline.build_group(
5657
"🔍 Kani",

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/dumbo/pdu/ethernet.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -255,16 +255,6 @@ mod kani_proofs {
255255
}
256256
}
257257

258-
mod stubs {
259-
// The current implementation of read_be_u16 function leads to a significant
260-
// performance degradation given a necessary loop unrolling. Using this stub,
261-
// we read the same information from the buffer while avoiding the loop, thus,
262-
// notably improving performance.
263-
pub fn read_be_u16(input: &[u8]) -> u16 {
264-
u16::from_be_bytes([input[0], input[1]])
265-
}
266-
}
267-
268258
// We consider the MMDS Network Stack spec for all postconditions in the harnesses.
269259
// See https://github.com/firecracker-microvm/firecracker/blob/main/docs/mmds/mmds-design.md#mmds-network-stack
270260

@@ -519,7 +509,6 @@ mod kani_proofs {
519509

520510
#[kani::proof]
521511
#[kani::solver(cadical)]
522-
#[kani::stub(crate::utils::byte_order::read_be_u16, stubs::read_be_u16)]
523512
fn verify_with_payload_len_unchecked() {
524513
// Create non-deterministic stream of bytes up to MAX_FRAME_SIZE
525514
let mut bytes: [u8; MAX_FRAME_SIZE] = kani::Arbitrary::any_array::<MAX_FRAME_SIZE>();

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
}

tests/integration_tests/test_kani.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ def test_kani(results_dir):
2929
"""
3030
# -Z stubbing is required to enable the stubbing feature
3131
# -Z function-contracts is required to enable the function contracts feature
32-
# --restrict-vtable is required for some virtio queue proofs, which go out of memory otherwise
32+
# -Z restrict-vtable is required for some virtio queue proofs, which go out of memory otherwise
3333
# -j enables kani harnesses to be verified in parallel (required to keep CI time low)
3434
# --output-format terse is required by -j
35-
# --enable-unstable is needed to enable `-Z` flags
35+
# -Z unstable-options is needed to enable the other `-Z` flags
3636
_, stdout, _ = utils.check_output(
37-
"cargo kani --enable-unstable -Z stubbing -Z function-contracts --restrict-vtable -j --output-format terse",
37+
"cargo kani -Z unstable-options -Z stubbing -Z function-contracts -Z restrict-vtable -j --output-format terse",
3838
timeout=TIMEOUT,
3939
)
4040

0 commit comments

Comments
 (0)