use core::ptr; use board_misoc::csr; use mailbox; use rpc_queue; use kernel_proto::{KERNELCPU_EXEC_ADDRESS, KERNELCPU_LAST_ADDRESS, KSUPPORT_HEADER_SIZE}; #[cfg(has_kernel_cpu)] pub unsafe fn start() { if csr::kernel_cpu::reset_read() == 0 { panic!("attempted to start kernel CPU when it is already running") } stop(); extern { static _binary____ksupport_ksupport_elf_start: u8; static _binary____ksupport_ksupport_elf_end: u8; } let ksupport_start = &_binary____ksupport_ksupport_elf_start as *const _; let ksupport_end = &_binary____ksupport_ksupport_elf_end as *const _; ptr::copy_nonoverlapping(ksupport_start, (KERNELCPU_EXEC_ADDRESS - KSUPPORT_HEADER_SIZE) as *mut u8, ksupport_end as usize - ksupport_start as usize); csr::kernel_cpu::reset_write(0); rpc_queue::init(); } #[cfg(not(has_kernel_cpu))] pub unsafe fn start() { unimplemented!("not(has_kernel_cpu)") } pub unsafe fn stop() { #[cfg(has_kernel_cpu)] csr::kernel_cpu::reset_write(1); mailbox::acknowledge(); rpc_queue::init(); } pub fn validate(ptr: usize) -> bool { ptr >= KERNELCPU_EXEC_ADDRESS && ptr <= KERNELCPU_LAST_ADDRESS }