main: refactor into abort, panic, ram

master
Astro 2019-11-11 02:37:06 +01:00
parent 92c274348f
commit 3279aab961
5 changed files with 71 additions and 59 deletions

13
src/abort.rs Normal file
View File

@ -0,0 +1,13 @@
use crate::println;
#[no_mangle]
pub unsafe extern "C" fn PrefetchAbort() {
println!("PrefetchAbort");
loop {}
}
#[no_mangle]
pub unsafe extern "C" fn DataAbort() {
println!("DataAbort");
loop {}
}

View File

@ -10,10 +10,7 @@
#![allow(dead_code)]
extern crate alloc;
use alloc::{vec, vec::Vec, alloc::Layout};
use core::alloc::GlobalAlloc;
use core::ptr::NonNull;
use core::cell::RefCell;
use alloc::{vec, vec::Vec};
use core::mem::transmute;
use r0::zero_bss;
use compiler_builtins as _;
@ -21,12 +18,14 @@ use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr};
use smoltcp::iface::{NeighborCache, EthernetInterfaceBuilder};
use smoltcp::time::Instant;
use smoltcp::socket::SocketSet;
use linked_list_allocator::Heap;
mod regs;
mod cortex_a9;
mod stdio;
mod abort;
mod panic;
mod zynq;
mod stdio;
mod ram;
use crate::regs::{RegisterR, RegisterW};
use crate::cortex_a9::{asm, regs::*, mmu};
@ -97,11 +96,7 @@ fn main() {
let mut ddr = zynq::ddr::DdrRam::new();
println!("DDR: {:?}", ddr.status());
ddr.memtest();
unsafe {
ALLOCATOR.0.borrow_mut()
.init(ddr.ptr::<u8>() as usize, ddr.size());
}
ram::init_alloc(&mut ddr);
let eth = zynq::eth::Eth::default(HWADDR.clone());
println!("Eth on");
@ -181,52 +176,6 @@ fn main() {
// None => println!("eth tx shortage"),
// }
}
}
#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
println!("\nPanic: {}", info);
zynq::slcr::RegisterBlock::unlocked(|slcr| slcr.soft_reset());
loop {}
}
#[global_allocator]
static ALLOCATOR: HeapAlloc = HeapAlloc(RefCell::new(Heap::empty()));
/// LockedHeap doesn't locking properly
struct HeapAlloc(RefCell<Heap>);
/// FIXME: unsound; lock properly
unsafe impl Sync for HeapAlloc {}
unsafe impl GlobalAlloc for HeapAlloc {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
self.0.borrow_mut()
.allocate_first_fit(layout)
.ok()
.map_or(0 as *mut u8, |allocation| allocation.as_ptr())
}
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
self.0.borrow_mut()
.deallocate(NonNull::new_unchecked(ptr), layout)
}
}
#[alloc_error_handler]
fn alloc_error(_: core::alloc::Layout) -> ! {
panic!("alloc_error")
}
#[no_mangle]
pub unsafe extern "C" fn PrefetchAbort() {
println!("PrefetchAbort");
loop {}
}
#[no_mangle]
pub unsafe extern "C" fn DataAbort() {
println!("DataAbort");
loop {}
}

9
src/panic.rs Normal file
View File

@ -0,0 +1,9 @@
use crate::{println, zynq};
#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
println!("\nPanic: {}", info);
zynq::slcr::RegisterBlock::unlocked(|slcr| slcr.soft_reset());
loop {}
}

42
src/ram.rs Normal file
View File

@ -0,0 +1,42 @@
use core::cell::RefCell;
use core::alloc::GlobalAlloc;
use core::ptr::NonNull;
use alloc::alloc::Layout;
use linked_list_allocator::Heap;
use crate::zynq::ddr::DdrRam;
#[global_allocator]
static ALLOCATOR: HeapAlloc = HeapAlloc(RefCell::new(Heap::empty()));
/// LockedHeap doesn't locking properly
struct HeapAlloc(RefCell<Heap>);
/// FIXME: unsound; lock properly
unsafe impl Sync for HeapAlloc {}
unsafe impl GlobalAlloc for HeapAlloc {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
self.0.borrow_mut()
.allocate_first_fit(layout)
.ok()
.map_or(0 as *mut u8, |allocation| allocation.as_ptr())
}
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
self.0.borrow_mut()
.deallocate(NonNull::new_unchecked(ptr), layout)
}
}
pub fn init_alloc(ddr: &mut DdrRam) {
unsafe {
ALLOCATOR.0.borrow_mut()
.init(ddr.ptr::<u8>() as usize, ddr.size());
}
}
#[alloc_error_handler]
fn alloc_error(_: core::alloc::Layout) -> ! {
panic!("alloc_error")
}

View File

@ -186,7 +186,6 @@ impl DdrRam {
self.regs.mode_sts_reg.read().operating_mode()
}
// TODO: move into trait
pub fn ptr<T>(&mut self) -> *mut T {
0x0010_0000 as *mut _
}