chore: fmt

master
ondra05 2022-04-12 00:23:11 +02:00
parent c61cb9e24a
commit d549b3ee6a
100 changed files with 1132 additions and 971 deletions

View File

@ -15,6 +15,7 @@ impl AliasTable {
table: HashMap::new(), table: HashMap::new(),
} }
} }
pub fn add_alias(&mut self, alias: String, path: String) { pub fn add_alias(&mut self, alias: String, path: String) {
self.table.insert(alias, path); self.table.insert(alias, path);
} }

View File

@ -1,12 +1,9 @@
/*! //! The allocator to be implemented by ableOS
The allocator to be implemented by ableOS
*/
use alloc::alloc::{GlobalAlloc, Layout}; use alloc::alloc::{GlobalAlloc, Layout};
use core::ptr::null_mut; use core::ptr::null_mut;
pub struct AAloc; pub struct AAloc;
unsafe impl GlobalAlloc for AAloc { unsafe impl GlobalAlloc for AAloc {
unsafe fn alloc(&self, _layout: Layout) -> *mut u8 { unsafe fn alloc(&self, _layout: Layout) -> *mut u8 {
println!("Allocating memory"); println!("Allocating memory");

View File

@ -1,22 +1,16 @@
mod aalloc; mod aalloc;
pub const HEAP_START: usize = 0x_4444_4444_0000;
/// 131072 bytes
// pub const HEAP_MULTIPLIER: usize = 1024;
pub const HEAP_MULTIPLIER: usize = 100000;
pub const HEAP_BASE: usize = 100;
pub const HEAP_SIZE: usize = HEAP_BASE * HEAP_MULTIPLIER;
use linked_list_allocator::LockedHeap; use linked_list_allocator::LockedHeap;
pub const HEAP_START: usize = 0x_4444_4444_0000;
pub const HEAP_MULTIPLIER: usize = 100000;
pub const HEAP_BASE: usize = 100;
pub const HEAP_SIZE: usize = HEAP_BASE * HEAP_MULTIPLIER;
#[global_allocator] #[global_allocator]
pub static ALLOCATOR: LockedHeap = LockedHeap::empty(); pub static ALLOCATOR: LockedHeap = LockedHeap::empty();
#[alloc_error_handler] #[alloc_error_handler]
fn alloc_error_handler(layout: alloc::alloc::Layout) -> ! { fn alloc_error_handler(layout: alloc::alloc::Layout) -> ! {
// error!("allocation error: {:?}", layout);
panic!("allocation error: {:?}", layout) panic!("allocation error: {:?}", layout)
} }

View File

@ -2,7 +2,6 @@ use alloc::alloc::{GlobalAlloc, Layout};
use core::ptr::null_mut; use core::ptr::null_mut;
pub struct Dummy; pub struct Dummy;
unsafe impl GlobalAlloc for Dummy { unsafe impl GlobalAlloc for Dummy {
unsafe fn alloc(&self, _layout: Layout) -> *mut u8 { unsafe fn alloc(&self, _layout: Layout) -> *mut u8 {
null_mut() null_mut()

View File

@ -7,21 +7,27 @@ impl Graphics for GraphicsBuffer {
fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb) { fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb) {
todo!() todo!()
} }
fn put_rect(coords_start: Point, coords_end: Point, color: Rgb) { fn put_rect(coords_start: Point, coords_end: Point, color: Rgb) {
todo!() todo!()
} }
fn put_circle(coords: Point, radius: u32) { fn put_circle(coords: Point, radius: u32) {
todo!() todo!()
} }
fn put_triangle(coords_1: Point, coords_2: Point, coords_3: Point, thickness: u32, color: Rgb) { fn put_triangle(coords_1: Point, coords_2: Point, coords_3: Point, thickness: u32, color: Rgb) {
todo!(); todo!();
} }
fn put_pixel(coords: Point, color: Rgb) { fn put_pixel(coords: Point, color: Rgb) {
todo!() todo!()
} }
fn paint_cursor(coords: Point) { fn paint_cursor(coords: Point) {
todo!() todo!()
} }
fn hide_cursor() {} fn hide_cursor() {}
fn show_cursor() {} fn show_cursor() {}
fn draw() {} fn draw() {}

View File

@ -1,36 +1,8 @@
//! A not-very-useful abstraction of GPIOs in Rust
#![allow(dead_code)] #![allow(dead_code)]
// A not-very-useful abstraction of GPIOs in Rust
use core::sync::atomic::{AtomicBool, Ordering::SeqCst}; use core::sync::atomic::{AtomicBool, Ordering::SeqCst};
/// A struct that represents an nRF52 Pin
pub struct Pin(u8);
/// A struct that represents P0 of the nRF52
pub struct Pins {
pub p0_31: Pin,
}
impl Pins {
/// A function to obtain a Port 0 singleton structure
pub fn take() -> Self {
static TAKEN: AtomicBool = AtomicBool::new(false);
// Enforce this as a singleton
assert!(!TAKEN.swap(true, SeqCst));
Self { p0_31: Pin(31) }
}
}
/// The level of a GPIO
#[derive(Copy, Clone)]
pub enum Level {
Low,
High,
}
const REG_P0_PIN_CNF_BASE: *mut u32 = 0x5000_0700 as *mut u32; const REG_P0_PIN_CNF_BASE: *mut u32 = 0x5000_0700 as *mut u32;
const REG_P0_OUT_SET: *mut u32 = 0x5000_0508 as *mut u32; const REG_P0_OUT_SET: *mut u32 = 0x5000_0508 as *mut u32;
const REG_P0_OUT_CLR: *mut u32 = 0x5000_050C as *mut u32; const REG_P0_OUT_CLR: *mut u32 = 0x5000_050C as *mut u32;
@ -40,7 +12,8 @@ const PIN_CNF_INPUT_CONNECT: u32 = 0x0000_0000;
const PIN_CNF_PULL_DISABLED: u32 = 0x0000_0000; const PIN_CNF_PULL_DISABLED: u32 = 0x0000_0000;
const PIN_CNF_DRIVE_S0S1: u32 = 0x0000_0000; const PIN_CNF_DRIVE_S0S1: u32 = 0x0000_0000;
const PIN_CNF_SENSE_DISABLED: u32 = 0x0000_0000; const PIN_CNF_SENSE_DISABLED: u32 = 0x0000_0000;
/// A struct that represents an nRF52 Pin
pub struct Pin(u8);
impl Pin { impl Pin {
/// Set a pin to be a push pull output /// Set a pin to be a push pull output
pub fn set_push_pull_output(&mut self, level: Level) { pub fn set_push_pull_output(&mut self, level: Level) {
@ -71,3 +44,27 @@ impl Pin {
unsafe { core::ptr::write_volatile(REG_P0_OUT_CLR, 1 << (self.0 as u32)) } unsafe { core::ptr::write_volatile(REG_P0_OUT_CLR, 1 << (self.0 as u32)) }
} }
} }
/// The level of a GPIO
#[derive(Copy, Clone)]
pub enum Level {
Low,
High,
}
/// A struct that represents P0 of the nRF52
pub struct Pins {
pub p0_31: Pin,
}
impl Pins {
/// A function to obtain a Port 0 singleton structure
pub fn take() -> Self {
static TAKEN: AtomicBool = AtomicBool::new(false);
// Enforce this as a singleton
assert!(!TAKEN.swap(true, SeqCst));
Self { p0_31: Pin(31) }
}
}

View File

@ -1,11 +1,10 @@
use core::ptr;
// mod panic;
pub mod drivers; pub mod drivers;
pub mod init; pub mod init;
use crate::arch::drivers::nrf52::{Level, Pins}; use crate::arch::drivers::nrf52::{Level, Pins};
use core::ptr;
use core::ptr::write_volatile; use core::ptr::write_volatile;
global_asm!(include_str!("boot.s")); global_asm!(include_str!("boot.s"));
fn delay(ticks: usize) { fn delay(ticks: usize) {
@ -33,7 +32,6 @@ pub extern "C" fn not_main() {
} }
} }
//
// let gpios = Pins::take(); // let gpios = Pins::take();
// let mut led = gpios.p0_31; // let mut led = gpios.p0_31;
// //
@ -46,14 +44,15 @@ pub extern "C" fn not_main() {
// } // }
// //
// led.set_push_pull_output(Level::Low); // led.set_push_pull_output(Level::Low);
crate::kmain::kernel_main();
crate::kmain::kernel_main();
sloop(); sloop();
} }
pub fn sloop() -> ! { pub fn sloop() -> ! {
loop {} loop {}
} }
pub fn print() { pub fn print() {
for byte in b"ableOS Arm 64" { for byte in b"ableOS Arm 64" {
const UART0: *mut u8 = 0x0900_0000 as *mut u8; const UART0: *mut u8 = 0x0900_0000 as *mut u8;

View File

@ -2,7 +2,6 @@ use alloc::alloc::{GlobalAlloc, Layout};
use core::ptr::null_mut; use core::ptr::null_mut;
pub struct Dummy; pub struct Dummy;
unsafe impl GlobalAlloc for Dummy { unsafe impl GlobalAlloc for Dummy {
unsafe fn alloc(&self, _layout: Layout) -> *mut u8 { unsafe fn alloc(&self, _layout: Layout) -> *mut u8 {
null_mut() null_mut()

View File

@ -7,21 +7,27 @@ impl Graphics for GraphicsBuffer {
fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb) { fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb) {
todo!() todo!()
} }
fn put_rect(coords_start: Point, coords_end: Point, color: Rgb) { fn put_rect(coords_start: Point, coords_end: Point, color: Rgb) {
todo!() todo!()
} }
fn put_circle(coords: Point, radius: u32) { fn put_circle(coords: Point, radius: u32) {
todo!() todo!()
} }
fn put_triangle(coords_1: Point, coords_2: Point, coords_3: Point, thickness: u32, color: Rgb) { fn put_triangle(coords_1: Point, coords_2: Point, coords_3: Point, thickness: u32, color: Rgb) {
todo!(); todo!();
} }
fn put_pixel(coords: Point, color: Rgb) { fn put_pixel(coords: Point, color: Rgb) {
todo!() todo!()
} }
fn paint_cursor(coords: Point) { fn paint_cursor(coords: Point) {
todo!() todo!()
} }
fn hide_cursor() {} fn hide_cursor() {}
fn show_cursor() {} fn show_cursor() {}
fn draw() {} fn draw() {}

View File

@ -3,7 +3,6 @@
/// We label the mmio function unsafe since /// We label the mmio function unsafe since
/// we will be working with raw memory. Rust cannot /// we will be working with raw memory. Rust cannot
/// make any guarantees when we do this. /// make any guarantees when we do this.
///
#[inline(always)] #[inline(always)]
fn mmio_write(address: usize, offset: usize, value: u8) { fn mmio_write(address: usize, offset: usize, value: u8) {
// Set the pointer based off of the address // Set the pointer based off of the address

View File

@ -1,6 +1,4 @@
use core::fmt::Write; use core::fmt::{Error, Write};
use core::fmt::Error;
/// Initialize the UART driver by setting /// Initialize the UART driver by setting
/// the word length, FIFOs, and interrupts /// the word length, FIFOs, and interrupts
@ -113,6 +111,7 @@ impl Uart {
uart_init(self.base_address); uart_init(self.base_address);
} }
} }
// This is a slightly different syntax. Write is this "trait", meaning it is much like // This is a slightly different syntax. Write is this "trait", meaning it is much like
// an interface where we're just guaranteeing a certain function signature. In the Write // an interface where we're just guaranteeing a certain function signature. In the Write
// trait, one is absolutely required to be implemented, which is write_str. There are other // trait, one is absolutely required to be implemented, which is write_str. There are other

View File

@ -1,5 +1,10 @@
pub mod drivers; pub mod drivers;
pub mod init; pub mod init;
use crate::print;
use crate::println;
use core::arch::asm;
#[naked] #[naked]
#[no_mangle] #[no_mangle]
unsafe extern "C" fn _boot() -> ! { unsafe extern "C" fn _boot() -> ! {
@ -31,9 +36,10 @@ unsafe extern "C" fn _boot() -> ! {
} }
extern "C" fn _start() -> ! { extern "C" fn _start() -> ! {
use crate::serial_println;
let uart = crate::arch::drivers::uart::Uart::new(0x1000_0000); let uart = crate::arch::drivers::uart::Uart::new(0x1000_0000);
uart.init(); uart.init();
use crate::serial_println;
serial_println!("Hello, world!\r"); serial_println!("Hello, world!\r");
loop { loop {
@ -53,7 +59,6 @@ extern "C" fn _start() -> ! {
} }
serial_println!("Serial connection closed.\r"); serial_println!("Serial connection closed.\r");
sloop() sloop()
} }
@ -64,13 +69,8 @@ pub fn sloop() -> ! {
}; };
} }
} }
use core::arch::asm;
pub fn shutdown() {} pub fn shutdown() {}
use crate::print;
use crate::println;
pub fn generate_process_pass() -> u128 { pub fn generate_process_pass() -> u128 {
123 123
} }

View File

@ -1,6 +1,5 @@
use alloc::alloc::{GlobalAlloc, Layout};
use crate::allocator::{HEAP_SIZE, HEAP_START}; use crate::allocator::{HEAP_SIZE, HEAP_START};
use alloc::alloc::{GlobalAlloc, Layout};
use core::ptr::null_mut; use core::ptr::null_mut;
use x86_64::{ use x86_64::{
structures::paging::{ structures::paging::{
@ -9,7 +8,6 @@ use x86_64::{
VirtAddr, VirtAddr,
}; };
pub struct Dummy; pub struct Dummy;
unsafe impl GlobalAlloc for Dummy { unsafe impl GlobalAlloc for Dummy {
unsafe fn alloc(&self, _layout: Layout) -> *mut u8 { unsafe fn alloc(&self, _layout: Layout) -> *mut u8 {
null_mut() null_mut()

View File

@ -8,25 +8,32 @@ impl Graphics for GraphicsBuffer {
fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb) { fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb) {
todo!() todo!()
} }
fn put_rect(coords_start: Point, coords_end: Point, color: Rgb) {} fn put_rect(coords_start: Point, coords_end: Point, color: Rgb) {}
fn put_circle(coords: Point, radius: u32) { fn put_circle(coords: Point, radius: u32) {
todo!() todo!()
} }
fn put_triangle(coords_1: Point, coords_2: Point, coords_3: Point, thickness: u32, color: Rgb) { fn put_triangle(coords_1: Point, coords_2: Point, coords_3: Point, thickness: u32, color: Rgb) {
todo!(); todo!();
} }
fn put_pixel(coords: Point, color: Rgb) { fn put_pixel(coords: Point, color: Rgb) {
todo!() todo!()
} }
fn paint_cursor(coords: Point) { fn paint_cursor(coords: Point) {
todo!() todo!()
} }
fn hide_cursor() { fn hide_cursor() {
unsafe { unsafe {
outw(0x0A, 0x3D4); outw(0x0A, 0x3D4);
outw(0x20, 0x3D5); outw(0x20, 0x3D5);
} }
} }
fn show_cursor() {} fn show_cursor() {}
fn draw() {} fn draw() {}
fn clear() { fn clear() {

View File

@ -1,8 +1,7 @@
pub mod allocator; pub mod allocator;
pub mod graphics; pub mod graphics;
pub mod serial; pub mod serial;
pub mod timer; pub mod timer;
// #[deprecated(note = "The use of hardware specific drivers for VGA is discouraged")] #[deprecated(note = "The use of hardware specific drivers for VGA is discouraged")]
pub mod vga; pub mod vga;

View File

@ -15,6 +15,7 @@ pub fn _print(args: ::core::fmt::Arguments) {
.write_fmt(args) .write_fmt(args)
.expect("Printing to serial failed"); .expect("Printing to serial failed");
} }
/// Prints to the host through the serial interface. /// Prints to the host through the serial interface.
#[macro_export] #[macro_export]
macro_rules! sprint { macro_rules! sprint {
@ -22,6 +23,7 @@ macro_rules! sprint {
$crate::arch::drivers::serial::_print(format_args!($($arg)*)); $crate::arch::drivers::serial::_print(format_args!($($arg)*));
}; };
} }
/// Prints to the host through the serial interface, appending a newline. /// Prints to the host through the serial interface, appending a newline.
#[macro_export] #[macro_export]
macro_rules! sprintln { macro_rules! sprintln {

View File

@ -1,3 +1,10 @@
use core::fmt;
use spin::{Lazy, Mutex};
use volatile::Volatile;
const BUFFER_HEIGHT: usize = 25;
const BUFFER_WIDTH: usize = 80;
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)] #[repr(u8)]
@ -19,6 +26,7 @@ pub enum Color {
Yellow = 14, Yellow = 14,
White = 15, White = 15,
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(transparent)] #[repr(transparent)]
struct ColorCode(u8); struct ColorCode(u8);
@ -27,23 +35,25 @@ impl ColorCode {
ColorCode((background as u8) << 4 | (foreground as u8)) ColorCode((background as u8) << 4 | (foreground as u8))
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(C)] #[repr(C)]
struct ScreenChar { struct ScreenChar {
ascii_character: u8, ascii_character: u8,
color_code: ColorCode, color_code: ColorCode,
} }
const BUFFER_HEIGHT: usize = 25;
const BUFFER_WIDTH: usize = 80;
#[repr(transparent)] #[repr(transparent)]
struct Buffer { struct Buffer {
chars: [[Volatile<ScreenChar>; BUFFER_WIDTH]; BUFFER_HEIGHT], chars: [[Volatile<ScreenChar>; BUFFER_WIDTH]; BUFFER_HEIGHT],
} }
pub struct Writer { pub struct Writer {
column_position: usize, column_position: usize,
color_code: ColorCode, color_code: ColorCode,
buffer: &'static mut Buffer, buffer: &'static mut Buffer,
} }
impl Writer { impl Writer {
pub fn write_byte(&mut self, byte: u8) { pub fn write_byte(&mut self, byte: u8) {
match byte { match byte {
@ -63,6 +73,7 @@ impl Writer {
} }
} }
} }
pub fn write_string(&mut self, s: &str) { pub fn write_string(&mut self, s: &str) {
for byte in s.bytes() { for byte in s.bytes() {
match byte { match byte {
@ -73,6 +84,7 @@ impl Writer {
} }
} }
} }
fn new_line(&mut self) { fn new_line(&mut self) {
for row in 1..BUFFER_HEIGHT { for row in 1..BUFFER_HEIGHT {
for col in 0..BUFFER_WIDTH { for col in 0..BUFFER_WIDTH {
@ -83,6 +95,7 @@ impl Writer {
self.clear_row(BUFFER_HEIGHT - 1); self.clear_row(BUFFER_HEIGHT - 1);
self.column_position = 0; self.column_position = 0;
} }
fn clear_row(&mut self, row: usize) { fn clear_row(&mut self, row: usize) {
let blank = ScreenChar { let blank = ScreenChar {
ascii_character: b' ', ascii_character: b' ',
@ -108,6 +121,7 @@ impl Writer {
} }
} }
} }
impl fmt::Write for Writer { impl fmt::Write for Writer {
fn write_str(&mut self, s: &str) -> fmt::Result { fn write_str(&mut self, s: &str) -> fmt::Result {
self.write_string(s); self.write_string(s);
@ -123,20 +137,17 @@ pub static WRITER: Lazy<Mutex<Writer>> = Lazy::new(|| {
}) })
}); });
use core::fmt;
use spin::{Lazy, Mutex};
use volatile::Volatile;
#[macro_export] #[macro_export]
macro_rules! kprint { macro_rules! kprint {
($($arg:tt)*) => ($crate::arch::drivers::vga::_kprint(format_args!($($arg)*))); ($($arg:tt)*) => ($crate::arch::drivers::vga::_kprint(format_args!($($arg)*)));
} }
#[macro_export] #[macro_export]
macro_rules! kprintln { macro_rules! kprintln {
() => ($crate::kprint!("\n")); () => ($crate::kprint!("\n"));
($($arg:tt)*) => ($crate::kprint!("{}\n", format_args!($($arg)*))); ($($arg:tt)*) => ($crate::kprint!("{}\n", format_args!($($arg)*)));
} }
#[doc(hidden)] #[doc(hidden)]
pub fn _kprint(args: fmt::Arguments) { pub fn _kprint(args: fmt::Arguments) {
use core::fmt::Write; use core::fmt::Write;

View File

@ -2,8 +2,14 @@ use spin::Lazy;
use x86_64::structures::gdt::{Descriptor, GlobalDescriptorTable, SegmentSelector}; use x86_64::structures::gdt::{Descriptor, GlobalDescriptorTable, SegmentSelector};
use x86_64::structures::tss::TaskStateSegment; use x86_64::structures::tss::TaskStateSegment;
use x86_64::VirtAddr; use x86_64::VirtAddr;
pub const DOUBLE_FAULT_IST_INDEX: u16 = 0; pub const DOUBLE_FAULT_IST_INDEX: u16 = 0;
struct Selectors {
code_selector: SegmentSelector,
tss_selector: SegmentSelector,
}
static TSS: Lazy<TaskStateSegment> = Lazy::new(|| { static TSS: Lazy<TaskStateSegment> = Lazy::new(|| {
let mut tss = TaskStateSegment::new(); let mut tss = TaskStateSegment::new();
tss.interrupt_stack_table[DOUBLE_FAULT_IST_INDEX as usize] = { tss.interrupt_stack_table[DOUBLE_FAULT_IST_INDEX as usize] = {
@ -29,11 +35,6 @@ static GDT: Lazy<(GlobalDescriptorTable, Selectors)> = Lazy::new(|| {
) )
}); });
struct Selectors {
code_selector: SegmentSelector,
tss_selector: SegmentSelector,
}
pub fn init() { pub fn init() {
use x86_64::instructions::segmentation::{Segment, CS}; use x86_64::instructions::segmentation::{Segment, CS};
use x86_64::instructions::tables::load_tss; use x86_64::instructions::tables::load_tss;

View File

@ -1,16 +1,17 @@
// #![allow(clippy::print_literal)] // #![allow(clippy::print_literal)]
use super::{gdt, interrupts};
use crate::{ use crate::{
logger, logger,
scheduler::{capabilities::Capabilities, SCHEDULER}, scheduler::{capabilities::Capabilities, SCHEDULER},
serial_println, serial_println,
}; };
use super::{gdt, interrupts};
/// x86_64 initialization /// x86_64 initialization
pub fn init() { pub fn init() {
use crate::network::socket::SimpleSock; use crate::{
use crate::relib::network::socket::Socket; network::socket::SimpleSock, relib::network::socket::Socket,
scheduler::priority::Priority::High, stdio::StdIO,
};
let mut log_socket_id = SimpleSock::new(); let mut log_socket_id = SimpleSock::new();
log_socket_id.register_protocol("Logger".to_string()); log_socket_id.register_protocol("Logger".to_string());
@ -22,10 +23,9 @@ pub fn init() {
} }
Err(err) => error!("{}", err), Err(err) => error!("{}", err),
} }
gdt::init(); gdt::init();
use crate::scheduler::priority::Priority::High;
use crate::stdio::StdIO;
let mut scheduler = SCHEDULER.lock(); let mut scheduler = SCHEDULER.lock();
let process_0 = scheduler.new_process( let process_0 = scheduler.new_process(
Capabilities::empty(), Capabilities::empty(),
@ -34,11 +34,9 @@ pub fn init() {
StdIO::new("null".to_string()), StdIO::new("null".to_string()),
); );
scheduler.add_process(process_0); scheduler.add_process(process_0);
drop(scheduler); drop(scheduler);
interrupts::init_idt(); interrupts::init_idt();
unsafe { interrupts::PICS.lock().initialize() }; unsafe { interrupts::PICS.lock().initialize() };
x86_64::instructions::interrupts::enable(); x86_64::instructions::interrupts::enable();
} }

View File

@ -4,13 +4,14 @@ use crate::{
print, println, print, println,
rhai_shell::KEYBUFF, rhai_shell::KEYBUFF,
}; };
use cpuio::outb; use cpuio::outb;
use pic8259::ChainedPics; use pic8259::ChainedPics;
use spin::Lazy; use spin::Lazy;
use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame}; use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame};
pub const PIC_1_OFFSET: u8 = 32; pub const PIC_1_OFFSET: u8 = 32;
pub const PIC_2_OFFSET: u8 = PIC_1_OFFSET + 8; pub const PIC_2_OFFSET: u8 = PIC_1_OFFSET + 8;
pub static PICS: spin::Mutex<ChainedPics> = pub static PICS: spin::Mutex<ChainedPics> =
spin::Mutex::new(unsafe { ChainedPics::new(PIC_1_OFFSET, PIC_2_OFFSET) }); spin::Mutex::new(unsafe { ChainedPics::new(PIC_1_OFFSET, PIC_2_OFFSET) });
@ -23,6 +24,7 @@ pub enum InterruptIndex {
// SecondInterrupt = PIC_2_OFFSET, // SecondInterrupt = PIC_2_OFFSET,
Cmos = 0x70, Cmos = 0x70,
} }
impl InterruptIndex { impl InterruptIndex {
fn as_u8(self) -> u8 { fn as_u8(self) -> u8 {
self as u8 self as u8
@ -31,9 +33,6 @@ impl InterruptIndex {
usize::from(self.as_u8()) usize::from(self.as_u8())
} }
} }
pub fn init_idt() {
IDT.load();
}
static IDT: Lazy<InterruptDescriptorTable> = Lazy::new(|| { static IDT: Lazy<InterruptDescriptorTable> = Lazy::new(|| {
let mut idt = InterruptDescriptorTable::new(); let mut idt = InterruptDescriptorTable::new();
@ -58,7 +57,7 @@ static IDT: Lazy<InterruptDescriptorTable> = Lazy::new(|| {
extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) { extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) {
println!("EXCEPTION: BREAKPOINT\n{:#?}", stack_frame); println!("EXCEPTION: BREAKPOINT\n{:#?}", stack_frame);
} }
// new
extern "x86-interrupt" fn double_fault_handler( extern "x86-interrupt" fn double_fault_handler(
stack_frame: InterruptStackFrame, stack_frame: InterruptStackFrame,
error_code: u64, error_code: u64,
@ -68,6 +67,7 @@ extern "x86-interrupt" fn double_fault_handler(
error_code, stack_frame error_code, stack_frame
); );
} }
extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFrame) { extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFrame) {
kernel::tick(); kernel::tick();
unsafe { unsafe {
@ -75,6 +75,7 @@ extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFr
.notify_end_of_interrupt(InterruptIndex::Timer.as_u8()); .notify_end_of_interrupt(InterruptIndex::Timer.as_u8());
} }
} }
extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStackFrame) { extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStackFrame) {
use crate::keyboard::{ use crate::keyboard::{
CustomLayout, CustomScancodeSet, DecodedKey, DecodedKeyKind, HandleControl, KeyCode, CustomLayout, CustomScancodeSet, DecodedKey, DecodedKeyKind, HandleControl, KeyCode,
@ -146,6 +147,10 @@ extern "x86-interrupt" fn floppy_disk_interrupt_handler(_stack_frame: InterruptS
println!("EXCEPTION: FLOPPY DISK"); println!("EXCEPTION: FLOPPY DISK");
} }
pub fn init_idt() {
IDT.load();
}
fn set_pit_frequency(freq: u32) { fn set_pit_frequency(freq: u32) {
let divisor: u16 = (1193180 / freq).try_into().unwrap(); let divisor: u16 = (1193180 / freq).try_into().unwrap();

View File

@ -74,7 +74,6 @@ pub fn create_example_mapping(
} }
pub struct EmptyFrameAllocator; pub struct EmptyFrameAllocator;
unsafe impl FrameAllocator<Size4KiB> for EmptyFrameAllocator { unsafe impl FrameAllocator<Size4KiB> for EmptyFrameAllocator {
fn allocate_frame(&mut self) -> Option<PhysFrame<Size4KiB>> { fn allocate_frame(&mut self) -> Option<PhysFrame<Size4KiB>> {
None None

View File

@ -1,16 +1,13 @@
use crate::arch::drivers::allocator;
use bootloader::{entry_point, BootInfo};
use x86_64::{
instructions::hlt,
{structures::paging::Page, VirtAddr},
};
pub mod drivers; pub mod drivers;
pub mod gdt; pub mod gdt;
pub mod init; pub mod init;
pub mod interrupts; pub mod interrupts;
pub mod memory; pub mod memory;
use crate::arch::drivers::allocator;
use bootloader::{entry_point, BootInfo};
use x86_64::{instructions::hlt, VirtAddr};
entry_point![start]; entry_point![start];
#[no_mangle] #[no_mangle]
pub fn start(boot_info: &'static BootInfo) -> ! { pub fn start(boot_info: &'static BootInfo) -> ! {
@ -19,13 +16,12 @@ pub fn start(boot_info: &'static BootInfo) -> ! {
let mut mapper = unsafe { memory::init(phys_mem_offset) }; let mut mapper = unsafe { memory::init(phys_mem_offset) };
let mut frame_allocator = let mut frame_allocator =
unsafe { memory::BootInfoFrameAllocator::init(&boot_info.memory_map) }; unsafe { memory::BootInfoFrameAllocator::init(&boot_info.memory_map) };
if false {
let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000));
memory::create_example_mapping(page, &mut mapper, &mut frame_allocator);
let page_ptr: *mut u64 = page.start_address().as_mut_ptr(); // let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000));
unsafe { page_ptr.offset(400).write_volatile(0xf021_f077_f065_804e) }; // memory::create_example_mapping(page, &mut mapper, &mut frame_allocator);
} //
// let page_ptr: *mut u64 = page.start_address().as_mut_ptr();
// unsafe { page_ptr.offset(400).write_volatile(0xf021_f077_f065_804e) };
allocator::init_heap(&mut mapper, &mut frame_allocator).expect("heap initialization failed"); allocator::init_heap(&mut mapper, &mut frame_allocator).expect("heap initialization failed");

View File

@ -1,9 +1,7 @@
use kernel::device_interface::character::CharacterDevice; use kernel::device_interface::character::CharacterDevice;
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DevNull; pub struct DevNull;
impl CharacterDevice for DevNull { impl CharacterDevice for DevNull {
fn can_read(&self) -> bool { fn can_read(&self) -> bool {
true true

View File

@ -44,5 +44,6 @@ fn add1_char(c: char) -> char {
if c == char::MAX { if c == char::MAX {
return 0x00 as char; return 0x00 as char;
} }
char::from_u32(c as u32 + 1).unwrap() char::from_u32(c as u32 + 1).unwrap()
} }

View File

@ -2,7 +2,6 @@ use kernel::device_interface::character::CharacterDevice;
#[derive(Debug)] #[derive(Debug)]
pub struct DevZero; pub struct DevZero;
impl CharacterDevice for DevZero { impl CharacterDevice for DevZero {
fn can_read(&self) -> bool { fn can_read(&self) -> bool {
true true

View File

@ -1,6 +1,5 @@
pub mod dev_null; pub mod dev_null;
pub mod dev_unicode; pub mod dev_unicode;
pub mod dev_zero; pub mod dev_zero;
pub use kernel::device_interface::character::CharacterDevice; pub use kernel::device_interface::character::CharacterDevice;

View File

@ -1,13 +1,19 @@
// ! A virtual terminal device. // ! A virtual terminal device.
use kernel::device_interface::character::CharacterDevice;
use core::ops::Not; use core::ops::Not;
use core::sync::atomic::AtomicU32;
use core::sync::atomic::Ordering;
use kernel::device_interface::character::CharacterDevice;
use shadeable::pixel_format::Rgba64; use shadeable::pixel_format::Rgba64;
pub const VTERM_HEIGHT: u32 = 40; pub const VTERM_HEIGHT: u32 = 40;
pub const VTERM_WIDTH: u32 = 100; pub const VTERM_WIDTH: u32 = 100;
pub static VIRTUAL_TERMINAL_COUNT: AtomicU32 = AtomicU32::new(0);
/// Fg and bg colors for vterm /// Fg and bg colors for vterm
pub type ColorCharacter = (Rgba64, Rgba64); pub type ColorCharacter = (Rgba64, Rgba64);
/// A vterm representation of a character /// A vterm representation of a character
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub struct VtermCharacter { pub struct VtermCharacter {
@ -25,21 +31,27 @@ impl Style {
pub fn bold(&self) -> bool { pub fn bold(&self) -> bool {
(self.0 & 0x01) > 0 (self.0 & 0x01) > 0
} }
pub fn underlined(&self) -> bool { pub fn underlined(&self) -> bool {
(self.0 & 0x02) > 0 (self.0 & 0x02) > 0
} }
pub fn italic(&self) -> bool { pub fn italic(&self) -> bool {
(self.0 & 0x04) > 0 (self.0 & 0x04) > 0
} }
pub fn blinking(&self) -> bool { pub fn blinking(&self) -> bool {
(self.0 & 0x08) > 0 (self.0 & 0x08) > 0
} }
pub fn reversed(&self) -> bool { pub fn reversed(&self) -> bool {
(self.0 & 0x10) > 0 (self.0 & 0x10) > 0
} }
pub fn struck(&self) -> bool { pub fn struck(&self) -> bool {
(self.0 & 0x20) > 0 (self.0 & 0x20) > 0
} }
#[must_use] #[must_use]
pub fn set_bold(mut self, v: bool) -> Self { pub fn set_bold(mut self, v: bool) -> Self {
if v { if v {
@ -49,6 +61,7 @@ impl Style {
} }
self self
} }
#[must_use] #[must_use]
pub fn set_underlined(mut self, v: bool) -> Self { pub fn set_underlined(mut self, v: bool) -> Self {
if v { if v {
@ -58,6 +71,7 @@ impl Style {
} }
self self
} }
#[must_use] #[must_use]
pub fn set_italic(mut self, v: bool) -> Self { pub fn set_italic(mut self, v: bool) -> Self {
if v { if v {
@ -67,6 +81,7 @@ impl Style {
} }
self self
} }
#[must_use] #[must_use]
pub fn set_blinking(mut self, v: bool) -> Self { pub fn set_blinking(mut self, v: bool) -> Self {
if v { if v {
@ -76,6 +91,7 @@ impl Style {
} }
self self
} }
#[must_use] #[must_use]
pub fn set_reversed(mut self, v: bool) -> Self { pub fn set_reversed(mut self, v: bool) -> Self {
if v { if v {
@ -85,6 +101,7 @@ impl Style {
} }
self self
} }
#[must_use] #[must_use]
pub fn set_struck(mut self, v: bool) -> Self { pub fn set_struck(mut self, v: bool) -> Self {
if v { if v {
@ -95,18 +112,23 @@ impl Style {
self self
} }
} }
#[derive(Debug)] #[derive(Debug)]
pub struct VTerm { pub struct VTerm {
pub characters: [[VtermCharacter; VTERM_WIDTH as usize]; VTERM_HEIGHT as usize],
pub cursor_visible: bool,
/// Internal ID of the vterm /// Internal ID of the vterm
iid: u32, iid: u32,
pub characters: [[VtermCharacter; VTERM_WIDTH as usize]; VTERM_HEIGHT as usize],
/// The internal representation of the vterm /// The internal representation of the vterm
style: Style, style: Style,
/// The cursor position in layout x,y /// The cursor position in layout x,y
cursor_position: (u32, u32), cursor_position: (u32, u32),
pub cursor_visible: bool,
key_buff: Vec<char>, key_buff: Vec<char>,
} }
impl Default for VTerm { impl Default for VTerm {
fn default() -> Self { fn default() -> Self {
VTerm { VTerm {
@ -150,6 +172,7 @@ impl VTerm {
self.cursor_position.1 = y; self.cursor_position.1 = y;
} }
} }
/// Set the vterm style /// Set the vterm style
pub fn set_vterm_style(&mut self, style: Style) { pub fn set_vterm_style(&mut self, style: Style) {
self.style = style; self.style = style;
@ -229,6 +252,7 @@ impl CharacterDevice for VTerm {
char_color: (0xff_ff_ff_ff, 0x00_00_00_00), char_color: (0xff_ff_ff_ff, 0x00_00_00_00),
style: Style::default(), style: Style::default(),
}; VTERM_WIDTH as usize]; VTERM_HEIGHT as usize]; }; VTERM_WIDTH as usize]; VTERM_HEIGHT as usize];
self.cursor_position = (0, 0); self.cursor_position = (0, 0);
self.cursor_visible = true; self.cursor_visible = true;
self.style = Style::default(); self.style = Style::default();
@ -238,7 +262,3 @@ impl CharacterDevice for VTerm {
true true
} }
} }
pub static VIRTUAL_TERMINAL_COUNT: AtomicU32 = AtomicU32::new(0);
use core::sync::atomic::AtomicU32;
use core::sync::atomic::Ordering;

View File

@ -1,15 +1,14 @@
#[derive(Debug)] #[derive(Debug)]
pub enum Vendor { pub enum Vendor {
Unknown = 0, Unknown = 0,
Ati = 1002, Ati = 1002,
} }
pub fn match_vendor(id: u16) -> Vendor { pub fn match_vendor(id: u16) -> Vendor {
use Vendor::*; use Vendor::*;
match id { match id {
1002 => Ati, 1002 => Ati,
_ => Unknown, _ => Unknown,
} }
} }

View File

@ -2,39 +2,52 @@ pub mod character_devs;
pub mod id; pub mod id;
pub mod pci_inner; pub mod pci_inner;
use hashbrown::HashMap;
use spin::Lazy;
mod dev_vterm; mod dev_vterm;
pub use self::Device::*;
use crate::devices::dev_vterm::VTerm; use crate::devices::dev_vterm::VTerm;
use character_devs::{dev_null::DevNull, dev_unicode::DevUnicode, dev_zero::DevZero};
use hashbrown::HashMap;
use kernel::device_interface::character::CharacterDevice; use kernel::device_interface::character::CharacterDevice;
use spin::Lazy;
pub static DEVICE_TABLE: Lazy<spin::Mutex<DeviceTable>> =
Lazy::new(|| spin::Mutex::new(DeviceTable::new()));
// FIXME: This is a hack to hold a device. // FIXME: This is a hack to hold a device.
// #[derive(Debug)] // #[derive(Debug)]
pub enum Device { pub enum Device {
Character(Box<dyn CharacterDevice>), Character(Box<dyn CharacterDevice>),
Vterm(Box<VTerm>), Vterm(Box<VTerm>),
} }
unsafe impl Sync for Device {} unsafe impl Sync for Device {}
unsafe impl Send for Device {} unsafe impl Send for Device {}
pub struct DeviceTable { pub struct DeviceTable {
pub devices: HashMap<String, Device>, pub devices: HashMap<String, Device>,
} }
use self::character_devs::{dev_null::DevNull, dev_unicode::DevUnicode, dev_zero::DevZero};
pub use self::Device::*;
impl DeviceTable { impl DeviceTable {
pub fn new() -> Self { pub fn new() -> Self {
let mut table: HashMap<String, Device> = HashMap::new(); DeviceTable {
table.insert("null".to_string(), Character(Box::new(DevNull))); devices: [
table.insert("zero".to_string(), Character(Box::new(DevZero))); ("null", Character(Box::new(DevNull))),
table.insert( ("zero", Character(Box::new(DevZero))),
"unicode".to_string(), (
Character(Box::new(DevUnicode { "unicode",
next_write_char: 0x00 as char, Character(Box::new(DevUnicode {
next_read_char: 0x00 as char, next_write_char: 0x00 as char,
})), next_read_char: 0x00 as char,
); })),
table.insert("kvterm".to_string(), Vterm(Box::new(VTerm::new()))); ),
DeviceTable { devices: table } ("kvterm", Vterm(Box::new(VTerm::new()))),
]
.into_iter()
.map(|(k, v)| (k.to_string(), v))
.collect(),
}
} }
} }
@ -43,6 +56,3 @@ impl Default for DeviceTable {
Self::new() Self::new()
} }
} }
pub static DEVICE_TABLE: Lazy<spin::Mutex<DeviceTable>> =
Lazy::new(|| spin::Mutex::new(DeviceTable::new()));

View File

@ -2,9 +2,6 @@
//! //!
//! //!
#[allow(dead_code)]
fn scan_pci_bus() {}
pub enum Vendors { pub enum Vendors {
ThreeDfxInteractiveInc = 0x121a, ThreeDfxInteractiveInc = 0x121a,
ThreeDLabs = 0x3d3d, ThreeDLabs = 0x3d3d,
@ -53,3 +50,6 @@ pub enum Vendors {
pub struct PciDevice { pub struct PciDevice {
pub vendor: Vendors, pub vendor: Vendors,
} }
#[allow(dead_code)]
fn scan_pci_bus() {}

View File

@ -1,16 +1,21 @@
#![allow(unused)] #![allow(unused)]
pub const REFRESH_RATE: u8 = 60;
pub type RefreshRate = u8;
pub type Resolution = (usize, usize);
pub type Point = (GCoord, GCoord);
pub type GCoord = usize;
pub enum GModes { pub enum GModes {
Vga800x600, Vga800x600,
Custom(u16, u16), Custom(u16, u16),
} }
pub type GCoord = usize;
// TODO remap to a bitmasked u32 // TODO remap to a bitmasked u32
/* REASON: More effecient memory wise so less overhead on the wasm memory // REASON: More effecient memory wise so less overhead on the wasm memory
Current: u32+u32+u32 // Current: u32+u32+u32
Proposed: u32 with bitmaps // Proposed: u32 with bitmaps
*/
pub struct Rgb { pub struct Rgb {
pub r: u32, pub r: u32,
pub g: u32, pub g: u32,
@ -22,13 +27,8 @@ impl Rgb {
todo!(); todo!();
} }
} }
pub type RefreshRate = u8;
pub const REFRESH_RATE: u8 = 60;
pub type Resolution = (usize, usize);
pub type Point = (GCoord, GCoord);
pub struct FrameBuffer; pub struct FrameBuffer;
// [[Rgb; 5]; 5]
pub trait Graphics { pub trait Graphics {
fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb); fn put_line(coords_start: Point, coords_end: Point, thickness: u32, color: Rgb);
fn put_rect(coords_start: Point, coords_end: Point, color: Rgb); fn put_rect(coords_start: Point, coords_end: Point, color: Rgb);

View File

@ -1,5 +1,3 @@
// TODO: Bitmasking // TODO: Bitmasking
pub enum Mouse { pub enum Mouse {
Button1, Button1,

View File

@ -3,6 +3,7 @@ use kernel::device_interface::character::CharacterDevice;
pub struct Serial { pub struct Serial {
pub base: usize, pub base: usize,
} }
impl CharacterDevice for Serial { impl CharacterDevice for Serial {
fn can_read(&self) -> bool { fn can_read(&self) -> bool {
true true
@ -28,6 +29,7 @@ impl CharacterDevice for Serial {
false false
} }
} }
pub fn new_serial_test() { pub fn new_serial_test() {
let mut serial = Serial { base: 0x3F8 }; let mut serial = Serial { base: 0x3F8 };
serial.initialize(); serial.initialize();

View File

@ -1,5 +1,6 @@
// TODO improve tokenizer/parser use logos::{Lexer, Logos};
// TODO improve tokenizer/parser
pub fn colorify(eval: &str) { pub fn colorify(eval: &str) {
let y = eval.split('$'); let y = eval.split('$');
for z in y { for z in y {
@ -62,8 +63,6 @@ pub fn colorify(eval: &str) {
} }
} }
use logos::Logos;
#[derive(Logos, Debug, PartialEq)] #[derive(Logos, Debug, PartialEq)]
pub enum Token { pub enum Token {
// Hex(u32), // Hex(u32),
@ -80,6 +79,7 @@ pub enum Token {
#[regex(r"[ \t\n\f]+", logos::skip)] #[regex(r"[ \t\n\f]+", logos::skip)]
Error, Error,
} }
pub fn colorify_2(eval: &str) { pub fn colorify_2(eval: &str) {
let lexer = Token::lexer(eval); let lexer = Token::lexer(eval);
for token in lexer { for token in lexer {
@ -100,9 +100,7 @@ pub fn colorify_2(eval: &str) {
} }
} }
} }
use logos::Lexer;
// use crate::kprint;
fn parse_text(lex: &mut Lexer<Token>) -> Option<String> { fn parse_text(lex: &mut Lexer<Token>) -> Option<String> {
let slice = lex.slice(); let slice = lex.slice();
Some(String::from(slice)) Some(String::from(slice))

View File

@ -1,6 +1,6 @@
use alloc::{string::String, vec, vec::Vec}; use alloc::{string::String, vec, vec::Vec};
// use crate::String;
// use crate::Vec; pub static CLIPBOARD: spin::Mutex<Clipboard> = spin::Mutex::new(Clipboard::new());
#[derive(Debug)] #[derive(Debug)]
pub enum Mime { pub enum Mime {
@ -8,8 +8,6 @@ pub enum Mime {
Text(String), Text(String),
} }
pub static CLIPBOARD: spin::Mutex<Clipboard> = spin::Mutex::new(Clipboard::new());
// ctrl+v paste but not pop and pastes // ctrl+v paste but not pop and pastes
// ctrl+shift+v pops from the stack and pastes // ctrl+shift+v pops from the stack and pastes
// ctrl+c pushes to the stack // ctrl+c pushes to the stack
@ -20,6 +18,7 @@ pub struct Clipboard {
pub index: usize, pub index: usize,
pub pages: Vec<Mime>, pub pages: Vec<Mime>,
} }
impl Clipboard { impl Clipboard {
pub const fn new() -> Clipboard { pub const fn new() -> Clipboard {
Clipboard { Clipboard {

View File

@ -1,9 +1,6 @@
use core::time::Duration; use core::time::Duration;
// pub struct Duration {}
pub struct AtomicU32(u32); pub struct AtomicU32(u32);
impl AtomicU32 { impl AtomicU32 {
//if v != current value //if v != current value
pub fn wait(&self, _v: u32) { pub fn wait(&self, _v: u32) {
@ -21,9 +18,8 @@ impl AtomicU32 {
} }
} }
/* /*
// SUPER HANDWAVEY
SUPER HANDWAVEY // YOU WILL NEED LOCKING THAT I DIDNT WRITE OUT (you == zuurr#9735)
YOU WILL NEED LOCKING THAT I DIDNT WRITE OUT (you == zuurr#9735)
// all the red is by design // all the red is by design
pub fn futex_wait(atom: &AtomicU32, value: usize, current_thread: ThreadID) { pub fn futex_wait(atom: &AtomicU32, value: usize, current_thread: ThreadID) {
@ -44,7 +40,6 @@ pub fn futex_wake(atom: &AtomicU32, threads_to_wake: usize) {
waiting_thread.wake() waiting_thread.wake()
} }
} }
*/ */
struct FutexWaitlist { struct FutexWaitlist {

View File

@ -1,8 +1,3 @@
#![cfg_attr(
not(any(target_arch = "x86_64", target_arch = "x86")),
allow(dead_code)
)]
//! ``` //! ```
//! extern crate cupid; //! extern crate cupid;
//! //!
@ -17,10 +12,50 @@
//! } //! }
//! ``` //! ```
#![cfg_attr(
not(any(target_arch = "x86_64", target_arch = "x86")),
allow(dead_code)
)]
use core::arch::asm; use core::arch::asm;
use core::ops::Deref; use core::ops::Deref;
use core::{fmt, slice, str}; use core::{fmt, slice, str};
// 3 calls of 4 registers of 4 bytes
const BRAND_STRING_LENGTH: usize = 3 * 4 * 4;
macro_rules! bit {
($reg:ident, {$($idx:expr => $name:ident),+ $(,)?}) => {
$(pub fn $name(self) -> bool {
((self.$reg >> $idx) & 1) != 0
})+
}
}
macro_rules! dump {
($me:expr, $f: expr, $sname:expr, {$($name:ident),+ $(,)?}) => {
$f.debug_struct($sname)
$(.field(stringify!($name), &$me.$name()))+
.finish()
}
}
macro_rules! delegate_flag {
($item:ident, {$($name:ident),+ $(,)?}) => {
$(pub fn $name(&self) -> bool {
self.$item.map(|i| i.$name()).unwrap_or(false)
})+
}
}
macro_rules! master_attr_reader {
($name:ident, $kind:ty) => {
pub fn $name(&self) -> Option<&$kind> {
self.$name.as_ref()
}
};
}
#[repr(u32)] #[repr(u32)]
pub enum RequestType { pub enum RequestType {
BasicInformation = 0x00000000, BasicInformation = 0x00000000,
@ -32,7 +67,7 @@ pub enum RequestType {
BrandString1 = 0x80000002, BrandString1 = 0x80000002,
BrandString2 = 0x80000003, BrandString2 = 0x80000003,
BrandString3 = 0x80000004, BrandString3 = 0x80000004,
// reserved = 0x80000005, // reserved = 0x80000005,
CacheLine = 0x80000006, CacheLine = 0x80000006,
TimeStampCounter = 0x80000007, TimeStampCounter = 0x80000007,
PhysicalAddressSize = 0x80000008, PhysicalAddressSize = 0x80000008,
@ -70,7 +105,6 @@ pub fn master() -> Option<Master> {
// The bit positions are inclusive. // The bit positions are inclusive.
fn bits_of(val: u32, start_bit: u8, end_bit: u8) -> u32 { fn bits_of(val: u32, start_bit: u8, end_bit: u8) -> u32 {
let mut silly = 0; let mut silly = 0;
for _ in start_bit..end_bit + 1 { for _ in start_bit..end_bit + 1 {
silly <<= 1; silly <<= 1;
silly |= 1; silly |= 1;
@ -85,38 +119,6 @@ pub fn as_bytes(v: &u32) -> &[u8] {
unsafe { slice::from_raw_parts(start, 4) } unsafe { slice::from_raw_parts(start, 4) }
} }
macro_rules! bit {
($reg:ident, {$($idx:expr => $name:ident),+}) => {
$(pub fn $name(self) -> bool {
((self.$reg >> $idx) & 1) != 0
})+
}
}
macro_rules! dump {
($me:expr, $f: expr, $sname:expr, {$($name:ident),+}) => {
$f.debug_struct($sname)
$(.field(stringify!($name), &$me.$name()))+
.finish()
}
}
macro_rules! delegate_flag {
($item:ident, {$($name:ident),+}) => {
$(pub fn $name(&self) -> bool {
self.$item.map(|i| i.$name()).unwrap_or(false)
})+
}
}
macro_rules! master_attr_reader {
($name:ident, $kind:ty) => {
pub fn $name(&self) -> Option<&$kind> {
self.$name.as_ref()
}
};
}
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct VersionInformation { pub struct VersionInformation {
eax: u32, eax: u32,
@ -246,8 +248,8 @@ impl VersionInformation {
27 => osxsave, 27 => osxsave,
28 => avx, 28 => avx,
29 => f16c, 29 => f16c,
30 => rdrand 30 => rdrand,
// 31 - unused // 31 - unused,
}); });
bit!(edx, { bit!(edx, {
@ -282,7 +284,7 @@ impl VersionInformation {
28 => htt, 28 => htt,
29 => tm, 29 => tm,
// 30 -reserved // 30 -reserved
31 => pbe 31 => pbe,
}); });
} }
@ -357,7 +359,7 @@ impl fmt::Debug for VersionInformation {
ss, ss,
htt, htt,
tm, tm,
pbe pbe,
}) })
} }
} }
@ -379,7 +381,7 @@ impl ExtendedProcessorSignature {
// 1-4 reserved // 1-4 reserved
5 => lzcnt, 5 => lzcnt,
// 6-7 reserved // 6-7 reserved
8 => prefetchw 8 => prefetchw,
// 9-31 reserved // 9-31 reserved
}); });
@ -392,7 +394,7 @@ impl ExtendedProcessorSignature {
26 => gigabyte_pages, 26 => gigabyte_pages,
27 => rdtscp_and_ia32_tsc_aux, 27 => rdtscp_and_ia32_tsc_aux,
// 28 reserved // 28 reserved
29 => intel_64_bit_architecture 29 => intel_64_bit_architecture,
// 30-31 reserved // 30-31 reserved
}); });
} }
@ -407,14 +409,11 @@ impl fmt::Debug for ExtendedProcessorSignature {
execute_disable, execute_disable,
gigabyte_pages, gigabyte_pages,
rdtscp_and_ia32_tsc_aux, rdtscp_and_ia32_tsc_aux,
intel_64_bit_architecture intel_64_bit_architecture,
}) })
} }
} }
// 3 calls of 4 registers of 4 bytes
const BRAND_STRING_LENGTH: usize = 3 * 4 * 4;
pub struct BrandString { pub struct BrandString {
bytes: [u8; BRAND_STRING_LENGTH], bytes: [u8; BRAND_STRING_LENGTH],
} }
@ -507,7 +506,7 @@ impl ThermalPowerManagementInformation {
9 => hwp_activity_window, 9 => hwp_activity_window,
10 => hwp_energy_performance_preference, 10 => hwp_energy_performance_preference,
// 12 - reserved // 12 - reserved
13 => hdc 13 => hdc,
}); });
pub fn number_of_interrupt_thresholds(self) -> u32 { pub fn number_of_interrupt_thresholds(self) -> u32 {
@ -535,9 +534,7 @@ impl fmt::Debug for ThermalPowerManagementInformation {
hwp_activity_window, hwp_activity_window,
hwp_energy_performance_preference, hwp_energy_performance_preference,
hdc, hdc,
number_of_interrupt_thresholds, number_of_interrupt_thresholds,
hardware_coordination_feedback, hardware_coordination_feedback,
performance_energy_bias performance_energy_bias
}) })
@ -578,7 +575,7 @@ impl StructuredExtendedInformation {
19 => adx, 19 => adx,
20 => smap, 20 => smap,
// 21-24 - reserved // 21-24 - reserved
25 => intel_processor_trace 25 => intel_processor_trace,
// 26-31 - reserved // 26-31 - reserved
}); });
@ -607,7 +604,7 @@ impl fmt::Debug for StructuredExtendedInformation {
adx, adx,
smap, smap,
intel_processor_trace, intel_processor_trace,
prefetchwt1 prefetchwt1,
}) })
} }
} }
@ -625,7 +622,6 @@ pub enum CacheLineAssociativity {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct CacheLine(u32); pub struct CacheLine(u32);
impl CacheLine { impl CacheLine {
fn new() -> CacheLine { fn new() -> CacheLine {
let (_, _, c, _) = cpuid(RequestType::CacheLine); let (_, _, c, _) = cpuid(RequestType::CacheLine);
@ -690,7 +686,6 @@ impl fmt::Debug for TimeStampCounter {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct PhysicalAddressSize(u32); pub struct PhysicalAddressSize(u32);
impl PhysicalAddressSize { impl PhysicalAddressSize {
fn new() -> PhysicalAddressSize { fn new() -> PhysicalAddressSize {
let (a, _, _, _) = cpuid(RequestType::PhysicalAddressSize); let (a, _, _, _) = cpuid(RequestType::PhysicalAddressSize);
@ -874,7 +869,7 @@ impl Master {
ss, ss,
htt, htt,
tm, tm,
pbe pbe,
}); });
delegate_flag!(thermal_power_management_information, { delegate_flag!(thermal_power_management_information, {
@ -890,7 +885,7 @@ impl Master {
hwp_energy_performance_preference, hwp_energy_performance_preference,
hdc, hdc,
hardware_coordination_feedback, hardware_coordination_feedback,
performance_energy_bias performance_energy_bias,
}); });
delegate_flag!(structured_extended_information, { delegate_flag!(structured_extended_information, {
@ -922,7 +917,7 @@ impl Master {
execute_disable, execute_disable,
gigabyte_pages, gigabyte_pages,
rdtscp_and_ia32_tsc_aux, rdtscp_and_ia32_tsc_aux,
intel_64_bit_architecture intel_64_bit_architecture,
}); });
delegate_flag!(time_stamp_counter, { invariant_tsc }); delegate_flag!(time_stamp_counter, { invariant_tsc });
@ -933,6 +928,7 @@ impl Default for Master {
Self::new() Self::new()
} }
} }
/* /*
cfg_if! { cfg_if! {
if #[cfg(any(target_arch = "x86_64", target_arch = "x86"))] { if #[cfg(any(target_arch = "x86_64", target_arch = "x86"))] {

View File

@ -1,15 +1,5 @@
// Can be standardized use super::systeminfo::SystemMemory;
// NOTE: Move this to relib
pub struct SemanticVersion {
pub major: u8,
pub minor: u8,
pub patch: u8,
}
impl core::fmt::Display for SemanticVersion {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "v{}.{}.{}", self.major, self.minor, self.patch)
}
}
// NOTE: Move to somewhere else // NOTE: Move to somewhere else
pub static KINFO: KernelInfo = KernelInfo { pub static KINFO: KernelInfo = KernelInfo {
kernel_version: SemanticVersion { kernel_version: SemanticVersion {
@ -19,6 +9,21 @@ pub static KINFO: KernelInfo = KernelInfo {
}, },
memory: SystemMemory { used: 0, total: 0 }, memory: SystemMemory { used: 0, total: 0 },
}; };
// Can be standardized
// NOTE: Move this to relib
pub struct SemanticVersion {
pub major: u8,
pub minor: u8,
pub patch: u8,
}
impl core::fmt::Display for SemanticVersion {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "v{}.{}.{}", self.major, self.minor, self.patch)
}
}
/// simple info you would want to know in a neofetch like program /// simple info you would want to know in a neofetch like program
pub struct KernelInfo { pub struct KernelInfo {
// os: String, // os: String,
@ -28,4 +33,3 @@ pub struct KernelInfo {
// gpu: String, // gpu: String,
pub memory: SystemMemory, pub memory: SystemMemory,
} }
use super::systeminfo::SystemMemory;

View File

@ -5,6 +5,7 @@ pub struct MailBoxes {
flags: u8, flags: u8,
mailboxes: [u64; 4], mailboxes: [u64; 4],
} }
impl MailBoxes { impl MailBoxes {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
@ -12,15 +13,18 @@ impl MailBoxes {
mailboxes: [0; 4], mailboxes: [0; 4],
} }
} }
pub fn reset(&mut self) { pub fn reset(&mut self) {
self.flags = 0b0000_0000; self.flags = 0b0000_0000;
self.mailboxes = [0; 4]; self.mailboxes = [0; 4];
} }
pub fn set_mailbox(&mut self, mailbox_num: u8, mailbox_data: u64) { pub fn set_mailbox(&mut self, mailbox_num: u8, mailbox_data: u64) {
if let 0..=3 = mailbox_num { if let 0..=3 = mailbox_num {
self.mailboxes[mailbox_num as usize] = mailbox_data self.mailboxes[mailbox_num as usize] = mailbox_data
} }
} }
pub fn set_flag(&mut self, flag_num: u8) { pub fn set_flag(&mut self, flag_num: u8) {
match flag_num { match flag_num {
0 => { 0 => {

View File

@ -3,7 +3,6 @@
pub mod absi; pub mod absi;
pub mod clip; pub mod clip;
pub mod futex; pub mod futex;
// pub mod info;
pub mod info; pub mod info;
pub mod kinfo; pub mod kinfo;
pub mod mail; pub mod mail;
@ -11,4 +10,5 @@ pub mod server;
pub mod systeminfo; pub mod systeminfo;
pub mod virtual_memory; pub mod virtual_memory;
pub mod y_compositor; pub mod y_compositor;
pub const BANNER: &str = include_str!("banner.txt"); pub const BANNER: &str = include_str!("banner.txt");

View File

@ -5,4 +5,3 @@ pub struct Notification {
text_body: String, text_body: String,
time: u64, time: u64,
} }
impl Notification {}

View File

@ -1,8 +1,9 @@
pub type PackageName = String;
use crate::experiments::kinfo::SemanticVersion; use crate::experiments::kinfo::SemanticVersion;
// Scuffed // Scuffed
pub type Hash = u8; pub type Hash = u8;
pub type PackageName = String;
pub struct MetaPackage { pub struct MetaPackage {
pub name: u8, pub name: u8,
pub version: SemanticVersion, pub version: SemanticVersion,

View File

@ -1,10 +1,13 @@
pub trait Server { pub trait Server {
/// Initialize the server and return a number /// Initialize the server and return a number
fn initialize() -> u32; fn initialize() -> u32;
/// kill the server /// kill the server
fn kill() -> bool; fn kill() -> bool;
// put data in the servers outbox // put data in the servers outbox
fn send(); fn send();
// put data in the servers inbox and notify it // put data in the servers inbox and notify it
fn recieve(); fn recieve();
} }

View File

@ -1,36 +1,6 @@
// Can be standardized // Can be standardized
// NOTE: move the file to the src/ dir // NOTE: move the file to the src/ dir
pub struct SystemMemory {
pub used: u64,
pub total: u64,
}
impl core::fmt::Display for SystemMemory {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "{} Bytes / {} Bytes", self.used, self.total)
}
}
/*
pub fn format_system_info() -> core::string::String {
let x = format!(
"{}
OS: AbleOS
Host: ComputAble
Kernel: {}
Uptime: 0:0:0
Packages: 0
Shell: Ashell
Gpu: MIPS32 R4000 R4k
Cpu: {}
Memory: {}
",
crate::experiments::BANNER,
crate::experiments::kinfo::KINFO.kernel_version,
crate::arch::ARCH,
crate::experiments::kinfo::KINFO.memory
);
return x;
}
// */
pub const KERNEL_VERSION: &str = env!("CARGO_PKG_VERSION"); pub const KERNEL_VERSION: &str = env!("CARGO_PKG_VERSION");
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
/// A constant to check if the kernel is in debug mode /// A constant to check if the kernel is in debug mode
@ -38,3 +8,14 @@ pub const RELEASE_TYPE: &str = "debug";
#[cfg(not(debug_assertions))] #[cfg(not(debug_assertions))]
/// A constant to check if the kernel is in release mode /// A constant to check if the kernel is in release mode
pub const RELEASE_TYPE: &str = "release"; pub const RELEASE_TYPE: &str = "release";
pub struct SystemMemory {
pub used: u64,
pub total: u64,
}
impl core::fmt::Display for SystemMemory {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "{} Bytes / {} Bytes", self.used, self.total)
}
}

View File

@ -4,4 +4,4 @@ pub struct Scheduler {
executables: usize, executables: usize,
} }
pub struct RunQueue {} pub struct RunQueue;

View File

@ -1,5 +1,4 @@
pub struct Compositor; pub struct Compositor;
impl Compositor { impl Compositor {
pub fn new() -> Self { pub fn new() -> Self {
Self Self

View File

@ -1,16 +1,17 @@
use crate::driver_traits::graphics::Point; use crate::driver_traits::graphics::Point;
pub type MenuBar = Vec<MenuOption>;
pub struct MenuOption { pub struct MenuOption {
symbol: char, symbol: char,
} }
pub type MenuBar = Vec<MenuOption>;
pub struct Window { pub struct Window {
title: String, title: String,
position: Point, position: Point,
fullscreen: bool, fullscreen: bool,
} }
// all of these should return a result // all of these should return a result
impl Window { impl Window {
pub fn new(title: String, position: Point, fullscreen: bool) -> Self { pub fn new(title: String, position: Point, fullscreen: bool) -> Self {

View File

@ -1 +0,0 @@

View File

@ -8,14 +8,8 @@ use ext2::{
}; };
use spin::Lazy; use spin::Lazy;
fn load_fs() -> Synced<Ext2<Size1024, Vec<u8>>> { pub static FILE_SYSTEM: Lazy<spin::Mutex<Synced<Ext2<Size1024, Vec<u8>>>>> =
let mut volume = Vec::new(); Lazy::new(|| spin::Mutex::new(load_fs()));
volume.extend_from_slice(include_bytes!("../../../userland/root_fs/ext2.img"));
Synced::<Ext2<Size1024, _>>::new(volume).unwrap()
}
// use serde::__private::from_utf8_lossy;
pub fn walk<S: SectorSize, V: Volume<u8, S>>( pub fn walk<S: SectorSize, V: Volume<u8, S>>(
fs: &Synced<Ext2<S, V>>, fs: &Synced<Ext2<S, V>>,
@ -40,5 +34,9 @@ pub fn walk<S: SectorSize, V: Volume<u8, S>>(
} }
} }
pub static FILE_SYSTEM: Lazy<spin::Mutex<Synced<Ext2<Size1024, Vec<u8>>>>> = fn load_fs() -> Synced<Ext2<Size1024, Vec<u8>>> {
Lazy::new(|| spin::Mutex::new(load_fs())); let mut volume = Vec::new();
volume.extend_from_slice(include_bytes!("../../../userland/root_fs/ext2.img"));
Synced::<Ext2<Size1024, _>>::new(volume).unwrap()
}

View File

@ -1,9 +1,13 @@
// use crate::vga_e::VGAE;
use ab_glyph::{Font, FontRef, Glyph}; use ab_glyph::{Font, FontRef, Glyph};
use shadeable::{evaluate_shader, pixel_format::Rgba64}; use shadeable::{evaluate_shader, pixel_format::Rgba64};
use spin::Lazy; use spin::Lazy;
// use vga::{colors::Color16, writers::GraphicsWriter};
pub static SCREEN_BUFFER: Lazy<spin::Mutex<ScreenBuffer>> =
Lazy::new(|| spin::Mutex::new(ScreenBuffer::new(640, 480)));
const FONT_SCALE: f32 = 1.6;
const GLYPH_HEIGHT: f32 = 18.0;
const GLYPH_WIDTH: f32 = 10.0;
#[derive(Debug)] #[derive(Debug)]
pub struct ScreenSize { pub struct ScreenSize {
@ -11,13 +15,6 @@ pub struct ScreenSize {
pub y: usize, pub y: usize,
} }
const FONT_SCALE: f32 = 1.6;
const GLYPH_HEIGHT: f32 = 18.0;
const GLYPH_WIDTH: f32 = 10.0;
pub static SCREEN_BUFFER: Lazy<spin::Mutex<ScreenBuffer>> =
Lazy::new(|| spin::Mutex::new(ScreenBuffer::new(640, 480)));
impl ScreenSize { impl ScreenSize {
pub fn new(x: usize, y: usize) -> Self { pub fn new(x: usize, y: usize) -> Self {
Self { x, y } Self { x, y }
@ -32,7 +29,7 @@ pub enum GraphicsReturn {
pub struct ScreenBuffer { pub struct ScreenBuffer {
pub size: ScreenSize, pub size: ScreenSize,
pub clear_color: Rgba64, pub clear_color: Rgba64,
pub buff: Box<[Rgba64]>, // Vec<Rgba64>, pub buff: Box<[Rgba64]>,
} }
impl ScreenBuffer { impl ScreenBuffer {
@ -69,6 +66,7 @@ impl ScreenBuffer {
} }
pub fn blit(&mut self, _width: usize, _height: usize) {} pub fn blit(&mut self, _width: usize, _height: usize) {}
pub fn draw_filled_rect(&mut self, x1: usize, y1: usize, x2: usize, y2: usize, color: Rgba64) { pub fn draw_filled_rect(&mut self, x1: usize, y1: usize, x2: usize, y2: usize, color: Rgba64) {
for y in y1..y2 { for y in y1..y2 {
for x in x1..x2 { for x in x1..x2 {
@ -198,38 +196,6 @@ impl ScreenBuffer {
} }
} }
} }
/*
pub trait VgaBuffer {
fn copy_to_buffer(&self) -> GraphicsReturn;
}
impl VgaBuffer for ScreenBuffer {
fn copy_to_buffer(&self) -> GraphicsReturn {
let mode = VGAE.lock();
for y in 0..self.size.y {
for x in 0..self.size.x {
use shadeable::pixel_format::into_vga_16;
let vga_color = into_vga_16(self.buff[y * self.size.x + x]);
// let vga_color = vga::colors::Color16::Cyan;
if Color16::Cyan != vga_color {
mode.set_pixel(x, y, vga_color);
}
}
}
GraphicsReturn::Ok
}
}
*/
pub fn get_coordinates(x1: i32, y1: i32, x2: i32, y2: i32) -> Vec<(usize, usize)> { pub fn get_coordinates(x1: i32, y1: i32, x2: i32, y2: i32) -> Vec<(usize, usize)> {
let mut coordinates: Vec<(usize, usize)> = vec![]; let mut coordinates: Vec<(usize, usize)> = vec![];
@ -271,5 +237,6 @@ pub fn get_coordinates(x1: i32, y1: i32, x2: i32, y2: i32) -> Vec<(usize, usize)
current_y += sy; current_y += sy;
} }
} }
coordinates coordinates
} }

View File

@ -2,104 +2,382 @@ use crate::{
DecodedKey, HandleControl, KeyCode, KeyboardLayout, LayoutEntry, LayoutEntryKind, Modifiers, DecodedKey, HandleControl, KeyCode, KeyboardLayout, LayoutEntry, LayoutEntryKind, Modifiers,
}; };
// Do not edit this file directly. Instead, create a `Keyboard` and modify that.
pub struct CustomLayout { pub struct CustomLayout {
mapping: [LayoutEntry; 256], mapping: [LayoutEntry; 256],
} }
impl Default for CustomLayout { impl Default for CustomLayout {
fn default() -> Self { fn default() -> Self {
Self::new_us104key() Self::new_us104key()
} }
} }
#[rustfmt::skip]
impl CustomLayout { impl CustomLayout {
pub fn new_us104key() -> Self { pub fn new_us104key() -> Self {
let mut mapping = Self { let mut mapping = Self {
mapping: [LayoutEntry::default(); 256], mapping: [LayoutEntry::default(); 256],
}; };
mapping.set(KeyCode::BackTick, LayoutEntry::regular().unshifted('`').shifted('`'));
mapping.set(KeyCode::Escape, LayoutEntry::regular().unshifted('\x1B')); mapping.set(
mapping.set(KeyCode::Key0, LayoutEntry::regular().unshifted('0').shifted(')')); KeyCode::BackTick,
mapping.set(KeyCode::Key1, LayoutEntry::regular().unshifted('1').shifted('!')); LayoutEntry::regular().unshifted('`').shifted('`'),
mapping.set(KeyCode::Key2, LayoutEntry::regular().unshifted('2').shifted('@')); );
mapping.set(KeyCode::Key3, LayoutEntry::regular().unshifted('3').shifted('#')); mapping.set(KeyCode::Escape, LayoutEntry::regular().unshifted('\x1B'));
mapping.set(KeyCode::Key4, LayoutEntry::regular().unshifted('4').shifted('$')); mapping.set(
mapping.set(KeyCode::Key5, LayoutEntry::regular().unshifted('5').shifted('%')); KeyCode::Key0,
mapping.set(KeyCode::Key6, LayoutEntry::regular().unshifted('6').shifted('^')); LayoutEntry::regular().unshifted('0').shifted(')'),
mapping.set(KeyCode::Key7, LayoutEntry::regular().unshifted('7').shifted('&')); );
mapping.set(KeyCode::Key8, LayoutEntry::regular().unshifted('8').shifted('*')); mapping.set(
mapping.set(KeyCode::Key9, LayoutEntry::regular().unshifted('9').shifted('(')); KeyCode::Key1,
mapping.set(KeyCode::Minus, LayoutEntry::regular().unshifted('-').shifted('_')); LayoutEntry::regular().unshifted('1').shifted('!'),
mapping.set(KeyCode::Equals, LayoutEntry::regular().unshifted('=').shifted('+')); );
mapping.set(KeyCode::Backspace, LayoutEntry::regular().all('\x08')); mapping.set(
mapping.set(KeyCode::Tab, LayoutEntry::regular().all('\x09')); KeyCode::Key2,
mapping.set(KeyCode::Q, LayoutEntry::alphabet().low('q').high('Q').raw_unicode('\u{0011}')); LayoutEntry::regular().unshifted('2').shifted('@'),
mapping.set(KeyCode::W, LayoutEntry::alphabet().low('w').high('W').raw_unicode('\u{0017}')); );
mapping.set(KeyCode::E, LayoutEntry::alphabet().low('e').high('E').raw_unicode('\u{0005}')); mapping.set(
mapping.set(KeyCode::R, LayoutEntry::alphabet().low('r').high('R').raw_unicode('\u{0012}')); KeyCode::Key3,
mapping.set(KeyCode::T, LayoutEntry::alphabet().low('t').high('T').raw_unicode('\u{0014}')); LayoutEntry::regular().unshifted('3').shifted('#'),
mapping.set(KeyCode::Y, LayoutEntry::alphabet().low('y').high('Y').raw_unicode('\u{0019}')); );
mapping.set(KeyCode::U, LayoutEntry::alphabet().low('u').high('U').raw_unicode('\u{0015}')); mapping.set(
mapping.set(KeyCode::I, LayoutEntry::alphabet().low('i').high('I').raw_unicode('\u{0009}')); KeyCode::Key4,
mapping.set(KeyCode::O, LayoutEntry::alphabet().low('o').high('O').raw_unicode('\u{000F}')); LayoutEntry::regular().unshifted('4').shifted('$'),
mapping.set(KeyCode::P, LayoutEntry::alphabet().low('p').high('P').raw_unicode('\u{0010}')); );
mapping.set(KeyCode::A, LayoutEntry::alphabet().low('a').high('A').raw_unicode('\u{0001}')); mapping.set(
mapping.set(KeyCode::S, LayoutEntry::alphabet().low('s').high('S').raw_unicode('\u{0013}')); KeyCode::Key5,
mapping.set(KeyCode::D, LayoutEntry::alphabet().low('d').high('D').raw_unicode('\u{0004}')); LayoutEntry::regular().unshifted('5').shifted('%'),
mapping.set(KeyCode::F, LayoutEntry::alphabet().low('f').high('F').raw_unicode('\u{0006}')); );
mapping.set(KeyCode::G, LayoutEntry::alphabet().low('g').high('G').raw_unicode('\u{0007}')); mapping.set(
mapping.set(KeyCode::H, LayoutEntry::alphabet().low('h').high('H').raw_unicode('\u{0008}')); KeyCode::Key6,
mapping.set(KeyCode::J, LayoutEntry::alphabet().low('j').high('J').raw_unicode('\u{000A}')); LayoutEntry::regular().unshifted('6').shifted('^'),
mapping.set(KeyCode::K, LayoutEntry::alphabet().low('k').high('K').raw_unicode('\u{000B}')); );
mapping.set(KeyCode::L, LayoutEntry::alphabet().low('l').high('L').raw_unicode('\u{000C}')); mapping.set(
mapping.set(KeyCode::Z, LayoutEntry::alphabet().low('z').high('Z').raw_unicode('\u{001A}')); KeyCode::Key7,
mapping.set(KeyCode::X, LayoutEntry::alphabet().low('x').high('X').raw_unicode('\u{0018}')); LayoutEntry::regular().unshifted('7').shifted('&'),
mapping.set(KeyCode::C, LayoutEntry::alphabet().low('c').high('C').raw_unicode('\u{0003}')); );
mapping.set(KeyCode::V, LayoutEntry::alphabet().low('v').high('V').raw_unicode('\u{0016}')); mapping.set(
mapping.set(KeyCode::B, LayoutEntry::alphabet().low('b').high('B').raw_unicode('\u{0002}')); KeyCode::Key8,
mapping.set(KeyCode::N, LayoutEntry::alphabet().low('n').high('N').raw_unicode('\u{000E}')); LayoutEntry::regular().unshifted('8').shifted('*'),
mapping.set(KeyCode::M, LayoutEntry::alphabet().low('m').high('M').raw_unicode('\u{000D}')); );
mapping.set(KeyCode::BracketSquareLeft, LayoutEntry::regular().unshifted('{').shifted('[')); mapping.set(
mapping.set(KeyCode::BracketSquareRight, LayoutEntry::regular().unshifted('}').shifted(']')); KeyCode::Key9,
mapping.set(KeyCode::BackSlash, LayoutEntry::regular().unshifted('|').shifted('\\')); LayoutEntry::regular().unshifted('9').shifted('('),
mapping.set(KeyCode::SemiColon, LayoutEntry::regular().unshifted(';').shifted(':')); );
mapping.set(KeyCode::Quote, LayoutEntry::regular().unshifted('\'').shifted('"')); mapping.set(
mapping.set(KeyCode::Enter, LayoutEntry::regular().all('\x0A')); KeyCode::Minus,
mapping.set(KeyCode::Comma, LayoutEntry::regular().unshifted(',').shifted('<')); LayoutEntry::regular().unshifted('-').shifted('_'),
mapping.set(KeyCode::Fullstop, LayoutEntry::regular().unshifted('.').shifted('>')); );
mapping.set(KeyCode::Slash, LayoutEntry::regular().unshifted('/').shifted('?')); mapping.set(
mapping.set(KeyCode::Spacebar, LayoutEntry::regular().all(' ')); KeyCode::Equals,
mapping.set(KeyCode::Delete, LayoutEntry::regular().all('\x7F')); LayoutEntry::regular().unshifted('=').shifted('+'),
mapping.set(KeyCode::NumpadSlash, LayoutEntry::numpad().all('/')); );
mapping.set(KeyCode::NumpadStar, LayoutEntry::numpad().all('*')); mapping.set(KeyCode::Backspace, LayoutEntry::regular().all('\x08'));
mapping.set(KeyCode::NumpadMinus, LayoutEntry::numpad().all('-')); mapping.set(KeyCode::Tab, LayoutEntry::regular().all('\x09'));
mapping.set(KeyCode::Numpad7, LayoutEntry::numpad().low('7').high(KeyCode::Home)); mapping.set(
mapping.set(KeyCode::Numpad8, LayoutEntry::numpad().low('8').high(KeyCode::ArrowUp)); KeyCode::Q,
mapping.set(KeyCode::Numpad9, LayoutEntry::numpad().low('9').high(KeyCode::PageUp)); LayoutEntry::alphabet()
mapping.set(KeyCode::NumpadPlus, LayoutEntry::numpad().all('+')); .low('q')
mapping.set(KeyCode::Numpad4, LayoutEntry::numpad().low('4').high(KeyCode::ArrowLeft)); .high('Q')
mapping.set(KeyCode::Numpad5, LayoutEntry::numpad().all('5')); .raw_unicode('\u{0011}'),
mapping.set(KeyCode::Numpad6, LayoutEntry::numpad().low('6').high(KeyCode::ArrowRight)); );
mapping.set(KeyCode::Numpad1, LayoutEntry::numpad().low('1').high(KeyCode::End)); mapping.set(
mapping.set(KeyCode::Numpad2, LayoutEntry::numpad().low('2').high(KeyCode::ArrowDown)); KeyCode::W,
mapping.set(KeyCode::Numpad3, LayoutEntry::numpad().low('3').high(KeyCode::PageDown)); LayoutEntry::alphabet()
mapping.set(KeyCode::Numpad0, LayoutEntry::numpad().low('0').high(KeyCode::Insert)); .low('w')
mapping.set(KeyCode::NumpadPeriod, LayoutEntry::numpad().low('.').high('\x7F')); .high('W')
mapping.set(KeyCode::NumpadEnter, LayoutEntry::numpad().all('\x0A')); .raw_unicode('\u{0017}'),
mapping );
} mapping.set(
pub fn new_us105key() -> Self { KeyCode::E,
let mut mapping = Self::new_us104key(); LayoutEntry::alphabet()
mapping.set(KeyCode::BackTick, LayoutEntry::regular().unshifted('`').shifted('¬').altgr('|')); .low('e')
mapping.set(KeyCode::Key2, LayoutEntry::regular().unshifted('2').shifted('"')); .high('E')
mapping.set(KeyCode::Quote, LayoutEntry::regular().unshifted('\'').shifted('@')); .raw_unicode('\u{0005}'),
mapping.set(KeyCode::Key3, LayoutEntry::regular().unshifted('3').shifted('£')); );
mapping.set(KeyCode::BackTick, LayoutEntry::regular().unshifted('4').shifted('$').altgr('€')); mapping.set(
mapping.set(KeyCode::HashTilde, LayoutEntry::regular().unshifted('#').shifted('~')); KeyCode::R,
mapping LayoutEntry::alphabet()
} .low('r')
.high('R')
.raw_unicode('\u{0012}'),
);
mapping.set(
KeyCode::T,
LayoutEntry::alphabet()
.low('t')
.high('T')
.raw_unicode('\u{0014}'),
);
mapping.set(
KeyCode::Y,
LayoutEntry::alphabet()
.low('y')
.high('Y')
.raw_unicode('\u{0019}'),
);
mapping.set(
KeyCode::U,
LayoutEntry::alphabet()
.low('u')
.high('U')
.raw_unicode('\u{0015}'),
);
mapping.set(
KeyCode::I,
LayoutEntry::alphabet()
.low('i')
.high('I')
.raw_unicode('\u{0009}'),
);
mapping.set(
KeyCode::O,
LayoutEntry::alphabet()
.low('o')
.high('O')
.raw_unicode('\u{000F}'),
);
mapping.set(
KeyCode::P,
LayoutEntry::alphabet()
.low('p')
.high('P')
.raw_unicode('\u{0010}'),
);
mapping.set(
KeyCode::A,
LayoutEntry::alphabet()
.low('a')
.high('A')
.raw_unicode('\u{0001}'),
);
mapping.set(
KeyCode::S,
LayoutEntry::alphabet()
.low('s')
.high('S')
.raw_unicode('\u{0013}'),
);
mapping.set(
KeyCode::D,
LayoutEntry::alphabet()
.low('d')
.high('D')
.raw_unicode('\u{0004}'),
);
mapping.set(
KeyCode::F,
LayoutEntry::alphabet()
.low('f')
.high('F')
.raw_unicode('\u{0006}'),
);
mapping.set(
KeyCode::G,
LayoutEntry::alphabet()
.low('g')
.high('G')
.raw_unicode('\u{0007}'),
);
mapping.set(
KeyCode::H,
LayoutEntry::alphabet()
.low('h')
.high('H')
.raw_unicode('\u{0008}'),
);
mapping.set(
KeyCode::J,
LayoutEntry::alphabet()
.low('j')
.high('J')
.raw_unicode('\u{000A}'),
);
mapping.set(
KeyCode::K,
LayoutEntry::alphabet()
.low('k')
.high('K')
.raw_unicode('\u{000B}'),
);
mapping.set(
KeyCode::L,
LayoutEntry::alphabet()
.low('l')
.high('L')
.raw_unicode('\u{000C}'),
);
mapping.set(
KeyCode::Z,
LayoutEntry::alphabet()
.low('z')
.high('Z')
.raw_unicode('\u{001A}'),
);
mapping.set(
KeyCode::X,
LayoutEntry::alphabet()
.low('x')
.high('X')
.raw_unicode('\u{0018}'),
);
mapping.set(
KeyCode::C,
LayoutEntry::alphabet()
.low('c')
.high('C')
.raw_unicode('\u{0003}'),
);
mapping.set(
KeyCode::V,
LayoutEntry::alphabet()
.low('v')
.high('V')
.raw_unicode('\u{0016}'),
);
mapping.set(
KeyCode::B,
LayoutEntry::alphabet()
.low('b')
.high('B')
.raw_unicode('\u{0002}'),
);
mapping.set(
KeyCode::N,
LayoutEntry::alphabet()
.low('n')
.high('N')
.raw_unicode('\u{000E}'),
);
mapping.set(
KeyCode::M,
LayoutEntry::alphabet()
.low('m')
.high('M')
.raw_unicode('\u{000D}'),
);
mapping.set(
KeyCode::BracketSquareLeft,
LayoutEntry::regular().unshifted('{').shifted('['),
);
mapping.set(
KeyCode::BracketSquareRight,
LayoutEntry::regular().unshifted('}').shifted(']'),
);
mapping.set(
KeyCode::BackSlash,
LayoutEntry::regular().unshifted('|').shifted('\\'),
);
mapping.set(
KeyCode::SemiColon,
LayoutEntry::regular().unshifted(';').shifted(':'),
);
mapping.set(
KeyCode::Quote,
LayoutEntry::regular().unshifted('\'').shifted('"'),
);
mapping.set(KeyCode::Enter, LayoutEntry::regular().all('\x0A'));
mapping.set(
KeyCode::Comma,
LayoutEntry::regular().unshifted(',').shifted('<'),
);
mapping.set(
KeyCode::Fullstop,
LayoutEntry::regular().unshifted('.').shifted('>'),
);
mapping.set(
KeyCode::Slash,
LayoutEntry::regular().unshifted('/').shifted('?'),
);
mapping.set(KeyCode::Spacebar, LayoutEntry::regular().all(' '));
mapping.set(KeyCode::Delete, LayoutEntry::regular().all('\x7F'));
mapping.set(KeyCode::NumpadSlash, LayoutEntry::numpad().all('/'));
mapping.set(KeyCode::NumpadStar, LayoutEntry::numpad().all('*'));
mapping.set(KeyCode::NumpadMinus, LayoutEntry::numpad().all('-'));
mapping.set(
KeyCode::Numpad7,
LayoutEntry::numpad().low('7').high(KeyCode::Home),
);
mapping.set(
KeyCode::Numpad8,
LayoutEntry::numpad().low('8').high(KeyCode::ArrowUp),
);
mapping.set(
KeyCode::Numpad9,
LayoutEntry::numpad().low('9').high(KeyCode::PageUp),
);
mapping.set(KeyCode::NumpadPlus, LayoutEntry::numpad().all('+'));
mapping.set(
KeyCode::Numpad4,
LayoutEntry::numpad().low('4').high(KeyCode::ArrowLeft),
);
mapping.set(KeyCode::Numpad5, LayoutEntry::numpad().all('5'));
mapping.set(
KeyCode::Numpad6,
LayoutEntry::numpad().low('6').high(KeyCode::ArrowRight),
);
mapping.set(
KeyCode::Numpad1,
LayoutEntry::numpad().low('1').high(KeyCode::End),
);
mapping.set(
KeyCode::Numpad2,
LayoutEntry::numpad().low('2').high(KeyCode::ArrowDown),
);
mapping.set(
KeyCode::Numpad3,
LayoutEntry::numpad().low('3').high(KeyCode::PageDown),
);
mapping.set(
KeyCode::Numpad0,
LayoutEntry::numpad().low('0').high(KeyCode::Insert),
);
mapping.set(
KeyCode::NumpadPeriod,
LayoutEntry::numpad().low('.').high('\x7F'),
);
mapping.set(KeyCode::NumpadEnter, LayoutEntry::numpad().all('\x0A'));
mapping
}
pub fn new_us105key() -> Self {
let mut mapping = Self::new_us104key();
mapping.set(
KeyCode::BackTick,
LayoutEntry::regular()
.unshifted('`')
.shifted('¬')
.altgr('|'),
);
mapping.set(
KeyCode::Key2,
LayoutEntry::regular().unshifted('2').shifted('"'),
);
mapping.set(
KeyCode::Quote,
LayoutEntry::regular().unshifted('\'').shifted('@'),
);
mapping.set(
KeyCode::Key3,
LayoutEntry::regular().unshifted('3').shifted('£'),
);
mapping.set(
KeyCode::BackTick,
LayoutEntry::regular()
.unshifted('4')
.shifted('$')
.altgr('€'),
);
mapping.set(
KeyCode::HashTilde,
LayoutEntry::regular().unshifted('#').shifted('~'),
);
mapping
}
pub fn set(&mut self, pos: KeyCode, entry: LayoutEntry) {
self.mapping[pos as usize] = entry;
}
} }
impl KeyboardLayout for CustomLayout { impl KeyboardLayout for CustomLayout {
fn map_keycode( fn map_keycode(
&self, &self,
@ -164,13 +442,3 @@ impl KeyboardLayout for CustomLayout {
} }
} }
} }
// Note(elfein) Not super hard to get right, but still- DO NOT TOUCH
impl CustomLayout {
// See how hard this is to get right?
// See the complexity of all the methods?
// Yeah- if you don't know what you're doing, ask before you touch!
pub fn set(&mut self, pos: KeyCode, entry: LayoutEntry) {
self.mapping[pos as usize] = entry;
}
}

View File

@ -6,17 +6,20 @@ pub struct CustomScancodeSet {
single_byte: [Option<KeyCode>; 256], single_byte: [Option<KeyCode>; 256],
extended: [Option<KeyCode>; 256], extended: [Option<KeyCode>; 256],
} }
impl Default for CustomScancodeSet { impl Default for CustomScancodeSet {
fn default() -> Self { fn default() -> Self {
Self::scancode_set1() Self::scancode_set1()
} }
} }
impl CustomScancodeSet { impl CustomScancodeSet {
pub fn scancode_set1() -> Self { pub fn scancode_set1() -> Self {
let mut scancode_set = Self { let mut scancode_set = Self {
single_byte: [None; 256], single_byte: [None; 256],
extended: [None; 256], extended: [None; 256],
}; };
scancode_set.single_byte[0x01] = Some(KeyCode::Escape); // 01 scancode_set.single_byte[0x01] = Some(KeyCode::Escape); // 01
scancode_set.single_byte[0x02] = Some(KeyCode::Key1); // 02 scancode_set.single_byte[0x02] = Some(KeyCode::Key1); // 02
scancode_set.single_byte[0x03] = Some(KeyCode::Key2); // 03 scancode_set.single_byte[0x03] = Some(KeyCode::Key2); // 03
@ -181,6 +184,7 @@ impl CustomScancodeSet {
} }
scancode_set scancode_set
} }
pub fn scancode_set2() -> Self { pub fn scancode_set2() -> Self {
Self { Self {
single_byte: [None; 256], single_byte: [None; 256],
@ -188,6 +192,7 @@ impl CustomScancodeSet {
} }
} }
} }
impl ScancodeSet for CustomScancodeSet { impl ScancodeSet for CustomScancodeSet {
fn advance_state(&self, state: &mut DecodeState, code: u8) -> Result<Option<KeyEvent>, Error> { fn advance_state(&self, state: &mut DecodeState, code: u8) -> Result<Option<KeyEvent>, Error> {
match *state { match *state {
@ -238,6 +243,7 @@ impl ScancodeSet for CustomScancodeSet {
} }
} }
} }
fn map_scancode(&self, code: u8) -> Result<KeyCode, Error> { fn map_scancode(&self, code: u8) -> Result<KeyCode, Error> {
if let Some(kc) = self.single_byte[code as usize] { if let Some(kc) = self.single_byte[code as usize] {
Ok(kc) Ok(kc)
@ -245,6 +251,7 @@ impl ScancodeSet for CustomScancodeSet {
Err(Error::UnknownKeyCode) Err(Error::UnknownKeyCode)
} }
} }
fn map_extended_scancode(&self, code: u8) -> Result<KeyCode, Error> { fn map_extended_scancode(&self, code: u8) -> Result<KeyCode, Error> {
if let Some(kc) = self.extended[code as usize] { if let Some(kc) = self.extended[code as usize] {
Ok(kc) Ok(kc)

View File

@ -1,4 +1,4 @@
use super::DecodedKey; use crate::DecodedKey;
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub enum LayoutEntryKind { pub enum LayoutEntryKind {
@ -32,6 +32,7 @@ impl LayoutEntry {
..Default::default() ..Default::default()
} }
} }
#[must_use] #[must_use]
pub fn numpad() -> Self { pub fn numpad() -> Self {
Self { Self {
@ -39,6 +40,7 @@ impl LayoutEntry {
..Default::default() ..Default::default()
} }
} }
#[must_use] #[must_use]
pub fn alphabet() -> Self { pub fn alphabet() -> Self {
Self { Self {
@ -46,36 +48,43 @@ impl LayoutEntry {
..Default::default() ..Default::default()
} }
} }
#[must_use] #[must_use]
pub fn unshifted(mut self, c: impl Into<DecodedKey>) -> Self { pub fn unshifted(mut self, c: impl Into<DecodedKey>) -> Self {
self.unshifted = Some(c.into()); self.unshifted = Some(c.into());
self self
} }
#[must_use] #[must_use]
pub fn shifted(mut self, c: impl Into<DecodedKey>) -> Self { pub fn shifted(mut self, c: impl Into<DecodedKey>) -> Self {
self.shifted = Some(c.into()); self.shifted = Some(c.into());
self self
} }
#[must_use] #[must_use]
pub fn altgr(mut self, c: impl Into<DecodedKey>) -> Self { pub fn altgr(mut self, c: impl Into<DecodedKey>) -> Self {
self.altgr = Some(c.into()); self.altgr = Some(c.into());
self self
} }
#[must_use] #[must_use]
pub fn raw_unicode(mut self, c: impl Into<DecodedKey>) -> Self { pub fn raw_unicode(mut self, c: impl Into<DecodedKey>) -> Self {
self.raw_unicode = Some(c.into()); self.raw_unicode = Some(c.into());
self self
} }
#[must_use] #[must_use]
pub fn locked(mut self, c: impl Into<DecodedKey>) -> Self { pub fn locked(mut self, c: impl Into<DecodedKey>) -> Self {
self.locked = Some(c.into()); self.locked = Some(c.into());
self self
} }
#[must_use] #[must_use]
pub fn locked_shifted(mut self, c: impl Into<DecodedKey>) -> Self { pub fn locked_shifted(mut self, c: impl Into<DecodedKey>) -> Self {
self.locked_shifted = Some(c.into()); self.locked_shifted = Some(c.into());
self self
} }
#[must_use] #[must_use]
pub fn common(self, c: impl Into<DecodedKey> + Clone) -> Self { pub fn common(self, c: impl Into<DecodedKey> + Clone) -> Self {
self.unshifted(c.clone()) self.unshifted(c.clone())
@ -83,14 +92,17 @@ impl LayoutEntry {
.locked(c.clone()) .locked(c.clone())
.locked_shifted(c) .locked_shifted(c)
} }
#[must_use] #[must_use]
pub fn low(self, c: impl Into<DecodedKey> + Clone) -> Self { pub fn low(self, c: impl Into<DecodedKey> + Clone) -> Self {
self.unshifted(c.clone()).locked_shifted(c) self.unshifted(c.clone()).locked_shifted(c)
} }
#[must_use] #[must_use]
pub fn high(self, c: impl Into<DecodedKey> + Clone) -> Self { pub fn high(self, c: impl Into<DecodedKey> + Clone) -> Self {
self.shifted(c.clone()).locked(c) self.shifted(c.clone()).locked(c)
} }
#[must_use] #[must_use]
pub fn all(self, c: impl Into<DecodedKey> + Clone) -> Self { pub fn all(self, c: impl Into<DecodedKey> + Clone) -> Self {
self.unshifted(c.clone()) self.unshifted(c.clone())

View File

@ -1,5 +1,3 @@
use super::*;
mod custom_layout; mod custom_layout;
mod custom_scancode_set; mod custom_scancode_set;
mod layout_entry; mod layout_entry;

View File

@ -1,13 +1,17 @@
#![allow(dead_code)] #![allow(dead_code)]
mod abstractions; mod abstractions;
mod small_types; mod small_types;
mod traits; mod traits;
pub use abstractions::*; pub use abstractions::*;
pub use small_types::*; pub use small_types::*;
pub use traits::*; pub use traits::*;
const KEYCODE_BITS: u8 = 11;
const EXTENDED_KEY_CODE: u8 = 0xE0; const EXTENDED_KEY_CODE: u8 = 0xE0;
const KEYCODE_BITS: u8 = 11;
const KEY_RELEASE_CODE: u8 = 0xF0; const KEY_RELEASE_CODE: u8 = 0xF0;
#[derive(Debug)] #[derive(Debug)]
pub struct Keyboard<T, S> pub struct Keyboard<T, S>
where where
@ -22,6 +26,7 @@ where
layout: T, layout: T,
set: S, set: S,
} }
impl<T, S> Keyboard<T, S> impl<T, S> Keyboard<T, S>
where where
T: KeyboardLayout + Default, T: KeyboardLayout + Default,
@ -47,14 +52,17 @@ where
set: S::default(), set: S::default(),
} }
} }
// /// Change the Ctrl key mapping.
/// Change the Ctrl key mapping.
pub fn set_ctrl_handling(&mut self, new_value: HandleControl) { pub fn set_ctrl_handling(&mut self, new_value: HandleControl) {
self.handle_ctrl = new_value; self.handle_ctrl = new_value;
} }
// /// Get the current Ctrl key mapping.
/// Get the current Ctrl key mapping.
pub fn get_ctrl_handling(&self) -> HandleControl { pub fn get_ctrl_handling(&self) -> HandleControl {
self.handle_ctrl self.handle_ctrl
} }
/// Clears the bit register. /// Clears the bit register.
/// ///
/// Call this when there is a timeout reading data from the keyboard. /// Call this when there is a timeout reading data from the keyboard.
@ -63,6 +71,7 @@ where
self.num_bits = 0; self.num_bits = 0;
self.decode_state = DecodeState::Start; self.decode_state = DecodeState::Start;
} }
/// Processes a 16-bit word from the keyboard. /// Processes a 16-bit word from the keyboard.
/// ///
/// * The start bit (0) must be in bit 0. /// * The start bit (0) must be in bit 0.
@ -74,6 +83,7 @@ where
let byte = self.check_word(word)?; let byte = self.check_word(word)?;
self.add_byte(byte) self.add_byte(byte)
} }
/// Processes an 8-bit byte from the keyboard. /// Processes an 8-bit byte from the keyboard.
/// ///
/// We assume the start, stop and parity bits have been processed and /// We assume the start, stop and parity bits have been processed and
@ -81,6 +91,7 @@ where
pub fn add_byte(&mut self, byte: u8) -> Result<Option<KeyEvent>, Error> { pub fn add_byte(&mut self, byte: u8) -> Result<Option<KeyEvent>, Error> {
self.set.advance_state(&mut self.decode_state, byte) self.set.advance_state(&mut self.decode_state, byte)
} }
/// Shift a bit into the register. /// Shift a bit into the register.
/// ///
/// Call this /or/ call `add_word` - don't call both. /// Call this /or/ call `add_word` - don't call both.
@ -97,6 +108,7 @@ where
Ok(None) Ok(None)
} }
} }
/// Processes a `KeyEvent` returned from `add_bit`, `add_byte` or `add_word` /// Processes a `KeyEvent` returned from `add_bit`, `add_byte` or `add_word`
/// and produces a decoded key. /// and produces a decoded key.
/// ///
@ -199,12 +211,15 @@ where
_ => None, _ => None,
} }
} }
fn get_bit(&self, word: u16, offset: usize) -> bool { fn get_bit(&self, word: u16, offset: usize) -> bool {
((word >> offset) & 0x0001) != 0 ((word >> offset) & 0x0001) != 0
} }
fn has_even_number_bits(&self, data: u8) -> bool { fn has_even_number_bits(&self, data: u8) -> bool {
(data.count_ones() % 2) == 0 (data.count_ones() % 2) == 0
} }
/// Check 11-bit word has 1 start bit, 1 stop bit and an odd parity bit. /// Check 11-bit word has 1 start bit, 1 stop bit and an odd parity bit.
fn check_word(&self, word: u16) -> Result<u8, Error> { fn check_word(&self, word: u16) -> Result<u8, Error> {
let start_bit = self.get_bit(word, 0); let start_bit = self.get_bit(word, 0);
@ -222,9 +237,11 @@ where
if need_parity != parity_bit { if need_parity != parity_bit {
return Err(Error::ParityError); return Err(Error::ParityError);
} }
Ok(data) Ok(data)
} }
} }
pub fn parse_format() { pub fn parse_format() {
let test = include_str!("../../keymaps/qwerty.keymap").lines(); let test = include_str!("../../keymaps/qwerty.keymap").lines();
// r#"0-NONE\n1-HI#Says HI"# // r#"0-NONE\n1-HI#Says HI"#

View File

@ -1,4 +1,5 @@
#![allow(non_snake_case)] #![allow(non_snake_case)]
#[derive(Debug)] #[derive(Debug)]
pub struct Modifiers { pub struct Modifiers {
pub lshift: bool, pub lshift: bool,
@ -9,17 +10,21 @@ pub struct Modifiers {
pub capslock: bool, pub capslock: bool,
pub alt_gr: bool, pub alt_gr: bool,
} }
impl Modifiers { impl Modifiers {
pub fn is_shifted(&self) -> bool { pub fn is_shifted(&self) -> bool {
self.lshift | self.rshift self.lshift | self.rshift
} }
pub fn is_ctrl(&self) -> bool { pub fn is_ctrl(&self) -> bool {
self.lctrl | self.rctrl self.lctrl | self.rctrl
} }
pub fn is_caps(&self) -> bool { pub fn is_caps(&self) -> bool {
self.capslock self.capslock
} }
} }
#[derive(Debug, PartialEq, Eq, Copy, Clone)] #[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum KeyState { pub enum KeyState {
Up, Up,
@ -30,11 +35,13 @@ pub struct KeyEvent {
pub code: KeyCode, pub code: KeyCode,
pub state: KeyState, pub state: KeyState,
} }
impl KeyEvent { impl KeyEvent {
pub fn new(code: KeyCode, state: KeyState) -> KeyEvent { pub fn new(code: KeyCode, state: KeyState) -> KeyEvent {
KeyEvent { code, state } KeyEvent { code, state }
} }
} }
#[derive(Debug, PartialEq, Eq, Copy, Clone)] #[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum HandleControl { pub enum HandleControl {
/// If either Ctrl key is held down, convert the letters A through Z into /// If either Ctrl key is held down, convert the letters A through Z into
@ -45,6 +52,7 @@ pub enum HandleControl {
/// and leave the letters as letters. /// and leave the letters as letters.
Ignore, Ignore,
} }
#[derive(Debug, Copy, Clone, Eq, PartialEq)] #[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum DecodeState { pub enum DecodeState {
Start, Start,
@ -52,6 +60,7 @@ pub enum DecodeState {
Release, Release,
ExtendedRelease, ExtendedRelease,
} }
/// Indicates different error conditions. /// Indicates different error conditions.
#[derive(Debug, PartialEq, Eq, Copy, Clone)] #[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum Error { pub enum Error {
@ -61,6 +70,7 @@ pub enum Error {
UnknownKeyCode, UnknownKeyCode,
InvalidState, InvalidState,
} }
#[derive(Debug, PartialEq, Eq, Copy, Clone)] #[derive(Debug, PartialEq, Eq, Copy, Clone)]
#[repr(u8)] #[repr(u8)]
pub enum DecodedKeyKind { pub enum DecodedKeyKind {
@ -73,6 +83,7 @@ pub struct DecodedKey {
pub kind: DecodedKeyKind, pub kind: DecodedKeyKind,
pub value: u32, pub value: u32,
} }
impl From<char> for DecodedKey { impl From<char> for DecodedKey {
fn from(ch: char) -> Self { fn from(ch: char) -> Self {
Self { Self {
@ -81,6 +92,7 @@ impl From<char> for DecodedKey {
} }
} }
} }
impl From<KeyCode> for DecodedKey { impl From<KeyCode> for DecodedKey {
fn from(kc: KeyCode) -> Self { fn from(kc: KeyCode) -> Self {
Self { Self {
@ -89,6 +101,7 @@ impl From<KeyCode> for DecodedKey {
} }
} }
} }
impl DecodedKey { impl DecodedKey {
pub const ZERO: Self = Self { pub const ZERO: Self = Self {
kind: DecodedKeyKind::Unicode, kind: DecodedKeyKind::Unicode,
@ -107,6 +120,7 @@ impl DecodedKey {
} }
} }
} }
macro_rules! keycode_enum { macro_rules! keycode_enum {
(@get_last $Variant:ident) => { (@get_last $Variant:ident) => {
Self::$Variant Self::$Variant
@ -134,6 +148,7 @@ macro_rules! keycode_enum {
keycode_enum!($($Variant=$Value,)* ); keycode_enum!($($Variant=$Value,)* );
}; };
} }
// This will be a way to map keys to other keys / keyyngs / macros // This will be a way to map keys to other keys / keyyngs / macros
keycode_enum! { keycode_enum! {
AltLeft = 0x00, AltLeft = 0x00,

View File

@ -1,13 +1,18 @@
use super::*; use super::Error;
use crate::{DecodeState, DecodedKey, HandleControl, KeyCode, KeyEvent, Modifiers};
pub trait ScancodeSet { pub trait ScancodeSet {
/// Handles the state logic for the decoding of scan codes into key events. /// Handles the state logic for the decoding of scan codes into key events.
fn advance_state(&self, state: &mut DecodeState, code: u8) -> Result<Option<KeyEvent>, Error>; fn advance_state(&self, state: &mut DecodeState, code: u8) -> Result<Option<KeyEvent>, Error>;
/// Convert a Scan Code set X byte to our 'KeyType' enum /// Convert a Scan Code set X byte to our 'KeyType' enum
fn map_scancode(&self, code: u8) -> Result<KeyCode, Error>; fn map_scancode(&self, code: u8) -> Result<KeyCode, Error>;
/// Convert a Scan Code Set X extended byte (prefixed E0) to our `KeyType` /// Convert a Scan Code Set X extended byte (prefixed E0) to our `KeyType`
/// enum. /// enum.
fn map_extended_scancode(&self, code: u8) -> Result<KeyCode, Error>; fn map_extended_scancode(&self, code: u8) -> Result<KeyCode, Error>;
} }
pub trait KeyboardLayout { pub trait KeyboardLayout {
/// Convert a `KeyType` enum to a Unicode character, if possible. /// Convert a `KeyType` enum to a Unicode character, if possible.
/// `KeyType::A` maps to `Some('a')` (or `Some('A')` if shifted), while /// `KeyType::A` maps to `Some('a')` (or `Some('A')` if shifted), while

View File

@ -1,15 +1,14 @@
#![allow(clippy::empty_loop)] #![allow(clippy::empty_loop)]
// use acpi::AcpiTables; use crate::info::master;
// use x86_64::instructions::interrupts::{disable, enable}; use crate::scheduler::SCHEDULER;
// use crate::{scratchpad, SCHEDULER, SCREEN_BUFFER};
use crate::{ use crate::{
arch::{init, sloop}, arch::{init, sloop},
relib::network::socket::{SimpleSock, Socket}, relib::network::socket::{SimpleSock, Socket},
scratchpad, scratchpad,
}; };
use crate::{boot_conf::KernelConfig, systeminfo::RELEASE_TYPE};
use kernel::KERNEL_VERSION;
use spin::Lazy; use spin::Lazy;
// TODO: Change this structure to allow for multiple cores loaded // TODO: Change this structure to allow for multiple cores loaded
@ -53,10 +52,3 @@ pub fn log_version_data() {
master().unwrap().brand_string().unwrap() master().unwrap().brand_string().unwrap()
); );
} }
use crate::info::master;
use kernel::KERNEL_VERSION;
use crate::scheduler::SCHEDULER;
use crate::{boot_conf::KernelConfig, systeminfo::RELEASE_TYPE};

View File

@ -4,109 +4,80 @@
//! //!
#![no_std] #![no_std]
#![feature( #![feature(abi_x86_interrupt)]
abi_x86_interrupt, #![feature(alloc_error_handler)]
asm_sym, #![feature(prelude_import)]
alloc_error_handler,
core_intrinsics, #[macro_use]
exclusive_range_pattern, pub extern crate log;
lang_items,
naked_functions, pub extern crate alloc;
slice_pattern, pub extern crate externc_libm as libm;
prelude_import
)]
/// Contains architecture specific code for aarch64. /// Contains architecture specific code for aarch64.
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
#[path = "arch/aarch64/mod.rs"] #[path = "arch/aarch64/mod.rs"]
pub mod arch; pub mod arch;
/// Contains architecture specific code for x86_64.
#[cfg(target_arch = "x86_64")]
#[path = "arch/x86_64/mod.rs"]
pub mod arch;
/// Contains architecture specific code for riscv64. /// Contains architecture specific code for riscv64.
#[cfg(target_arch = "riscv64")] #[cfg(target_arch = "riscv64")]
#[path = "arch/riscv/mod.rs"] #[path = "arch/riscv/mod.rs"]
pub mod arch; pub mod arch;
#[macro_use] /// Contains architecture specific code for x86_64.
pub mod print; #[cfg(target_arch = "x86_64")]
pub mod devices; #[path = "arch/x86_64/mod.rs"]
pub mod rhai_shell; pub mod arch;
pub mod wasm_jumploader;
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
pub mod port_io; pub mod port_io;
#[macro_use] #[macro_use]
pub mod serial_print; pub mod print;
pub mod time;
#[macro_use] #[macro_use]
pub extern crate log; pub mod serial_print;
/////////////
// Modules //
/////////////
pub mod allocator; pub mod allocator;
pub mod boot_conf;
pub mod devices;
pub mod driver_traits; pub mod driver_traits;
pub mod experiments; pub mod experiments;
pub mod filesystem;
pub mod graphics; pub mod graphics;
pub mod kernel_state; pub mod kernel_state;
pub mod keyboard; pub mod keyboard;
pub mod kmain; pub mod kmain;
pub mod logger; pub mod logger;
pub mod prelude;
pub mod relib; pub mod relib;
pub mod rhai_shell;
pub mod scheduler; pub mod scheduler;
mod unicode_utils; pub mod scratchpad;
pub mod stdio;
pub mod time;
pub mod utils; pub mod utils;
// pub mod vga_e; pub mod virtio;
pub mod wasm; pub mod wasm;
pub mod wasm_jumploader;
pub extern crate alloc; mod unicode_utils;
pub extern crate externc_libm as libm;
//////////////////
// Re-exports ///
////////////////
pub use allocator::*; pub use allocator::*;
pub use driver_traits::*; pub use driver_traits::*;
pub use experiments::*; pub use experiments::*;
pub use graphics::*; pub use graphics::*;
pub use kernel;
pub use kernel::messaging;
pub use kernel::panic;
pub use kernel_state::*; pub use kernel_state::*;
pub use keyboard::*; pub use keyboard::*;
pub use logger::*; pub use logger::*;
pub use relib::*; pub use relib::*;
// pub use scheduler::*;
pub use utils::*;
// pub use vga_e::*;
pub use wasm::*;
pub mod boot_conf;
pub mod virtio;
pub use virtio::*;
// pub mod alias_table;
// pub use alias_table::*;
// pub mod tests;
// pub use tests::*;
pub mod scratchpad;
pub use scratchpad::*; pub use scratchpad::*;
pub mod filesystem; pub use utils::*;
pub use virtio::*;
/////////////// pub use wasm::*;
/// Kernel ///
/////////////
pub use kernel;
pub use kernel::messaging;
pub use kernel::panic;
pub mod prelude;
#[prelude_import] #[prelude_import]
pub use prelude::rust_2021::*; pub use prelude::rust_2021::*;
pub mod stdio;

View File

@ -1,14 +1,15 @@
use crate::kmain::KERNEL_CONF; use crate::kmain::KERNEL_CONF;
use crate::network::socket::{SimpleSock, Socket}; use crate::network::socket::{SimpleSock, Socket};
use crate::time::fetch_time; use crate::time::fetch_time;
use lliw::{Fg, Reset}; use lliw::{Fg, Reset};
use log::{Level, Metadata, Record}; use log::{Level, Metadata, Record};
use log::{LevelFilter, SetLoggerError};
struct SimpleLogger; static LOGGER: SimpleLogger = SimpleLogger;
// TODO: Rebuild this to take advantage of sockets // TODO: Rebuild this to take advantage of sockets
// DETAIL: Log to a socket instead of the screen // DETAIL: Log to a socket instead of the screen
// So that we can log in the kernel and display it in userland // So that we can log in the kernel and display it in userland
struct SimpleLogger;
impl log::Log for SimpleLogger { impl log::Log for SimpleLogger {
fn enabled(&self, metadata: &Metadata) -> bool { fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= Level::Trace metadata.level() <= Level::Trace
@ -62,10 +63,6 @@ impl log::Log for SimpleLogger {
fn flush(&self) {} fn flush(&self) {}
} }
use log::{LevelFilter, SetLoggerError};
static LOGGER: SimpleLogger = SimpleLogger;
pub fn init() -> Result<(), SetLoggerError> { pub fn init() -> Result<(), SetLoggerError> {
log::set_logger(&LOGGER).map(|()| log::set_max_level(LevelFilter::Trace)) log::set_logger(&LOGGER).map(|()| log::set_max_level(LevelFilter::Trace))
} }

View File

@ -3,6 +3,7 @@ use cpuio::{inb, inl, outb, outl};
pub fn read32(reg: u16) -> u32 { pub fn read32(reg: u16) -> u32 {
unsafe { inl(reg) } unsafe { inl(reg) }
} }
pub fn read8(reg: u16) -> u8 { pub fn read8(reg: u16) -> u8 {
unsafe { inb(reg) } unsafe { inb(reg) }
} }

View File

@ -1,10 +1,7 @@
pub use crate::print::*;
pub use crate::serial_print::*;
pub use alloc::{boxed::Box, format, string::*, vec, vec::*};
pub use core::arch::asm; pub use core::arch::asm;
pub use core::prelude::rust_2021::*; pub use core::prelude::rust_2021::*;
pub use core::prelude::v1::*; pub use core::prelude::v1::*;
pub use crate::print::*;
pub use crate::serial_print::*;
pub use log::{debug, info, trace, warn}; pub use log::{debug, info, trace, warn};
pub use alloc::{boxed::Box, format, string::*, vec, vec::*};

View File

@ -1,8 +1,10 @@
// TODO: refactor this file // TODO: refactor this file
// TODO: make STDOUT redirect to a socket owned // TODO: make STDOUT redirect to a socket owned
// by the process named "stdout" // by the process named "stdout"
pub struct Stdout;
use core::fmt::{Arguments, Error}; use core::fmt::{Arguments, Error};
pub struct Stdout;
impl Stdout { impl Stdout {
pub fn write_fmt(&mut self, arg: Arguments<'_>) /*-> Result<(), Error> */ pub fn write_fmt(&mut self, arg: Arguments<'_>) /*-> Result<(), Error> */
{ {
@ -10,6 +12,7 @@ impl Stdout {
// Ok(()) // Ok(())
} }
} }
impl core::fmt::Write for Stdout { impl core::fmt::Write for Stdout {
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
fn write_str(&mut self, s: &str) -> Result<(), Error> { fn write_str(&mut self, s: &str) -> Result<(), Error> {
@ -33,6 +36,7 @@ impl core::fmt::Write for Stdout {
core::fmt::write(&mut self, args) core::fmt::write(&mut self, args)
} }
} }
#[macro_export] #[macro_export]
macro_rules! print { macro_rules! print {
() => { () => {

View File

@ -1,9 +1,6 @@
/* /// # clparse
clparse /// simple command line parser for ableOS
* A simple command line parser for ableOS
*/
// use std::collections::HashMap;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Argument { pub struct Argument {
key: String, key: String,
@ -53,6 +50,7 @@ impl Command {
} }
} }
} }
pub fn test() { pub fn test() {
let x = Command::parse("hi?there=uwu&hi=abc".to_string()); let x = Command::parse("hi?there=uwu&hi=abc".to_string());

View File

@ -17,13 +17,12 @@ pub fn encode(bytes: &[u8]) -> Vec<u8> {
} }
encoding.push(occurrences); encoding.push(occurrences);
encoding encoding
} }
/// Read a run-length encoding and return its decoded contents. /// Read a run-length encoding and return its decoded contents.
/// ///
/// * `bytes` - The bytes to be decoded. /// - `bytes` - The bytes to be decoded.
pub fn decode(bytes: &[u8]) -> Vec<u8> { pub fn decode(bytes: &[u8]) -> Vec<u8> {
let mut decoding = Vec::<u8>::new(); let mut decoding = Vec::<u8>::new();

View File

@ -1,3 +1 @@
pub mod mono_bitmap; pub mod mono_bitmap;
pub mod stupid_simple_image;

View File

@ -1,10 +1,8 @@
use shadeable::pixel_format::new_rgba64;
use crate::{ use crate::{
graphics::SCREEN_BUFFER, graphics::SCREEN_BUFFER,
relib::encoding::rle::{decode, encode}, relib::encoding::rle::{decode, encode},
}; };
// use super::qoi; use shadeable::pixel_format::new_rgba64;
pub fn bruh() { pub fn bruh() {
#[rustfmt::skip] #[rustfmt::skip]

View File

@ -1,6 +0,0 @@
/*
r[255,0,0]
g[0,0,0]
b[0,0,0]
a[0,0,0]
*/

View File

@ -1,3 +1,6 @@
pub static SOCKETS: spin::Mutex<SocketState> = spin::Mutex::new(vec![]);
pub type SocketState = Vec<SimpleSock>;
pub type Stream = Vec<u8>; pub type Stream = Vec<u8>;
#[derive(Debug)] #[derive(Debug)]
@ -32,9 +35,6 @@ impl Socket for SocketID {
} }
} }
pub type SocketState = Vec<SimpleSock>;
pub static SOCKETS: spin::Mutex<SocketState> = spin::Mutex::new(vec![]);
pub trait Socket { pub trait Socket {
fn peek(&mut self) -> SocketReturns; fn peek(&mut self) -> SocketReturns;
@ -47,6 +47,7 @@ pub trait Socket {
fn close(&mut self) {} fn close(&mut self) {}
} }
#[derive(Debug)] #[derive(Debug)]
pub enum SocketReturns { pub enum SocketReturns {
ReadOk(Stream), ReadOk(Stream),
@ -113,6 +114,7 @@ impl Socket for SimpleSock {
} }
SocketReturns::ReadOk(return_vec) SocketReturns::ReadOk(return_vec)
} }
fn read(&mut self, length: usize) -> SocketReturns { fn read(&mut self, length: usize) -> SocketReturns {
let mut return_vec = vec![]; let mut return_vec = vec![];
if length > self.stream.len() { if length > self.stream.len() {
@ -125,9 +127,11 @@ impl Socket for SimpleSock {
SocketReturns::ReadOk(return_vec) SocketReturns::ReadOk(return_vec)
} }
} }
fn register_protocol(&mut self, protocol_name: String) { fn register_protocol(&mut self, protocol_name: String) {
self.protocol = Some(protocol_name); self.protocol = Some(protocol_name);
} }
fn check_protocol(&mut self, protocol_name: String) -> bool { fn check_protocol(&mut self, protocol_name: String) -> bool {
if self.protocol == Some(protocol_name) { if self.protocol == Some(protocol_name) {
return true; return true;
@ -135,11 +139,13 @@ impl Socket for SimpleSock {
false false
} }
fn write(&mut self, stream: Stream) -> SocketReturns { fn write(&mut self, stream: Stream) -> SocketReturns {
for byte in stream { for byte in stream {
self.stream.push(byte); self.stream.push(byte);
} }
SocketReturns::WriteOk SocketReturns::WriteOk
} }
fn close(&mut self) {} fn close(&mut self) {}
} }

View File

@ -1,8 +1,27 @@
use super::Time; use super::Time;
use core::fmt::{Display, Error, Formatter}; use core::fmt::{Display, Error, Formatter};
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
#[repr(transparent)] #[repr(transparent)]
pub struct Kilosecond(usize); pub struct Kilosecond(usize);
impl Kilosecond {
pub fn from_ms(ms: usize) -> Self {
Self(ms)
}
pub fn from_sec(sec: usize) -> Self {
Self(sec * 1000)
}
pub fn from_minutes(min: usize) -> Self {
Self(min * 60 * 1000)
}
pub fn from_hours(hrs: usize) -> Self {
Self(hrs * 60 * 60 * 1000)
}
pub fn from_days(days: usize) -> Self {
Self(days * 24 * 60 * 60 * 1000)
}
}
impl Display for Kilosecond { impl Display for Kilosecond {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
let mut reg = self.0; let mut reg = self.0;
@ -36,37 +55,23 @@ impl Display for Kilosecond {
Ok(()) Ok(())
} }
} }
impl core::ops::Add for Kilosecond { impl core::ops::Add for Kilosecond {
type Output = Self; type Output = Self;
fn add(self, rhs: Self) -> Self { fn add(self, rhs: Self) -> Self {
Self(self.0 + rhs.0) Self(self.0 + rhs.0)
} }
} }
impl core::ops::Sub for Kilosecond { impl core::ops::Sub for Kilosecond {
type Output = Self; type Output = Self;
fn sub(self, rhs: Self) -> Self { fn sub(self, rhs: Self) -> Self {
Self(self.0 - rhs.0) Self(self.0 - rhs.0)
} }
} }
impl From<Time> for Kilosecond { impl From<Time> for Kilosecond {
fn from(t: Time) -> Self { fn from(t: Time) -> Self {
Self((t.hour as usize * 3600 + t.minutes as usize * 60 + t.seconds as usize) * 1000) Self((t.hour as usize * 3600 + t.minutes as usize * 60 + t.seconds as usize) * 1000)
} }
} }
impl Kilosecond {
pub fn from_ms(ms: usize) -> Self {
Self(ms)
}
pub fn from_sec(sec: usize) -> Self {
Self(sec * 1000)
}
pub fn from_minutes(min: usize) -> Self {
Self(min * 60 * 1000)
}
pub fn from_hours(hrs: usize) -> Self {
Self(hrs * 60 * 60 * 1000)
}
pub fn from_days(days: usize) -> Self {
Self(days * 24 * 60 * 60 * 1000)
}
}

View File

@ -1,3 +1,7 @@
pub mod kilotime;
use core::fmt;
pub struct Time { pub struct Time {
pub year: u16, pub year: u16,
pub month: u16, pub month: u16,
@ -7,6 +11,7 @@ pub struct Time {
pub seconds: u16, pub seconds: u16,
pub microseconds: u32, pub microseconds: u32,
} }
impl fmt::Display for Time { impl fmt::Display for Time {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!( write!(
@ -16,5 +21,3 @@ impl fmt::Display for Time {
) )
} }
} }
pub mod kilotime;
use core::fmt;

View File

@ -1,4 +1,20 @@
use crate::filesystem::FILE_SYSTEM;
use crate::info::master;
use crate::time::fetch_time;
use crate::wasm_jumploader::interp;
use crate::ALLOCATOR;
use crate::{
arch::{shutdown, sloop},
systeminfo::{KERNEL_VERSION, RELEASE_TYPE},
KERNEL_STATE,
};
use genfs::{Fs, OpenOptions};
use rhai::Engine;
use spin::Lazy; use spin::Lazy;
use x86_64::instructions::interrupts::{disable, enable};
pub static KEYBUFF: spin::Mutex<Vec<char>> = spin::Mutex::new(Vec::new());
pub static CURRENT_DIR: Lazy<spin::Mutex<String>> = Lazy::new(|| spin::Mutex::new("/".to_string()));
#[cfg(target_arch = "riscv64")] #[cfg(target_arch = "riscv64")]
pub fn shell() {} pub fn shell() {}
@ -41,22 +57,6 @@ pub fn shell() {
} }
} }
pub static KEYBUFF: spin::Mutex<Vec<char>> = spin::Mutex::new(Vec::new());
pub static CURRENT_DIR: Lazy<spin::Mutex<String>> = Lazy::new(|| spin::Mutex::new("/".to_string()));
use rhai::Engine;
use x86_64::instructions::interrupts::{disable, enable};
use crate::info::master;
use crate::time::fetch_time;
use crate::wasm_jumploader::interp;
use crate::ALLOCATOR;
use crate::{
arch::{shutdown, sloop},
systeminfo::{KERNEL_VERSION, RELEASE_TYPE},
KERNEL_STATE,
};
pub fn afetch() { pub fn afetch() {
let kstate = KERNEL_STATE.lock(); let kstate = KERNEL_STATE.lock();
@ -82,37 +82,12 @@ pub fn afetch() {
); );
drop(kstate); drop(kstate);
} }
pub fn set_hostname(name: String) { pub fn set_hostname(name: String) {
let mut kstate = KERNEL_STATE.lock(); let mut kstate = KERNEL_STATE.lock();
kstate.hostname = name; kstate.hostname = name;
} }
fn engine_construction() -> Engine {
let mut engine = rhai::Engine::new();
engine.on_print(|x| println!("{}", x));
engine.on_debug(|x, src, pos| {
let src = src.unwrap_or("unknown");
println!("DEBUG: {} at {:?}: {}", src, pos, x);
debug!("{} at {:?}: {}", src, pos, x);
});
engine.register_fn("ls", ls);
engine.register_fn("cat", echo_file);
engine.register_fn("cd", change_directory);
engine.register_fn("afetch", afetch);
engine.register_fn("set_hostname", set_hostname);
engine.register_fn("shutdown", shutdown);
engine.register_fn("peek", peek_memory);
engine.register_fn("poke", poke_memory);
engine.register_fn("sloop", sloop);
engine.register_fn("wasm", interp);
engine.register_fn("log_dump", log_dump);
engine
}
/// Examine a memory pointer /// Examine a memory pointer
pub fn peek_memory(ptr: i64) -> u8 { pub fn peek_memory(ptr: i64) -> u8 {
let ptr: usize = ptr.unsigned_abs() as _; let ptr: usize = ptr.unsigned_abs() as _;
@ -166,9 +141,6 @@ pub fn log_dump() {
} }
} }
use crate::filesystem::FILE_SYSTEM;
use genfs::{Fs, OpenOptions};
pub fn echo_file(path: String) { pub fn echo_file(path: String) {
let mut current_dir = CURRENT_DIR.lock(); let mut current_dir = CURRENT_DIR.lock();
@ -218,3 +190,28 @@ pub fn change_directory(path: String) {
current_dir.push_str(&path); current_dir.push_str(&path);
} }
} }
fn engine_construction() -> Engine {
let mut engine = rhai::Engine::new();
engine.on_print(|x| println!("{}", x));
engine.on_debug(|x, src, pos| {
let src = src.unwrap_or("unknown");
println!("DEBUG: {} at {:?}: {}", src, pos, x);
debug!("{} at {:?}: {}", src, pos, x);
});
engine.register_fn("ls", ls);
engine.register_fn("cat", echo_file);
engine.register_fn("cd", change_directory);
engine.register_fn("afetch", afetch);
engine.register_fn("set_hostname", set_hostname);
engine.register_fn("shutdown", shutdown);
engine.register_fn("peek", peek_memory);
engine.register_fn("poke", poke_memory);
engine.register_fn("sloop", sloop);
engine.register_fn("wasm", interp);
engine.register_fn("log_dump", log_dump);
engine
}

View File

@ -54,6 +54,7 @@ pub struct Capabilities {
pub sound_cards: SoundCardAccess, pub sound_cards: SoundCardAccess,
pub network_access: NetworkAccess, pub network_access: NetworkAccess,
} }
impl Capabilities { impl Capabilities {
/// Generate a set of empty capabilities /// Generate a set of empty capabilities
pub fn empty() -> Self { pub fn empty() -> Self {

View File

@ -1,13 +1,15 @@
use crate::{arch::generate_process_pass, stdio::StdIO};
use crate::scheduler::capabilities::Capabilities;
use kernel::proccess::PID;
pub mod capabilities; pub mod capabilities;
pub mod priority; pub mod priority;
pub mod proc; pub mod proc;
use crate::scheduler::capabilities::Capabilities;
use crate::{arch::generate_process_pass, stdio::StdIO};
use kernel::proccess::PID;
use priority::Priority; use priority::Priority;
use proc::Process; use proc::Process;
pub static SCHEDULER: spin::Mutex<Scheduler> = spin::Mutex::new(Scheduler::new());
/// Add additional wake conditions to the list /// Add additional wake conditions to the list
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub enum WakeCondition { pub enum WakeCondition {
@ -34,8 +36,9 @@ pub struct Scheduler {
pub execution_queue: Vec<Process>, pub execution_queue: Vec<Process>,
pub sleeping_queue: Vec<BlockedProcess>, pub sleeping_queue: Vec<BlockedProcess>,
pub blocked_queue: Vec<BlockedProcess>, pub blocked_queue: Vec<BlockedProcess>,
// / All timed processes sorted by wake time // All timed processes sorted by wake time
} }
impl Scheduler { impl Scheduler {
/// Create a new scheduler /// Create a new scheduler
pub const fn new() -> Self { pub const fn new() -> Self {
@ -89,5 +92,3 @@ impl Scheduler {
self.execution_queue.remove(0); self.execution_queue.remove(0);
} }
} }
pub static SCHEDULER: spin::Mutex<Scheduler> = spin::Mutex::new(Scheduler::new());

View File

@ -22,5 +22,3 @@ pub struct Process {
pub working_dir: String, pub working_dir: String,
pub stdio: StdIO, pub stdio: StdIO,
} }
impl Process {}

View File

@ -1,6 +1,23 @@
use crate::rhai_shell::shell;
use acpi::AcpiTables; use acpi::AcpiTables;
use crate::rhai_shell::shell; // TODO: move to a better place
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct AcpiStruct {}
impl acpi::AcpiHandler for AcpiStruct {
unsafe fn map_physical_region<T>(
&self,
physical_address: usize,
size: usize,
) -> acpi::PhysicalMapping<Self, T> {
info!("PHYS ADDR: {:?}", physical_address);
info!("Size: {:?}", size);
todo!("map_physical_region");
}
fn unmap_physical_region<T>(_region: &acpi::PhysicalMapping<Self, T>) {
todo!("unmap_physical_region");
}
}
/// Experimental scratchpad for testing. /// Experimental scratchpad for testing.
pub fn scratchpad() { pub fn scratchpad() {
@ -28,21 +45,3 @@ pub fn acpi() {
_table = AcpiTables::search_for_rsdp_bios(acpi_handler); _table = AcpiTables::search_for_rsdp_bios(acpi_handler);
} }
} }
// TODO: move to a better place
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct AcpiStruct {}
impl acpi::AcpiHandler for AcpiStruct {
unsafe fn map_physical_region<T>(
&self,
physical_address: usize,
size: usize,
) -> acpi::PhysicalMapping<Self, T> {
info!("PHYS ADDR: {:?}", physical_address);
info!("Size: {:?}", size);
todo!("map_physical_region");
}
fn unmap_physical_region<T>(_region: &acpi::PhysicalMapping<Self, T>) {
todo!("unmap_physical_region");
}
}

View File

@ -1,5 +1,6 @@
pub struct Serialout;
use core::fmt::{Arguments, Error}; use core::fmt::{Arguments, Error};
pub struct Serialout;
impl Serialout { impl Serialout {
pub fn write_fmt(&mut self, arg: Arguments<'_>) /*-> Result<(), Error> */ pub fn write_fmt(&mut self, arg: Arguments<'_>) /*-> Result<(), Error> */
{ {
@ -7,6 +8,7 @@ impl Serialout {
// Ok(()) // Ok(())
} }
} }
impl core::fmt::Write for Serialout { impl core::fmt::Write for Serialout {
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
fn write_str(&mut self, s: &str) -> Result<(), Error> { fn write_str(&mut self, s: &str) -> Result<(), Error> {
@ -30,6 +32,7 @@ impl core::fmt::Write for Serialout {
core::fmt::write(&mut self, args) core::fmt::write(&mut self, args)
} }
} }
#[macro_export] #[macro_export]
macro_rules! serial_print { macro_rules! serial_print {
() => { () => {
@ -39,6 +42,7 @@ macro_rules! serial_print {
::core::write!($crate::serial_print::Serialout, $($tt)*) ::core::write!($crate::serial_print::Serialout, $($tt)*)
}; };
} }
#[macro_export] #[macro_export]
macro_rules! serial_println { macro_rules! serial_println {
($($tt:tt)*) => { ($($tt:tt)*) => {

View File

@ -37,6 +37,7 @@ impl StdIO {
} }
} }
} }
pub fn read(&mut self) { pub fn read(&mut self) {
todo!(); todo!();
} }

View File

@ -1,15 +1,14 @@
use picorand::PicoRandGenerate;
use rkyv::{ser::serializers::AllocSerializer, Deserialize};
use shadeable::pixel_format::from_vga_16;
use vga::colors::Color16;
use y_compositor_protocol::Version;
use crate::{ use crate::{
kmain::KERNEL_CONF, kmain::KERNEL_CONF,
network::socket::{SimpleSock, Socket, SocketReturns}, network::socket::{SimpleSock, Socket, SocketReturns},
num_to_vga16, VgaBuffer, SCREEN_BUFFER, num_to_vga16, VgaBuffer, SCREEN_BUFFER,
}; };
use kernel::TICK; use kernel::TICK;
use picorand::PicoRandGenerate;
use rkyv::{ser::serializers::AllocSerializer, Deserialize};
use shadeable::pixel_format::from_vga_16;
use vga::colors::Color16;
use y_compositor_protocol::Version;
pub fn run_tests() { pub fn run_tests() {
if KERNEL_CONF.tests.run_tests { if KERNEL_CONF.tests.run_tests {

View File

@ -1,3 +1,6 @@
use core::sync::atomic::Ordering;
use kernel::TICK;
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
pub fn fetch_time() -> f64 { pub fn fetch_time() -> f64 {
use x86_64::instructions::interrupts::{disable, enable}; use x86_64::instructions::interrupts::{disable, enable};
@ -8,8 +11,6 @@ pub fn fetch_time() -> f64 {
time time
} }
use core::sync::atomic::Ordering;
use kernel::TICK;
#[cfg(target_arch = "riscv64")] #[cfg(target_arch = "riscv64")]
pub fn fetch_time() -> f64 { pub fn fetch_time() -> f64 {
let time = TICK.load(Ordering::Relaxed) as f64; let time = TICK.load(Ordering::Relaxed) as f64;

View File

@ -1,2 +1,2 @@
pub const POWER_SIGN: &str = "\u{23FB}";
pub const CONSOLE: &str = "\u{E795}"; pub const CONSOLE: &str = "\u{E795}";
pub const POWER_SIGN: &str = "\u{23FB}";

View File

@ -1,16 +1,15 @@
//! //!
//!
//!
//!
//!
pub enum UsbSpeed { pub enum UsbSpeed {
/// Super-speed functions operate at up to 5 Gb/s. /// Super-speed functions operate at up to 5 Gb/s.
Super, Super,
/// High-speed functions operate at up to 480 Mb/s. /// High-speed functions operate at up to 480 Mb/s.
High, High,
/// Full-speed functions operate at up to 12 Mb/s. /// Full-speed functions operate at up to 12 Mb/s.
Full, Full,
/// Low-speed functions operate at up to 1.5 Mb/s. /// Low-speed functions operate at up to 1.5 Mb/s.
Low, Low,
} }

View File

@ -1,12 +1,18 @@
//! Small generic utilities //! Small generic utilities
//!
//!
//!
#[inline] #[inline]
pub fn type_of<T>(_: &T) -> &str { pub fn type_of<T>(_: &T) -> &str {
core::any::type_name::<T>() core::any::type_name::<T>()
} }
#[no_mangle]
#[allow(unconditional_recursion)]
pub extern "C" fn stack_overflow() -> u8 {
stack_overflow();
// meme number
69 // NOTE: Any specific reason for this number aside from memes?
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
@ -16,11 +22,3 @@ mod tests {
assert_eq!(type_of(&1), "i32"); assert_eq!(type_of(&1), "i32");
} }
} }
#[no_mangle]
#[allow(unconditional_recursion)]
pub extern "C" fn stack_overflow() -> u8 {
stack_overflow();
// meme number
69 // NOTE: Any specific reason for this number aside from memes?
}

View File

@ -3,17 +3,18 @@ use vga::{
writers::{Graphics640x480x16, GraphicsWriter}, writers::{Graphics640x480x16, GraphicsWriter},
}; };
pub static VGAE_BUFF_OFFSET_X: spin::Mutex<u8> = spin::Mutex::new(0);
pub static VGAE_BUFF_OFFSET_Y: spin::Mutex<u8> = spin::Mutex::new(0);
pub static VGAE: spin::Mutex<Graphics640x480x16> = { pub static VGAE: spin::Mutex<Graphics640x480x16> = {
let xyz = Graphics640x480x16::new(); let xyz = Graphics640x480x16::new();
xyz.set_mode(); xyz.set_mode();
spin::Mutex::new(xyz) spin::Mutex::new(xyz)
}; };
pub static VGAE_BUFF_OFFSET_X: spin::Mutex<u8> = spin::Mutex::new(0);
pub static VGAE_BUFF_OFFSET_Y: spin::Mutex<u8> = spin::Mutex::new(0);
/// Converts a number to ... i forgor 💀 /// Converts a number to ... i forgor 💀
pub fn num_to_vga16(num: u8) -> Color16 { pub const fn num_to_vga16(num: u8) -> Color16 {
use Color16::*; use Color16::*;
match num { match num {
0 => Black, 0 => Black,
1 => Blue, 1 => Blue,

View File

@ -1,5 +1,6 @@
/// `NULL a s m` as an array of 4 bytes /// `NULL a s m` as an array of 4 bytes
pub const WASM_BINARY_MAGIC: [u8; 4] = [0x00, 0x61, 0x73, 0x6d]; pub const WASM_BINARY_MAGIC: [u8; 4] = [0x00, 0x61, 0x73, 0x6d];
/// `1 0 0 0` as an array of 4 bytes /// `1 0 0 0` as an array of 4 bytes
pub const WASM_VERSION: [u8; 4] = [0x01, 0x00, 0x00, 0x00]; pub const WASM_VERSION: [u8; 4] = [0x01, 0x00, 0x00, 0x00];

View File

@ -1,18 +1,124 @@
use crate::{arch::generate_process_pass, rhai_shell::KEYBUFF};
use wasmi::{ use wasmi::{
Error, Externals, FuncInstance, FuncRef, ModuleImportResolver, RuntimeArgs, RuntimeValue, Error, Externals, FuncInstance, FuncRef, ModuleImportResolver, RuntimeArgs, RuntimeValue,
Signature, Trap, ValueType, Signature, Trap, ValueType,
}; };
pub struct HostExternals {}
const ADD_FUNC_INDEX: usize = 0; const ADD_FUNC_INDEX: usize = 0;
const SEND_SIGNAL_INDEX: usize = 1;
const GET_TIME_INDEX: usize = 2; const GET_TIME_INDEX: usize = 2;
const GET_RANDOM_INDEX: usize = 3; const GET_RANDOM_INDEX: usize = 3;
const GET_INPUT_INDEX: usize = 4; const GET_INPUT_INDEX: usize = 4;
const PRINT_CLEVER_HACK: usize = 5; const PRINT_CLEVER_HACK: usize = 5;
const SEND_SIGNAL_INDEX: usize = 1;
pub struct HostExternals;
impl HostExternals {
fn check_signature(&self, index: usize, signature: &Signature) -> bool {
match index {
ADD_FUNC_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[ValueType::I32, ValueType::I32], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
SEND_SIGNAL_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[ValueType::I32, ValueType::I32], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
GET_TIME_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
GET_RANDOM_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
GET_INPUT_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
PRINT_CLEVER_HACK => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) = (&[ValueType::I64], None);
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
_ => false,
}
}
}
impl Externals for HostExternals { impl Externals for HostExternals {
fn invoke_index( fn invoke_index(
@ -28,6 +134,7 @@ impl Externals for HostExternals {
trace!("SYSCALL: {} + {} = {}", a, b, result); trace!("SYSCALL: {} + {} = {}", a, b, result);
Ok(Some(RuntimeValue::I32(result as i32))) Ok(Some(RuntimeValue::I32(result as i32)))
} }
SEND_SIGNAL_INDEX => { SEND_SIGNAL_INDEX => {
let pid: u32 = args.nth_checked(0)?; let pid: u32 = args.nth_checked(0)?;
let signal: u32 = args.nth_checked(1)?; let signal: u32 = args.nth_checked(1)?;
@ -47,6 +154,7 @@ impl Externals for HostExternals {
let ret = RuntimeValue::I32(tick_time.try_into().unwrap()); let ret = RuntimeValue::I32(tick_time.try_into().unwrap());
Ok(Some(ret)) Ok(Some(ret))
} }
GET_RANDOM_INDEX => { GET_RANDOM_INDEX => {
trace!("SYSCALL: get random"); trace!("SYSCALL: get random");
let rand = generate_process_pass(); let rand = generate_process_pass();
@ -91,113 +199,6 @@ impl Externals for HostExternals {
} }
} }
use crate::rhai_shell::KEYBUFF;
use crate::arch::generate_process_pass;
impl HostExternals {
fn check_signature(&self, index: usize, signature: &Signature) -> bool {
match index {
ADD_FUNC_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[ValueType::I32, ValueType::I32], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
SEND_SIGNAL_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[ValueType::I32, ValueType::I32], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
GET_TIME_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
GET_RANDOM_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
GET_INPUT_INDEX => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) =
(&[], Some(ValueType::I32));
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
PRINT_CLEVER_HACK => {
let (params, ret_ty): (&[ValueType], Option<ValueType>) = (&[ValueType::I64], None);
if params.len() != signature.params().len() {
return false;
}
if ret_ty != signature.return_type() {
return false;
}
for (ty, param) in params.iter().zip(signature.params()) {
if *ty != *param {
return false;
}
}
true
}
_ => false,
}
}
}
impl ModuleImportResolver for HostExternals { impl ModuleImportResolver for HostExternals {
fn resolve_func(&self, field_name: &str, signature: &Signature) -> Result<FuncRef, Error> { fn resolve_func(&self, field_name: &str, signature: &Signature) -> Result<FuncRef, Error> {
let index = match field_name { let index = match field_name {
@ -221,8 +222,8 @@ impl ModuleImportResolver for HostExternals {
field_name, signature field_name, signature
))); )));
} }
trace!("Resolved export {} as func {}", field_name, index);
trace!("Resolved export {} as func {}", field_name, index);
Ok(FuncInstance::alloc_host(signature.clone(), index)) Ok(FuncInstance::alloc_host(signature.clone(), index))
} }
} }

View File

@ -1,13 +1,9 @@
pub mod host_functions; pub mod host_functions;
extern crate wasmi; use crate::{filesystem::FILE_SYSTEM, wasm_jumploader::host_functions::HostExternals};
// extern crate wabt;
use genfs::{Fs, OpenOptions}; use genfs::{Fs, OpenOptions};
use wasmi::{ImportsBuilder, ModuleInstance}; use wasmi::{ImportsBuilder, ModuleInstance};
use crate::{filesystem::FILE_SYSTEM, wasm_jumploader::host_functions::HostExternals};
pub fn interp() { pub fn interp() {
trace!("Interpreting..."); trace!("Interpreting...");
let fs = &*FILE_SYSTEM.lock(); let fs = &*FILE_SYSTEM.lock();
@ -36,10 +32,8 @@ pub fn interp() {
match instance { match instance {
Ok(inst) => { Ok(inst) => {
let instance = inst.assert_no_start(); let instance = inst.assert_no_start();
let mut is_driver = false; let mut is_driver = false;
let _is_program = false; let _is_program = false;
let mut has_driver_entry = false; let mut has_driver_entry = false;
let mut has_driver_exit = false; let mut has_driver_exit = false;
let mut has_start = false; let mut has_start = false;

View File

@ -1,7 +1,5 @@
#![no_std] #![no_std]
// extern crate alloc;
use log::*; use log::*;
pub const VERSION: &str = env!("CARGO_PKG_VERSION"); pub const VERSION: &str = env!("CARGO_PKG_VERSION");

View File

@ -4,14 +4,19 @@
pub trait CharacterDevice { pub trait CharacterDevice {
/// Returns true if the device can be read from. /// Returns true if the device can be read from.
fn can_read(&self) -> bool; fn can_read(&self) -> bool;
/// Returns true if the device can be written to /// Returns true if the device can be written to
fn can_write(&self) -> bool; fn can_write(&self) -> bool;
/// Reads a single character from the device /// Reads a single character from the device
fn read_char(&mut self) -> Option<char>; fn read_char(&mut self) -> Option<char>;
/// Writes a single character to the device and returns true if the write was successful /// Writes a single character to the device and returns true if the write was successful
fn write_char(&mut self, c: char) -> bool; fn write_char(&mut self, c: char) -> bool;
/// Reset the device to its initial state /// Reset the device to its initial state
fn reset(&mut self); fn reset(&mut self);
/// initializes the device, returns true if successful /// initializes the device, returns true if successful
fn initialize(&mut self) -> bool; fn initialize(&mut self) -> bool;
} }

View File

@ -1,9 +1,9 @@
//! The ableOS kernel.
#![deny(missing_docs)] #![deny(missing_docs)]
#![no_std] #![no_std]
#![feature(prelude_import)] #![feature(prelude_import)]
//! The ableOS kernel.
pub mod device_interface; pub mod device_interface;
pub mod messaging; pub mod messaging;
pub mod panic; pub mod panic;
@ -12,9 +12,18 @@ pub mod syscalls;
pub mod time; pub mod time;
use core::sync::atomic::{AtomicU64, Ordering::Relaxed}; use core::sync::atomic::{AtomicU64, Ordering::Relaxed};
use versioning::Version; use versioning::Version;
/// The number of ticks since the first CPU was started
pub static TICK: AtomicU64 = AtomicU64::new(0);
/// Kernel's version
pub const KERNEL_VERSION: Version = Version {
major: 0,
minor: 1,
patch: 2,
};
/// called by arch specific timers to tick up all kernel related functions /// called by arch specific timers to tick up all kernel related functions
pub fn tick() { pub fn tick() {
let mut data = TICK.load(Relaxed); let mut data = TICK.load(Relaxed);
@ -22,13 +31,3 @@ pub fn tick() {
TICK.store(data, Relaxed) TICK.store(data, Relaxed)
} }
/// The number of ticks since the first CPU was started
pub static TICK: AtomicU64 = AtomicU64::new(0);
///
pub const KERNEL_VERSION: Version = Version {
major: 0,
minor: 1,
patch: 2,
};

View File

@ -1,12 +1,10 @@
//! //! Panic-related stuff
use core::panic::PanicInfo;
// #[macro_use] use core::panic::PanicInfo;
use log::error; use log::error;
#[panic_handler] #[panic_handler]
fn panic_handler(info: &PanicInfo) -> ! { fn panic_handler(info: &PanicInfo) -> ! {
error!("{}", info); error!("{}", info);
loop {} loop {}
} }

View File

@ -3,11 +3,12 @@
/// A process ID /// A process ID
pub type PID = u64; pub type PID = u64;
#[repr(C)]
/// Signals that can be sent to a process /// Signals that can be sent to a process
#[repr(C)]
pub enum Signals { pub enum Signals {
/// Terminate the process /// Terminate the process
Terminate, Terminate,
/// Shutdown the process and allow it to shutdown cleanly /// Shutdown the process and allow it to shutdown cleanly
Quit, Quit,
} }

View File

@ -1,24 +1,26 @@
//! //!
use crate::proccess::{Signals, PID}; use crate::proccess::{Signals, PID};
/// All possible system calls /// All possible system calls
pub enum Syscall { pub enum Syscall {
/// Create a new process and return its PID /// Create a new process and return its PID
CreateProcess, CreateProcess,
/// Send a signal to a process /// Send a signal to a process
SendSignal(PID, Signals), SendSignal(PID, Signals),
/// Get the current process ID /// Get the current process ID
GetPID, GetPID,
/// Get the current time /// Get the current time
GetTime, GetTime,
/// Set the time /// Set the time
SetTime, SetTime,
/* // ListInodes,
ListInodes, // CreateInode,
CreateInode, // RemoveInode,
RemoveInode, // OpenInode,
OpenInode, // CloseInode,
CloseInode,
*/
} }

View File

@ -1,6 +1,5 @@
const VERSION = 0.5; const VERSION = 0.5;
fn main(){ fn main(){
let abcd = RGBA(255, 255, 0, 0); let abcd = RGBA(255, 255, 0, 0);
//print("hi"); //print("hi");

View File

@ -1,8 +1,8 @@
use crate::pixel_format::{get_a, get_b, get_g, get_r, set_a, set_b, set_g, set_r}; use crate::pixel_format::{get_a, get_b, get_g, get_r, set_a, set_b, set_g, set_r};
use crate::pixel_format::{rgba_div, Rgba64}; use crate::pixel_format::{rgba_div, Rgba64};
use log::{debug, info}; use log::{debug, info};
use rhai::Engine; use rhai::Engine;
use rhai::INT;
pub fn engine_startup() -> Engine { pub fn engine_startup() -> Engine {
let mut engine = Engine::new(); let mut engine = Engine::new();
@ -21,17 +21,16 @@ pub fn engine_startup() -> Engine {
.register_fn("RGBA", get_rgba_rhai) .register_fn("RGBA", get_rgba_rhai)
.register_fn("RGBA", get_rgba_from_int) .register_fn("RGBA", get_rgba_from_int)
.register_fn("RGBA", get_rgba_from_int) .register_fn("RGBA", get_rgba_from_int)
.register_fn("/", rgba_div) .register_fn("/", rgba_div);
// .register_fn("*", rgba_mult) // .register_fn("*", rgba_mult)
// .register_fn("+", rgba_add) // .register_fn("+", rgba_add)
// .register_fn("-", rgba_sub) // .register_fn("-", rgba_sub)
;
// engine.register_global_module(RandomPackage::new().as_shared_module()); // engine.register_global_module(RandomPackage::new().as_shared_module());
engine engine
} }
use rhai::INT;
pub fn get_rgba_rhai(r: INT, g: INT, b: INT, a: INT) -> Rgba64 { pub fn get_rgba_rhai(r: INT, g: INT, b: INT, a: INT) -> Rgba64 {
let mut pixel = 0; let mut pixel = 0;

View File

@ -17,12 +17,9 @@ pub fn evaluate_shader(x: usize, y: usize, pixel: Rgba64) -> Result<Rgba64, Box<
let ast = engine.compile(SHADER)?; let ast = engine.compile(SHADER)?;
let mut scope = Scope::new(); let mut scope = Scope::new();
scope.push("PIXEL_RGBA", pixel); scope.push("PIXEL_RGBA", pixel);
scope.push("PIXEL_X", x); scope.push("PIXEL_X", x);
scope.push("PIXEL_Y", y); scope.push("PIXEL_Y", y);
let result: Rgba64 = engine.call_fn(&mut scope, &ast, "main", ())?; engine.call_fn(&mut scope, &ast, "main", ())
Ok(result)
} }

View File

@ -1,8 +1,26 @@
use core::ops::{BitAnd, BitOr, Shr}; use core::ops::{BitAnd, BitOr, Shr};
// use vga::colors::Color16;
pub type Rgba64 = u64; pub type Rgba64 = u64;
enum ChannelValue {
Dark,
Low,
Mid,
High,
}
impl From<u8> for ChannelValue {
fn from(b: u8) -> Self {
use ChannelValue::*;
match b {
0x00..=0x3f => Dark,
0x40..=0x7f => Low,
0x80..=0xbf => Mid,
0xc0..=0xff => High,
}
}
}
pub fn get_r(rgba: Rgba64) -> u8 { pub fn get_r(rgba: Rgba64) -> u8 {
rgba.bitand(0xff_00_00_00).shr(0o30) as u8 rgba.bitand(0xff_00_00_00).shr(0o30) as u8
} }
@ -47,123 +65,3 @@ pub fn rgba_div(a: Rgba64, b: Rgba64) -> Rgba64 {
pub fn new_rgba64(r: u8, g: u8, b: u8, a: u8) -> Rgba64 { pub fn new_rgba64(r: u8, g: u8, b: u8, a: u8) -> Rgba64 {
set_r(0, r) | set_g(0, g) | set_b(0, b) | set_a(0, a) set_r(0, r) | set_g(0, g) | set_b(0, b) | set_a(0, a)
} }
enum ChannelValue {
Dark,
Low,
Mid,
High,
}
impl From<u8> for ChannelValue {
fn from(b: u8) -> Self {
use ChannelValue::*;
match b {
0x00..=0x3f => Dark,
0x40..=0x7f => Low,
0x80..=0xbf => Mid,
0xc0..=0xff => High,
}
}
}
/*
pub fn into_vga_16(rgba_64: Rgba64) -> Color16 {
use ChannelValue::*;
use Color16::*;
match (
get_r(rgba_64).into(),
get_g(rgba_64).into(),
get_b(rgba_64).into(),
) {
(Dark, Dark, Dark) => Black,
(Dark, Dark, Low) => Black,
(Dark, Dark, Mid) => Blue,
(Dark, Dark, High) => Blue,
(Dark, Low, Dark) => Black,
(Dark, Low, Low) => Black,
(Dark, Low, Mid) => Blue,
(Dark, Low, High) => Blue,
(Dark, Mid, Dark) => Green,
(Dark, Mid, Low) => Green,
(Dark, Mid, Mid) => Cyan,
(Dark, Mid, High) => Cyan,
(Dark, High, Dark) => Green,
(Dark, High, Low) => Green,
(Dark, High, Mid) => Green,
(Dark, High, High) => Cyan,
(Low, Dark, Dark) => Black,
(Low, Dark, Low) => Black,
(Low, Dark, Mid) => Blue,
(Low, Dark, High) => Blue,
(Low, Low, Dark) => Black,
(Low, Low, Low) => DarkGrey,
(Low, Low, Mid) => LightGrey,
(Low, Low, High) => Blue,
(Low, Mid, Dark) => DarkGrey,
(Low, Mid, Low) => LightGrey,
(Low, Mid, Mid) => Cyan,
(Low, Mid, High) => Cyan,
(Low, High, Dark) => Green,
(Low, High, Low) => Green,
(Low, High, Mid) => Cyan,
(Low, High, High) => Cyan,
(Mid, Dark, Dark) => Red,
(Mid, Dark, Low) => Red,
(Mid, Dark, Mid) => Magenta,
(Mid, Dark, High) => Magenta,
(Mid, Low, Dark) => Brown,
(Mid, Low, Low) => Red,
(Mid, Low, Mid) => DarkGrey,
(Mid, Low, High) => LightBlue,
(Mid, Mid, Dark) => Brown,
(Mid, Mid, Low) => Brown,
(Mid, Mid, Mid) => LightGrey,
(Mid, Mid, High) => LightBlue,
(Mid, High, Dark) => Green,
(Mid, High, Low) => Green,
(Mid, High, Mid) => LightGreen,
(Mid, High, High) => LightCyan,
(High, Dark, Dark) => Red,
(High, Dark, _) => Magenta,
(High, Low, Dark) => Red,
(High, Low, Low) => LightRed,
(High, Low, Mid) => Pink,
(High, Low, High) => Magenta,
(High, Mid, Dark) => Yellow,
(High, Mid, Low) => Yellow,
(High, Mid, Mid) => LightRed,
(High, Mid, High) => Pink,
(High, High, Dark) => Yellow,
(High, High, Low) => White,
(High, High, Mid) => White,
(High, High, High) => White,
}
}
pub fn from_vga_16(color: Color16) -> Rgba64 {
use Color16::*;
match color {
Black => new_rgba64(0, 0, 0, 0),
DarkGrey => new_rgba64(105, 105, 105, 0),
LightGrey => new_rgba64(211, 211, 211, 0),
//
Blue => new_rgba64(0, 0, 0xff, 0),
Green => new_rgba64(0, 0xff, 0, 0),
Red => new_rgba64(0xff, 0, 0, 0),
//
Yellow => new_rgba64(0xff, 0xff, 0, 0),
Cyan => new_rgba64(0, 0xff, 0xff, 0),
Magenta => new_rgba64(0xff, 0, 0xff, 0),
Brown => new_rgba64(165, 42, 42, 0),
Pink => new_rgba64(0xff, 105, 180, 0),
White => new_rgba64(0xff, 0xff, 0xff, 0),
LightBlue => new_rgba64(173, 216, 230, 0),
LightGreen => new_rgba64(144, 238, 144, 0),
LightCyan => new_rgba64(88, 100, 100, 0),
LightRed => new_rgba64(0xff, 204, 203, 0),
}
}
*/

View File

@ -1,15 +1,20 @@
enum FSReturns { enum FSReturns {
/// The system call was successful /// The system call was successful
Ok, Ok,
/// The directory can not be created /// The directory can not be created
DirectoryCouldNotBeCreated, DirectoryCouldNotBeCreated,
/// The directory could not be removed /// The directory could not be removed
DirectoryCouldNotBeRemoved, DirectoryCouldNotBeRemoved,
/// ///
FileCouldNotBeCreated, FileCouldNotBeCreated,
/// ///
FileCouldNotBeRemoved, FileCouldNotBeRemoved,
/// The file could not be opened /// The file could not be opened
FileCouldNotBeOpened, FileCouldNotBeOpened,
/// ///
FileCouldNotBeClosed, FileCouldNotBeClosed,
@ -18,12 +23,8 @@ enum FSReturns {
int create_directory(path) { int create_directory(path) {
return DirectoryCouldNotBeCreated; return DirectoryCouldNotBeCreated;
} }
/// ///
int remove_directory(path) { int remove_directory(path) {
return DirectoryCouldNotBeRemoved; return DirectoryCouldNotBeRemoved;
} }

View File

@ -1,7 +1,6 @@
//! An implementation of the uname command. //! An implementation of the uname command.
//!
use crate::Arch::*;
use crate::Arch::*;
use core::fmt; use core::fmt;
// an example string "Darwin Roadrunner.local 10.3.0 Darwin Kernel Version 10.3.0: Fri Feb 26 11:58:09 PST 2010; root:xnu-1504.3.12~1/RELEASE_I386 i386" // an example string "Darwin Roadrunner.local 10.3.0 Darwin Kernel Version 10.3.0: Fri Feb 26 11:58:09 PST 2010; root:xnu-1504.3.12~1/RELEASE_I386 i386"
@ -9,19 +8,6 @@ pub struct RName {
pub arch: Arch, pub arch: Arch,
} }
fn main() {
let mut rname_string = "".to_string();
rname_string.push_str("ableOS");
let arch = Some(X86_64);
if let Some(arch) = arch {
let fmt_str = format!(" {:?}", arch);
rname_string.push_str(&fmt_str);
}
println!("{}", rname_string);
}
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub enum Arch { pub enum Arch {
X86, X86,
@ -42,3 +28,17 @@ impl fmt::Display for Arch {
write!(f, "{:?}", self) write!(f, "{:?}", self)
} }
} }
fn main() {
let mut rname_string = "".to_string();
rname_string.push_str("ableOS");
let arch = Some(X86_64);
if let Some(arch) = arch {
let fmt_str = format!(" {:?}", arch);
rname_string.push_str(&fmt_str);
}
println!("{}", rname_string);
}

View File

@ -1,5 +1,7 @@
#![no_std] #![no_std]
extern crate alloc; extern crate alloc;
use { use {
alloc::{string::String, vec::Vec}, alloc::{string::String, vec::Vec},
serde::Deserialize, serde::Deserialize,
@ -13,7 +15,7 @@ pub struct Version {
} }
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct MetaData { pub struct Metadata {
pub name: String, pub name: String,
pub version: Version, pub version: Version,
pub authors: Vec<String>, pub authors: Vec<String>,