From 9e836f8098de440095cd76d96179cf6e75a498c9 Mon Sep 17 00:00:00 2001 From: Able Date: Tue, 19 Apr 2022 02:15:45 -0500 Subject: [PATCH] updates --- ableos/Cargo.toml | 2 +- ableos/src/scratchpad.rs | 74 ++++++++++++++++++------------ ableos/src/stdio.rs | 17 ++++++- ableos/src/wasm_jumploader/mod.rs | 10 +++- userland/root_fs/ext2.img | Bin 4194304 -> 4194304 bytes 5 files changed, 71 insertions(+), 32 deletions(-) diff --git a/ableos/Cargo.toml b/ableos/Cargo.toml index 54805f9..8984597 100644 --- a/ableos/Cargo.toml +++ b/ableos/Cargo.toml @@ -54,7 +54,6 @@ watson = "0.4" genfs = "0.1.0" rhai = "1.6.0" libwasm = {git="https://git.ablecorp.us:443/able/libwasm.git"} -acpi = "4.1.0" axel = { git = "https://git.ablecorp.us/able/aos_userland" } versioning = { git = "https://git.ablecorp.us/able/aos_userland" } @@ -134,3 +133,4 @@ volatile = "0.2.6" x86_64 = "*" pc-beeper = {git = "https://github.com/AbleOS/pc-beeper"} vga = "*" +acpi = "4.1.0" \ No newline at end of file diff --git a/ableos/src/scratchpad.rs b/ableos/src/scratchpad.rs index 698f6b5..aa1dd42 100644 --- a/ableos/src/scratchpad.rs +++ b/ableos/src/scratchpad.rs @@ -1,6 +1,49 @@ -use crate::rhai_shell::shell; -use acpi::AcpiTables; +use core::alloc::Layout; +use crate::rhai_shell::shell; +use acpi::{AcpiTables, PlatformInfo}; + +/// Experimental scratchpad for testing. +pub fn scratchpad() { + let axel_raw = "kernel{ + vals= + time: 123 + fn| + print: (None) -> (None); + foo: (None) -> (Num); +}"; + let axel = axel::parse(axel_raw.to_string()); + for node in axel { + info!("{:?}", node); + } + // acpi(); + shell(); +} + +pub fn pci_fun() {} + +pub fn acpi() { + let acpi_handler = AcpiStruct {}; + let _table; + unsafe { + _table = AcpiTables::search_for_rsdp_bios(acpi_handler); + } + match _table.unwrap().platform_info().unwrap() { + PlatformInfo { + power_profile, + interrupt_model, + processor_info, + pm_timer, + } => { + info!("{:?}", power_profile); + info!("{:?}", interrupt_model); + // info!("{:?}", processor_info.unwrap()); + // info!("{:?}", pm_timer.unwrap()); + } + + _ => todo!(), + } +} // TODO: move to a better place #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct AcpiStruct {} @@ -18,30 +61,3 @@ impl acpi::AcpiHandler for AcpiStruct { todo!("unmap_physical_region"); } } - -/// Experimental scratchpad for testing. -pub fn scratchpad() { - let axel_raw = "kernel{ - vals= - time: 123 - fn| - print: (None) -> (None); - foo: (None) -> (Num); -}"; - let axel = axel::parse(axel_raw.to_string()); - for node in axel { - info!("{:?}", node); - } - - shell(); -} - -pub fn pci_fun() {} - -pub fn acpi() { - let acpi_handler = AcpiStruct {}; - let _table; - unsafe { - _table = AcpiTables::search_for_rsdp_bios(acpi_handler); - } -} diff --git a/ableos/src/stdio.rs b/ableos/src/stdio.rs index 7d243c2..f69a2e3 100644 --- a/ableos/src/stdio.rs +++ b/ableos/src/stdio.rs @@ -39,6 +39,21 @@ impl StdIO { } pub fn read(&mut self) { - todo!(); + use crate::devices::DEVICE_TABLE; + let mut dt = DEVICE_TABLE.lock(); + let key_device = dt.devices.get_mut(&self.device).unwrap(); + + match key_device { + Character(dev) => { + let mut buf = String::new(); + dev.read_char().map(|c| buf.push(c)); + println!("{}", buf); + } + Vterm(vterm) => { + let mut buf = String::new(); + vterm.read_char().map(|c| buf.push(c)); + println!("{}", buf); + } + } } } diff --git a/ableos/src/wasm_jumploader/mod.rs b/ableos/src/wasm_jumploader/mod.rs index 12d740f..50b1fd8 100644 --- a/ableos/src/wasm_jumploader/mod.rs +++ b/ableos/src/wasm_jumploader/mod.rs @@ -10,7 +10,7 @@ pub fn interp() { trace!("Got filesystem"); let file = fs .open( - b"/home/able/bins/aos_wasm_stress_test.wasm", + b"/home/able/bins/aos_test.wasm", OpenOptions::new().read(true), ) .unwrap(); @@ -54,6 +54,14 @@ pub fn interp() { None => debug!("No start function found"), } + match instance.export_by_name("main") { + Some(_val) => { + trace!("Program main function found"); + has_start = true; + } + None => debug!("No main function found"), + } + match (has_driver_entry, has_driver_exit) { (true, true) => { trace!("Valid driver entry and exit functions found"); diff --git a/userland/root_fs/ext2.img b/userland/root_fs/ext2.img index 385e50c8daff6ed696a8f86d6be559e87411d5c7..87b45adae6ef7d2b35d9a90a50d7bc7499e0a49e 100644 GIT binary patch delta 39032 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 K_YFFI>VE*b!APe7