extern crate alloc;
use crate::task::get_cur_task;
use alloc::format;
use core::panic::PanicInfo;
use core::ptr;
use fe_osi::print_msg;
#[cfg(target_arch = "arm")]
pub fn int_register(irqn: i8, int_handler: *const usize) {
extern "C" {
static mut _svtable: u32;
static mut _evtable: u32;
}
unsafe {
let int_num: usize = (irqn + 16) as usize;
let int_pos = ((&_svtable) as *const u32).add(int_num) as *mut u32;
let regs = cortex_m::peripheral::SCB::ptr();
if (*regs).vtor.read() != &_svtable as *const u32 as u32 {
let count = (&_evtable as *const u32 as usize - &_svtable as *const u32 as usize) / 4;
let flash_ptr = (*regs).vtor.read() as *const u32;
let ram_ptr = (&mut _svtable) as *mut u32;
ptr::copy_nonoverlapping(flash_ptr, ram_ptr, count);
(*regs).vtor.write(ram_ptr as u32);
}
ptr::write(int_pos, int_handler as usize as u32);
}
}
#[cfg(not(target_arch = "arm"))]
pub fn int_register(_irqn: i8, _int_handler: *const usize) {}
#[no_mangle]
unsafe extern "C" fn Reset() -> ! {
extern "C" {
static mut _sbss: u8;
static mut _ebss: u8;
static mut _sdata: u8;
static mut _edata: u8;
static _sidata: u8;
}
let count = &_ebss as *const u8 as usize - &_sbss as *const u8 as usize;
ptr::write_bytes(&mut _sbss as *mut u8, 0, count);
let count = &_edata as *const u8 as usize - &_sdata as *const u8 as usize;
ptr::copy_nonoverlapping(&_sidata as *const u8, &mut _sdata as *mut u8, count);
extern "Rust" {
fn main() -> !;
}
main()
}
#[link_section = ".vector_table.reset_vector"]
#[no_mangle]
pub static RESET_VECTOR: unsafe extern "C" fn() -> ! = Reset;
#[panic_handler]
fn panic(panic_info: &PanicInfo<'_>) -> ! {
let pid = unsafe { get_cur_task().pid };
unsafe {
super::disable_interrupts();
}
print_msg(format!("Oh no! Process {} has panicked!\n", pid).as_str());
if let Some(loc) = panic_info.location() {
print_msg(format!("{} line {}\n", loc.file(), loc.line()).as_str());
}
if let Some(msg) = panic_info.message() {
print_msg(format!("{}\n", msg).as_str());
}
unsafe {
super::enable_interrupts();
}
fe_osi::exit();
loop {}
}
#[no_mangle]
pub extern "C" fn DefaultExceptionHandler() {
loop {}
}