forked from AbleOS/ableos
colorify function added
This commit is contained in:
parent
cddecccb4c
commit
914085fdf5
|
@ -1,2 +0,0 @@
|
||||||
cargo bootimage --target json_targets/x86_64-ableos.json && \
|
|
||||||
qemu-system-x86_64 -S -gdb tcp::9000 -drive format=raw,file=target/x86_64-ableos/debug/bootimage-ableos.bin
|
|
|
@ -1,2 +0,0 @@
|
||||||
cargo bootimage --target json_targets/x86_64-ableos.json && \
|
|
||||||
qemu-system-x86_64 -drive format=raw,file=target/x86_64-ableos/debug/bootimage-ableos.bin
|
|
|
@ -1,2 +0,0 @@
|
||||||
cargo bootimage --target json_targets/x86_64-ableos.json && \
|
|
||||||
qemu-system-x86_64 -drive format=raw,file=target/x86_64-ableos/debug/bootimage-ableos.bin
|
|
|
@ -1,2 +0,0 @@
|
||||||
cargo bootimage --release --target json_targets/x86_64-ableos.json && \
|
|
||||||
qemu-system-x86_64 -drive format=raw,file=target/x86_64-ableos/release/bootimage-ableos.bin
|
|
|
@ -1,5 +1,5 @@
|
||||||
pub mod allocator;
|
pub mod allocator;
|
||||||
pub mod graphics;
|
pub mod graphics;
|
||||||
pub mod serial;
|
pub mod serial;
|
||||||
#[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;
|
||||||
|
|
|
@ -2,114 +2,111 @@
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum Color {
|
pub enum Color {
|
||||||
Black = 0,
|
Black = 0,
|
||||||
Blue = 1,
|
Blue = 1,
|
||||||
Green = 2,
|
Green = 2,
|
||||||
Cyan = 3,
|
Cyan = 3,
|
||||||
Red = 4,
|
Red = 4,
|
||||||
Magenta = 5,
|
Magenta = 5,
|
||||||
Brown = 6,
|
Brown = 6,
|
||||||
LightGray = 7,
|
LightGray = 7,
|
||||||
DarkGray = 8,
|
DarkGray = 8,
|
||||||
LightBlue = 9,
|
LightBlue = 9,
|
||||||
LightGreen = 10,
|
LightGreen = 10,
|
||||||
LightCyan = 11,
|
LightCyan = 11,
|
||||||
LightRed = 12,
|
LightRed = 12,
|
||||||
Pink = 13,
|
Pink = 13,
|
||||||
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);
|
||||||
impl ColorCode {
|
impl ColorCode {
|
||||||
fn new(foreground: Color, background: Color) -> ColorCode {
|
fn new(foreground: Color, background: Color) -> 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_HEIGHT: usize = 25;
|
||||||
const BUFFER_WIDTH: usize = 80;
|
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 {
|
||||||
b'\n' => self.new_line(),
|
b'\n' => self.new_line(),
|
||||||
byte => {
|
byte => {
|
||||||
if self.column_position >= BUFFER_WIDTH {
|
if self.column_position >= BUFFER_WIDTH {
|
||||||
self.new_line();
|
self.new_line();
|
||||||
}
|
}
|
||||||
let row = BUFFER_HEIGHT - 1;
|
let row = BUFFER_HEIGHT - 1;
|
||||||
let col = self.column_position;
|
let col = self.column_position;
|
||||||
let color_code = self.color_code;
|
let color_code = self.color_code;
|
||||||
self.buffer.chars[row][col].write(ScreenChar {
|
self.buffer.chars[row][col].write(ScreenChar {
|
||||||
ascii_character: byte,
|
ascii_character: byte,
|
||||||
color_code,
|
color_code,
|
||||||
});
|
});
|
||||||
self.column_position += 1;
|
self.column_position += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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 {
|
||||||
// printable ASCII byte or newline
|
// printable ASCII byte or newline
|
||||||
0x20..=0x7e | b'\n' => self.write_byte(byte),
|
0x20..=0x7e | b'\n' => self.write_byte(byte),
|
||||||
// not part of printable ASCII range
|
// not part of printable ASCII range
|
||||||
_ => self.write_byte(0xfe),
|
_ => self.write_byte(0xfe),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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 {
|
||||||
let character = self.buffer.chars[row][col].read();
|
let character = self.buffer.chars[row][col].read();
|
||||||
self.buffer.chars[row - 1][col].write(character);
|
self.buffer.chars[row - 1][col].write(character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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' ',
|
||||||
color_code: self.color_code,
|
color_code: self.color_code,
|
||||||
};
|
};
|
||||||
for col in 0..BUFFER_WIDTH {
|
for col in 0..BUFFER_WIDTH {
|
||||||
self.buffer.chars[row][col].write(blank);
|
self.buffer.chars[row][col].write(blank);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref WRITER: Mutex<Writer> = Mutex::new(Writer {
|
pub static ref WRITER: Mutex<Writer> = Mutex::new(Writer {
|
||||||
column_position: 0,
|
column_position: 0,
|
||||||
color_code: ColorCode::new(Color::Green, Color::Black),
|
color_code: ColorCode::new(Color::Green, Color::Black),
|
||||||
buffer: unsafe { &mut *(0xb8000 as *mut Buffer) },
|
buffer: unsafe { &mut *(0xb8000 as *mut Buffer) },
|
||||||
});
|
});
|
||||||
}
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub fn set_vga_color() {
|
|
||||||
WRITER.lock().color_code = ColorCode::new(Color::White, Color::Yellow);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use spin::Mutex;
|
use spin::Mutex;
|
||||||
|
@ -125,9 +122,13 @@ macro_rules! kprintln {
|
||||||
}
|
}
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub fn _kprint(args: fmt::Arguments) {
|
pub fn _kprint(args: fmt::Arguments) {
|
||||||
use core::fmt::Write;
|
use core::fmt::Write;
|
||||||
use x86_64::instructions::interrupts;
|
use x86_64::instructions::interrupts;
|
||||||
interrupts::without_interrupts(|| {
|
interrupts::without_interrupts(|| {
|
||||||
WRITER.lock().write_fmt(args).unwrap();
|
WRITER.lock().write_fmt(args).unwrap();
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_vga_color(fg: Color, bg: Color) {
|
||||||
|
WRITER.lock().color_code = ColorCode::new(fg, bg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,8 @@ pub fn start(boot_info: &'static BootInfo) -> ! {
|
||||||
let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000));
|
let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000));
|
||||||
memory::create_example_mapping(page, &mut mapper, &mut frame_allocator);
|
memory::create_example_mapping(page, &mut mapper, &mut frame_allocator);
|
||||||
|
|
||||||
let page_ptr: *mut u64 = page.start_address().as_mut_ptr();
|
// let page_ptr: *mut u64 = page.start_address().as_mut_ptr();
|
||||||
unsafe { page_ptr.offset(400).write_volatile(0xf021_f077_f065_804e) };
|
// 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");
|
||||||
|
|
||||||
|
|
63
ableos/src/experiments/absi.rs
Normal file
63
ableos/src/experiments/absi.rs
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
use crate::arch::drivers::vga::{set_vga_color, Color};
|
||||||
|
|
||||||
|
pub fn colorify(eval: &str) {
|
||||||
|
let y = eval.split("$");
|
||||||
|
for z in y {
|
||||||
|
match z {
|
||||||
|
"BLACK" => {
|
||||||
|
set_vga_color(Color::Black, Color::Black);
|
||||||
|
}
|
||||||
|
"RED" => {
|
||||||
|
set_vga_color(Color::Red, Color::Black);
|
||||||
|
}
|
||||||
|
"GREEN" => {
|
||||||
|
set_vga_color(Color::Green, Color::Black);
|
||||||
|
}
|
||||||
|
"BLUE" => {
|
||||||
|
set_vga_color(Color::Blue, Color::Black);
|
||||||
|
}
|
||||||
|
"CYAN" => {
|
||||||
|
set_vga_color(Color::Cyan, Color::Black);
|
||||||
|
}
|
||||||
|
"MAGENTA" => {
|
||||||
|
set_vga_color(Color::Magenta, Color::Black);
|
||||||
|
}
|
||||||
|
"BROWN" => {
|
||||||
|
set_vga_color(Color::Brown, Color::Black);
|
||||||
|
}
|
||||||
|
"LIGHTGRAY" => {
|
||||||
|
set_vga_color(Color::LightGray, Color::Black);
|
||||||
|
}
|
||||||
|
"DARKGRAY" => {
|
||||||
|
set_vga_color(Color::DarkGray, Color::Black);
|
||||||
|
}
|
||||||
|
"LIGHTBLUE" => {
|
||||||
|
set_vga_color(Color::LightBlue, Color::Black);
|
||||||
|
}
|
||||||
|
"LIGHTGREEN" => {
|
||||||
|
set_vga_color(Color::LightGreen, Color::Black);
|
||||||
|
}
|
||||||
|
"LIGHTCYAN" => {
|
||||||
|
set_vga_color(Color::LightCyan, Color::Black);
|
||||||
|
}
|
||||||
|
"LIGHTRED" => {
|
||||||
|
set_vga_color(Color::LightRed, Color::Black);
|
||||||
|
}
|
||||||
|
"PINK" => {
|
||||||
|
set_vga_color(Color::Pink, Color::Black);
|
||||||
|
}
|
||||||
|
"YELLOW" => {
|
||||||
|
set_vga_color(Color::Yellow, Color::Black);
|
||||||
|
}
|
||||||
|
"WHITE" => {
|
||||||
|
set_vga_color(Color::White, Color::Black);
|
||||||
|
}
|
||||||
|
"RESET" => {
|
||||||
|
set_vga_color(Color::White, Color::Black);
|
||||||
|
}
|
||||||
|
elk => {
|
||||||
|
print!("{}", elk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
use crate::trace;
|
use crate::trace;
|
||||||
|
// TODO: Evaluate variable sized mailboxes
|
||||||
|
|
||||||
pub struct MailBoxes {
|
pub struct MailBoxes {
|
||||||
flags: u8,
|
flags: u8,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
pub mod absi;
|
||||||
pub mod clip;
|
pub mod clip;
|
||||||
pub mod server;
|
pub mod server;
|
||||||
pub mod systeminfo;
|
pub mod systeminfo;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#![allow(clippy::empty_loop)]
|
#![allow(clippy::empty_loop)]
|
||||||
|
|
||||||
|
use crate::experiments::absi::colorify;
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
arch::{drivers::graphics::GraphicsBuffer, init, sloop},
|
arch::{drivers::graphics::GraphicsBuffer, init, sloop},
|
||||||
|
@ -12,7 +13,6 @@ use {
|
||||||
alloc::vec,
|
alloc::vec,
|
||||||
lazy_static::lazy_static,
|
lazy_static::lazy_static,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
#[allow(unconditional_recursion)]
|
#[allow(unconditional_recursion)]
|
||||||
pub extern "C" fn stack_overflow() -> u8 {
|
pub extern "C" fn stack_overflow() -> u8 {
|
||||||
|
@ -31,6 +31,7 @@ lazy_static! {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn kernel_main() -> ! {
|
pub fn kernel_main() -> ! {
|
||||||
init::init();
|
init::init();
|
||||||
|
|
||||||
let mut a_thread = Thread::new();
|
let mut a_thread = Thread::new();
|
||||||
|
|
||||||
a_thread.new_task(test_fn);
|
a_thread.new_task(test_fn);
|
||||||
|
@ -46,6 +47,8 @@ pub fn kernel_main() -> ! {
|
||||||
println!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
|
println!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
|
||||||
info!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
|
info!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
|
||||||
|
|
||||||
|
colorify("$PINK$Hi$RED$ from$GREEN$ able");
|
||||||
|
|
||||||
// stack_overflow();
|
// stack_overflow();
|
||||||
// crate::arch::shutdown();
|
// crate::arch::shutdown();
|
||||||
sloop()
|
sloop()
|
||||||
|
|
|
@ -39,7 +39,6 @@ pub mod kmain;
|
||||||
pub mod panic;
|
pub mod panic;
|
||||||
pub mod relib;
|
pub mod relib;
|
||||||
pub mod scheduler;
|
pub mod scheduler;
|
||||||
pub mod test;
|
|
||||||
pub mod wasm;
|
pub mod wasm;
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
|
@ -72,7 +72,7 @@ impl ModuleImportResolver for HostFunctions {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn evaluate() {
|
pub fn evaluate() {
|
||||||
let wasm_binary = include_bytes!("rust.wasm");
|
let wasm_binary = include_bytes!("zig.wasm");
|
||||||
|
|
||||||
// Load wasm binary and prepare it for instantiation.
|
// Load wasm binary and prepare it for instantiation.
|
||||||
let module = wasmi::Module::from_buffer(&wasm_binary).expect("failed to load wasm");
|
let module = wasmi::Module::from_buffer(&wasm_binary).expect("failed to load wasm");
|
||||||
|
|
|
@ -37,11 +37,22 @@ syscall_enum! {
|
||||||
GET_PID=6, // Get the proccess ID
|
GET_PID=6, // Get the proccess ID
|
||||||
PROCESS_INFO=7, // Get information about the process
|
PROCESS_INFO=7, // Get information about the process
|
||||||
//scheduler Related Syscals
|
//scheduler Related Syscals
|
||||||
GET_PRIORITY=10, // Get scheduler priority
|
GET_PRIORITY=8, // Get scheduler priority
|
||||||
SET_PRIORITY=11, // Set scheduler priority
|
SET_PRIORITY=9, // Set scheduler priority
|
||||||
//
|
//
|
||||||
GET_HOSTNAME=12,
|
GET_HOSTNAME=10,
|
||||||
SET_HOSTNAME=13,
|
SET_HOSTNAME=11,
|
||||||
|
|
||||||
|
|
||||||
|
NEW_THREAD=12,
|
||||||
|
NEW_TASK=13,
|
||||||
|
KILL_THREAD=14,
|
||||||
|
KILL_TASK=15,
|
||||||
|
GET_THREAD=16,
|
||||||
|
GET_TASK=17,
|
||||||
|
SEND= 18,
|
||||||
|
RECEIVE = 19,
|
||||||
|
RESPOND = 20,
|
||||||
|
|
||||||
//File Related syscalls
|
//File Related syscalls
|
||||||
//
|
//
|
||||||
|
@ -65,7 +76,6 @@ syscall_enum! {
|
||||||
GET_TIME=36, // Gets the system time (some derivitive of seconds)
|
GET_TIME=36, // Gets the system time (some derivitive of seconds)
|
||||||
SET_TIME=37, // Sets the system time (some derivitive of seconds)
|
SET_TIME=37, // Sets the system time (some derivitive of seconds)
|
||||||
|
|
||||||
|
|
||||||
// Socket SysCall
|
// Socket SysCall
|
||||||
SOCKET_BIND=39, // Used by servers to lock a port
|
SOCKET_BIND=39, // Used by servers to lock a port
|
||||||
SOCKET_CONNECT=40,
|
SOCKET_CONNECT=40,
|
||||||
|
@ -73,6 +83,9 @@ syscall_enum! {
|
||||||
SOCKET_SEND=42,
|
SOCKET_SEND=42,
|
||||||
SOCKET_RECEIVE=43,
|
SOCKET_RECEIVE=43,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EXIT=50,
|
EXIT=50,
|
||||||
EMPTY=0xFFFF,
|
EMPTY=0xFFFF,
|
||||||
}
|
}
|
||||||
|
|
BIN
ableos/src/wasm/zig.wasm
Normal file
BIN
ableos/src/wasm/zig.wasm
Normal file
Binary file not shown.
Loading…
Reference in a new issue