1
0
Fork 0
forked from AbleOS/ableos

Compare commits

...

8 commits

Author SHA1 Message Date
koniifer 38d3a10659 updates and updates 2024-11-30 11:46:33 +00:00
koniifer a551b2672f buffer awaiting -> free performance and free bugs 2024-11-27 16:53:17 +00:00
koniifer fd26ec734b temp interrupt fix, problem with sds_search_service 2024-11-27 12:52:48 +00:00
koniifer 9d1c59b65d consolidate simple tests, bug revealed 2024-11-27 12:41:51 +00:00
able cda022e6f0 Merge pull request 'Ktest major improvements' (#23) from funky/ableos:ktest_merge_conflict_fix into master
Reviewed-on: https://git.ablecorp.us/AbleOS/ableos/pulls/23
2024-11-27 06:16:25 -06:00
funky 95cf948d59 Ktest major improvements 2024-11-27 19:09:15 +11:00
koniifer f6a8a78b6c mini size fixes 2024-11-26 22:02:54 +00:00
kodin 5d152811b2 Interrupt Forwarding (#22)
Co-authored-by: Talha Qamar <qamartalha@proton.me>
Reviewed-on: https://git.ablecorp.us/AbleOS/ableos/pulls/22
Co-authored-by: kodin <kodin@yourmoms.house>
Co-committed-by: kodin <kodin@yourmoms.house>
2024-11-26 15:53:50 -06:00
35 changed files with 329 additions and 184 deletions

57
Cargo.lock generated
View file

@ -73,9 +73,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.1" version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc"
dependencies = [ dependencies = [
"shlex", "shlex",
] ]
@ -201,9 +201,9 @@ dependencies = [
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.15.1" version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
dependencies = [ dependencies = [
"allocator-api2", "allocator-api2",
"equivalent", "equivalent",
@ -213,12 +213,12 @@ dependencies = [
[[package]] [[package]]
name = "hbbytecode" name = "hbbytecode"
version = "0.1.0" version = "0.1.0"
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#a3355a59c0727e58519a94a8f65013beb9c2331b" source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#a2ca8d98df7f58366252b71f58450a0ab5c11bca"
[[package]] [[package]]
name = "hblang" name = "hblang"
version = "0.1.0" version = "0.1.0"
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#a3355a59c0727e58519a94a8f65013beb9c2331b" source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#a2ca8d98df7f58366252b71f58450a0ab5c11bca"
dependencies = [ dependencies = [
"hashbrown", "hashbrown",
"hbbytecode", "hbbytecode",
@ -229,7 +229,7 @@ dependencies = [
[[package]] [[package]]
name = "hbvm" name = "hbvm"
version = "0.1.0" version = "0.1.0"
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#a3355a59c0727e58519a94a8f65013beb9c2331b" source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#a2ca8d98df7f58366252b71f58450a0ab5c11bca"
dependencies = [ dependencies = [
"hbbytecode", "hbbytecode",
] ]
@ -401,7 +401,7 @@ dependencies = [
"uart_16550", "uart_16550",
"versioning", "versioning",
"x2apic", "x2apic",
"x86_64 0.15.1", "x86_64 0.15.2",
"xml", "xml",
] ]
@ -421,9 +421,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.164" version = "0.2.167"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc"
[[package]] [[package]]
name = "limine" name = "limine"
@ -433,9 +433,9 @@ checksum = "02034f8f6b3e7bf050f310fbaf6db0018b8e54b75598d0a4c97172054752fede"
[[package]] [[package]]
name = "litemap" name = "litemap"
version = "0.7.4" version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704"
[[package]] [[package]]
name = "lock_api" name = "lock_api"
@ -593,9 +593,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.23.18" version = "0.23.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1"
dependencies = [ dependencies = [
"log", "log",
"once_cell", "once_cell",
@ -726,9 +726,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.89" version = "2.0.90"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -827,17 +827,20 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]] [[package]]
name = "ureq" name = "ureq"
version = "2.10.1" version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" checksum = "b30e6f97efe1fa43535ee241ee76967d3ff6ff3953ebb430d8d55c5393029e7b"
dependencies = [ dependencies = [
"base64", "base64",
"litemap",
"log", "log",
"once_cell", "once_cell",
"rustls", "rustls",
"rustls-pki-types", "rustls-pki-types",
"url", "url",
"webpki-roots", "webpki-roots",
"yoke",
"zerofrom",
] ]
[[package]] [[package]]
@ -996,7 +999,7 @@ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"paste", "paste",
"raw-cpuid 10.7.0", "raw-cpuid 10.7.0",
"x86_64 0.14.12", "x86_64 0.14.13",
] ]
[[package]] [[package]]
@ -1012,9 +1015,9 @@ dependencies = [
[[package]] [[package]]
name = "x86_64" name = "x86_64"
version = "0.14.12" version = "0.14.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96cb6fd45bfeab6a5055c5bffdb08768bd0c069f1d946debe585bbb380a7c062" checksum = "c101112411baafbb4bf8d33e4c4a80ab5b02d74d2612331c61e8192fc9710491"
dependencies = [ dependencies = [
"bit_field", "bit_field",
"bitflags 2.6.0", "bitflags 2.6.0",
@ -1024,9 +1027,9 @@ dependencies = [
[[package]] [[package]]
name = "x86_64" name = "x86_64"
version = "0.15.1" version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bc79523af8abf92fb1a970c3e086c5a343f6bcc1a0eb890f575cbb3b45743df" checksum = "0f042214de98141e9c8706e8192b73f56494087cc55ebec28ce10f26c5c364ae"
dependencies = [ dependencies = [
"bit_field", "bit_field",
"bitflags 2.6.0", "bitflags 2.6.0",
@ -1044,9 +1047,9 @@ dependencies = [
[[package]] [[package]]
name = "yoke" name = "yoke"
version = "0.7.5" version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5"
dependencies = [ dependencies = [
"serde", "serde",
"stable_deref_trait", "stable_deref_trait",
@ -1068,9 +1071,9 @@ dependencies = [
[[package]] [[package]]
name = "zerofrom" name = "zerofrom"
version = "0.1.5" version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55"
dependencies = [ dependencies = [
"zerofrom-derive", "zerofrom-derive",
] ]

View file

@ -1,28 +1,85 @@
extern crate proc_macro; extern crate proc_macro;
extern crate quote; extern crate quote;
extern crate syn; extern crate syn;
use { use {
proc_macro::TokenStream, proc_macro::TokenStream,
quote::quote, quote::quote,
syn::{parse_macro_input, ItemFn} syn::{parse::Parse, parse_macro_input, Expr, ItemFn, Token}
}; };
struct KtestInput {
lhs: Expr,
_comma: Token![,],
rhs: Expr,
}
impl Parse for KtestInput {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
Ok(Self {
lhs: input.parse()?,
_comma: input.parse()?,
rhs: input.parse()?,
})
}
}
#[proc_macro]
pub fn ktest_eq(item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as KtestInput);
let lhs = input.lhs;
let rhs = input.rhs;
let out = quote! {
if #lhs != #rhs {
return Err(name);
}
};
TokenStream::from(out)
}
#[proc_macro]
pub fn ktest_neq(item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as KtestInput);
let lhs = input.lhs;
let rhs = input.rhs;
let out = quote! {
if #lhs == #rhs {
return Err(name);
}
};
TokenStream::from(out)
}
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn ktest(_attr: TokenStream, item: TokenStream) -> TokenStream { pub fn ktest(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn); let input = parse_macro_input!(item as ItemFn);
let test_name = &input.sig.ident; let test_name = &input.sig.ident;
let test_string = test_name.to_string();
let static_var_name = syn::Ident::new( let static_var_name = syn::Ident::new(
&format!("__ktest_{}", test_name), &format!("__ktest_{}", test_name).to_uppercase(),
test_name.span(), test_name.span(),
); );
let out = quote! {
// #[cfg(feature = "ktest")]
#input
// #[cfg(feature = "ktest")] let block = &input.block;
let out = quote! {
#[cfg(feature = "ktest")]
fn #test_name() -> Result<String, String> {
use crate::alloc::string::ToString;
let name = #test_string.to_string();
#block
return Ok(name);
}
#[cfg(feature = "ktest")]
#[unsafe(link_section = ".note.ktest")] #[unsafe(link_section = ".note.ktest")]
#[used] #[used]
pub static #static_var_name: fn() = #test_name; pub static #static_var_name: fn() -> Result<String, String> = #test_name;
}; };
TokenStream::from(out) TokenStream::from(out)

View file

@ -6,6 +6,11 @@ SECTIONS
.text.boot : { *(.text.boot) } .text.boot : { *(.text.boot) }
.text : { *(.text) } .text : { *(.text) }
.data : { *(.data) } .data : { *(.data) }
.note.ktest : {
__ktest_start = .;
*(.note.ktest)
__ktest_end = .;
}
.rodata : { *(.rodata) } .rodata : { *(.rodata) }
.bss : { .bss : {
*(COMMON) *(COMMON)

View file

@ -62,7 +62,7 @@ extern "x86-interrupt" fn page_fault(
} }
extern "x86-interrupt" fn timer(_isf: InterruptStackFrame) { extern "x86-interrupt" fn timer(_isf: InterruptStackFrame) {
// interrupt(Interrupt::Timer); interrupt(Interrupt::Timer);
unsafe { unsafe {
LAPIC.end_of_interrupt(); LAPIC.end_of_interrupt();
@ -83,28 +83,31 @@ extern "x86-interrupt" fn spurious(_: InterruptStackFrame) {
} }
} }
#[allow(unused_imports)]
fn interrupt(interrupt_type: Interrupt) { fn interrupt(interrupt_type: Interrupt) {
use crate::arch::INTERRUPT_LIST; use crate::{arch::INTERRUPT_LIST, kmain::EXECUTOR};
let il = INTERRUPT_LIST.lock(); // let il = INTERRUPT_LIST.lock();
let val = il.list.get(&interrupt_type).unwrap(); // let val = il.list.get(&interrupt_type).unwrap();
use crate::holeybytes::kernel_services::service_definition_service::sds_search_service; // use crate::holeybytes::kernel_services::service_definition_service::sds_search_service;
let buffer = sds_search_service(val); // let buffer = sds_search_service(val);
if buffer != 0 { // if buffer != 0 {
use {crate::kmain::IPC_BUFFERS, alloc::vec::Vec}; // use {crate::kmain::IPC_BUFFERS, alloc::vec::Vec};
let mut buffs = IPC_BUFFERS.lock(); // let mut buffs = IPC_BUFFERS.lock();
match buffs.get_mut(&buffer) { // match buffs.get_mut(&buffer) {
Some(buff) => { // Some(buff) => {
let mut msg_vec = Vec::new(); // let mut msg_vec = Vec::new();
msg_vec.push(0xFF); // msg_vec.push(0xFF);
buff.push(msg_vec.to_vec()); // buff.push(msg_vec.to_vec());
log::debug!("Sent Message {:?} to Buffer({})", msg_vec, buffer); // log::debug!("Sent Message {:?} to Buffer({})", msg_vec, buffer);
} // }
None => { // None => {
log::error!("Access of non-existent buffer {}", buffer) // log::error!("Access of non-existent buffer {}", buffer)
} // }
} // }
// }
// log::info!("{}", buffer); unsafe {
EXECUTOR.send_interrupt(interrupt_type as u8);
} }
} }

View file

@ -80,6 +80,10 @@ pub fn handler(vm: &mut Vm, pid: &usize) {
let length = vm.registers[5].cast::<u64>() as usize; let length = vm.registers[5].cast::<u64>() as usize;
trace!("IPC address: {:?}", mem_addr); trace!("IPC address: {:?}", mem_addr);
unsafe { LazyCell::<Executor>::get_mut(&mut EXECUTOR) }
.unwrap()
.send_buffer(buffer_id as usize);
match buffer_id { match buffer_id {
0 => match sds_msg_handler(vm, mem_addr, length) { 0 => match sds_msg_handler(vm, mem_addr, length) {
Ok(()) => {} Ok(()) => {}
@ -242,6 +246,28 @@ pub fn handler(vm: &mut Vm, pid: &usize) {
vm.registers[3] = x vm.registers[3] = x
} }
} }
6 => {
// Wait till interrupt
use crate::kmain::EXECUTOR;
let interrupt_type = vm.registers[3].cast::<u8>();
debug!("Interrupt subscribed: {}", interrupt_type);
unsafe {
LazyCell::<Executor>::get_mut(&mut EXECUTOR)
.unwrap()
.interrupt_subscribe(*pid, interrupt_type);
}
}
7 => {
// Wait till buffer
use crate::kmain::EXECUTOR;
let buffer_id = vm.registers[3].cast::<u64>() as usize;
debug!("Buffer subscribed: {}", buffer_id);
unsafe {
LazyCell::<Executor>::get_mut(&mut EXECUTOR)
.unwrap()
.buffer_subscribe(*pid, buffer_id);
}
}
_ => { _ => {
log::error!("Syscall unknown {:?}{:?}", ecall_number, vm.registers); log::error!("Syscall unknown {:?}{:?}", ecall_number, vm.registers);
} }

View file

@ -24,8 +24,11 @@ pub fn kmain(_cmdline: &str, boot_modules: BootModules) -> ! {
#[cfg(feature = "ktest")] #[cfg(feature = "ktest")]
{ {
use crate::ktest; use {
debug!("TESTING"); crate::ktest,
log::info,
};
info!("Running tests");
ktest::test_main(); ktest::test_main();
loop {} loop {}

View file

@ -1,38 +1,51 @@
pub use ktest_macro::ktest; pub use ktest_macro::*;
use log::debug;
use {
alloc::string::String,
log::{error, info},
};
extern "C" { extern "C" {
static __ktest_start: fn(); static __ktest_start: fn() -> Result<String, String>;
static __ktest_end: fn(); static __ktest_end: fn() -> Result<String, String>;
} }
// TODO: Get test_fn linker name (may require no_mangle in macro) // TODO: Implement ktest for arm and riscv (Later problems, see below)
// More info on tests (run the rest even if panic)
// Implement ktest for arm and riscv (Later problems, see below)
// Allow for arch specific tests (Leave for now) // Allow for arch specific tests (Leave for now)
// Allow for ktest test name attr // Should panic tests
// Usefull message at the end of testing // Test specific panic handler
pub fn test_main() { pub fn test_main() {
unsafe { unsafe {
let mut current_test = &__ktest_start as *const fn(); let mut current_test = &__ktest_start as *const fn() -> Result<String, String>;
let mut current = 1; let test_end = &__ktest_end as *const fn() -> Result<String, String>;
let test_end = &__ktest_end as *const fn();
let mut pass = 0;
let mut fail = 0;
while current_test < test_end { while current_test < test_end {
let test_fn = *current_test; let test_fn = *current_test;
debug!("Running test {}", current); let test_name = test_fn();
match test_name {
test_fn(); Ok(name) => {
debug!("Test {} passed", current); info!("Test: {} passed", name);
pass += 1;
},
Err(name) => {
error!("Test: {} failed", name);
fail += 1;
}
}
current_test = current_test.add(1); current_test = current_test.add(1);
current += 1;
} }
info!("{}/{} tests passed", pass, pass + fail);
} }
} }
#[ktest] #[ktest]
pub fn trivial_assertion() { pub fn trivial_assertion() {
assert_eq!(1, 1); ktest_eq!(1, 1);
} ktest_neq!(0, 1);
}

View file

@ -34,10 +34,10 @@ mod memory;
mod task; mod task;
mod utils; mod utils;
// #[cfg(feature = "tests")] #[allow(improper_ctypes, non_upper_case_globals)]
mod ktest; mod ktest;
use {alloc::string::ToString, versioning::Version}; use versioning::Version;
/// Kernel's version /// Kernel's version
pub const VERSION: Version = Version { pub const VERSION: Version = Version {
@ -49,6 +49,7 @@ pub const VERSION: Version = Version {
#[panic_handler] #[panic_handler]
#[cfg(target_os = "none")] #[cfg(target_os = "none")]
fn panic(info: &core::panic::PanicInfo) -> ! { fn panic(info: &core::panic::PanicInfo) -> ! {
use alloc::string::ToString;
arch::register_dump(); arch::register_dump();
if let Some(loc) = info.location() { if let Some(loc) = info.location() {

View file

@ -1,5 +1,9 @@
use { use {
alloc::{boxed::Box, sync::Arc}, alloc::{
boxed::Box,
collections::{BTreeMap, BTreeSet},
sync::Arc,
},
core::{ core::{
future::Future, future::Future,
pin::Pin, pin::Pin,
@ -33,15 +37,19 @@ pub trait Process: Future<Output = ()> + Send {}
impl<T: Future<Output = ()> + Send> Process for T {} impl<T: Future<Output = ()> + Send> Process for T {}
pub struct Executor { pub struct Executor {
tasks: Slab<Task>, tasks: Slab<Task>,
task_queue: Arc<SegQueue<usize>>, task_queue: Arc<SegQueue<usize>>,
interrupt_lookup: [Option<usize>; u8::MAX as usize],
buffer_lookup: BTreeMap<usize, BTreeSet<usize>>,
} }
impl Executor { impl Executor {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
tasks: Slab::new(), tasks: Slab::new(),
task_queue: Arc::new(SegQueue::new()), task_queue: Arc::new(SegQueue::new()),
interrupt_lookup: [None; u8::MAX as usize],
buffer_lookup: BTreeMap::new(),
} }
} }
@ -52,19 +60,33 @@ impl Executor {
id id
} }
pub fn pause(&mut self, id: usize) { pub fn pause(&self, id: usize) {
if let Some(task) = self.tasks.get(id) { if let Some(task) = self.tasks.get(id) {
task.set_paused(true); task.set_paused(true);
} }
} }
pub fn unpause(&mut self, id: usize) { pub fn unpause(&self, id: usize) {
if let Some(task) = self.tasks.get(id) { if let Some(task) = self.tasks.get(id) {
task.set_paused(false); task.set_paused(false);
self.task_queue.push(id); self.task_queue.push(id);
} }
} }
pub fn interrupt_subscribe(&mut self, pid: usize, interrupt_type: u8) {
self.pause(pid);
self.interrupt_lookup[interrupt_type as usize] = Some(pid);
}
pub fn buffer_subscribe(&mut self, pid: usize, buffer_id: usize) {
self.pause(pid);
if let Some(buf) = self.buffer_lookup.get_mut(&buffer_id) {
buf.insert(pid);
} else {
self.buffer_lookup.insert(buffer_id, BTreeSet::from([pid]));
}
}
pub fn run(&mut self) { pub fn run(&mut self) {
let mut task_batch = [0; 32]; let mut task_batch = [0; 32];
loop { loop {
@ -79,7 +101,8 @@ impl Executor {
} }
if batch_len == 0 { if batch_len == 0 {
break; // break;
continue;
} }
for &(mut id) in &task_batch[..batch_len] { for &(mut id) in &task_batch[..batch_len] {
@ -93,11 +116,34 @@ impl Executor {
if let Poll::Ready(()) = task.poll(&mut cx) { if let Poll::Ready(()) = task.poll(&mut cx) {
self.tasks.remove(id); self.tasks.remove(id);
self.interrupt_lookup.map(|pid| {
if let Some(pid) = pid {
if pid == id {
return None;
}
}
return pid;
});
self.buffer_lookup.iter_mut().for_each(|(_, pid_set)| {
pid_set.remove(&id);
});
} }
} }
} }
} }
} }
pub fn send_interrupt(&self, interrupt: u8) {
let id = self.interrupt_lookup[interrupt as usize];
if let Some(id) = id {
self.unpause(id);
}
}
pub fn send_buffer(&self, id: usize) {
if let Some(buf) = self.buffer_lookup.get(&id) {
buf.iter().for_each(|pid| self.unpause(*pid));
}
}
} }
struct Task { struct Task {

View file

@ -1,5 +1,7 @@
[toolchain] [toolchain]
# old toolchain # old toolchain
# channel = "nightly-2024-07-27" # channel = "nightly-2024-07-27"
channel = "nightly-2024-11-20" # last stable
# channel = "nightly-2024-11-20"
channel = "nightly"
components = ["rust-src", "llvm-tools"] components = ["rust-src", "llvm-tools"]

View file

@ -1,5 +1,9 @@
string := @use("string.hb") string := @use("string.hb")
$await := fn(buffer_id: uint): void {
return @eca(7, buffer_id)
}
$recv := fn($Expr: type, buffer_id: uint, memory_map_location: ^Expr): void { $recv := fn($Expr: type, buffer_id: uint, memory_map_location: ^Expr): void {
return @eca(4, buffer_id, memory_map_location, @sizeof(Expr)) return @eca(4, buffer_id, memory_map_location, @sizeof(Expr))
} }

View file

@ -10,6 +10,7 @@ random := @use("random.hb")
file := @use("file_io.hb") file := @use("file_io.hb")
dt := @use("dt.hb") dt := @use("dt.hb")
process := @use("process.hb") process := @use("process.hb")
sleep := @use("sleep.hb")
panic := fn(message: ?^u8): never { panic := fn(message: ?^u8): never {
log.error("Error: Panic Called, Message:\0") log.error("Error: Panic Called, Message:\0")

View file

@ -3,4 +3,5 @@ subscribe_to_interrupt := fn(interrupt_number: u8): bool {
} }
// Pauses execution until the interrupt occures // Pauses execution until the interrupt occures
sleep_until_interrupt := fn(interrupt_number: u8): void { sleep_until_interrupt := fn(interrupt_number: u8): void {
@eca(6, interrupt_number)
} }

View file

@ -48,6 +48,8 @@ await_channel := fn(): Channel {
await_message := fn($Expr: type, buffer_id: uint): Message(Expr) { await_message := fn($Expr: type, buffer_id: uint): Message(Expr) {
response := @as(?Message(Expr), null) response := @as(?Message(Expr), null)
loop { loop {
// awaiting here causes flickering... idk why
buffer.await(buffer_id)
buffer.recv(?Message(Expr), buffer_id, &response) buffer.recv(?Message(Expr), buffer_id, &response)
if response != null { if response != null {
return @as(Message(Expr), response) return @as(Message(Expr), response)
@ -58,9 +60,11 @@ await_message := fn($Expr: type, buffer_id: uint): Message(Expr) {
await_header := fn(buffer_id: uint): MessageHeader { await_header := fn(buffer_id: uint): MessageHeader {
response := @as(?MessageHeader, null) response := @as(?MessageHeader, null)
loop { loop {
// awaiting here causes flickering... idk why
buffer.await(buffer_id)
buffer.recv(?MessageHeader, buffer_id, &response) buffer.recv(?MessageHeader, buffer_id, &response)
if response != null { if response != null {
return @as(?MessageHeader, response) return @as(MessageHeader, response)
} }
} }
} }

View file

@ -1 +0,0 @@
# alloc_test

View file

@ -1,11 +0,0 @@
[package]
name = "alloc_test"
authors = [""]
[dependants.libraries]
[dependants.binaries]
hblang.version = "1.0.0"
[build]
command = "hblang src/main.hb"

View file

@ -1 +0,0 @@
# dt_buffer_test

View file

@ -1,13 +0,0 @@
.{dt} := @use("../../../libraries/stn/src/lib.hb")
main := fn(): void {
dt.get(void, "framebuffer/fb0/width\0")
dt.get(void, "cpu/cpu0/architecture\0")
// Checking if the first detected serial port is memory mapped or port mapped
// 0 -> memory mapped
// 1 -> port mapped
dt.get(void, "serial_ports/sp0/mapping\0")
return
}

View file

@ -1,11 +0,0 @@
[package]
name = "hash_test"
authors = [""]
[dependants.libraries]
[dependants.binaries]
hblang.version = "1.0.0"
[build]
command = "hblang src/main.hb"

View file

@ -1,11 +0,0 @@
[package]
name = "processes"
authors = ["koniifer"]
[dependants.libraries]
[dependants.binaries]
hblang.version = "1.0.0"
[build]
command = "hblang src/main.hb"

View file

@ -1,11 +0,0 @@
[package]
name = "serial_driver_test"
authors = ["able"]
[dependants.libraries]
[dependants.binaries]
hblang.version = "1.0.0"
[build]
command = "hblang src/main.hb"

View file

@ -1,20 +0,0 @@
.{string, buffer} := @use("../../../libraries/stn/src/lib.hb")
log_info := fn(): void {
a := buffer.search("XNumber\0")
if a == 0 {
} else {
msg := "XABC\0"
// inline is broked
// msg_length := @inline(string.length, msg)
msg_length := 5
@as(void, @eca(3, a, msg, msg_length))
}
return
}
main := fn(): int {
log_info()
return 0
}

View file

@ -91,8 +91,8 @@ main := fn(): int {
// Mouse cursor // Mouse cursor
{ {
render.put_filled_rect(screen, .(mouse_x, mouse_y), .(20, 20), sunset.server.DECO_COLOUR_DARKER) render.put_filled_circle(screen, .(mouse_x, mouse_y), 10, sunset.server.DECO_COLOUR_DARKER)
render.put_rect(screen, .(mouse_x, mouse_y), .(20, 20), sunset.server.DECO_COLOUR) render.put_circle(screen, .(mouse_x, mouse_y), 10, sunset.server.DECO_COLOUR)
} }
render.sync(screen) render.sync(screen)

View file

@ -1,6 +1,6 @@
[package] [package]
name = "dt_buffer_test" name = "test"
authors = ["able"] authors = ["koniifer", "able"]
[dependants.libraries] [dependants.libraries]

View file

@ -0,0 +1,7 @@
stn := @use("./tests/stn/lib.hb")
serial_driver := @use("./tests/serial_driver.hb")
main := fn(): uint {
// return serial_driver.test()
return stn.sleep.test()
}

View file

@ -0,0 +1,18 @@
.{string, buffer} := @use("../../../../libraries/stn/src/lib.hb")
log_info := fn(): void {
a := buffer.search("XNumber\0")
if a == 0 {
} else {
msg := "XABC\0"
msg_length := string.length(msg)
@eca(3, a, msg, msg_length)
}
return
}
test := fn(): uint {
log_info()
return 0
}

View file

@ -1,11 +1,11 @@
stn := @use("../../../libraries/stn/src/lib.hb"); stn := @use("../../../../../libraries/stn/src/lib.hb");
.{allocators, panic, log} := stn .{allocators, panic, log} := stn
AStruct := struct { AStruct := struct {
a_field: u8, a_field: u8,
} }
main := fn(): void { test := fn(): uint {
// alloc := allocators.FakeAlloc.init() // alloc := allocators.FakeAlloc.init()
// astruct := alloc.alloc(AStruct, 2) // astruct := alloc.alloc(AStruct, 2)
// if astruct.ptr != null{ // if astruct.ptr != null{
@ -26,5 +26,5 @@ main := fn(): void {
// log.info("Allocator functioned.\0") // log.info("Allocator functioned.\0")
// } // }
// balloc.dealloc(bstruct_ptr, AStruct, 2) // balloc.dealloc(bstruct_ptr, AStruct, 2)
return return 0
} }

View file

@ -0,0 +1,18 @@
.{dt, memory, string, log} := @use("../../../../../libraries/stn/src/lib.hb")
test := fn(): uint {
buffer := memory.request_page(1)
log.info(string.display_int(dt.get(int, "framebuffer/fb0/width\0"), buffer, 10))
string.clear(buffer)
log.info(string.display_int(dt.get(int, "cpu/cpu0/architecture\0"), buffer, 10))
string.clear(buffer)
// 0 -> memory mapped
// 1 -> port mapped
log.info(string.display_int(dt.get(int, "serial_ports/sp0/mapping\0"), buffer, 10))
return 0
}

View file

@ -1,6 +1,6 @@
.{hashers, log, memory, string} := @use("../../../libraries/stn/src/lib.hb") .{hashers, log, memory, string} := @use("../../../../../libraries/stn/src/lib.hb")
main := fn(): void { test := fn(): uint {
buffer := memory.request_page(1) buffer := memory.request_page(1)
target := "abcdefghijklmnop\0" target := "abcdefghijklmnop\0"
strings := [^u8].("abcdefshijklmnop\0", "abcdefghijklnnop\0", "abcdefshijklmnop\0", "abcdefghijklmnop\0", "abcdefghijflmnop\0", "dbcdefghijklmnop\0", "abcdefghijklmnop\0") strings := [^u8].("abcdefshijklmnop\0", "abcdefghijklnnop\0", "abcdefshijklmnop\0", "abcdefghijklmnop\0", "abcdefghijflmnop\0", "dbcdefghijklmnop\0", "abcdefghijklmnop\0")
@ -28,4 +28,5 @@ main := fn(): void {
log.debug(string.display_int(@bitcast(d), buffer, 16)) log.debug(string.display_int(@bitcast(d), buffer, 16))
string.clear(buffer) string.clear(buffer)
} }
return 0
} }

View file

@ -0,0 +1,5 @@
hashers := @use("./hashers.hb")
allocators := @use("./allocators.hb")
sleep := @use("./sleep.hb")
dt := @use("./dt.hb")
process := @use("./process.hb")

View file

@ -1,8 +1,8 @@
.{process, log, string, memory} := @use("../../../libraries/stn/src/lib.hb") .{process, log, string, memory} := @use("../../../../../libraries/stn/src/lib.hb")
exe := @embed("./hello_world_and_spin.hbf") exe := @embed("./assets/hello_world_and_spin.hbf")
main := fn(): void { test := fn(): uint {
buf := "\0\0\0\0\0\0\0" buf := "\0\0\0\0\0\0\0"
loop { loop {
log.info( log.info(
@ -16,4 +16,5 @@ main := fn(): void {
i := 0 i := 0
loop if i == 1000000 break else i += 1 loop if i == 1000000 break else i += 1
} }
return 0
} }

View file

@ -0,0 +1,8 @@
.{sleep, log} := @use("../../../../../libraries/stn/src/lib.hb")
test := fn(): uint {
log.info("BEFORE\0")
sleep.sleep_until_interrupt(32)
log.info("AFTER\0")
return 0
}

View file

@ -40,8 +40,8 @@ path = "boot:///sunset_client.hbf"
[boot.limine.ableos.modules.sunset_client_2] [boot.limine.ableos.modules.sunset_client_2]
path = "boot:///sunset_client_2.hbf" path = "boot:///sunset_client_2.hbf"
[boot.limine.ableos.modules.sdoom] # [boot.limine.ableos.modules.sdoom]
path = "boot:///sdoom.hbf" # path = "boot:///sdoom.hbf"
[boot.limine.ableos.modules.sunset_server] [boot.limine.ableos.modules.sunset_server]
path = "boot:///sunset_server.hbf" path = "boot:///sunset_server.hbf"
@ -49,8 +49,5 @@ path = "boot:///sunset_server.hbf"
# [boot.limine.ableos.modules.pcspkr] # [boot.limine.ableos.modules.pcspkr]
# path = "boot:///pcspkr.hbf" # path = "boot:///pcspkr.hbf"
# [boot.limine.ableos.modules.alloc_test] # [boot.limine.ableos.modules.test]
# path = "boot:///alloc_test.hbf" # path = "boot:///test.hbf"
# [boot.limine.ableos.modules.hash_test]
# path = "boot:///hash_test.hbf"