workspace

master
Able 2022-04-11 13:53:33 -05:00
parent 8e3e7346ec
commit 19dc431237
Signed by untrusted user: able
GPG Key ID: D164AF5F5700BE51
19 changed files with 1143 additions and 201 deletions

2
.gitignore vendored
View File

@ -7,4 +7,6 @@ qprofiler
userland/*/target
kernel/target
userland/root_fs/mnt/*
target/
!*/.gitkeep

1065
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

10
Cargo.toml Normal file
View File

@ -0,0 +1,10 @@
[workspace]
members = [
"ableos",
"kernel",
"facepalm",
"shadeable",
"repbuild",
]

24
ableos/Cargo.lock generated
View File

@ -117,7 +117,7 @@ dependencies = [
"hashbrown 0.7.2",
"log",
"logos",
"versioning 0.1.2 (git+https://git.ablecorp.us/able/aos_userland)",
"versioning",
]
[[package]]
@ -308,7 +308,7 @@ version = "0.1.2"
dependencies = [
"lazy_static",
"log",
"versioning 0.1.2 (git+https://git.ablecorp.us/able/versioning)",
"versioning",
]
[[package]]
@ -571,11 +571,12 @@ checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "rhai"
version = "1.5.0"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49c94fda0280985896ed6d8bf0b43bbb5a7f0e39ccc8728ac907ddb4f06dae94"
checksum = "8ef3d57e55ca044c53ced279d2d3ee9df229b247556b005a23713d5206a2ecfc"
dependencies = [
"ahash 0.7.6",
"bitflags",
"core-error",
"instant",
"libm",
@ -588,9 +589,9 @@ dependencies = [
[[package]]
name = "rhai_codegen"
version = "1.3.0"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e02d33d76a7aa8ec72ac8298d5b52134fd2dff77445ada0c65f6f8c40d8f2931"
checksum = "faa0ff1c9dc19c9f8bba510a2a75d3f0449f6233570c2672c7e31c692a11a59a"
dependencies = [
"proc-macro2",
"quote",
@ -705,11 +706,13 @@ checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
[[package]]
name = "smartstring"
version = "0.2.10"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e714dff2b33f2321fdcd475b71cec79781a692d846f37f415fb395a1d2bcd48e"
checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29"
dependencies = [
"autocfg",
"static_assertions",
"version_check",
]
[[package]]
@ -819,11 +822,6 @@ dependencies = [
"serde",
]
[[package]]
name = "versioning"
version = "0.1.2"
source = "git+https://git.ablecorp.us/able/versioning#b86e53ab8461ee4f28807bf2254d543f6d8f4727"
[[package]]
name = "vga"
version = "0.2.7"

View File

@ -50,10 +50,10 @@ spin = "0.5.2"
log = "*"
pretty-hex = "0.2.1"
unicode-width = "0.1.7"
picorand = "*"
picorand = "0.1.0"
watson = "0.4"
genfs = "0.1.0"
rhai = "1.5"
rhai = "1.6.0"
libwasm = {git="https://git.ablecorp.us:443/able/libwasm.git"}
acpi = "4.1.0"

View File

@ -56,15 +56,19 @@ lazy_static! {
idt
};
}
extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) {
println!("EXCEPTION: BREAKPOINT\n{:#?}", stack_frame);
}
// new
extern "x86-interrupt" fn double_fault_handler(
stack_frame: InterruptStackFrame,
_error_code: u64,
error_code: u64,
) -> ! {
panic!("EXCEPTION: DOUBLE FAULT\n{:#?}", stack_frame);
panic!(
"EXCEPTION: Error code{}\nDOUBLE FAULT\n{:#?}",
error_code, stack_frame
);
}
extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFrame) {
kernel::tick();

View File

@ -51,7 +51,7 @@ pub fn cpu_socket_startup() {
}
pub fn log_version_data() {
info!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
info!("{} v{:?}", RELEASE_TYPE, KERNEL_VERSION);
info!(
"Brand String: {}",
master().unwrap().brand_string().unwrap()

View File

@ -58,7 +58,6 @@ pub mod kernel_state;
pub mod keyboard;
pub mod kmain;
pub mod logger;
pub mod proto_filetable;
pub mod relib;
pub mod scheduler;
mod unicode_utils;
@ -79,7 +78,6 @@ pub use graphics::*;
pub use kernel_state::*;
pub use keyboard::*;
pub use logger::*;
pub use proto_filetable::*;
pub use relib::*;
// pub use scheduler::*;
pub use utils::*;

View File

@ -46,6 +46,5 @@ macro_rules! print {
macro_rules! println {
($($tt:tt)*) => {
::core::writeln!($crate::print::Stdout, $($tt)*)
// panic![];
};
}

View File

@ -1,5 +0,0 @@
use crate::ProtoFileTable;
lazy_static::lazy_static!(
pub static ref FILE_TABLE: spin::Mutex<ProtoFileTable> = spin::Mutex::new(ProtoFileTable::new());
);

View File

@ -1,82 +0,0 @@
use core::fmt;
#[derive(Debug, PartialEq, Clone)]
pub struct PathRep {
pub location: FileLocations,
pub file_name: String,
}
#[derive(Debug)]
pub struct FilePermissions {
pub read: bool,
pub write: bool,
pub execute: bool,
}
#[derive(Debug)]
pub struct FileMetadata {
pub file_type: String,
pub size: usize,
// pub permissions: FilePermissions,
}
#[derive(Debug, Clone, PartialEq)]
pub enum FileLocations {
Bin,
Config,
Home,
}
impl fmt::Display for FileLocations {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
#[derive(Debug)]
pub struct File {
pub location: FileLocations,
pub file_name: String,
pub meta_data: FileMetadata,
pub data_pointer: Vec<u8>,
}
impl File {
/// Write the provided bytes to a file
pub fn write_bytes(&mut self, bytes: &[u8]) {
for byte in bytes {
self.data_pointer.push(*byte);
}
self.meta_data.size = self.data_pointer.len();
}
pub fn new(location: FileLocations, file_name: String, file_type: String) -> Self {
let bytes: Vec<u8> = vec![];
let abc123 = bytes;
Self {
location,
file_name,
meta_data: FileMetadata { file_type, size: 0 },
data_pointer: abc123,
}
}
pub fn size(&self) -> usize {
self.meta_data.size.clone()
}
pub fn read_to_string(&mut self, _string: &mut String) {
todo!();
}
pub fn read_and_return(&mut self) -> String {
String::from_utf8(self.data_pointer.clone()).expect("Found invalid UTF-8")
}
}
impl fmt::Display for File {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}://{}", self.location, self.file_name)
}
}

View File

@ -1,56 +0,0 @@
//! A file table module for AbleOS
//!
//! This module provides a file table interface for AbleOS.
//!
//! # Examples
//! ```
//! use relib::filesystem::ProtoFileTable;
//! let mut file_table = ProtoFileTable::new();
//! file_table.add_file("test.txt", "Hello, world!".as_bytes());
//! let file = file_table.get_file("test.txt");
//! assert_eq!(file.unwrap().as_slice(), "Hello, world!".as_bytes());
//! ```
//! # Notes
//! The file table is a simple in-memory hashmap.
//! The file table is not thread safe.
//! The file table is not persistent.
use hashbrown::HashMap;
pub mod contain;
pub mod file;
use file::File;
/// A prototype file table for AbleOS
///
/// This module provides a file table interface for AbleOS.
///
/// # Examples
/// ```
/// use crate::filesystem::ProtoFileTable;
/// let mut file_table = ProtoFileTable::new();
/// file_table.add_file("test.txt", "Hello, world!".as_bytes());
/// let file = file_table.get_file("test.txt");
/// assert_eq!(file.unwrap().as_slice(), "Hello, world!".as_bytes());
/// ```
pub struct ProtoFileTable {
files: HashMap<String, File>,
}
impl ProtoFileTable {
pub fn new() -> ProtoFileTable {
ProtoFileTable {
files: HashMap::new(),
}
}
pub fn add_file(&mut self, path: &str, contents: File) {
self.files.insert(path.to_string(), contents);
}
pub fn get_file(&self, path: &str) -> Option<&File> {
self.files.get(path)
}
}
#[cfg(test)]
mod tests;

View File

@ -1,16 +0,0 @@
use super::file::FileLocations;
use super::*;
// #[test]
fn test_add_file() {
let mut file_table = ProtoFileTable::new();
let file_to_add = File::new(FileLocations::Bin, "test".to_string(), "txt".to_string());
file_to_add.write_bytes(b"Hello, world!");
file_table.add_file("test", file_to_add);
let file = file_table.get_file("test.txt");
assert_eq!(
file.unwrap().data_pointer.as_slice(),
"Hello, world!".as_bytes()
);
}

View File

@ -43,6 +43,5 @@ macro_rules! serial_print {
macro_rules! serial_println {
($($tt:tt)*) => {
::core::writeln!($crate::serial_print::Serialout, $($tt)*)
// panic![];
};
}

View File

@ -14,6 +14,8 @@ const GET_RANDOM_INDEX: usize = 3;
const GET_INPUT_INDEX: usize = 4;
const PRINT_CLEVER_HACK: usize = 5;
impl Externals for HostExternals {
fn invoke_index(
&mut self,
@ -25,21 +27,21 @@ impl Externals for HostExternals {
let a: u32 = args.nth_checked(0)?;
let b: u32 = args.nth_checked(1)?;
let result = a + b;
println!("SYSCALL: {} + {} = {}", a, b, result);
trace!("SYSCALL: {} + {} = {}", a, b, result);
Ok(Some(RuntimeValue::I32(result as i32)))
}
SEND_SIGNAL_INDEX => {
let pid: u32 = args.nth_checked(0)?;
let signal: u32 = args.nth_checked(1)?;
println!("SYSCALL: send signal {} to pid {}", signal, pid);
trace!("SYSCALL: send signal {} to pid {}", signal, pid);
let ret = RuntimeValue::I32(0);
Ok(Some(ret))
}
GET_TIME_INDEX => {
use core::sync::atomic::Ordering::*;
println!("SYSCALL: get time");
trace!("SYSCALL: get time");
x86_64::instructions::interrupts::disable();
let tick_time = kernel::TICK.load(Relaxed);
x86_64::instructions::interrupts::enable();
@ -48,7 +50,7 @@ impl Externals for HostExternals {
Ok(Some(ret))
}
GET_RANDOM_INDEX => {
println!("SYSCALL: get random");
trace!("SYSCALL: get random");
let rand = generate_process_pass();
let ret = RuntimeValue::I32(rand as i32);
@ -58,11 +60,10 @@ impl Externals for HostExternals {
}
GET_INPUT_INDEX => {
// println!("SYSCALL: get input");
let input =
x86_64::instructions::interrupts::without_interrupts(|| KEYBUFF.lock().pop());
if let Some(chr) = input {
println!("SYSCALL: input: {}", chr);
trace!("SYSCALL: input: {}", chr);
}
let ret = RuntimeValue::I32(input.unwrap_or(0x00 as char) as i32);
@ -70,7 +71,24 @@ impl Externals for HostExternals {
Ok(Some(ret))
}
_ => panic!("Unimplemented function at {}", index),
PRINT_CLEVER_HACK => {
// println!("SYSCALL: print clever hack");
let combinated = args.nth_checked::<u64>(0).unwrap().to_le_bytes();
for x in combinated.iter() {
let chr = *x as char;
print!("{}", chr);
}
println!("\n");
Ok(None)
}
_ => {
error!("Unimplemented function at {}", index);
Err(Trap::new(wasmi::TrapKind::Unreachable))
}
}
}
}
@ -129,7 +147,6 @@ impl HostExternals {
}
return true;
}
GET_RANDOM_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[], Some(ValueType::I32));
@ -162,6 +179,22 @@ impl HostExternals {
}
return true;
}
PRINT_CLEVER_HACK => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) = (&[ValueType::I64], None);
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
return true;
}
_ => false,
}
}
@ -175,6 +208,7 @@ impl ModuleImportResolver for HostExternals {
"get_time" => GET_TIME_INDEX,
"get_random" => GET_RANDOM_INDEX,
"get_input" => GET_INPUT_INDEX,
"print_clever_hack" => PRINT_CLEVER_HACK,
_ => {
return Err(Error::Instantiation(format!(
"Export {} not found",
@ -192,11 +226,6 @@ impl ModuleImportResolver for HostExternals {
trace!("Resolved export {} as func {}", field_name, index);
Ok(FuncInstance::alloc_host(signature.clone(), index))
/*Ok(FuncInstance::alloc_host(
Signature::new(&[ValueType::I32, ValueType::I32][..], Some(ValueType::I32)),
index,
))*/
}
}
use crate::wasm_jumploader::host_functions::ValueType::I32;

View File

@ -32,12 +32,10 @@ pub fn interp() {
// Instantiate a module with empty imports and
// assert that there is no `start` function.
let instance = ModuleInstance::new(&module, &imports); // .expect("failed to instantiate wasm module")
// .assert_no_start();
match instance {
Ok(inst) => {
let mut instance = inst.assert_no_start();
// trace!("Instantiated wasm module");
let mut is_driver = false;
let mut is_program = false;
@ -54,7 +52,6 @@ pub fn interp() {
has_driver_exit = true;
}
// trace!("Checking for start function");
match instance.export_by_name("start") {
Some(val) => {
trace!("Program start function found");

View File

@ -12,4 +12,4 @@ version = "1.4.0"
default-features = false
[dependencies.versioning]
git = "https://git.ablecorp.us/able/versioning"
git = "https://git.ablecorp.us/able/aos_userland"

View File

@ -2,11 +2,11 @@
use core::panic::PanicInfo;
// #[macro_use]
// use log;
use log::error;
#[panic_handler]
fn panic_handler(_info: &PanicInfo) -> ! {
// error!("{}", _info);
fn panic_handler(info: &PanicInfo) -> ! {
error!("{}", info);
loop {}
}

Binary file not shown.