This commit is contained in:
Able 2023-04-07 16:44:33 -05:00
parent 20e3ce15be
commit 530a8a9d60
15 changed files with 17531 additions and 39 deletions

30
Cargo.lock generated
View file

@ -125,7 +125,7 @@ dependencies = [
[[package]] [[package]]
name = "clparse" name = "clparse"
version = "0.1.0" version = "0.1.0"
source = "git+https://git.ablecorp.us/ableos/ableos_userland#389c85d6a4ed06dce5aa044257e881d1547edfdb" source = "git+https://git.ablecorp.us/ableos/ableos_userland#8fa6c705f23ae310e3c4395a61823449ed5a1d02"
dependencies = [ dependencies = [
"hashbrown 0.13.2", "hashbrown 0.13.2",
"log", "log",
@ -420,8 +420,10 @@ dependencies = [
"crossbeam-queue", "crossbeam-queue",
"derive_more", "derive_more",
"error-stack 0.3.1", "error-stack 0.3.1",
"hashbrown 0.13.2",
"limine", "limine",
"log", "log",
"rdrand",
"sbi", "sbi",
"slab", "slab",
"spin", "spin",
@ -430,6 +432,7 @@ dependencies = [
"wasmi", "wasmi",
"x2apic", "x2apic",
"x86_64", "x86_64",
"xml",
] ]
[[package]] [[package]]
@ -547,6 +550,12 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
[[package]] [[package]]
name = "raw-cpuid" name = "raw-cpuid"
version = "10.7.0" version = "10.7.0"
@ -556,6 +565,15 @@ dependencies = [
"bitflags", "bitflags",
] ]
[[package]]
name = "rdrand"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e233b642160555c1aa1ff7a78443c6139342f411b6fa6602af2ebbfee9e166bb"
dependencies = [
"rand_core",
]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.7.3" version = "1.7.3"
@ -773,7 +791,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]] [[package]]
name = "versioning" name = "versioning"
version = "0.1.3" version = "0.1.3"
source = "git+https://git.ablecorp.us/ableos/ableos_userland#389c85d6a4ed06dce5aa044257e881d1547edfdb" source = "git+https://git.ablecorp.us/ableos/ableos_userland#8fa6c705f23ae310e3c4395a61823449ed5a1d02"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -1086,3 +1104,11 @@ dependencies = [
"rustversion", "rustversion",
"volatile", "volatile",
] ]
[[package]]
name = "xml"
version = "0.1.0"
source = "git+https://git.ablecorp.us/ableos/ableos_userland#8fa6c705f23ae310e3c4395a61823449ed5a1d02"
dependencies = [
"serde",
]

View file

@ -1,2 +1,5 @@
resolver = "2"
[workspace] [workspace]
members = ["kernel", "repbuild"] members = ["kernel", "repbuild"]

View file

@ -10,12 +10,12 @@ log = "0.4"
spin = "0.9" spin = "0.9"
uart_16550 = "0.2" uart_16550 = "0.2"
slab = { version = "0.4", default-features = false } slab = { version = "0.4", default-features = false }
# xml = { git = "https://git.ablecorp.us/ableos/ableos_userland" } xml = { git = "https://git.ablecorp.us/ableos/ableos_userland" }
clparse = { git = "https://git.ablecorp.us/ableos/ableos_userland", default-features = false } clparse = { git = "https://git.ablecorp.us/ableos/ableos_userland", default-features = false }
versioning = { git = "https://git.ablecorp.us/ableos/ableos_userland" } versioning = { git = "https://git.ablecorp.us/ableos/ableos_userland" }
wasmi = { version = "0.29.0", default-features = false } wasmi = { version = "0.29.0", default-features = false }
hashbrown = "*"
[dependencies.crossbeam-queue] [dependencies.crossbeam-queue]
version = "0.3" version = "0.3"
@ -43,6 +43,9 @@ features = [
limine = { version = "0.1", git = "https://github.com/limine-bootloader/limine-rs" } limine = { version = "0.1", git = "https://github.com/limine-bootloader/limine-rs" }
x86_64 = "0.14" x86_64 = "0.14"
x2apic = "0.4" x2apic = "0.4"
# rdrand = "*"
rdrand = { version = "0.8", default-features = false }
[target.'cfg(target_arch = "riscv64")'.dependencies] [target.'cfg(target_arch = "riscv64")'.dependencies]
sbi = "0.2.0" sbi = "0.2.0"

36
kernel/data/test.wat Normal file
View file

@ -0,0 +1,36 @@
(module
(data "mouse")
(data "x")
(data "y")
(func $rma (import "host" "read_mem_addr")(param i32)(result i32))
(func $co (import "host" "create_object")(param i32 i32)(result i64))
(func $roa (import "host" "read_object_attribute")(param i64 i32 i32)(result i32 i32))
(memory (export "memory") 1)
(func
(export "start")(result i32)
;; Copy into memory the object name
(memory.init 0
(i32.const 0) ;; target offset
(i32.const 0) ;; source offset
(i32.const 5))
(memory.init 1
(i32.const 6) ;; target offset
(i32.const 0) ;; source offset
(i32.const 1))
(memory.init 2
(i32.const 7) ;; target offset
(i32.const 0) ;; source offset
(i32.const 1))
i32.const 0
i32.const 5
call $co
i32.const 6
i32.const 1
call $roa
)
)

View file

@ -2,6 +2,8 @@ use spin::{Lazy, Mutex};
use x2apic::lapic::{LocalApic, LocalApicBuilder}; use x2apic::lapic::{LocalApic, LocalApicBuilder};
use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame, PageFaultErrorCode}; use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame, PageFaultErrorCode};
use crate::interp::wasm;
pub unsafe fn init() { pub unsafe fn init() {
log::info!("Initialising IDT"); log::info!("Initialising IDT");
IDT.load(); IDT.load();
@ -16,7 +18,7 @@ enum Interrupt {
Spurious = u8::MAX, Spurious = u8::MAX,
} }
static LAPIC: Lazy<Mutex<LocalApic>> = Lazy::new(|| { pub(crate) static LAPIC: Lazy<Mutex<LocalApic>> = Lazy::new(|| {
let mut lapic = LocalApicBuilder::new() let mut lapic = LocalApicBuilder::new()
.timer_vector(Interrupt::Timer as usize) .timer_vector(Interrupt::Timer as usize)
.error_vector(Interrupt::ApicErr as usize) .error_vector(Interrupt::ApicErr as usize)
@ -54,7 +56,7 @@ extern "x86-interrupt" fn page_fault(
panic!("Page fault ({error_code:?}): {stack_frame:?}") panic!("Page fault ({error_code:?}): {stack_frame:?}")
} }
extern "x86-interrupt" fn timer(_: InterruptStackFrame) { extern "x86-interrupt" fn timer(isf: InterruptStackFrame) {
unsafe { LAPIC.lock().end_of_interrupt() }; unsafe { LAPIC.lock().end_of_interrupt() };
} }

View file

@ -1,7 +1,7 @@
pub mod memory; pub mod memory;
mod gdt; mod gdt;
mod interrupts; pub(crate) mod interrupts;
mod logging; mod logging;
pub use logging::log; pub use logging::log;
@ -82,3 +82,13 @@ pub fn sloop() -> ! {
x86_64::instructions::hlt(); x86_64::instructions::hlt();
} }
} }
pub fn hardware_random_u64() -> u64 {
use log::trace;
use rdrand::RdRand;
let gen = RdRand::new().unwrap();
let ret = gen.try_next_u64().unwrap();
trace!("Random {}", ret);
ret
}

46
kernel/src/handle.rs Normal file
View file

@ -0,0 +1,46 @@
use core::fmt::{self, Formatter};
use crate::arch::hardware_random_u64;
#[derive(Debug, Eq, Hash, PartialEq)]
pub struct Handle {
pub handle_data: i64,
perms: Permissions,
}
impl Handle {
pub fn new() -> Handle {
Handle {
handle_data: hardware_random_u64() as i64,
perms: Permissions::new(),
}
}
}
impl fmt::Display for Handle {
fn fmt(&self, w: &mut Formatter<'_>) -> Result<(), core::fmt::Error> {
write!(w, "{}", self.handle_data);
Ok(())
}
}
impl Into<i64> for Handle {
fn into(self) -> i64 {
self.handle_data
// (abc[0..3] as i64, abc[4..8] as i64)
}
}
#[derive(PartialEq, Hash, Eq, Debug)]
pub struct Permissions {
edit_children: bool,
edit_attributes: bool,
}
impl Permissions {
pub fn new() -> Self {
Self {
edit_children: true,
edit_attributes: true,
}
}
}

View file

@ -1,46 +1,139 @@
use alloc::vec::Vec; use alloc::{string::String, vec::Vec};
use core::fmt::Debug;
use core::fmt::Display;
use log::trace; use log::trace;
use wasmi::{Caller, Func, Linker, Module, Store}; use wasmi::{Caller, Func, Linker, Module, Store};
use xml::XMLElement;
use crate::handle::{self, Handle};
pub fn wasm() -> Result<(), wasmi::Error> { pub fn wasm() -> Result<(), wasmi::Error> {
use wasmi::Config; use wasmi::Config;
use wasmi::Engine; use wasmi::Engine;
trace!(""); let mut conf = Config::default();
let conf = Config::default(); conf.wasm_bulk_memory(true);
// conf.,
let engine = Engine::new(&conf); let engine = Engine::new(&conf);
trace!("Engine constructed"); // trace!("Engine constructed");
let wasm = include_bytes!("../../wasm_syscall_test.wasm"); // let wasm = include_bytes!("../../wasm_syscall_test.wasm");
let wasm = include_bytes!("../../test.wasm");
trace!("Loading WASM binary"); // trace!("Loading WASM binary");
let module = Module::new(&engine, &wasm[..]).unwrap(); let module = Module::new(&engine, &wasm[..]).unwrap();
trace!("Constructing wasm module"); // trace!("Constructing wasm module");
let hs = HostState {
proc_handle: crate::handle::Handle::new(),
};
let mut store = Store::new(&engine, hs);
// trace!("constructing host store");
let mut store = Store::new(&engine, 42); let read_mem_addr = Func::wrap(
trace!("constructing host store"); &mut store,
|caller: Caller<'_, HostState>, param: i32| -> i32 { read_memory_address(caller, param) },
let read_mem_addr = Func::wrap(&mut store, |caller: Caller<'_, HostState>, param: u64| { );
read_memory_address(caller, param);
panic!(":)")
});
let mut linker = <Linker<HostState>>::new(&engine); let mut linker = <Linker<HostState>>::new(&engine);
linker.define("host", "read_mem_addr", read_mem_addr)?; linker.define(
trace!("Linked read_mem_addr"); "host",
"read_mem_addr",
Func::wrap(
&mut store,
|caller: Caller<'_, HostState>, param: i32| -> i32 {
read_memory_address(caller, param)
},
),
)?;
let instance = linker.instantiate(&mut store, &module)?.start(&mut store)?; linker.define(
trace!("Instanced the engine and module"); "host",
"read_object_attribute",
Func::wrap(&mut store, host_read_object_attribute),
)?;
let hello = instance.get_typed_func::<(), ()>(&store, "_start")?; linker.define(
"host",
"create_object",
Func::wrap(&mut store, host_make_object),
)?;
let instance = linker
.instantiate(&mut store, &module)?
.ensure_no_start(&mut store)?;
let version = instance.get_global(&store, "VERSION");
// trace!("Version: {:?}", version);
let hello = instance.get_typed_func::<(), (i32, i32)>(&store, "start")?;
let ret = hello.call(&mut store, ())?;
trace!("Called _start got return of {:?}", ret);
hello.call(&mut store, ())?;
trace!("Called _start");
Ok(()) Ok(())
} }
pub type HostState = u32; pub struct HostState {
pub fn read_memory_address(caller: Caller<'_, HostState>, address: u64) -> u64 { /// In ableOS a handle is an unsigned 128 bit number
proc_handle: Handle,
}
pub fn read_memory_address(caller: Caller<'_, HostState>, address: i32) -> i32 {
trace!("Proccess Handle: {:?}", caller.data().proc_handle);
trace!("Address: {}", address); trace!("Address: {}", address);
// let obj = host_make_object(caller, 16, 23);
0 0
} }
use crate::kmain::OBJECTS;
pub fn host_make_object(
caller: Caller<'_, HostState>,
address_start: i32,
length_of_string: i32,
) -> i64 {
trace!(
"Called with addr {{ start {} length {} }}",
address_start,
length_of_string
);
let mem = caller.get_export("memory").unwrap().into_memory().unwrap();
let mem_array = mem.data(&caller);
let mut name = String::new();
for i in address_start..(address_start + length_of_string) {
let ch = mem_array[i as usize] as char;
name.push(ch);
}
trace!("Object Name {}", name);
let hand = handle::Handle::new();
{
let binding = OBJECTS;
let mut olock = binding.lock();
let obj = XMLElement::new(name);
olock.insert(handle::Handle::new(), obj);
}
hand.into()
}
pub fn host_read_object_attribute(
caller: Caller<'_, HostState>,
handle: i64,
address_start: i32,
length_of_string: i32,
) -> (i32, i32) {
{
let binding = OBJECTS;
let mut olock = binding.lock();
// olock.get(&handle);
}
let mem = caller.get_export("memory").unwrap().into_memory().unwrap();
let mem_array = mem.data(&caller);
let mut name = String::new();
for i in address_start..(address_start + length_of_string) {
let ch = mem_array[i as usize] as char;
name.push(ch);
}
(0, 0)
}

View file

@ -1,8 +1,12 @@
//! AbleOS Kernel Entrypoint //! AbleOS Kernel Entrypoint
use log::{info, trace}; // use std::collections::HashMap;
use crate::arch::sloop; use log::{info, trace};
use spin::{Lazy, Mutex};
use crate::arch::{hardware_random_u64, sloop};
use crate::handle::Handle;
use crate::{interp, task}; use crate::{interp, task};
use crate::alloc::string::ToString; use crate::alloc::string::ToString;
@ -17,10 +21,14 @@ pub fn kmain(cmdline: &str, bootstrap: Option<&'static [u8]>) -> ! {
let kcmd = clparse::Arguments::parse(cmdline.to_string()).unwrap(); let kcmd = clparse::Arguments::parse(cmdline.to_string()).unwrap();
log::info!("Cmdline: {kcmd:?}"); log::info!("Cmdline: {kcmd:?}");
if kcmd.arguments.get("baka") == Some(&"9".to_string()) { if kcmd.arguments.get("baka") == Some(&"true".to_string()) {
let _ = crate::arch::log(format_args!(include_str!("../data/⑨. バカ"))); let _ = crate::arch::log(format_args!(include_str!("../data/⑨. バカ")));
} }
if kcmd.arguments.get("foobles") == Some(&"true".to_string()) {
let _ = crate::arch::log(format_args!("foobles\n"));
}
let bootstrap = bootstrap/*.expect("no bootstrap found")*/; let bootstrap = bootstrap/*.expect("no bootstrap found")*/;
match bootstrap { match bootstrap {
Some(bootstrap_mod) => {} Some(bootstrap_mod) => {}
@ -29,11 +37,18 @@ pub fn kmain(cmdline: &str, bootstrap: Option<&'static [u8]>) -> ! {
} }
} }
// use xml::XMLElement; use xml::XMLElement;
// let kcmd = XMLElement::new("cmdline"); let kcmd = XMLElement::new("cmdline");
let hnd = Handle::new();
OBJECTS.lock().insert(hnd, kcmd);
let abc = interp::wasm(); let abc = interp::wasm();
trace!("{:?}", abc); trace!("{:?}", abc);
crate::arch::sloop() crate::arch::sloop()
} }
pub const OBJECTS: Lazy<Mutex<HashMap<Handle, xml::XMLElement>>> = Lazy::new(|| {
let mut obj: HashMap<Handle, xml::XMLElement> = HashMap::new();
Mutex::new(obj)
});
use hashbrown::HashMap;

View file

@ -15,6 +15,7 @@ extern crate alloc;
mod allocator; mod allocator;
mod arch; mod arch;
pub mod handle;
pub mod interp; pub mod interp;
mod kmain; mod kmain;
mod logger; mod logger;

24
kernel/sycall.md Normal file
View file

@ -0,0 +1,24 @@
`create_object`
```
params
i32
start address of the string to use as the object name
i32
length of string
returns
i64 Handle to the object
```
`read_object_attribute`
```
params
i64 Handle to the object
i32
start address of the string to use as the attribute name
i32
end address of the string to use as the attribute name
returns
```

17232
out.txt Normal file

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@ ${ABLEOS_KERNEL}=boot:///kernel
# TODO: Make a boot background image for ableOS # TODO: Make a boot background image for ableOS
DEFAULT_ENTRY=1 DEFAULT_ENTRY=1
TIMEOUT=3 TIMEOUT=0
VERBOSE=yes VERBOSE=yes
INTERFACE_RESOLUTION=1024x768 INTERFACE_RESOLUTION=1024x768
# Terminal related settings # Terminal related settings
@ -13,9 +13,10 @@ TERM_BACKDROP=008080
COMMENT=Default AbleOS boot entry. COMMENT=Default AbleOS boot entry.
PROTOCOL=limine PROTOCOL=limine
KERNEL_PATH=${ABLEOS_KERNEL} KERNEL_PATH=${ABLEOS_KERNEL}
KERNEL_CMDLINE="hi=true bye=false baka=9" KERNEL_CMDLINE="baka=false foobles=true"
# KERNEL_CMDLINE=""
# Setting a default resolution for the framebuffer # Setting a default resolution for the framebuffer
RESOLUTION=1024x768x24 RESOLUTION=1024x768x24
MODULE_PATH=boot:///boot/fs.wasm # MODULE_PATH=boot:///boot/fs.wasm
# MODULE_CMDLINE=This is the first module. # MODULE_CMDLINE=This is the first module.

BIN
test.wasm Normal file

Binary file not shown.

Binary file not shown.