From c1cb1e562033aadc71388d18595bc85e6087863b Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Mon, 12 Feb 2018 16:06:00 +0100 Subject: [PATCH 1/2] greatly simplified Writer by removing T generic, 0xb8000 is now hardcoded in flush() --- kernel-rs/src/context.rs | 18 +++++------------- kernel-rs/src/keyboard.rs | 1 - kernel-rs/src/vga/buffer.rs | 36 +++++++++++++++++++++++++++++------- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/kernel-rs/src/context.rs b/kernel-rs/src/context.rs index cb61b08f..6eb76626 100644 --- a/kernel-rs/src/context.rs +++ b/kernel-rs/src/context.rs @@ -5,24 +5,16 @@ use vga; pub struct Context { pub current_term: u8, - pub vga1: vga::Writer<&'static mut [u8]>, - pub vga2: vga::Writer<&'static mut [u8]>, + pub vga1: vga::Writer, + pub vga2: vga::Writer, } impl Context { pub fn new() -> Context { - let slice1 = unsafe { - core::slice::from_raw_parts_mut(0xb8000 as *mut u8, 4000) - }; - - let slice2 = unsafe { - core::slice::from_raw_parts_mut(0xb8000 as *mut u8, 4000) - }; - Context { current_term: 0, - vga1: vga::Writer::new(slice1), - vga2: vga::Writer::new(slice2), + vga1: vga::Writer::new(), + vga2: vga::Writer::new(), } } @@ -33,7 +25,7 @@ impl Context { }; } - pub fn current_term(&mut self) -> &mut vga::Writer<&'static mut [u8]>{ + pub fn current_term(&mut self) -> &mut vga::Writer{ if self.current_term == 0 { &mut self.vga1 } else { diff --git a/kernel-rs/src/keyboard.rs b/kernel-rs/src/keyboard.rs index 7653340c..7cc66263 100644 --- a/kernel-rs/src/keyboard.rs +++ b/kernel-rs/src/keyboard.rs @@ -6,7 +6,6 @@ use context; pub static SCANCODE_TO_ASCII: [u8; 59] = *b"??1234567890-=??qwertyuiop[]\n?asdfghjkl;'`?\\zxcvbnm,./?*? ?"; - pub fn kbd_callback(context: &mut context::Context) { // let terminal_two: vga::terminal::Terminal = vga::Screen::new(); let control = unsafe { cpuio::inb(0x64) }; diff --git a/kernel-rs/src/vga/buffer.rs b/kernel-rs/src/vga/buffer.rs index 7461d9ca..a7765905 100644 --- a/kernel-rs/src/vga/buffer.rs +++ b/kernel-rs/src/vga/buffer.rs @@ -16,20 +16,41 @@ struct ScreenChar { color_code: ColorCode, } +// macro_rules! print { +// ($($arg:tt)*) => ({ +// $crate::vga_buffer::print(format_args!($($arg)*)); +// }); +// } + +// macro_rules! println { +// ($fmt:expr) => (print!(concat!($fmt, "\n"))); +// ($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*)); +// } + +// pub fn print(args: fmt::Arguments) { +// use core::fmt::Write; +// context.current_screen().write_fmt(args).unwrap(); +// } + + +extern crate core; + +// pub const unsafe fn vga_slice() -> &'static [u8] { +// unsafe { core::slice::from_raw_parts_mut(0xb8000 as *mut u8, 4000) } +// } + const BUFFER_ROWS: usize = 25; const BUFFER_COLS: usize = 80 * 2; -pub struct Writer> { +pub struct Writer { pub position: usize, color_code: ColorCode, - slice: T, buffer: [u8; BUFFER_ROWS * BUFFER_COLS], } -impl> Writer { - pub fn new(slice: T) -> Writer { +impl Writer { + pub fn new() -> Writer { Writer { - slice, position: 0, color_code: ColorCode::new(Color::White, Color::Black), buffer: [0; BUFFER_ROWS * BUFFER_COLS], @@ -70,7 +91,8 @@ impl> Writer { } pub fn flush(&mut self) { - self.slice.as_mut().clone_from_slice(&self.buffer); + let slice = unsafe { core::slice::from_raw_parts_mut(0xb8000 as *mut u8, 4000) }; + slice.as_mut().clone_from_slice(&self.buffer); } fn scroll(&mut self) { @@ -92,7 +114,7 @@ impl> Writer { } use core::fmt; -impl> fmt::Write for Writer { +impl fmt::Write for Writer { fn write_str(&mut self, s: &str) -> ::core::fmt::Result { for byte in s.bytes() { self.write_byte(byte) From 2503fdb96defd2e096397b5e7d3bf0fa1d2058ab Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Mon, 12 Feb 2018 16:11:47 +0100 Subject: [PATCH 2/2] CONTEXT is instanciated at compile time now --- kernel-rs/src/context.rs | 13 +++++-------- kernel-rs/src/keyboard.rs | 27 +++++++++++++-------------- kernel-rs/src/lib.rs | 4 +--- kernel-rs/src/vga/buffer.rs | 2 +- 4 files changed, 20 insertions(+), 26 deletions(-) diff --git a/kernel-rs/src/context.rs b/kernel-rs/src/context.rs index 6eb76626..06ca9bb4 100644 --- a/kernel-rs/src/context.rs +++ b/kernel-rs/src/context.rs @@ -2,6 +2,11 @@ extern crate core; use vga; +pub static mut CONTEXT: Context = Context { + current_term: 0, + vga1: vga::Writer::new(), + vga2: vga::Writer::new(), +}; pub struct Context { pub current_term: u8, @@ -10,14 +15,6 @@ pub struct Context { } impl Context { - pub fn new() -> Context { - Context { - current_term: 0, - vga1: vga::Writer::new(), - vga2: vga::Writer::new(), - } - } - pub fn switch_term(&mut self) { self.current_term = { if self.current_term == 0 { 1 } diff --git a/kernel-rs/src/keyboard.rs b/kernel-rs/src/keyboard.rs index 7cc66263..8ea0148b 100644 --- a/kernel-rs/src/keyboard.rs +++ b/kernel-rs/src/keyboard.rs @@ -1,29 +1,28 @@ extern crate core; use cpuio; -use context; +use context::CONTEXT; // use vga::color::{Color, ColorCode}; pub static SCANCODE_TO_ASCII: [u8; 59] = *b"??1234567890-=??qwertyuiop[]\n?asdfghjkl;'`?\\zxcvbnm,./?*? ?"; -pub fn kbd_callback(context: &mut context::Context) { +pub fn kbd_callback() { // let terminal_two: vga::terminal::Terminal = vga::Screen::new(); let control = unsafe { cpuio::inb(0x64) }; if (control & 1) == 1 { let scancode = unsafe { cpuio::inb(0x60) }; - //TODO implement logic to translate scancode->ascii - match self::SCANCODE_TO_ASCII.get(scancode as usize) { - Some(&b'1') => { - context.switch_term(); - context.current_term().flush(); + unsafe { + match self::SCANCODE_TO_ASCII.get(scancode as usize) { + Some(&b'1') => { + CONTEXT.switch_term(); + CONTEXT.current_term().flush(); + } + Some(ascii) => { + CONTEXT.current_term().keypress(*ascii); + }, + None =>{}, + // None => println!("nokey ctrl {:x}", control), } - Some(ascii) => { - let mut terminal = context.current_term(); - terminal.keypress(*ascii); - }, - None =>{}, - // None => println!("nokey ctrl {:x}", control), } - // current_screen.flush(); } } diff --git a/kernel-rs/src/lib.rs b/kernel-rs/src/lib.rs index 51bb83a1..77f1d37d 100644 --- a/kernel-rs/src/lib.rs +++ b/kernel-rs/src/lib.rs @@ -41,10 +41,8 @@ pub extern fn kmain() -> ! { // WRITER.lock().color_code = ColorCode::new(Color::White, Color::Black); // println!(">> Kernel startup..."); - let mut context = context::Context::new(); - loop { - keyboard::kbd_callback(&mut context); + keyboard::kbd_callback(); } } diff --git a/kernel-rs/src/vga/buffer.rs b/kernel-rs/src/vga/buffer.rs index a7765905..eb946ea9 100644 --- a/kernel-rs/src/vga/buffer.rs +++ b/kernel-rs/src/vga/buffer.rs @@ -49,7 +49,7 @@ pub struct Writer { } impl Writer { - pub fn new() -> Writer { + pub const fn new() -> Writer { Writer { position: 0, color_code: ColorCode::new(Color::White, Color::Black),