Merge remote-tracking branch 'origin/mipsel' into dev

toolchain_update
Jiajie Chen 6 years ago
commit b2777032c8

@ -1,3 +1,3 @@
/// board specific constants /// board specific constants
pub const MEMORY_END: usize = 0x8080_0000; pub const MEMORY_END: usize = 0x8080_0000;
pub const KERNEL_HEAP_SIZE: usize = 0x0020_0000; pub const KERNEL_HEAP_SIZE: usize = 0x0044_0000;

@ -21,6 +21,7 @@ pub fn init_serial_early() {
pub fn init_driver() { pub fn init_driver() {
// TODO: add possibly more drivers // TODO: add possibly more drivers
// timer::init(); // timer::init();
fb::init();
} }
pub fn probe_fb_info(width: u32, height: u32, depth: u32) -> FramebufferResult { pub fn probe_fb_info(width: u32, height: u32, depth: u32) -> FramebufferResult {

@ -4,7 +4,7 @@
OUTPUT_ARCH(riscv) OUTPUT_ARCH(riscv)
ENTRY(_start) ENTRY(_start)
BASE_ADDRESS = 0x80100000; BASE_ADDRESS = 0x80000000;
SECTIONS SECTIONS
{ {

@ -2,7 +2,7 @@
/// ///
pub use super::board::consts::*; pub use super::board::consts::*;
pub const KERNEL_OFFSET: usize = 0x80100000; pub const KERNEL_OFFSET: usize = 0x80000000;
pub const MEMORY_OFFSET: usize = 0x8000_0000; pub const MEMORY_OFFSET: usize = 0x8000_0000;

@ -11,4 +11,7 @@ pub mod console;
pub fn init() { pub fn init() {
board::init_driver(); board::init_driver();
console::init(); console::init();
if let Some(con) = console::CONSOLE.lock().as_mut() {
con.clear();
}
} }

@ -29,6 +29,9 @@ pub fn init() {
status.enable_soft_int1(); status.enable_soft_int1();
// Enable clock interrupt // Enable clock interrupt
status.enable_hard_int5(); status.enable_hard_int5();
// Enable serial interrupt
#[cfg(feature = "board_thinpad")]
status.enable_hard_int0();
cp0::status::write(status); cp0::status::write(status);
} }
@ -209,6 +212,11 @@ fn reserved_inst(tf: &mut TrapFrame) -> bool {
let sel = (inst >> 6) & 0b111; let sel = (inst >> 6) & 0b111;
let format = inst & 0b111111; let format = inst & 0b111111;
if inst == 0x42000020 {
// ignore WAIT
return true;
}
if opcode == 0b011111 && format == 0b111011 { if opcode == 0b011111 && format == 0b111011 {
// RDHWR // RDHWR
if rd == 29 && sel == 0 { if rd == 29 && sel == 0 {

@ -1,3 +1,3 @@
#[cfg(any(target_arch = "x86_64", target_arch = "mips"))] #[cfg(any(target_arch = "x86_64", all(target_arch = "mips", feature = "board_malta")))]
pub mod pci; pub mod pci;
pub mod virtio_mmio; pub mod virtio_mmio;

@ -2,6 +2,7 @@
use crate::util::{read, write}; use crate::util::{read, write};
use core::fmt::{Arguments, Result, Write}; use core::fmt::{Arguments, Result, Write};
use spin::Mutex;
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub struct SerialPort { pub struct SerialPort {
@ -15,6 +16,10 @@ const UART_STATUS_CTS: u8 = 0x1; // clear to send signal
const UART_STATUS_DR: u8 = 0x2; // data ready signal const UART_STATUS_DR: u8 = 0x2; // data ready signal
impl SerialPort { impl SerialPort {
fn new() -> SerialPort {
SerialPort { base: 0 }
}
pub fn init(&mut self, base: usize) { pub fn init(&mut self, base: usize) {
self.base = base; self.base = base;
} }
@ -49,12 +54,6 @@ impl SerialPort {
pub fn putfmt(&mut self, fmt: Arguments) { pub fn putfmt(&mut self, fmt: Arguments) {
self.write_fmt(fmt).unwrap(); self.write_fmt(fmt).unwrap();
} }
pub fn lock(&self) -> SerialPort {
self.clone()
}
pub fn force_unlock(&self) {}
} }
impl Write for SerialPort { impl Write for SerialPort {
@ -72,7 +71,10 @@ impl Write for SerialPort {
} }
} }
pub static SERIAL_PORT: SerialPort = SerialPort { base: 0 }; // pub static SERIAL_PORT: SerialPort = SerialPort { base: 0xa3000000 };
lazy_static! {
pub static ref SERIAL_PORT: Mutex<SerialPort> = Mutex::new(SerialPort::new());
}
pub fn init(base: usize) { pub fn init(base: usize) {
SERIAL_PORT.lock().init(base); SERIAL_PORT.lock().init(base);

@ -13,6 +13,7 @@
//! mipssim/malta(MIPS) -- 10MB //! mipssim/malta(MIPS) -- 10MB
use super::HEAP_ALLOCATOR; use super::HEAP_ALLOCATOR;
use core::mem;
pub use crate::arch::paging::*; pub use crate::arch::paging::*;
use crate::consts::{KERNEL_OFFSET, MEMORY_OFFSET}; use crate::consts::{KERNEL_OFFSET, MEMORY_OFFSET};
use crate::sync::SpinNoIrqLock; use crate::sync::SpinNoIrqLock;
@ -138,11 +139,13 @@ pub fn handle_page_fault(addr: usize) -> bool {
pub fn init_heap() { pub fn init_heap() {
use crate::consts::KERNEL_HEAP_SIZE; use crate::consts::KERNEL_HEAP_SIZE;
static mut HEAP: [u8; KERNEL_HEAP_SIZE] = [0; KERNEL_HEAP_SIZE]; const machine_align: usize = mem::size_of::<usize>();
const heap_block: usize = KERNEL_HEAP_SIZE / machine_align;
static mut HEAP: [usize; heap_block] = [0; heap_block];
unsafe { unsafe {
HEAP_ALLOCATOR HEAP_ALLOCATOR
.lock() .lock()
.init(HEAP.as_ptr() as usize, KERNEL_HEAP_SIZE); .init(HEAP.as_ptr() as usize, heap_block * machine_align);
} }
info!("heap init end"); info!("heap init end");
} }

@ -6,7 +6,7 @@ use crate::process::*;
use alloc::string::String; use alloc::string::String;
use alloc::vec::Vec; use alloc::vec::Vec;
#[cfg(not(feature = "run_cmdline"))] #[cfg(not(any(feature = "run_cmdline", feature = "board_thinpad")))]
pub fn add_user_shell() { pub fn add_user_shell() {
// the busybox of alpine linux can not transfer env vars into child process // the busybox of alpine linux can not transfer env vars into child process
// Now we use busybox from // Now we use busybox from
@ -38,6 +38,21 @@ pub fn add_user_shell() {
} }
} }
#[cfg(feature = "board_thinpad")]
pub fn run_user_shell() {
if let Ok(inode) = ROOT_INODE.lookup("sh") {
let data = inode.read_as_vec().unwrap();
processor().manager().add(Thread::new_user(
data.as_slice(),
"sh",
vec!["sh".into()],
Vec::new(),
));
} else {
processor().manager().add(Thread::new_kernel(shell, 0));
}
}
#[cfg(feature = "run_cmdline")] #[cfg(feature = "run_cmdline")]
pub fn add_user_shell() { pub fn add_user_shell() {
use crate::drivers::CMDLINE; use crate::drivers::CMDLINE;

Loading…
Cancel
Save