forked from koniifer/ableos
cursed-ness
This commit is contained in:
parent
ebfc9c1c4e
commit
d1d1bd7fd7
|
@ -1,8 +1,9 @@
|
||||||
use embedded_graphics::pixelcolor::Rgb888;
|
|
||||||
|
|
||||||
use {
|
use {
|
||||||
crate::{arch::x86_64::graphics::DISPLAY, bootmodules::BootModule},
|
crate::{arch::x86_64::graphics::DISPLAY, bootmodules::BootModule},
|
||||||
core::arch::asm,
|
core::arch::asm,
|
||||||
|
embedded_graphics::pixelcolor::Rgb888,
|
||||||
|
log::warn,
|
||||||
|
rdrand::RdSeed,
|
||||||
};
|
};
|
||||||
pub mod memory;
|
pub mod memory;
|
||||||
|
|
||||||
|
@ -186,11 +187,29 @@ pub fn spin_loop() -> ! {
|
||||||
|
|
||||||
pub fn hardware_random_u64() -> u64 {
|
pub fn hardware_random_u64() -> u64 {
|
||||||
use {log::trace, rdrand::RdRand};
|
use {log::trace, rdrand::RdRand};
|
||||||
let gen = RdRand::new().unwrap();
|
let gen = RdRand::new();
|
||||||
let ret = gen.try_next_u64().unwrap();
|
match gen {
|
||||||
trace!("Random {}", ret);
|
Ok(gen) => {
|
||||||
|
let ret = gen.try_next_u64().unwrap();
|
||||||
ret
|
trace!("Random {}", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
warn!("RDRand not supported.");
|
||||||
|
// Try rdseed
|
||||||
|
let gen = RdSeed::new();
|
||||||
|
match gen {
|
||||||
|
Ok(gen) => {
|
||||||
|
let ret = gen.try_next_u64().unwrap();
|
||||||
|
trace!("Random {}", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
panic!("Neither RDRand or RDSeed are supported")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_edid() {}
|
pub fn get_edid() {}
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
use {
|
|
||||||
crate::{
|
|
||||||
ipc::buffer::{BufferTypes, IpcBuffer},
|
|
||||||
kmain::IPC_BUFFERS,
|
|
||||||
},
|
|
||||||
hbvm::value::Value,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub fn make_ipc_buffer(registers: [Value; 256]) {
|
|
||||||
let r255 = registers[255];
|
|
||||||
let r254 = registers[254];
|
|
||||||
let r253 = registers[253];
|
|
||||||
|
|
||||||
let bounded = match unsafe { r254.u64 } {
|
|
||||||
0 => false,
|
|
||||||
1 => true,
|
|
||||||
_ => {
|
|
||||||
panic!("Bad");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let length = unsafe { r254.u64 };
|
|
||||||
|
|
||||||
let mut buffs = IPC_BUFFERS.lock();
|
|
||||||
match bounded {
|
|
||||||
false => {
|
|
||||||
let abc = IpcBuffer::new(false, 0);
|
|
||||||
buffs.push(abc);
|
|
||||||
}
|
|
||||||
true => {
|
|
||||||
let abc = IpcBuffer::new(true, length);
|
|
||||||
buffs.push(abc);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn delete_ipc_buffer(registers: [Value; 256]) {
|
|
||||||
log::warn!("Unstable ecall");
|
|
||||||
//TODO: fully define out how to layout the ecall for deleting buffers
|
|
||||||
//and figure out what happens if there are still messages in the queue
|
|
||||||
}
|
|
|
@ -1,19 +1,17 @@
|
||||||
use crate::kmain::IPC_BUFFERS;
|
|
||||||
|
|
||||||
use {
|
use {
|
||||||
|
crate::{arch, ipc::buffer::IpcBuffer, kmain::IPC_BUFFERS},
|
||||||
alloc::boxed::Box,
|
alloc::boxed::Box,
|
||||||
core::{default, future::Future, task::Poll},
|
core::{default, future::Future, task::Poll},
|
||||||
hbvm::{
|
hbvm::{
|
||||||
mem::{
|
mem::{
|
||||||
softpaging::{icache::ICache, HandlePageFault, SoftPagedMem},
|
softpaging::{icache::ICache, HandlePageFault, SoftPagedMem},
|
||||||
Address,
|
Address, Memory,
|
||||||
},
|
},
|
||||||
Vm, VmRunError, VmRunOk,
|
Vm, VmRunError, VmRunOk,
|
||||||
},
|
},
|
||||||
|
log::{debug, info, trace, warn},
|
||||||
};
|
};
|
||||||
|
|
||||||
mod ecalls;
|
|
||||||
|
|
||||||
const TIMER_QUOTIENT: usize = 100;
|
const TIMER_QUOTIENT: usize = 100;
|
||||||
|
|
||||||
pub struct ExecThread<'p> {
|
pub struct ExecThread<'p> {
|
||||||
|
@ -75,13 +73,56 @@ Register dump: {:?}",
|
||||||
}
|
}
|
||||||
1 => {
|
1 => {
|
||||||
// Make buffer
|
// Make buffer
|
||||||
ecalls::make_ipc_buffer(self.vm.registers);
|
let r255 = self.vm.registers[255];
|
||||||
|
let r254 = self.vm.registers[254];
|
||||||
|
let r253 = self.vm.registers[253];
|
||||||
|
|
||||||
|
let bounded = match unsafe { r254.u64 } {
|
||||||
|
0 => false,
|
||||||
|
1 => true,
|
||||||
|
_ => {
|
||||||
|
panic!("Bad");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let length = unsafe { r254.u64 };
|
||||||
|
|
||||||
|
let mut buffs = IPC_BUFFERS.lock();
|
||||||
|
let abc;
|
||||||
|
|
||||||
|
match bounded {
|
||||||
|
false => {
|
||||||
|
abc = IpcBuffer::new(false, 0);
|
||||||
|
}
|
||||||
|
true => {
|
||||||
|
abc = IpcBuffer::new(true, length);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let buff_id = arch::hardware_random_u64();
|
||||||
|
buffs.insert(buff_id, abc);
|
||||||
|
debug!("Buffer ID: {}", buff_id);
|
||||||
}
|
}
|
||||||
2 => {
|
2 => {
|
||||||
// Delete buffer
|
// Delete buffer
|
||||||
ecalls::delete_ipc_buffer(self.vm.registers);
|
|
||||||
}
|
}
|
||||||
|
3 => {
|
||||||
|
// Send a message to a buffer
|
||||||
|
let r254 = self.vm.registers[254];
|
||||||
|
let r253 = self.vm.registers[253];
|
||||||
|
let r252 = self.vm.registers[252];
|
||||||
|
|
||||||
|
let buffer_id = unsafe { r254.u64 };
|
||||||
|
let mem_addr = unsafe { r253.u64 };
|
||||||
|
let length = unsafe { r252.u64 as usize };
|
||||||
|
trace!("{:?}", mem_addr);
|
||||||
|
use alloc::vec::Vec;
|
||||||
|
|
||||||
|
if buffer_id == 1 {
|
||||||
|
info!("Logging")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 4
|
||||||
|
// 5
|
||||||
_ => {
|
_ => {
|
||||||
log::error!("Syscall unknown {:?}", r255)
|
log::error!("Syscall unknown {:?}", r255)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//! AbleOS Kernel Entrypoint
|
//! AbleOS Kernel Entrypoint
|
||||||
|
|
||||||
use hbvm::mem::Address;
|
use {hashbrown::HashMap, hbvm::mem::Address};
|
||||||
|
|
||||||
use crate::{capabilities, holeybytes::ExecThread, ipc::buffer::IpcBuffer};
|
use crate::{capabilities, holeybytes::ExecThread, ipc::buffer::IpcBuffer};
|
||||||
// use crate::arch::sloop;
|
// use crate::arch::sloop;
|
||||||
|
@ -65,8 +65,9 @@ pub static DEVICE_TREE: Lazy<Mutex<DeviceTree>> = Lazy::new(|| {
|
||||||
});
|
});
|
||||||
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
pub static IPC_BUFFERS: Lazy<Mutex<Vec<IpcBuffer>>> = Lazy::new(|| {
|
pub type IpcBuffers = HashMap<u64, IpcBuffer>;
|
||||||
let bufs = Vec::new();
|
pub static IPC_BUFFERS: Lazy<Mutex<IpcBuffers>> = Lazy::new(|| {
|
||||||
|
let bufs = HashMap::new();
|
||||||
Mutex::new(bufs)
|
Mutex::new(bufs)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -191,6 +191,7 @@ fn run(release: bool, target: Target) -> Result<(), Error> {
|
||||||
"-drive", "file=target/disk.img,format=raw",
|
"-drive", "file=target/disk.img,format=raw",
|
||||||
"-m", "4G",
|
"-m", "4G",
|
||||||
"-smp", "cores=4",
|
"-smp", "cores=4",
|
||||||
|
"-cpu", "Broadwell-v4"
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
Target::Riscv64Virt => {
|
Target::Riscv64Virt => {
|
||||||
|
|
Loading…
Reference in a new issue