Hack in an inb/outb api
This commit is contained in:
parent
f33cc0bf70
commit
1adc381399
|
@ -88,6 +88,37 @@ pub fn handler(vm: &mut Vm) {
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
3 => {
|
||||||
|
unsafe fn x86_in(address: u16) -> u32 {
|
||||||
|
x86_64::instructions::port::Port::new(address).read()
|
||||||
|
}
|
||||||
|
unsafe fn x86_out(address: u16, value: u32) {
|
||||||
|
x86_64::instructions::port::Port::new(address).write(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut msg_vec = block_read(mem_addr, length);
|
||||||
|
let msg_type = msg_vec[0];
|
||||||
|
msg_vec.remove(0);
|
||||||
|
match msg_type {
|
||||||
|
0 => {
|
||||||
|
let addr = msg_vec[0];
|
||||||
|
msg_vec.remove(0);
|
||||||
|
let value = unsafe { x86_in(addr as u16) };
|
||||||
|
|
||||||
|
info!("Read the value {} from address {}", value, addr);
|
||||||
|
vm.registers[1] = hbvm::value::Value(value as u64);
|
||||||
|
}
|
||||||
|
1 => {
|
||||||
|
let addr = msg_vec[0];
|
||||||
|
msg_vec.remove(0);
|
||||||
|
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) };
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
buffer_id => {
|
buffer_id => {
|
||||||
let mut buffs = IPC_BUFFERS.lock();
|
let mut buffs = IPC_BUFFERS.lock();
|
||||||
|
|
||||||
|
|
|
@ -16,5 +16,13 @@ main := fn(): int {
|
||||||
|
|
||||||
memory.release_page(memory_pages, 3);
|
memory.release_page(memory_pages, 3);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// todo: abstract this out
|
||||||
|
port_str := "\0\{70}\0";
|
||||||
|
a := @eca(u8, 3, 3, port_str, 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
Loading…
Reference in a new issue