forked from koniifer/ableos
clean up the build system and add riscv support
This commit is contained in:
parent
50e8444c69
commit
6675d7e1fb
|
@ -9,3 +9,5 @@ build-std = ["core", "compiler_builtins"]
|
||||||
[target.'cfg(target_arch = "x86_64")']
|
[target.'cfg(target_arch = "x86_64")']
|
||||||
# --quiet suppresses warning messages from the bootimage crate
|
# --quiet suppresses warning messages from the bootimage crate
|
||||||
runner = "bootimage runner --quiet"
|
runner = "bootimage runner --quiet"
|
||||||
|
[target.riscv64gc-unknown-none-elf]
|
||||||
|
rustflags = "-C link-arg=-T../ableos/src/arch/riscv/virt.lds"
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
31
ableos/src/arch/riscv/drivers/graphics.rs
Normal file
31
ableos/src/arch/riscv/drivers/graphics.rs
Normal 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!()
|
||||||
|
}
|
||||||
|
}
|
2
ableos/src/arch/riscv/drivers/mod.rs
Normal file
2
ableos/src/arch/riscv/drivers/mod.rs
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
pub mod graphics;
|
||||||
|
pub mod serial;
|
11
ableos/src/arch/riscv/drivers/serial.rs
Normal file
11
ableos/src/arch/riscv/drivers/serial.rs
Normal 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)*) => {};
|
||||||
|
}
|
BIN
ableos/src/arch/riscv/firmwear/opensbi-riscv64-generic-fw_jump.bin
Executable file
BIN
ableos/src/arch/riscv/firmwear/opensbi-riscv64-generic-fw_jump.bin
Executable file
Binary file not shown.
1
ableos/src/arch/riscv/init.rs
Normal file
1
ableos/src/arch/riscv/init.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pub fn init() {}
|
46
ableos/src/arch/riscv/mod.rs
Normal file
46
ableos/src/arch/riscv/mod.rs
Normal 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") };
|
||||||
|
}
|
||||||
|
}
|
64
ableos/src/arch/riscv/virt.lds
Normal file
64
ableos/src/arch/riscv/virt.lds
Normal 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) }
|
||||||
|
}
|
|
@ -11,6 +11,10 @@ pub extern "C" fn _start() -> ! {
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub fn shutdown() -> ! {
|
pub fn shutdown() -> ! {
|
||||||
|
unsafe {
|
||||||
|
cpuio::outw(0x2000, 0x604);
|
||||||
|
}
|
||||||
|
|
||||||
sloop();
|
sloop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +25,7 @@ pub fn sloop() -> ! {
|
||||||
}
|
}
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub fn test_runner(tests: &[&dyn Fn()]) {
|
pub fn test_runner(tests: &[&dyn Fn()]) {
|
||||||
for test in tests {
|
for test in tests {
|
||||||
test();
|
test();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,16 @@
|
||||||
#![allow(unused)]
|
#![allow(unused)]
|
||||||
pub enum GModes {
|
pub enum GModes {
|
||||||
Vga800x600,
|
Vga800x600,
|
||||||
Custom(u16, u16),
|
Custom(u16, u16),
|
||||||
}
|
}
|
||||||
pub type GCoord = usize;
|
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 struct Rgb {
|
||||||
pub r: u32,
|
pub r: u32,
|
||||||
pub g: u32,
|
pub g: u32,
|
||||||
|
|
|
@ -33,8 +33,9 @@ pub extern "C" fn kernel_main() {
|
||||||
AES::init_rng();
|
AES::init_rng();
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
#[cfg(not(target_arch = "riscv64"))]
|
||||||
println!("init");
|
println!("init");
|
||||||
|
|
||||||
{
|
{
|
||||||
use crate::experiments::mail::MailBoxes;
|
use crate::experiments::mail::MailBoxes;
|
||||||
let mut x = MailBoxes::new();
|
let mut x = MailBoxes::new();
|
||||||
|
@ -44,7 +45,7 @@ pub extern "C" fn kernel_main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// stack_overflow();
|
// stack_overflow();
|
||||||
|
// crate::arch::shutdown();
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
// TODO: reimplement for the random handler
|
// TODO: reimplement for the random handler
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#![reexport_test_harness_main = "test_main"]
|
#![reexport_test_harness_main = "test_main"]
|
||||||
#![feature(custom_test_frameworks)]
|
#![feature(custom_test_frameworks)]
|
||||||
#![test_runner(crate::arch::test_runner)]
|
#![test_runner(crate::arch::test_runner)]
|
||||||
|
#![feature(naked_functions)]
|
||||||
#[cfg(target_arch = "arm")]
|
#[cfg(target_arch = "arm")]
|
||||||
#[path = "arch/aarch32/mod.rs"]
|
#[path = "arch/aarch32/mod.rs"]
|
||||||
mod arch;
|
mod arch;
|
||||||
|
@ -19,18 +20,21 @@ mod arch;
|
||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
#[path = "arch/x86_64/mod.rs"]
|
#[path = "arch/x86_64/mod.rs"]
|
||||||
mod arch;
|
mod arch;
|
||||||
#[cfg(target_arch = "mips")]
|
#[cfg(target_arch = "riscv64")]
|
||||||
#[path = "arch/ps_portable/mod.rs"]
|
#[path = "arch/riscv/mod.rs"]
|
||||||
mod arch;
|
mod arch;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
pub mod print;
|
pub mod print;
|
||||||
|
|
||||||
|
use arch::drivers::serial;
|
||||||
|
|
||||||
|
mod driver_traits;
|
||||||
|
mod experiments;
|
||||||
#[cfg(not(target_arch = "mips"))]
|
#[cfg(not(target_arch = "mips"))]
|
||||||
// pub mod allocator;
|
// pub mod allocator;
|
||||||
mod kmain;
|
mod kmain;
|
||||||
#[cfg(not(target_arch = "mips"))]
|
#[cfg(not(target_arch = "mips"))]
|
||||||
mod panic;
|
mod panic;
|
||||||
mod driver_traits;
|
|
||||||
mod experiments;
|
|
||||||
pub use experiments::server;
|
pub use experiments::server;
|
||||||
pub mod keyboard;
|
pub mod keyboard;
|
||||||
pub mod relib;
|
pub mod relib;
|
||||||
|
|
|
@ -30,7 +30,10 @@ impl core::fmt::Write for Stdout {
|
||||||
kprint!("{}", s);
|
kprint!("{}", s);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
#[cfg(target_arch = "riscv64")]
|
||||||
|
fn write_str(&mut self, s: &str) -> Result<(), Error> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
#[cfg(target_arch = "mips")]
|
#[cfg(target_arch = "mips")]
|
||||||
fn write_str(&mut self, s: &str) -> Result<(), Error> {
|
fn write_str(&mut self, s: &str) -> Result<(), Error> {
|
||||||
use psp::dprint;
|
use psp::dprint;
|
||||||
|
|
|
@ -12,6 +12,7 @@ enum Command {
|
||||||
machine: Option<MachineType>,
|
machine: Option<MachineType>,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(clap::ArgEnum, Debug, Clone)]
|
#[derive(clap::ArgEnum, Debug, Clone)]
|
||||||
enum MachineType {
|
enum MachineType {
|
||||||
X86,
|
X86,
|
||||||
|
@ -56,29 +57,16 @@ fn main() -> anyhow::Result<()> {
|
||||||
.run()?;
|
.run()?;
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
xshell::cmd!(
|
xshell::cmd!(
|
||||||
"
|
"qemu-system-riscv64
|
||||||
qemu-system-riscv64
|
-machine virt
|
||||||
-machine virt
|
-cpu rv64
|
||||||
-cpu rv64
|
-smp 8
|
||||||
-smp 8
|
-m 128M
|
||||||
-m 128M
|
-bios src/arch/riscv/firmwear/opensbi-riscv64-generic-fw_jump.bin
|
||||||
-bios opensbi-riscv64-generic-fw_jump.bin
|
-kernel target/riscv64gc-unknown-none-elf/release/ableos"
|
||||||
-kernel blog_os/target/riscv64gc-unknown-none-elf/release/blog_os
|
).run()?;
|
||||||
|
|
||||||
"
|
|
||||||
)
|
|
||||||
.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()?;
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue