Skip to content

Commit e1fb260

Browse files
committed
kernel-hal: merge commom serial code
1 parent 9c5fa63 commit e1fb260

File tree

16 files changed

+60
-179
lines changed

16 files changed

+60
-179
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
[workspace]
22
members = [
33
"zircon-object",
4+
"zircon-syscall",
45
"zircon-loader",
56
"linux-object",
6-
"zircon-syscall",
7+
"linux-syscall",
78
"linux-loader",
89
"kernel-hal",
910
]
@@ -12,5 +13,4 @@ exclude = [
1213
"zircon-user",
1314
"zCore",
1415
"rboot",
15-
"linux-syscall",
1616
]

kernel-hal/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ async-std = { version = "1.9", optional = true }
3333
# Bare-metal mode
3434
[target.'cfg(target_os = "none")'.dependencies]
3535
executor = { git = "https://github.com/rcore-os/executor.git", rev = "a2d02ee9" }
36-
naive-timer = "0.1.0"
36+
naive-timer = "0.2.0"
3737
lazy_static = { version = "1.4", features = ["spin_no_std"] }
3838
bitmap-allocator = { git = "https://github.com/rcore-os/bitmap-allocator", rev = "b3f9f51" }
3939
# rcore-fs = { git = "https://github.com/rcore-os/rcore-fs", rev = "6df6cd2" }

kernel-hal/src/bare/arch/riscv/interrupt.rs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use alloc::boxed::Box;
22
use riscv::register::{sie, sstatus};
33
use spin::Mutex;
44

5-
use super::{consts, plic, serial, trap, uart};
5+
use super::{plic, trap};
66
use crate::utils::irq_manager::IrqManager;
77

88
// IRQ
@@ -18,22 +18,13 @@ lazy_static::lazy_static! {
1818
#[allow(dead_code)]
1919
fn init_soft() {
2020
unsafe { sie::set_ssoft() };
21-
sbi_println!("+++ setup soft int! +++");
21+
info!("+++ setup soft int! +++");
2222
}
2323

2424
fn init_ext() {
2525
unsafe { sie::set_sext() };
2626
plic::init();
27-
sbi_println!("+++ Setting up PLIC +++");
28-
}
29-
30-
fn init_uart() {
31-
uart::init(consts::UART_BASE);
32-
33-
//但当没有SBI_CONSOLE_PUTCHAR时,却为什么不行?
34-
serial::uart_print_fmt(format_args!("UART output testing\n\r"));
35-
36-
sbi_println!("+++ Setting up UART interrupts +++");
27+
info!("+++ Setting up PLIC +++");
3728
}
3829

3930
fn init_irq() {
@@ -47,10 +38,9 @@ fn init_irq() {
4738

4839
pub(super) fn init() {
4940
unsafe { sstatus::set_sie() };
50-
init_uart();
5141
init_ext();
5242
init_irq();
53-
sbi_println!("+++ setup interrupt +++");
43+
info!("+++ setup interrupt OK +++");
5444
}
5545

5646
hal_fn_impl! {

kernel-hal/src/bare/arch/riscv/mod.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
#![allow(dead_code)]
22

3-
#[macro_use]
4-
pub mod serial;
5-
63
mod consts;
74
mod plic;
85
mod sbi;
@@ -14,6 +11,7 @@ pub mod context;
1411
pub mod cpu;
1512
pub mod interrupt;
1613
pub mod mem;
14+
pub mod serial;
1715
pub mod special;
1816
pub mod timer;
1917
pub mod vm;
@@ -22,8 +20,7 @@ pub fn init() {
2220
vm::remap_the_kernel().unwrap();
2321
interrupt::init();
2422
timer::init();
25-
26-
unsafe { asm!("ebreak") };
23+
uart::init(consts::UART_BASE);
2724

2825
#[cfg(feature = "board_qemu")]
2926
{

kernel-hal/src/bare/arch/riscv/plic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub(super) fn handle_interrupt() {
8484
match interrupt {
8585
1..=8 => {
8686
//virtio::handle_interrupt(interrupt);
87-
sbi_println!("plic virtio external interrupt: {}", interrupt);
87+
info!("plic virtio external interrupt: {}", interrupt);
8888
}
8989
UART0_INT_NUM => {
9090
//UART中断ID是10
@@ -94,7 +94,7 @@ pub(super) fn handle_interrupt() {
9494
//interrupt::try_process_serial();
9595
}
9696
_ => {
97-
sbi_println!("Unknown external interrupt: {}", interrupt);
97+
info!("Unknown external interrupt: {}", interrupt);
9898
}
9999
}
100100
//这将复位pending的中断,允许UART再次中断。
Lines changed: 1 addition & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,7 @@
1-
use alloc::{boxed::Box, collections::VecDeque, vec::Vec};
21
use core::fmt::{Arguments, Result, Write};
32

4-
use spin::Mutex;
5-
63
use super::{sbi, uart};
74

8-
lazy_static::lazy_static! {
9-
static ref STDIN: Mutex<VecDeque<u8>> = Mutex::new(VecDeque::new());
10-
static ref STDIN_CALLBACK: Mutex<Vec<Box<dyn Fn() -> bool + Send + Sync>>> =
11-
Mutex::new(Vec::new());
12-
}
13-
145
struct SbiConsole;
156
struct UartConsole;
167

@@ -34,52 +25,10 @@ impl Write for UartConsole {
3425
}
3526
}
3627

37-
pub(super) fn sbi_print_fmt(fmt: Arguments) {
38-
SbiConsole.write_fmt(fmt).unwrap();
39-
}
40-
41-
pub(super) fn uart_print_fmt(fmt: Arguments) {
42-
UartConsole.write_fmt(fmt).unwrap();
43-
}
44-
4528
hal_fn_impl! {
4629
impl mod crate::hal_fn::serial {
47-
fn serial_put(x: u8) {
48-
if (x == b'\r') || (x == b'\n') {
49-
STDIN.lock().push_back(b'\n');
50-
STDIN.lock().push_back(b'\r');
51-
}else{
52-
STDIN.lock().push_back(x);
53-
}
54-
STDIN_CALLBACK.lock().retain(|f| !f());
55-
}
56-
57-
fn serial_set_callback(callback: Box<dyn Fn() -> bool + Send + Sync>) {
58-
STDIN_CALLBACK.lock().push(callback);
59-
}
60-
61-
fn serial_read(buf: &mut [u8]) -> usize {
62-
let mut stdin = STDIN.lock();
63-
let len = stdin.len().min(buf.len());
64-
for c in &mut buf[..len] {
65-
*c = stdin.pop_front().unwrap();
66-
}
67-
len
68-
}
69-
7030
fn serial_write_fmt(fmt: Arguments) {
71-
uart_print_fmt(fmt);
31+
UartConsole.write_fmt(fmt).unwrap();
7232
}
7333
}
7434
}
75-
76-
macro_rules! sbi_print {
77-
($($arg:tt)*) => ({
78-
crate::serial::sbi_print_fmt(format_args!($($arg)*));
79-
});
80-
}
81-
82-
macro_rules! sbi_println {
83-
() => (sbi_print!("\n"));
84-
($($arg:tt)*) => (sbi_print!("{}\n", format_args!($($arg)*)));
85-
}

kernel-hal/src/bare/arch/riscv/timer.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@ use riscv::register::{sie, time};
33

44
fn get_cycle() -> u64 {
55
time::read() as u64
6-
/*
7-
unsafe {
8-
MMIO_MTIME.read_volatile()
9-
}
10-
*/
116
}
127

138
pub(super) fn timer_set_next() {
@@ -16,14 +11,13 @@ pub(super) fn timer_set_next() {
1611
super::sbi::set_timer(get_cycle() + TIMEBASE);
1712
}
1813

19-
pub fn timer_now() -> Duration {
20-
const FREQUENCY: u64 = 10_000_000; // ???
21-
let time = get_cycle();
22-
//bare_println!("timer_now(): {:?}", time);
23-
Duration::from_nanos(time * 1_000_000_000 / FREQUENCY as u64)
24-
}
25-
2614
pub(super) fn init() {
2715
unsafe { sie::set_stimer() };
2816
timer_set_next();
2917
}
18+
19+
pub(crate) fn timer_now() -> Duration {
20+
const FREQUENCY: u64 = 10_000_000; // ???
21+
let time = get_cycle();
22+
Duration::from_nanos(time * 1_000_000_000 / FREQUENCY as u64)
23+
}

kernel-hal/src/bare/arch/riscv/trap.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use super::{plic, sbi};
66
use crate::MMUFlags;
77

88
fn breakpoint(sepc: &mut usize) {
9-
sbi_println!("Exception::Breakpoint: A breakpoint set @0x{:x} ", sepc);
9+
info!("Exception::Breakpoint: A breakpoint set @0x{:x} ", sepc);
1010

1111
//sepc为触发中断指令ebreak的地址
1212
//防止无限循环中断,让sret返回时跳转到sepc的下一条指令地址
@@ -17,14 +17,12 @@ pub(super) fn super_timer() {
1717
super::timer::timer_set_next();
1818
crate::timer::timer_tick();
1919

20-
//sbi_print!(".");
21-
2220
//发生外界中断时,epc的指令还没有执行,故无需修改epc到下一条
2321
}
2422

2523
fn super_soft() {
2624
sbi::clear_ipi();
27-
sbi_println!("Interrupt::SupervisorSoft!");
25+
info!("Interrupt::SupervisorSoft!");
2826
}
2927

3028
fn page_fault(access_flags: MMUFlags) {

kernel-hal/src/bare/arch/riscv/uart.rs

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,6 @@ pub(super) fn handle_interrupt() {
8888
if let Some(c) = uart.lock().get() {
8989
//CONSOLE
9090
crate::serial::serial_put(c);
91-
92-
/*
93-
* 因serial_write()已可以被回调输出了,这里则不再需要了
94-
match c {
95-
0x7f => { //0x8 [backspace] ; 而实际qemu运行,[backspace]键输出0x7f, 表示del
96-
bare_print!("{} {}", 8 as char, 8 as char);
97-
},
98-
10 | 13 => { // 新行或回车
99-
bare_println!();
100-
},
101-
_ => {
102-
bare_print!("{}", c as char);
103-
},
104-
}
105-
*/
10691
}
10792
}
10893
}

kernel-hal/src/bare/arch/x86_64/interrupt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ fn timer() {
241241

242242
fn com1() {
243243
let c = super::serial::COM1.lock().receive();
244-
super::serial::serial_put(c);
244+
crate::serial::serial_put(c);
245245
}
246246

247247
/*

0 commit comments

Comments
 (0)