forked from M-Labs/artiq
02b8426f60
By analogy with libbuild_misoc. Hopefully one day it actually gets moved to misoc...
47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
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
|
|
}
|