SEARCHING for dynamically created buffers now works using buffer.create / buffer.search

This commit is contained in:
Able 2024-08-12 08:15:50 -05:00
parent c7214a5a9b
commit f4246ae387
9 changed files with 88 additions and 27 deletions

View file

@ -68,7 +68,7 @@ pub fn handler(vm: &mut Vm) {
let buffer_id = vm.registers[3].cast::<u64>(); let buffer_id = vm.registers[3].cast::<u64>();
let mem_addr = vm.registers[4].cast::<u64>(); let mem_addr = vm.registers[4].cast::<u64>();
let length = vm.registers[5].cast::<u64>() as usize; let length = vm.registers[5].cast::<u64>() as usize;
debug!("IPC address: {:?}", mem_addr); trace!("IPC address: {:?}", mem_addr);
use alloc::vec::Vec; use alloc::vec::Vec;
match buffer_id { match buffer_id {
@ -111,7 +111,7 @@ pub fn handler(vm: &mut Vm) {
let value = unsafe { x86_in(addr) }; let value = unsafe { x86_in(addr) };
info!("Read the value {} from address {}", value, addr); trace!("Read the value {} from address {}", value, addr);
vm.registers[1] = hbvm::value::Value(value as u64); vm.registers[1] = hbvm::value::Value(value as u64);
} }
1 => { 1 => {
@ -125,7 +125,7 @@ pub fn handler(vm: &mut Vm) {
let value = msg_vec[0]; let value = msg_vec[0];
msg_vec.remove(0); msg_vec.remove(0);
info!("Setting the address {} to {}", addr, value); trace!("Setting the address {} to {}", addr, value);
unsafe { x86_out(addr, value) }; unsafe { x86_out(addr, value) };
} }
_ => {} _ => {}

View file

@ -22,14 +22,21 @@ pub fn sds_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(),
let sds_event_type: ServiceEventType = msg_vec[0].into(); let sds_event_type: ServiceEventType = msg_vec[0].into();
msg_vec.remove(0); msg_vec.remove(0);
info!("Length {}", msg_vec.len());
use ServiceEventType::*; use ServiceEventType::*;
match sds_event_type { match sds_event_type {
CreateService => { CreateService => {
let string = String::from_utf8(msg_vec).expect("Our bytes should be valid utf8"); let string = String::from_utf8(msg_vec).expect("Our bytes should be valid utf8");
sds_create_service(string); let ret = sds_create_service(string);
vm.registers[1] = hbvm::value::Value(ret as u64);
} }
DeleteService => todo!(), DeleteService => todo!(),
SearchServices => todo!(), SearchServices => {
let string = String::from_utf8(msg_vec).expect("Our bytes should be valid utf8");
let ret = sds_search_service(string);
vm.registers[1] = hbvm::value::Value(ret as u64);
}
} }
// let buffer_id_raw = &msg_vec[0..8]; // let buffer_id_raw = &msg_vec[0..8];
// let mut arr = [0u8; 8]; // let mut arr = [0u8; 8];
@ -67,8 +74,23 @@ impl From<u8> for ServiceEventType {
fn sds_create_service(protocol: String) -> u64 { fn sds_create_service(protocol: String) -> u64 {
let buff_id = hardware_random_u64(); let buff_id = hardware_random_u64();
let mut services = SERVICES.lock(); let mut services = SERVICES.lock();
services.0.insert(buff_id, protocol.clone().into());
info!("BufferID({}) => {}", buff_id, protocol); let protocol_ = Protocol::from(protocol.clone());
let a: protocol::Protocol = protocol.into();
services.0.insert(buff_id, protocol_);
trace!("BufferID({}) => {}", buff_id, protocol);
// let a: protocol::Protocol = protocol.into();
buff_id buff_id
} }
fn sds_search_service(protocol: String) -> u64 {
let mut services = SERVICES.lock();
let compare = Protocol::from(protocol.clone());
for (bid, protocol_canidate) in &services.0 {
if protocol_canidate == &compare {
trace!("BufferID({}) => {}", bid, protocol.clone());
return *bid;
}
}
0
}

View file

@ -23,7 +23,6 @@ impl IpcBuffer {
bounded, bounded,
length length
); );
match (bounded, length) { match (bounded, length) {
(false, a) => { (false, a) => {
let buftype = BufferTypes::Unbound(SegQueue::new()); let buftype = BufferTypes::Unbound(SegQueue::new());

View file

@ -3,13 +3,14 @@ use {
hashbrown::HashMap, hashbrown::HashMap,
log::info, log::info,
}; };
#[derive(PartialEq)]
pub struct Type {} pub struct Type {}
#[derive(PartialEq)]
pub struct Funct { pub struct Funct {
takes: Vec<String>, takes: Vec<String>,
gives: Vec<String>, gives: Vec<String>,
} }
#[derive(PartialEq)]
pub struct Protocol { pub struct Protocol {
types: HashMap<String, Type>, types: HashMap<String, Type>,
fns: HashMap<String, Funct>, fns: HashMap<String, Funct>,
@ -29,11 +30,10 @@ impl Protocol {
impl From<String> for Protocol { impl From<String> for Protocol {
fn from(value: alloc::string::String) -> Self { fn from(value: alloc::string::String) -> Self {
if value.starts_with("protocol") { let mut hm_t = HashMap::new();
info!("ABC"); hm_t.insert(value, Type {});
}
Self { Self {
types: HashMap::new(), types: hm_t,
fns: HashMap::new(), fns: HashMap::new(),
} }
} }

View file

@ -11,9 +11,15 @@ send_message := fn(buffer_id: int): void {
return return
} }
create := fn(): int { create := fn(msg: ^u8): int {
msg := "\{01}Number\0"
msg_length := string.length(msg); msg_length := string.length(msg);
*msg = 0 *msg = 0
return @eca(int, 1, 0, msg, msg_length) return @eca(int, 3, 0, msg, msg_length)
}
search := fn(msg: ^u8): int {
msg_length := string.length(msg);
*msg = 3
return @eca(int, 3, 0, msg, msg_length)
} }

View file

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

View file

@ -1,7 +1,31 @@
stn := @use("../../../libraries/stn/src/lib.hb");
.{log, string, memory, buffer} := stn
main:= fn(): int { serial_print := fn(ptr: ^u8): void {
arch := "Arm"; letter := 0
ADDR := 0x09000000; loop if *ptr == 0 break else {
loop { } letter = *ptr
return 0; memory.outb(3, 248, letter)
ptr += 1
}
return
}
serial_println := fn(ptr: ^u8): void {
serial_print(ptr)
memory.outb(3, 248, 12)
memory.outb(3, 248, 13)
return
}
main := fn(): int {
serial_println("Starting Serial Driver.\0")
// Note that the first byte is reserved, pad accordingly.
a := buffer.create("XNumber\0")
b := buffer.search("XNumber\0")
if a == b {
serial_println("Stopping Serial Driver.\0")
}
return 0
} }

View file

@ -5,7 +5,6 @@ s := stn.string
page := 0 page := 0
main := fn(): void { main := fn(): void {
page += mem.request_page(1) page += mem.request_page(1)
port_str := "\0\0\{47}\0" port_str := "\0\0\{47}\0"
a := @eca(u8, 3, 3, port_str, 4) a := @eca(u8, 3, 3, port_str, 4)

View file

@ -19,12 +19,12 @@ resolution = "1024x768x24"
# [boot.limine.ableos.modules.tests] # [boot.limine.ableos.modules.tests]
# path = "boot:///tests.hbf" # path = "boot:///tests.hbf"
[boot.limine.ableos.modules.serial_driver]
path = "boot:///serial_driver.hbf"
[boot.limine.ableos.modules.diskio_driver] [boot.limine.ableos.modules.diskio_driver]
path = "boot:///diskio_driver.hbf" path = "boot:///diskio_driver.hbf"
[boot.limine.ableos.modules.fb_driver] [boot.limine.ableos.modules.fb_driver]
path = "boot:///fb_driver.hbf" path = "boot:///fb_driver.hbf"
# [boot.limine.ableos.modules.time_driver]
# path = "boot:///time_driver.hbf"