From 63fe64ec0fa4fcbae8c47bf6341baa5f70e66859 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Thu, 10 Dec 2020 17:20:13 +0800 Subject: [PATCH] Update rustsbi-k210 to enable lagacy console_putchar. Adjust alignment of links apps. Run matrix on K210! --- bootloader/rustsbi-k210.bin | Bin 73536 -> 73796 bytes os/build.rs | 1 + os/src/main.rs | 1 + user/src/bin/00power_3.rs | 29 --------------- user/src/bin/01power_5.rs | 29 --------------- user/src/bin/02power_7.rs | 29 --------------- user/src/bin/03sleep.rs | 18 ---------- user/src/bin/matrix.rs | 68 ++++++++++++++++++++++++++++++++++++ user/src/lib.rs | 21 +++++++++-- 9 files changed, 88 insertions(+), 108 deletions(-) delete mode 100644 user/src/bin/00power_3.rs delete mode 100644 user/src/bin/01power_5.rs delete mode 100644 user/src/bin/02power_7.rs delete mode 100644 user/src/bin/03sleep.rs create mode 100644 user/src/bin/matrix.rs diff --git a/bootloader/rustsbi-k210.bin b/bootloader/rustsbi-k210.bin index 5a9fa7d1a253dcc2396c86a01af7e8cc407c8268..7e07391dbef25fd5989bdba1b52fdfe3ffabcef3 100755 GIT binary patch delta 26631 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 delta 26382 zcmb`v349bq_Bh_tVJ0)-%6$Q$a}8k#LlPhm&LJ{UE=62fZ##(-j`iRg#8sGvbwcn2 z3LJD-?F19!d^HQi0P8s*i7V^vf;SFq5+Vi+8V)7M?^V6(=_JVa_<#QM`9OEod-aa0 zSFc{Zs?LExpTJvv%rOQ-efpTF*_+H$J(3_CSLBPfR*RbFN;+y$*QyDb1|i1iI^}~W z@m62(fPIEvmt}y>DftFH?ZFna6F%?B2~Tgv*H* z)yMb+j`}ZB%u{Yp>BH56Mg62IDp`KAG5OvnRr|Mzu3LLjZ_53EB-SU z)$aDGtTfp6lSMU0V@XN!p9TS21rVrc`2hEaZfqkzqT|TVg8*}BTj_xRB)qo>9$@EM zcCQPo6+cw&pa=nnMa_!FcNyOCO>w1XRYs@Vc1A;ugW?5`Xm9f87Imp>kkKgl0*u8T z|MwQPU-Gps-Zld;8S}vF@W%Q3krZ8Mhc|(-UI}lEc;K9d82pg58xlQ20#q>h zf-oA0qRmlc@TpNADjb#~H#26#R?WW3juQNS-XFO7JglkOXcWu9L zobbx{gKpayyVvhVtN?U;ttXn3GSPuXX_YeVO_jB`K&UQwzg8zK(cS{fwKsKz_NLsY zy~z|WhxNk`p*Pw$&|w}hfj4b1%m(KpZZw>h8Z?>An|v_zq`YQcMY6HTa5a)}+-XrO zl6^}kIe8wK2bdRF_HzHv>EprJoYdGFb5SYBc-u)kjM!qA|A&LFx*w5l^$q42OVO6T zMoQ5GWTacbo??)sV-CoL7P}PLH_fb#(b>y?gihnQ%1lig`MUH;m6Amb8@o1jt+O=Y11r-2(|J05t<%;*Qu@Suyo=MvRHnr_L4&lhsvw|F z4U1@P6st|D#kw;K^*XTTSRkJTthwIKRMa~#%yzV{%c4fOfTFe4ojz%&6_s)=s_3(2 zu(4>@`J(%If6lOY)QUd5Lnkp~=|haF5y8@2U~x@)#?EViO;)!Ze>a_^an*x�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 LWs6o8uW ! { mm::init(); mm::remap_test(); task::add_initproc(); + println!("after initproc!"); trap::init(); trap::enable_timer_interrupt(); timer::set_next_trigger(); diff --git a/user/src/bin/00power_3.rs b/user/src/bin/00power_3.rs deleted file mode 100644 index 532829d..0000000 --- a/user/src/bin/00power_3.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![no_std] -#![no_main] - -#[macro_use] -extern crate user_lib; - -const LEN: usize = 100; - -static mut S: [u64; LEN] = [0u64; LEN]; - -#[no_mangle] -unsafe fn main() -> i32 { - let p = 3u64; - let m = 998244353u64; - let iter: usize = 300000; - let mut cur = 0usize; - S[cur] = 1; - for i in 1..=iter { - let next = if cur + 1 == LEN { 0 } else { cur + 1 }; - S[next] = S[cur] * p % m; - cur = next; - if i % 10000 == 0 { - println!("power_3 [{}/{}]", i, iter); - } - } - println!("{}^{} = {}(mod {})", p, iter, S[cur], m); - println!("Test power_3 OK!"); - 0 -} \ No newline at end of file diff --git a/user/src/bin/01power_5.rs b/user/src/bin/01power_5.rs deleted file mode 100644 index f23e3b8..0000000 --- a/user/src/bin/01power_5.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![no_std] -#![no_main] - -#[macro_use] -extern crate user_lib; - -const LEN: usize = 100; - -static mut S: [u64; LEN] = [0u64; LEN]; - -#[no_mangle] -unsafe fn main() -> i32 { - let p = 5u64; - let m = 998244353u64; - let iter: usize = 210000; - let mut cur = 0usize; - S[cur] = 1; - for i in 1..=iter { - let next = if cur + 1 == LEN { 0 } else { cur + 1 }; - S[next] = S[cur] * p % m; - cur = next; - if i % 10000 == 0 { - println!("power_5 [{}/{}]", i, iter); - } - } - println!("{}^{} = {}(mod {})", p, iter, S[cur], m); - println!("Test power_5 OK!"); - 0 -} diff --git a/user/src/bin/02power_7.rs b/user/src/bin/02power_7.rs deleted file mode 100644 index 35bada1..0000000 --- a/user/src/bin/02power_7.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![no_std] -#![no_main] - -#[macro_use] -extern crate user_lib; - -const LEN: usize = 100; - -static mut S: [u64; LEN] = [0u64; LEN]; - -#[no_mangle] -unsafe fn main() -> i32 { - let p = 7u64; - let m = 998244353u64; - let iter: usize = 240000; - let mut cur = 0usize; - S[cur] = 1; - for i in 1..=iter { - let next = if cur + 1 == LEN { 0 } else { cur + 1 }; - S[next] = S[cur] * p % m; - cur = next; - if i % 10000 == 0 { - println!("power_7 [{}/{}]", i, iter); - } - } - println!("{}^{} = {}(mod {})", p, iter, S[cur], m); - println!("Test power_7 OK!"); - 0 -} diff --git a/user/src/bin/03sleep.rs b/user/src/bin/03sleep.rs deleted file mode 100644 index d500f5a..0000000 --- a/user/src/bin/03sleep.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![no_std] -#![no_main] - -#[macro_use] -extern crate user_lib; - -use user_lib::{get_time, yield_}; - -#[no_mangle] -fn main() -> i32 { - let current_timer = get_time(); - let wait_for = current_timer + 10000000; - while get_time() < wait_for { - yield_(); - } - println!("Test sleep OK!"); - 0 -} \ No newline at end of file diff --git a/user/src/bin/matrix.rs b/user/src/bin/matrix.rs new file mode 100644 index 0000000..729625e --- /dev/null +++ b/user/src/bin/matrix.rs @@ -0,0 +1,68 @@ +#![no_std] +#![no_main] + +#[macro_use] +extern crate user_lib; + +use user_lib::{fork, wait, yield_, exit, getpid, get_time, wait_once}; + +static NUM: usize = 13; +const N: usize = 10; +static P: i32 = 10007; +type Arr = [[i32; N]; N]; + +fn work(times: isize) { + let mut a: Arr = Default::default(); + let mut b: Arr = Default::default(); + let mut c: Arr = Default::default(); + for i in 0..N { + for j in 0..N { + a[i][j] = 1; + b[i][j] = 1; + } + } + yield_(); + println!("pid {} is running ({} times)!.", getpid(), times); + for _ in 0..times { + for i in 0..N { + for j in 0..N { + c[i][j] = 0; + for k in 0..N { + c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % P; + } + } + } + for i in 0..N { + for j in 0..N { + a[i][j] = c[i][j]; + b[i][j] = c[i][j]; + } + } + } + println!("pid {} done!.", getpid()); + exit(0); +} + +#[no_mangle] +pub fn main() -> i32 { + for _ in 0..NUM { + let pid = fork(); + if pid == 0 { + let current_time = get_time(); + let times = (current_time as i32 as isize) * (current_time as i32 as isize) % 1000; + work(times * 40); + } + } + + println!("fork ok."); + + let mut xstate: i32 = 0; + for _ in 0..NUM { + if wait(&mut xstate) < 0 { + panic!("wait failed."); + } + } + assert!(wait_once(&mut xstate) < 0); + println!("matrix passed."); + 0 +} \ No newline at end of file diff --git a/user/src/lib.rs b/user/src/lib.rs index 995bb36..8f3c77d 100644 --- a/user/src/lib.rs +++ b/user/src/lib.rs @@ -48,7 +48,22 @@ pub fn get_time() -> isize { sys_get_time() } pub fn getpid() -> isize { sys_getpid() } pub fn fork() -> isize { sys_fork() } pub fn exec(path: &str) -> isize { sys_exec(path) } -pub fn wait(xstate: &mut i32) -> isize { sys_waitpid(-1, xstate as *mut _) } -pub fn waitpid(pid: usize, xstate: &mut i32) -> isize { - sys_waitpid(pid as isize, xstate as *mut _) +pub fn wait(exit_code: &mut i32) -> isize { + loop { + match sys_waitpid(-1, exit_code as *mut _) { + -1 => { yield_(); } + exit_pid => return exit_pid, + } + } +} +pub fn wait_once(exit_code: &mut i32) -> isize { + sys_waitpid(-1, exit_code as *mut _) +} +pub fn waitpid(pid: usize, exit_code: &mut i32) -> isize { + loop { + match sys_waitpid(pid as isize, exit_code as *mut _) { + -1 => { yield_(); } + exit_pid => return exit_pid, + } + } } \ No newline at end of file