use { crate::{ devices::{pci_inner::DeviceClass, Device, DEVICE_TABLE}, proc::PID, wasm_jumploader::interp, }, alloc::{format, vec::Vec}, pci::PortOps, }; /// Experimental scratchpad for testing. pub fn scratchpad() { let mut dev_list = Vec::new(); let bus_scan; unsafe { bus_scan = pci::scan_bus(&PciIO {}, pci::CSpaceAccessMethod::IO); } for dev in bus_scan { dev_list.push(dev); } let device_table = &mut *DEVICE_TABLE.lock(); for x in dev_list { let device_name = format!("{:?}-{}", DeviceClass::from_u8(x.id.class), x.id.device_id); device_table .devices .insert(device_name.clone(), Device::Pci(x)); } /* for (key, _value) in device_table.devices.iter() { debug!("{}", key); } */ // interp(); rhai_shell(); } pub struct PciIO {} impl PortOps for PciIO { unsafe fn read8(&self, port: u16) -> u8 { cpuio::inb(port as u16) } unsafe fn read16(&self, port: u16) -> u16 { cpuio::inw(port as u16) } unsafe fn read32(&self, port: u16) -> u32 { cpuio::inl(port as u16) } unsafe fn write8(&self, port: u16, val: u8) { cpuio::outb(val, port as u16); } unsafe fn write16(&self, port: u16, val: u16) { cpuio::outw(val, port as u16); } unsafe fn write32(&self, port: u16, val: u32) { cpuio::outl(val, port as u16); } } /* /// An experimental process message format pub struct ProcessMessage { pub to_pid: PID, pub from_pid: PID, pub message: [u8; 2048], pub sender_time: SecondsTime, } // // use libwasm::syscalls::time_calls::SecondsTime; impl ProcessMessage { pub fn new(to_pid: PID, from_pid: PID, message: [u8; 2048]) -> Self { ProcessMessage { to_pid, from_pid, message, sender_time: SecondsTime { seconds: 0, milliseconds: 0, }, } } } */ pub fn rhai_shell() { 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); 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::(&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> = spin::Mutex::new( Vec::new()) ; ); use alloc::string::{String, ToString}; 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); enable(); println!("OS: AbleOS"); println!("Host: {}", kstate.hostname); println!("Kernel: AKern-{}-v{}", RELEASE_TYPE, KERNEL_VERSION); println!("Uptime: {}", tick_time); drop(kstate); } pub fn set_hostname(name: String) { let mut kstate = KERNEL_STATE.lock(); kstate.hostname = name; }