refactor: unsafe only in adapter + libkos; forbid(unsafe_code) everywhere else; libkos Window (volatile, bounds-checked MMIO/DMA/shared mem), entry!, thread::spawn; MapRegion returns pages; kernel const-built (with_cores/install_platform); newtype addrs
This commit is contained in:
@@ -7,12 +7,13 @@ use hw_virtio::mmio::{
|
||||
use libkos::device::{self, Device};
|
||||
use libkos::syscall;
|
||||
use types::badge::Badge;
|
||||
use types::bootinfo::{BOOT_INFO_VA, BootInfo, KIND_UART_16550, KIND_VIRTIO, NO_SLOT};
|
||||
use types::address::VirtualAddress;
|
||||
use types::bootinfo::{BootInfo, KIND_UART_16550, KIND_VIRTIO, NO_SLOT};
|
||||
use types::bounded::CapSlot;
|
||||
use types::permission::{Permission, PermissionSet};
|
||||
|
||||
/// Where init briefly maps a device to ask what it is (top of the window).
|
||||
const PROBE_VA: usize = 0x01F0_0000;
|
||||
const PROBE_VA: VirtualAddress = VirtualAddress::from_raw(0x01F0_0000);
|
||||
|
||||
pub struct Devices {
|
||||
pub disk: Device,
|
||||
@@ -36,10 +37,10 @@ fn virtio_id(region: CapSlot) -> u32 {
|
||||
return 0;
|
||||
};
|
||||
let id = match device::map_mmio(copy, PROBE_VA) {
|
||||
// SAFETY: PROBE_VA maps the device's registers until the drop below.
|
||||
Ok(()) => unsafe {
|
||||
let reg = |off: usize| core::ptr::read_volatile((PROBE_VA + off) as *const u32);
|
||||
if reg(REG_MAGIC) == MAGIC { reg(REG_DEVICE_ID) } else { 0 }
|
||||
// The registers stay mapped until the drop below.
|
||||
Ok(regs) => match regs.read::<u32>(REG_MAGIC) == MAGIC {
|
||||
true => regs.read(REG_DEVICE_ID),
|
||||
false => 0,
|
||||
},
|
||||
Err(_) => 0,
|
||||
};
|
||||
@@ -47,10 +48,9 @@ fn virtio_id(region: CapSlot) -> u32 {
|
||||
id
|
||||
}
|
||||
|
||||
fn boot_info() -> &'static BootInfo {
|
||||
// SAFETY: boot maps the BootInfo page read-only at BOOT_INFO_VA before
|
||||
// init runs; readers check its magic.
|
||||
unsafe { &*(BOOT_INFO_VA as *const BootInfo) }
|
||||
/// What boot left for init; readers check its magic.
|
||||
fn boot_info() -> BootInfo {
|
||||
libkos::boot_info()
|
||||
}
|
||||
|
||||
/// The capability that halts the machine, if boot said where it is.
|
||||
|
||||
Reference in New Issue
Block a user