Skip to content

Commit 33a592d

Browse files
authored
Merge pull request #649 from mkroening/provenance-casts
fix: enable strict provenance lints
2 parents d6058e1 + 91adc00 commit 33a592d

File tree

15 files changed

+53
-40
lines changed

15 files changed

+53
-40
lines changed

src/arch/aarch64/kernel/mmio.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ pub fn init_drivers() {
110110
}
111111

112112
let virtio_region_start =
113-
PhysAddr::new(virtio_region.starting_address as u64);
113+
PhysAddr::from(virtio_region.starting_address.expose_provenance());
114114

115115
assert!(
116116
virtio_region.size.unwrap()

src/arch/aarch64/kernel/scheduler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ impl TaskStacks {
177177
}
178178

179179
pub fn from_boot_stacks() -> TaskStacks {
180-
let stack = VirtAddr::new(CURRENT_STACK_ADDRESS.load(Ordering::Relaxed) as u64);
180+
let stack = VirtAddr::from_ptr(CURRENT_STACK_ADDRESS.load(Ordering::Relaxed));
181181
debug!("Using boot stack {stack:p}");
182182

183183
TaskStacks::Boot(BootStack { stack })
@@ -302,7 +302,7 @@ impl TaskFrame for Task {
302302
let state = stack.as_mut_ptr::<State>();
303303
#[cfg(not(feature = "common-os"))]
304304
if let Some(tls) = &self.tls {
305-
(*state).tpidr_el0 = tls.thread_ptr() as u64;
305+
(*state).tpidr_el0 = tls.thread_ptr().expose_provenance() as u64;
306306
}
307307

308308
/*

src/arch/riscv64/kernel/devicetree.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ pub fn init_drivers() {
103103
.next()
104104
.unwrap();
105105

106-
let plic_region_start = PhysAddr::new(plic_region.starting_address as u64);
106+
let plic_region_start = PhysAddr::from(plic_region.starting_address.addr());
107107
debug!(
108108
"Init PLIC at {:p}, size: {:x}",
109109
plic_region_start,
@@ -119,9 +119,9 @@ pub fn init_drivers() {
119119
// TODO: Determine correct context via devicetree and allow more than one context
120120
match PLATFORM_MODEL {
121121
Model::Virt | Model::Unknown => {
122-
init_plic(plic_region.starting_address as usize, 1);
122+
init_plic(plic_region.starting_address.expose_provenance(), 1);
123123
}
124-
Model::Fux40 => init_plic(plic_region.starting_address as usize, 2),
124+
Model::Fux40 => init_plic(plic_region.starting_address.expose_provenance(), 2),
125125
}
126126
}
127127

@@ -161,7 +161,8 @@ pub fn init_drivers() {
161161
warn!("Expected ethernet-phy node, found something else");
162162
}
163163

164-
let gem_region_start = PhysAddr::new(gem_region.starting_address as u64);
164+
let gem_region_start =
165+
PhysAddr::from(gem_region.starting_address.expose_provenance());
165166
debug!("Init GEM at {gem_region_start:p}, irq: {irq}, phy_addr: {phy_addr}");
166167
assert!(
167168
gem_region.size.unwrap() < usize::try_from(paging::HugePageSize::SIZE).unwrap()
@@ -193,7 +194,8 @@ pub fn init_drivers() {
193194
.next()
194195
.unwrap();
195196

196-
let virtio_region_start = PhysAddr::new(virtio_region.starting_address as u64);
197+
let virtio_region_start =
198+
PhysAddr::from(virtio_region.starting_address.expose_provenance());
197199

198200
debug!("Init virtio_mmio at {virtio_region_start:p}, irq: {irq}");
199201
assert!(

src/arch/riscv64/kernel/interrupts.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use alloc::vec::Vec;
2+
use core::ptr;
23

34
use ahash::RandomState;
45
use hashbrown::HashMap;
@@ -128,18 +129,21 @@ pub(crate) fn install_handlers() {
128129

129130
// Set priority to 7 (highest on FU740)
130131
let prio_address = *base_ptr + *irq_number as usize * 4;
131-
core::ptr::write_volatile(prio_address as *mut u32, 1);
132+
let prio_ptr = ptr::with_exposed_provenance_mut::<u32>(prio_address);
133+
prio_ptr.write_volatile(1);
132134
// Set Threshold to 0 (lowest)
133135
let thresh_address = *base_ptr + 0x20_0000 + 0x1000 * (*context as usize);
134-
core::ptr::write_volatile(thresh_address as *mut u32, 0);
136+
let thresh_ptr = ptr::with_exposed_provenance_mut::<u32>(thresh_address);
137+
thresh_ptr.write_volatile(0);
135138
// Enable irq for context
136139
const PLIC_ENABLE_OFFSET: usize = 0x0000_2000;
137140
let enable_address = *base_ptr
138141
+ PLIC_ENABLE_OFFSET
139142
+ 0x80 * (*context as usize)
140143
+ ((*irq_number / 32) * 4) as usize;
141-
debug!("enable_address {enable_address:x}");
142-
core::ptr::write_volatile(enable_address as *mut u32, 1 << (irq_number % 32));
144+
let enable_ptr = ptr::with_exposed_provenance_mut::<u32>(enable_address);
145+
debug!("enable_address {enable_ptr:p}");
146+
enable_ptr.write_volatile(1 << (irq_number % 32));
143147
}
144148
}
145149

@@ -193,7 +197,8 @@ fn external_handler() {
193197
let base_ptr = PLIC_BASE.lock();
194198
let context = PLIC_CONTEXT.lock();
195199
let claim_address = *base_ptr + 0x20_0004 + 0x1000 * (*context as usize);
196-
let irq = unsafe { core::ptr::read_volatile(claim_address as *mut u32) };
200+
let claim_ptr = ptr::with_exposed_provenance_mut::<u32>(claim_address);
201+
let irq = unsafe { claim_ptr.read_volatile() };
197202

198203
if irq != 0 {
199204
debug!("External INT: {irq}");
@@ -219,7 +224,7 @@ fn external_handler() {
219224

220225
// Complete interrupt after handling
221226
unsafe {
222-
core::ptr::write_volatile(claim_address as *mut u32, irq);
227+
claim_ptr.write_volatile(irq);
223228
}
224229

225230
// Remove from active interrupts

src/arch/riscv64/kernel/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ pub fn boot_next_processor() {
156156
let frame_layout = PageLayout::from_size(KERNEL_STACK_SIZE).unwrap();
157157
let frame_range = FrameAlloc::allocate(frame_layout)
158158
.expect("Failed to allocate boot stack for new core");
159-
let stack = PhysAddr::from(frame_range.start());
160-
CURRENT_STACK_ADDRESS.store(stack.as_usize() as _, Ordering::Relaxed);
159+
let stack = ptr::with_exposed_provenance_mut(frame_range.start());
160+
CURRENT_STACK_ADDRESS.store(stack, Ordering::Relaxed);
161161
}
162162

163163
info!(
@@ -171,7 +171,7 @@ pub fn boot_next_processor() {
171171

172172
//When running bare-metal/QEMU we use the firmware to start the next hart
173173
if !env::is_uhyve() {
174-
let start_addr = start::_start as *const () as usize;
174+
let start_addr = (start::_start as *const ()).expose_provenance();
175175
sbi_rt::hart_start(next_hart_id as usize, start_addr, 0).unwrap();
176176
}
177177
} else {

src/arch/riscv64/kernel/scheduler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ impl TaskFrame for Task {
328328
let state = stack.as_mut_ptr::<State>();
329329
#[cfg(not(feature = "common-os"))]
330330
if let Some(tls) = &self.tls {
331-
(*state).tp = tls.thread_ptr() as usize;
331+
(*state).tp = tls.thread_ptr().expose_provenance();
332332
}
333333
(*state).ra = task_start;
334334
(*state).a0 = func as usize;

src/arch/riscv64/mm/paging.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,8 +473,9 @@ where
473473
let index = page.table_index::<L>();
474474
// trace!("Index: {:#X}", index);
475475
let subtable_address = self.entries[index].address().as_usize();
476+
let subtable_ptr = ptr::with_exposed_provenance_mut(subtable_address);
476477
// trace!("subtable_address: {:#X}", subtable_address);
477-
unsafe { &mut *(subtable_address as *mut PageTable<L::SubtableLevel>) }
478+
unsafe { &mut *subtable_ptr }
478479
}
479480

480481
/// Maps a continuous range of pages.
@@ -577,7 +578,7 @@ pub fn virtual_to_physical(virtual_address: VirtAddr) -> Option<PhysAddr> {
577578
} else {
578579
//PTE is a pointer to the next level of the page table
579580
assert!(i != 0); //pte should be a leaf if i=0
580-
page_table_addr = pte.address().as_usize() as *mut PageTable<L2Table>;
581+
page_table_addr = ptr::with_exposed_provenance_mut(pte.address().as_usize());
581582
// trace!("PTE is pointer: {:?}", page_table_addr);
582583
}
583584
}

src/arch/x86_64/kernel/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,8 @@ where
252252
flags,
253253
);
254254

255-
let code_slice = unsafe { slice::from_raw_parts_mut(LOADER_START as *mut u8, code_size) };
255+
let loader_start_ptr = ptr::with_exposed_provenance_mut(LOADER_START);
256+
let code_slice = unsafe { slice::from_raw_parts_mut(loader_start_ptr, code_size) };
256257

257258
if tls_size > 0 {
258259
// To access TLS blocks on x86-64, TLS offsets are *subtracted* from the thread register value.
@@ -287,7 +288,7 @@ where
287288
unsafe {
288289
thread_ptr.cast::<*mut ()>().write(thread_ptr);
289290
}
290-
crate::arch::x86_64::kernel::processor::writefs(thread_ptr as usize);
291+
crate::arch::x86_64::kernel::processor::writefs(thread_ptr.expose_provenance());
291292

292293
func(code_slice, Some(block))
293294
} else {
@@ -314,7 +315,8 @@ pub unsafe fn jump_to_user_land(entry_point: usize, code_size: usize, arg: &[&st
314315

315316
let stack_pointer =
316317
stack_pointer - 128 /* red zone */ - arg.len() * core::mem::size_of::<*mut u8>();
317-
let argv = unsafe { core::slice::from_raw_parts_mut(stack_pointer as *mut *mut u8, arg.len()) };
318+
let stack_ptr = ptr::with_exposed_provenance_mut::<*mut u8>(stack_pointer);
319+
let argv = unsafe { core::slice::from_raw_parts_mut(stack_ptr, arg.len()) };
318320
let len = arg.iter().fold(0, |acc, x| acc + x.len() + 1);
319321
// align stack pointer to fulfill the requirements of the x86_64 ABI
320322
let stack_pointer = (stack_pointer - len).align_down(16) - core::mem::size_of::<usize>();
@@ -323,7 +325,7 @@ pub unsafe fn jump_to_user_land(entry_point: usize, code_size: usize, arg: &[&st
323325
for (i, s) in arg.iter().enumerate() {
324326
if let Ok(s) = CString::new(*s) {
325327
let bytes = s.as_bytes_with_nul();
326-
argv[i] = (stack_pointer + pos) as *mut u8;
328+
argv[i] = ptr::with_exposed_provenance_mut::<u8>(stack_pointer + pos);
327329
pos += bytes.len();
328330

329331
unsafe {

src/arch/x86_64/kernel/vga.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use core::ptr;
2+
13
use hermit_sync::SpinMutex;
24
use memory_addresses::{PhysAddr, VirtAddr};
35
use x86_64::instructions::port::Port;
@@ -47,7 +49,7 @@ unsafe impl Send for VgaScreen {}
4749
impl VgaScreen {
4850
const fn new() -> Self {
4951
Self {
50-
buffer: VGA_BUFFER_ADDRESS.as_u64() as *mut _,
52+
buffer: ptr::with_exposed_provenance_mut(VGA_BUFFER_ADDRESS.as_usize()),
5153
current_col: 0,
5254
current_row: 0,
5355
is_initialized: false,

src/drivers/net/gem.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use alloc::vec::Vec;
1111
use core::alloc::Layout;
1212
use core::convert::TryInto;
1313
use core::ptr::NonNull;
14-
use core::{mem, slice};
14+
use core::{mem, ptr, slice};
1515

1616
use align_address::Align;
1717
use memory_addresses::{PhysAddr, VirtAddr};
@@ -477,13 +477,10 @@ impl<'a> smoltcp::phy::RxToken for RxToken<'a> {
477477

478478
// SAFETY: This is a blatant lie and very unsound.
479479
// The API must be fixed or the buffer may never touched again.
480-
let buffer = unsafe {
481-
core::slice::from_raw_parts_mut(
482-
(self.rx_fields.rxbuffer.as_usize() + (self.buffer_index * RX_BUF_LEN) as usize)
483-
as *mut u8,
484-
length as usize,
485-
)
486-
};
480+
let buffer_addr =
481+
self.rx_fields.rxbuffer.as_usize() + (self.buffer_index * RX_BUF_LEN) as usize;
482+
let buffer_ptr = ptr::with_exposed_provenance_mut::<u8>(buffer_addr);
483+
let buffer = unsafe { core::slice::from_raw_parts_mut(buffer_ptr, length as usize) };
487484
trace!("BUFFER: {buffer:x?}");
488485
let res = f(buffer);
489486
self.rx_buffer_consumed();

0 commit comments

Comments
 (0)