diff options
| author | Tianhao Wang <shrik3@riseup.net> | 2023-03-10 19:26:31 +0100 |
|---|---|---|
| committer | Tianhao Wang <shrik3@riseup.net> | 2023-03-10 19:26:31 +0100 |
| commit | 29e28bc9c67378d0d9a7174dec6a0b541fb7f4d5 (patch) | |
| tree | ff9cd708e41ffb7f3b84347d404ffde758c18ab5 /src | |
| parent | 285508a3c9c2fa35b608e3a561f0c7a63cfacf62 (diff) | |
a minimal working demo on bare metal
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/mod.rs | 1 | ||||
| -rw-r--r-- | src/arch/x86_64/asm/io_port.s | 71 | ||||
| -rw-r--r-- | src/arch/x86_64/asm/startup.s | 12 | ||||
| -rw-r--r-- | src/arch/x86_64/cpu.rs | 0 | ||||
| -rw-r--r-- | src/arch/x86_64/io_port.rs | 0 | ||||
| -rw-r--r-- | src/arch/x86_64/linker.ld | 74 | ||||
| -rw-r--r-- | src/arch/x86_64/mod.rs | 5 | ||||
| -rw-r--r-- | src/arch/x86_64/pic.rs | 0 | ||||
| -rw-r--r-- | src/arch/x86_64/pit.rs | 0 | ||||
| -rw-r--r-- | src/arch/x86_64/plugbox.rs | 0 | ||||
| -rw-r--r-- | src/lib.rs | 23 | ||||
| -rw-r--r-- | src/machine/cgascr.rs | 36 | ||||
| -rw-r--r-- | src/machine/mod.rs | 1 | ||||
| -rw-r--r-- | src/main.rs | 3 |
14 files changed, 217 insertions, 9 deletions
diff --git a/src/arch/mod.rs b/src/arch/mod.rs new file mode 100644 index 0000000..2a99bf5 --- /dev/null +++ b/src/arch/mod.rs @@ -0,0 +1 @@ +pub mod x86_64; diff --git a/src/arch/x86_64/asm/io_port.s b/src/arch/x86_64/asm/io_port.s index e69de29..9ddc4e6 100644 --- a/src/arch/x86_64/asm/io_port.s +++ b/src/arch/x86_64/asm/io_port.s @@ -0,0 +1,71 @@ +;*************************************************************************** +;* Operating-System Construction * +;*---------------------------------------------------------------------------* +;* * +;* I O _ P O R T * +;* * +;*---------------------------------------------------------------------------* +;* The functions defined here encapsulate the machine instructions 'in' and * +;* 'out' for class IO_Port. * +;***************************************************************************** + +; EXPORTED FUNCTIONS + +[GLOBAL outb] +[GLOBAL outw] +[GLOBAL inb] +[GLOBAL inw] + +; FUNCTION IMPLEMENTATIONS + +[SECTION .text] + +; OUTB: Byte-wise output via an I/O port. +; +; C prototype: void outb (int port, int value); + +outb: + push rbp + mov rbp, rsp + mov rdx, rdi + mov rax, rsi + out dx, al + pop rbp + ret + +; OUTW: Word-wise output via an I/O port. +; +; C prototype: void outw (int port, int value); + +outw: + push rbp + mov rbp, rsp + mov rdx, rdi + mov rax, rsi + out dx, ax + pop rbp + ret + +; INB: Byte-wise input via an I/O port. +; +; C prototype: unsigned char inb (int port); + +inb: + push rbp + mov rbp, rsp + mov rdx, rdi + in al, dx + pop rbp + ret + +; INW: Word-wise input via an I/O port. +; +; C prototype: unsigned short inw (int port); + +inw: + push rbp + mov rbp, rsp + mov rdx, rdi + in ax, dx + pop rbp + ret diff --git a/src/arch/x86_64/asm/startup.s b/src/arch/x86_64/asm/startup.s index 4c696e1..7b5bbff 100644 --- a/src/arch/x86_64/asm/startup.s +++ b/src/arch/x86_64/asm/startup.s @@ -17,7 +17,7 @@ ; Constants ; -; stack for the main function +; stack for the main function (renamed to _entry()) STACKSIZE: equ 65536 ; video memory base address @@ -59,8 +59,8 @@ pagetable_end: equ 0x200000 [GLOBAL _ZdlPvm] ; functions from the C parts of the system -[EXTERN main] -[EXTERN guardian] +[EXTERN _entry] +;[EXTERN guardian] ; addresses provided by the compiler [EXTERN ___BSS_START__] @@ -204,7 +204,7 @@ fill_tables3_done: ; system start, part 2 (in 64-bit Long Mode) ; ; This code clears the BSS segment and initializes IDT and PICs. Then the -; constructors of global C++ objects are called, and finally main() is run. +; constructors of global C++ objects are called, and finally _entry() is run. ; longmode_start: @@ -234,7 +234,7 @@ clear_bss: ;mov cr4, rax call _init ; call constructors of global objects - call main ; call the OS kernel's C / C++ part + call _entry ; call the OS kernel's C / C++ part call _fini ; call destructors cli ; Usually we should not get here. hlt @@ -279,7 +279,7 @@ wrapper_body: ; pass interrupt number as the first parameter mov rdi, rax - call guardian +; call guardian ; restore volatile registers pop r11 diff --git a/src/arch/x86_64/cpu.rs b/src/arch/x86_64/cpu.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/arch/x86_64/cpu.rs diff --git a/src/arch/x86_64/io_port.rs b/src/arch/x86_64/io_port.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/arch/x86_64/io_port.rs diff --git a/src/arch/x86_64/linker.ld b/src/arch/x86_64/linker.ld new file mode 100644 index 0000000..7a03770 --- /dev/null +++ b/src/arch/x86_64/linker.ld @@ -0,0 +1,74 @@ +SECTIONS +{ + . = 0x100000; /* system's start address */ + + .text : + { + *(".text") + *(".text.*") + *(".text$") + *(".init") + *(".fini") + *(".gnu.linkonce.*") + } + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + KEEP (*(".ctors")) + KEEP (*(".ctor")) + PROVIDE_HIDDEN (__init_array_end = .); + } + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + KEEP (*(".dtors")) + KEEP (*(".dtor")) + PROVIDE_HIDDEN (__fini_array_end = .); + } + + .data : + { + *(".data") + *(".data$") + *(".rodata") + *(".rodata.*") + *(".got") + *(".got.plt") + *(".eh_frame") + *(".eh_fram") + *(".jcr") + *(".note.*") + } + + .bss : + { + ___BSS_START__ = .; + *(".bss") + *(".bss.*") + ___BSS_END__ = .; + } + + /* global page table for 64-bit long mode */ + .global_pagetable ALIGN(4096) (NOLOAD) : + { + *(".global_pagetable") + } + +/* + /DISCARD/ : + { + *(".note") + *(".comment") + *(".debug_line") + *(".debug_info") + *(".debug_abbrev") + *(".debug_aranges") + } +*/ +} diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs new file mode 100644 index 0000000..ef06437 --- /dev/null +++ b/src/arch/x86_64/mod.rs @@ -0,0 +1,5 @@ +pub mod io_port; +pub mod pic; +pub mod pit; +pub mod plugbox; +pub mod cpu; diff --git a/src/arch/x86_64/pic.rs b/src/arch/x86_64/pic.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/arch/x86_64/pic.rs diff --git a/src/arch/x86_64/pit.rs b/src/arch/x86_64/pit.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/arch/x86_64/pit.rs diff --git a/src/arch/x86_64/plugbox.rs b/src/arch/x86_64/plugbox.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/arch/x86_64/plugbox.rs diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..767e547 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,23 @@ +#![no_std] +#![no_main] +mod arch; +// use core::panic::PanicInfo; + +static HELLO: &[u8] = b"Hello World!"; + +// #[panic_handler] +// fn panic(_info: &PanicInfo) -> ! { +// +// loop {} +// } + +#[no_mangle] +pub extern "C" fn _entry() -> ! { + let vga_buffer = 0xb8000 as *mut u8; + + unsafe { + *vga_buffer.offset(10 as isize * 2) = 'X' as u8; + *vga_buffer.offset(10 as isize * 2 + 1) = 0xb; + } + loop {} +} diff --git a/src/machine/cgascr.rs b/src/machine/cgascr.rs new file mode 100644 index 0000000..a43e073 --- /dev/null +++ b/src/machine/cgascr.rs @@ -0,0 +1,36 @@ +const CGA_START:u32 = 0xb8000; + +#[allow(dead_code)] +pub struct CGAScreen{ + max_cows:u32, + max_rows:u32, +} + +#[allow(dead_code)] +impl CGAScreen{ + pub fn new(cows:u32, rows:u32) -> Self { + Self {max_cows: cows, max_rows:rows,} + } + + pub fn set_pos(x:u32, y:u32){ + + } + + pub fn get_pos(x:&mut u32, y:&mut u32){ + // TODO + *x = 1; + *y = 1; + } + + pub fn putchar(c:char, attr:u8){ + + } + + // this function should be the only one that "directly touches" + // the memory by address. + // and since it's unsafe, it shouldn't be public + fn show(&self, x:u32, y:u32, c:char, attr:u8){ + + } + +} diff --git a/src/machine/mod.rs b/src/machine/mod.rs new file mode 100644 index 0000000..4622e0b --- /dev/null +++ b/src/machine/mod.rs @@ -0,0 +1 @@ +pub mod cgascr; diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index e7a11a9..0000000 --- a/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -} |
