1
0
Fork 0
forked from AbleOS/ableos
ableos-idl/ableos/src/rhai_shell/mod.rs

97 lines
2.3 KiB
Rust
Raw Normal View History

2022-02-19 08:46:11 -06:00
use alloc::vec::Vec;
pub fn rhai_shell() {
2022-02-19 09:07:33 -06:00
let engine = engine_construction();
2022-02-19 08:46:11 -06:00
let mut scope = rhai::Scope::new();
let mut buf = String::new();
print!("> ");
loop {
match x86_64::instructions::interrupts::without_interrupts(|| KEYBUFF.lock().pop()) {
Some('\n') => {
match engine.eval_with_scope::<rhai::Dynamic>(&mut scope, &buf) {
Ok(o) => println!("{o}"),
Err(e) => println!("Eval error: {e}"),
};
buf.clear();
print!("> ");
}
Some('\u{0008}') => {
buf.pop();
}
Some(chr) => buf.push(chr),
None => (),
}
}
}
lazy_static::lazy_static!(
pub static ref KEYBUFF: spin::Mutex<Vec<char>> = spin::Mutex::new(
Vec::new())
;
);
use alloc::string::{String, ToString};
2022-02-19 09:07:33 -06:00
use rhai::Engine;
2022-02-19 08:46:11 -06:00
use x86_64::instructions::interrupts::{disable, enable};
use crate::{
arch::{shutdown, sloop},
kmain::{tick, TICK},
systeminfo::{KERNEL_VERSION, RELEASE_TYPE},
KERNEL_STATE,
};
pub fn afetch() {
let kstate = KERNEL_STATE.lock();
use core::sync::atomic::Ordering::*;
disable();
let tick_time = TICK.load(Relaxed);
2022-02-23 10:06:27 -06:00
println!(
"OS: AbleOS
Host: {}
Kernel: AKern-{}-v{}
Uptime: {}",
kstate.hostname, RELEASE_TYPE, KERNEL_VERSION, tick_time
);
2022-02-22 18:15:16 -06:00
enable();
2022-02-19 08:46:11 -06:00
drop(kstate);
}
pub fn set_hostname(name: String) {
let mut kstate = KERNEL_STATE.lock();
kstate.hostname = name;
}
2022-02-19 09:07:33 -06:00
fn engine_construction() -> Engine {
let mut engine = rhai::Engine::new();
engine.on_print(|x| println!("{}", x));
engine.on_debug(|x, src, pos| {
let src = src.unwrap_or("unknown");
println!("DEBUG: {} at {:?}: {}", src, pos, x);
debug!("{} at {:?}: {}", src, pos, x);
});
engine.register_fn("afetch", afetch);
engine.register_fn("set_hostname", set_hostname);
engine.register_fn("shutdown", shutdown);
2022-02-23 10:06:27 -06:00
engine.register_fn("peek", peek_memory);
engine.register_fn("poke", poke_memory);
2022-02-19 09:07:33 -06:00
engine
}
2022-02-23 10:06:27 -06:00
/// Examine a memory pointer
pub fn peek_memory(ptr: i64) -> u8 {
let ptr: usize = ptr as usize;
unsafe { *(ptr as *const u8) }
}
pub fn poke_memory(ptr: i64, val: u8) {
let ptr: usize = ptr as usize;
unsafe { *(ptr as *mut u8) = val }
}