From 0c12d43b61c36f9dc54842581d2d2bbead7b5a20 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Tue, 8 Dec 2020 10:43:24 +0800 Subject: [PATCH] Get app data by name. --- os/build.rs | 7 +++++++ os/src/loader.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/os/build.rs b/os/build.rs index 792fe3c4..389587aa 100644 --- a/os/build.rs +++ b/os/build.rs @@ -34,6 +34,13 @@ _num_app: } writeln!(f, r#" .quad app_{}_end"#, apps.len() - 1)?; + writeln!(f, r#" + .global _app_names +_app_names:"#)?; + for app in apps.iter() { + writeln!(f, r#" .string "{}\n""#, app)?; + } + for (idx, app) in apps.iter().enumerate() { println!("app_{}: {}", idx, app); writeln!(f, r#" diff --git a/os/src/loader.rs b/os/src/loader.rs index 6d284743..1a23b979 100644 --- a/os/src/loader.rs +++ b/os/src/loader.rs @@ -1,3 +1,5 @@ +use alloc::vec::Vec; + pub fn get_num_app() -> usize { extern "C" { fn _num_app(); } unsafe { (_num_app as usize as *const usize).read_volatile() } @@ -18,3 +20,33 @@ pub fn get_app_data(app_id: usize) -> &'static [u8] { ) } } + +#[allow(unused)] +pub fn get_app_data_by_name(name: &str) -> Option<&'static [u8]> { + let num_app = get_num_app(); + let app_names = app_names(); + (0..num_app) + .find(|&i| app_names[i] == name) + .map(|i| get_app_data(i)) +} + +#[allow(unused)] +fn app_names() -> Vec<&'static str> { + let num_app = get_num_app(); + extern "C" { fn _app_names(); } + let mut start = _app_names as usize as *const u8; + let mut v = Vec::new(); + unsafe { + for _ in 0..num_app { + let mut end = start; + while end.read_volatile() != '\n' as u8 { + end = end.add(1); + } + let slice = core::slice::from_raw_parts(start, end as usize - start as usize); + let str = core::str::from_utf8(slice).unwrap(); + v.push(str); + start = end.add(1); + } + } + v +}