1
0
Fork 0

clean up the build system and add riscv support

usermode
Able 2021-11-17 08:42:54 -06:00
parent 50e8444c69
commit 6675d7e1fb
16 changed files with 197 additions and 99 deletions

View File

@ -9,3 +9,5 @@ build-std = ["core", "compiler_builtins"]
[target.'cfg(target_arch = "x86_64")']
# --quiet suppresses warning messages from the bootimage crate
runner = "bootimage runner --quiet"
[target.riscv64gc-unknown-none-elf]
rustflags = "-C link-arg=-T../ableos/src/arch/riscv/virt.lds"

View File

@ -1,58 +0,0 @@
.S
# bootloader for SoS
# Stephen Marz
# 8 February 2019
.option norvc
.section .data
.section .text.init
.global _start
_start:
# Any hardware threads (hart) that are not bootstrapping
# need to wait for an IPI
csrr t0, mhartid
bnez t0, 3f
# SATP should be zero, but let's make sure
csrw satp, zero
.option push
.option norelax
la gp, _global_pointer
.option pop
# The BSS section is expected to be zero
la a0, _bss_start
la a1, _bss_end
bgeu a0, a1, 2f
1:
sd zero, (a0)
addi a0, a0, 8
bltu a0, a1, 1b
2:
3:
wfi
j 3b
# Control registers, set the stack, mstatus, mepc,
# and mtvec to return to the main function.
# li t5, 0xffff;
# csrw medeleg, t5
# csrw mideleg, t5
la sp, _stack
# We use mret here so that the mstatus register
# is properly updated.
li t0, (0b11 << 11) | (1 << 7) | (1 << 3)
csrw mstatus, t0
la t1, kernel_main
csrw mepc, t1
la t2, asm_trap_vector
csrw mtvec, t2
li t3, (1 << 3) | (1 << 7) | (1 << 11)
csrw mie, t3
la ra, 4f
mret
4:
wfi
j 4b

View File

@ -1,8 +0,0 @@
# trap.S
# Assembly-level trap handler.
.section .text
.global asm_trap_vector
asm_trap_vector:
# We get here when the CPU is interrupted
# for any reason.
mret

View File

@ -0,0 +1,31 @@
use crate::driver_traits::graphics::{Graphics, Point, Rgb};
pub struct GraphicsBuffer;
#[allow(unused)]
impl Graphics for GraphicsBuffer {
fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb) {
todo!()
}
fn put_rect(coords_start: Point, coords_end: Point, color: Rgb) {
todo!()
}
fn put_circle(coords: Point, radius: u32) {
todo!()
}
fn put_triangle(coords_1: Point, coords_2: Point, coords_3: Point, thickness: u32, color: Rgb) {
todo!();
}
fn put_pixel(coords: Point, color: Rgb) {
todo!()
}
fn paint_cursor(coords: Point) {
todo!()
}
fn hide_cursor() {}
fn show_cursor() {}
fn draw() {}
fn clear() {
todo!()
}
}

View File

@ -0,0 +1,2 @@
pub mod graphics;
pub mod serial;

View File

@ -0,0 +1,11 @@
#[macro_export]
macro_rules! serial_print {
($($arg:tt)*) => {};
}
/// Prints to the host through the serial interface, appending a newline.
#[macro_export]
macro_rules! serial_println {
() => {};
($fmt:expr) => {};
($fmt:expr, $($arg:tt)*) => {};
}

View File

@ -0,0 +1 @@
pub fn init() {}

View File

@ -0,0 +1,46 @@
pub mod drivers;
pub mod init;
#[naked]
#[no_mangle]
unsafe extern "C" fn _boot() -> ! {
#[rustfmt::skip]
asm!("
csrw sie, zero
csrci sstatus, 2
.option push
.option norelax
lla gp, __global_pointer$
.option pop
lla sp, __tmp_stack_top
lla t0, __bss_start
lla t1, __bss_end
1:
beq t0, t1, 2f
sd zero, (t0)
addi t0, t0, 8
j 1b
2:
j {}
",
sym _start, options(noreturn));
}
extern "C" fn _start() -> ! {
let uart_data = 0x10000000 as *mut u8;
for c in b"Hello, world!\n" {
unsafe { uart_data.write_volatile(*c) };
}
sloop()
}
pub fn sloop() -> ! {
loop {
unsafe { asm!("nop") };
}
}

View File

@ -0,0 +1,64 @@
OUTPUT_ARCH(riscv64gc)
ENTRY(_boot);
SECTIONS {
. = 0x80200000;
.text : {
PROVIDE(__text_start = .);
PROVIDE(KERNEL_START = .);
*(.init.boot)
*(.init.rust)
*(.text .text.*)
. = ALIGN(4K);
PROVIDE(__text_end = .);
}
.data : {
PROVIDE(__data_start = .);
*(.data .data.* .rodata .rodata.*)
. = ALIGN(8);
PROVIDE(__tmp_stack_bottom = .);
. += 1024 * 1024 * 4;
PROVIDE(__tmp_stack_top = .);
. += 4096;
PROVIDE(__scratch_stack = .);
. = ALIGN(8);
}
. = ALIGN(8);
.sdata : {
PROVIDE(__global_pointer$ = .);
*(.sdata .sdata.*)
. = ALIGN(4K);
PROVIDE(__data_end = .);
}
PROVIDE(__bss_start = .);
.sbss : {
*(.sbss .sbss.*);
}
.bss : {
*(.bss .bss.*)
}
. = ALIGN(4K);
PROVIDE(__bss_end = .);
.tdata : {
. = ALIGN(4K);
PROVIDE(__tdata_start = .);
*(.tdata .tdata.*)
. = ALIGN(4K);
PROVIDE(__tdata_end = .);
}
. = ALIGN(2M);
PROVIDE(KERNEL_END = .);
/DISCARD/ : { *(.eh_frame_hdr .eh_frame) }
}

View File

@ -11,6 +11,10 @@ pub extern "C" fn _start() -> ! {
#[allow(unused)]
pub fn shutdown() -> ! {
unsafe {
cpuio::outw(0x2000, 0x604);
}
sloop();
}
@ -21,7 +25,7 @@ pub fn sloop() -> ! {
}
#[cfg(test)]
pub fn test_runner(tests: &[&dyn Fn()]) {
for test in tests {
test();
}
for test in tests {
test();
}
}

View File

@ -1,9 +1,16 @@
#![allow(unused)]
pub enum GModes {
Vga800x600,
Custom(u16, u16),
Vga800x600,
Custom(u16, u16),
}
pub type GCoord = usize;
// TODO remap to a bitmasked u32
/* REASON: More effecient memory wise so less overhead on the wasm memory
Current: u32+u32+u32
Proposed: u32 with bitmaps
*/
pub struct Rgb {
pub r: u32,
pub g: u32,

View File

@ -33,8 +33,9 @@ pub extern "C" fn kernel_main() {
AES::init_rng();
*/
#[cfg(not(target_arch = "riscv64"))]
println!("init");
{
use crate::experiments::mail::MailBoxes;
let mut x = MailBoxes::new();
@ -44,7 +45,7 @@ pub extern "C" fn kernel_main() {
}
// stack_overflow();
// crate::arch::shutdown();
loop {}
}
// TODO: reimplement for the random handler

View File

@ -8,6 +8,7 @@
#![reexport_test_harness_main = "test_main"]
#![feature(custom_test_frameworks)]
#![test_runner(crate::arch::test_runner)]
#![feature(naked_functions)]
#[cfg(target_arch = "arm")]
#[path = "arch/aarch32/mod.rs"]
mod arch;
@ -19,18 +20,21 @@ mod arch;
#[cfg(target_arch = "x86_64")]
#[path = "arch/x86_64/mod.rs"]
mod arch;
#[cfg(target_arch = "mips")]
#[path = "arch/ps_portable/mod.rs"]
#[cfg(target_arch = "riscv64")]
#[path = "arch/riscv/mod.rs"]
mod arch;
#[macro_use]
pub mod print;
use arch::drivers::serial;
mod driver_traits;
mod experiments;
#[cfg(not(target_arch = "mips"))]
// pub mod allocator;
mod kmain;
#[cfg(not(target_arch = "mips"))]
mod panic;
mod driver_traits;
mod experiments;
pub use experiments::server;
pub mod keyboard;
pub mod relib;

View File

@ -30,7 +30,10 @@ impl core::fmt::Write for Stdout {
kprint!("{}", s);
Ok(())
}
#[cfg(target_arch = "riscv64")]
fn write_str(&mut self, s: &str) -> Result<(), Error> {
Ok(())
}
#[cfg(target_arch = "mips")]
fn write_str(&mut self, s: &str) -> Result<(), Error> {
use psp::dprint;

View File

@ -12,6 +12,7 @@ enum Command {
machine: Option<MachineType>,
},
}
#[derive(clap::ArgEnum, Debug, Clone)]
enum MachineType {
X86,
@ -56,29 +57,16 @@ fn main() -> anyhow::Result<()> {
.run()?;
#[rustfmt::skip]
xshell::cmd!(
"
qemu-system-riscv64
-machine virt
-cpu rv64
-smp 8
-m 128M
-bios opensbi-riscv64-generic-fw_jump.bin
-kernel blog_os/target/riscv64gc-unknown-none-elf/release/blog_os
"
)
.run()?;
"qemu-system-riscv64
-machine virt
-cpu rv64
-smp 8
-m 128M
-bios src/arch/riscv/firmwear/opensbi-riscv64-generic-fw_jump.bin
-kernel target/riscv64gc-unknown-none-elf/release/ableos"
).run()?;
}
}
/*
#[rustfmt::skip]
xshell::cmd!("
qemu-system-x86_64
-drive format=raw,file=../../ableos/target/x86_64-ableos/release/bootimage-ableos.bin
{debug_log...}
"
).run()?;
*/
}
}