diff --git a/kernel/src/holeybytes/ecah.rs b/kernel/src/holeybytes/ecah.rs index 846957b7a..59eb32991 100644 --- a/kernel/src/holeybytes/ecah.rs +++ b/kernel/src/holeybytes/ecah.rs @@ -68,7 +68,7 @@ pub fn handler(vm: &mut Vm) { let buffer_id = vm.registers[3].cast::(); let mem_addr = vm.registers[4].cast::(); let length = vm.registers[5].cast::() as usize; - // debug!("IPC address: {:?}", mem_addr); + debug!("IPC address: {:?}", mem_addr); use alloc::vec::Vec; match buffer_id { @@ -89,10 +89,10 @@ pub fn handler(vm: &mut Vm) { // } 3 => { - unsafe fn x86_in(address: u16) -> u32 { + unsafe fn x86_in(address: u16) -> u8 { x86_64::instructions::port::Port::new(address).read() } - unsafe fn x86_out(address: u16, value: u32) { + unsafe fn x86_out(address: u16, value: u8) { x86_64::instructions::port::Port::new(address).write(value); } @@ -101,20 +101,32 @@ pub fn handler(vm: &mut Vm) { msg_vec.remove(0); match msg_type { 0 => { - let addr = msg_vec[0]; + let mut addr = msg_vec[0] as u16; msg_vec.remove(0); - let value = unsafe { x86_in(addr as u16) }; + + let addr2 = msg_vec[0] as u16; + msg_vec.remove(0); + + addr = ((addr) << 8) | addr2; + + let value = unsafe { x86_in(addr) }; info!("Read the value {} from address {}", value, addr); vm.registers[1] = hbvm::value::Value(value as u64); } 1 => { - let addr = msg_vec[0]; + let mut addr = msg_vec[0] as u16; msg_vec.remove(0); + + let addr2 = msg_vec[0] as u16; + msg_vec.remove(0); + + addr = ((addr) << 8) | addr2; + let value = msg_vec[0]; msg_vec.remove(0); info!("Setting the address {} to {}", addr, value); - unsafe { x86_out(addr as u16, value as u32) }; + unsafe { x86_out(addr, value) }; } _ => {} } diff --git a/repbuild/src/main.rs b/repbuild/src/main.rs index 76be7f5e5..c308774c8 100644 --- a/repbuild/src/main.rs +++ b/repbuild/src/main.rs @@ -337,7 +337,8 @@ fn run(release: bool, target: Target) -> Result<(), Error> { "-m", "4G", "-smp", "cores=4", // "-enable-kvm", - "-cpu", "Broadwell-v4" + "-cpu", "Broadwell-v4", + "-device", "isa-debug-exit,iobase=0xf4,iosize=0x04" ]); } Target::Riscv64Virt => { diff --git a/sysdata/libraries/stn/src/memory.hb b/sysdata/libraries/stn/src/memory.hb index c3dddcb6a..fbbe80cbf 100644 --- a/sysdata/libraries/stn/src/memory.hb +++ b/sysdata/libraries/stn/src/memory.hb @@ -15,4 +15,21 @@ release_page := fn(ptr: ^u8, page_count: u8): void { *msg_ptr = ptr return @eca(void, 3, 2, msg, 12) +} + +outb := fn(addr_high: u8, addr_low: u8, value: u8): void { + msg := "\0\0\0\0"; + *msg = 1; + *(msg + 1) = addr_high; + *(msg + 2) = addr_low; + *(msg + 3) = value + @eca(void, 3, 3, msg, 4) + return +} + +inb := fn(addr_high: u8, addr_low: u8): u8 { + msg := "\0\0\0\0"; + *(msg + 1) = addr_high; + *(msg + 2) = addr_low + return @eca(u8, 3, 3, msg, 3) } \ No newline at end of file diff --git a/sysdata/programs/diskio_driver/src/main.hb b/sysdata/programs/diskio_driver/src/main.hb index 7493b263f..d5295289e 100644 --- a/sysdata/programs/diskio_driver/src/main.hb +++ b/sysdata/programs/diskio_driver/src/main.hb @@ -1,5 +1,12 @@ +stn := @use("../../../libraries/stn/src/lib.hb"); +.{log, string, memory, buffer} := stn + main := fn(): int { - @eca(i32, 1, 1, 1); - - return 0; + // shuts down ableOS + memory.outb(0, 244, 0) + + a := memory.inb(0, 70) + b := memory.inb(0, 71) + + return 0 } \ No newline at end of file diff --git a/sysdata/programs/tests/src/main.hb b/sysdata/programs/tests/src/main.hb index 05bbc8a3a..a8dbc78ef 100644 --- a/sysdata/programs/tests/src/main.hb +++ b/sysdata/programs/tests/src/main.hb @@ -9,6 +9,6 @@ service_search := fn(): void { } main := fn(): int { - service_search() + //service_search() return 0 } \ No newline at end of file