From aeb7fce0e6e61679372c595d138bed860ff9bb55 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Sun, 8 Jul 2018 01:02:43 +0800 Subject: [PATCH] SBI: Support RISCV64 --- crate/bbl/src/sbi.rs | 45 ++++++++++++++++++++------------------ src/arch/riscv32/serial.rs | 2 +- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/crate/bbl/src/sbi.rs b/crate/bbl/src/sbi.rs index cd9834b..b8782b7 100644 --- a/crate/bbl/src/sbi.rs +++ b/crate/bbl/src/sbi.rs @@ -1,7 +1,7 @@ //! Port from sbi.h #[inline(always)] -fn sbi_call(which: u32, arg0: u32, arg1: u32, arg2: u32) -> u32 { +fn sbi_call(which: usize, arg0: usize, arg1: usize, arg2: usize) -> usize { let ret; unsafe { asm!("ecall" @@ -13,11 +13,11 @@ fn sbi_call(which: u32, arg0: u32, arg1: u32, arg2: u32) -> u32 { ret } -pub fn console_putchar(ch: u32) { +pub fn console_putchar(ch: usize) { sbi_call(SBI_CONSOLE_PUTCHAR, ch, 0, 0); } -pub fn console_getchar() -> u32 { +pub fn console_getchar() -> usize { sbi_call(SBI_CONSOLE_GETCHAR, 0, 0, 0) } @@ -26,35 +26,38 @@ pub fn shutdown() { } pub fn set_timer(stime_value: u64) { - sbi_call(SBI_SET_TIMER, stime_value as u32, (stime_value >> 32) as u32, 0); + #[cfg(target_pointer_width = "32")] + sbi_call(SBI_SET_TIMER, stime_value as usize, (stime_value >> 32) as usize, 0); + #[cfg(target_pointer_width = "64")] + sbi_call(SBI_SET_TIMER, stime_value as usize, 0, 0); } pub fn clear_ipi() { sbi_call(SBI_CLEAR_IPI, 0, 0, 0); } -pub fn send_ipi(hart_mask: *const u32) { - sbi_call(SBI_SEND_IPI, hart_mask as u32, 0, 0); +pub fn send_ipi(hart_mask: *const usize) { + sbi_call(SBI_SEND_IPI, hart_mask as usize, 0, 0); } -pub fn remote_fence_i(hart_mask: *const u32) { - sbi_call(SBI_REMOTE_FENCE_I, hart_mask as u32, 0, 0); +pub fn remote_fence_i(hart_mask: *const usize) { + sbi_call(SBI_REMOTE_FENCE_I, hart_mask as usize, 0, 0); } -pub fn remote_sfence_vma(hart_mask: *const u32, _start: u32, _size: u32) { - sbi_call(SBI_REMOTE_SFENCE_VMA, hart_mask as u32, 0, 0); +pub fn remote_sfence_vma(hart_mask: *const usize, _start: usize, _size: usize) { + sbi_call(SBI_REMOTE_SFENCE_VMA, hart_mask as usize, 0, 0); } -pub fn remote_sfence_vma_asid(hart_mask: *const u32, _start: u32, _size: u32, _asid: u32) { - sbi_call(SBI_REMOTE_SFENCE_VMA_ASID, hart_mask as u32, 0, 0); +pub fn remote_sfence_vma_asid(hart_mask: *const usize, _start: usize, _size: usize, _asid: usize) { + sbi_call(SBI_REMOTE_SFENCE_VMA_ASID, hart_mask as usize, 0, 0); } -const SBI_SET_TIMER: u32 = 0; -const SBI_CONSOLE_PUTCHAR: u32 = 1; -const SBI_CONSOLE_GETCHAR: u32 = 2; -const SBI_CLEAR_IPI: u32 = 3; -const SBI_SEND_IPI: u32 = 4; -const SBI_REMOTE_FENCE_I: u32 = 5; -const SBI_REMOTE_SFENCE_VMA: u32 = 6; -const SBI_REMOTE_SFENCE_VMA_ASID: u32 = 7; -const SBI_SHUTDOWN: u32 = 8; +const SBI_SET_TIMER: usize = 0; +const SBI_CONSOLE_PUTCHAR: usize = 1; +const SBI_CONSOLE_GETCHAR: usize = 2; +const SBI_CLEAR_IPI: usize = 3; +const SBI_SEND_IPI: usize = 4; +const SBI_REMOTE_FENCE_I: usize = 5; +const SBI_REMOTE_SFENCE_VMA: usize = 6; +const SBI_REMOTE_SFENCE_VMA_ASID: usize = 7; +const SBI_SHUTDOWN: usize = 8; diff --git a/src/arch/riscv32/serial.rs b/src/arch/riscv32/serial.rs index d09032b..5b0372e 100644 --- a/src/arch/riscv32/serial.rs +++ b/src/arch/riscv32/serial.rs @@ -6,7 +6,7 @@ pub struct SerialPort; impl fmt::Write for SerialPort { fn write_str(&mut self, s: &str) -> fmt::Result { for c in s.bytes() { - sbi::console_putchar(c as u32); + sbi::console_putchar(c as usize); } Ok(()) }