Skip to content

Commit a49f39e

Browse files
Attempting to make println!
1 parent 68a6ab9 commit a49f39e

File tree

7 files changed

+77
-46
lines changed

7 files changed

+77
-46
lines changed

src/bootsector/src/errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use shared::utils;
2-
use shared::console::println;
2+
use super::console::println;
33

44
#[no_mangle]
55
pub extern "C" fn dap_load_failed() -> ! {

src/bootsector/src/main.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
mod errors;
99
mod console;
1010

11-
use core::panic::PanicInfo;
1211
use stage_2::second_stage;
1312

1413
use self::console::println;
@@ -37,14 +36,6 @@ unsafe extern "C" fn rust_start(disk_number: u16) -> ! {
3736
}
3837
}
3938

40-
#[panic_handler]
41-
pub fn panic(_info: &PanicInfo) -> ! {
42-
println(b"[!] Rust Panic");
43-
loop {
44-
utils::hlt()
45-
}
46-
}
47-
4839
pub fn check_int13h_extensions(disk_number: u16) {
4940
unsafe {
5041
llvm_asm!("

src/shared/src/console.rs

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,51 @@
1-
#[inline(never)]
2-
pub fn println(s: &[u8]) {
3-
print(s);
4-
print_char(b'\n');
1+
use core::{fmt, fmt::Write};
2+
3+
#[macro_export]
4+
macro_rules! print {
5+
($($arg:tt)*) => {{
6+
use core::fmt::Write;
7+
let mut writer = $crate::console::Writer {};
8+
let _ = writer.write_fmt(format_args!($($arg)*));
9+
}};
10+
}
11+
12+
#[macro_export]
13+
macro_rules! println {
14+
() => ($crate::print!("\n"));
15+
($($arg:tt)*) => ($crate::print!("{}\n", format_args!($($arg)*)));
516
}
617

7-
pub fn print(s: &[u8]) {
8-
let mut i = 0;
18+
pub struct Writer {}
19+
20+
impl Write for Writer {
21+
fn write_str(&mut self, s: &str) -> fmt::Result {
22+
for c in s.chars() {
23+
let _ = self.write_char(c);
24+
}
25+
26+
Ok(())
27+
}
928

10-
while i < s.len() {
11-
print_char(s[i]);
12-
i += 1;
13-
}
29+
fn write_char(&mut self, c: char) -> fmt::Result {
30+
let mut buffer = [0u8; 4];
31+
32+
c.encode_utf8(&mut buffer);
33+
34+
for raw_char in &buffer {
35+
self.write_raw_char(*raw_char);
36+
}
37+
38+
Ok(())
39+
}
1440
}
1541

16-
#[inline(always)]
17-
pub fn print_char(c: u8) {
18-
let ax = u16::from(c) | 0x0e00;
19-
unsafe {
20-
llvm_asm!("int 0x10" :: "{ax}"(ax) :: "intel" );
42+
impl Writer {
43+
#[inline(always)]
44+
fn write_raw_char(&mut self, c: u8) {
45+
let ax = u16::from(c) | 0x0e00;
46+
47+
unsafe {
48+
llvm_asm!("int 0x10" :: "{ax}"(ax), "{bx}"(0) :: "intel", "volatile");
49+
}
2150
}
2251
}

src/stage_2/src/lib.rs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
#![no_std]
22
#![feature(llvm_asm)]
33

4-
use shared::console::println;
4+
// FIXME
5+
#![allow(dead_code, unused_variables)]
6+
7+
use shared::println;
58
use shared::linker_symbol;
69
use v86::gdt::{GlobalDescriptorTable, Descriptor, TaskStateSegment};
710

811
use lazy_static::lazy_static;
912

13+
mod panic;
14+
1015
lazy_static! {
1116
static ref TSS: TaskStateSegment = {
1217
let mut tss = TaskStateSegment::new();
@@ -30,21 +35,23 @@ lazy_static! {
3035

3136
#[no_mangle]
3237
pub fn second_stage() {
33-
println(b"Stage 2");
38+
println!("Stage 2");
3439

35-
println(b"Loading GDT");
40+
loop {}
41+
}
42+
43+
fn enter_protected_mode() {
44+
println!("Loading GDT");
3645

3746
unsafe { GDT.load(); }
3847

39-
println(b"GDT Loaded!");
48+
println!("GDT Loaded!");
4049

41-
loop {};
42-
43-
println(b"Switching to 32-bit");
50+
println!("Switching to 32-bit");
4451

4552
enable_a20();
4653

47-
println(b"A20");
54+
println!("A20");
4855

4956
loop {};
5057

@@ -61,18 +68,9 @@ pub fn second_stage() {
6168
}
6269
}
6370

64-
static HELLO: &[u8] = b"Protected Mode!";
65-
6671
#[no_mangle]
6772
extern "C" fn protected_mode() {
68-
let vga_buffer = 0xb8000 as *mut u8;
69-
70-
for (i, &byte) in HELLO.iter().enumerate() {
71-
unsafe {
72-
*vga_buffer.offset(i as isize * 2) = byte;
73-
*vga_buffer.offset(i as isize * 2 + 1) = 0xb;
74-
}
75-
}
73+
println!("Protected Mode!");
7674

7775
loop {}
7876
}

src/stage_2/src/panic.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use core::panic::PanicInfo;
2+
use shared::println;
3+
use shared::utils;
4+
5+
#[panic_handler]
6+
pub fn panic(info: &PanicInfo) -> ! {
7+
println!("[Panic]");
8+
9+
loop {
10+
utils::hlt()
11+
}
12+
}

src/v86/src/gdt.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ impl GlobalDescriptorTable {
4848
limit: (self.table.len() * size_of::<u64>() - 1) as u16,
4949
};
5050

51-
unsafe {
52-
llvm_asm!("lgdt ($0)" :: "r" (&ptr) : "memory");
53-
}
51+
llvm_asm!("lgdt ($0)" :: "r" (&ptr) : "memory");
5452
}
5553

5654
#[inline]

src/v86/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
#![feature(llvm_asm)]
44
#![no_std]
55

6+
// FIXME
7+
#![allow(dead_code, unused_imports)]
8+
69
use core::slice;
710

811
pub mod gdt;

0 commit comments

Comments
 (0)