diff --git a/x86_64/bootsector.asm b/x86_64/bootsector.asm index f1b463ef56954ba9dbb643fb7c9e437fd56402a9..80e40e834f28e0db13a7c9e812b0a1e1c04bdb5a 100644 --- a/x86_64/bootsector.asm +++ b/x86_64/bootsector.asm @@ -27,11 +27,11 @@ boot: ; dl comes with disk call print_line mov bx, (startup_start - boot) / 512 - call print_num + call print_hex call print_line mov bx, startup_start - call print_num + call print_hex call print_line mov eax, (startup_start - boot) / 512 @@ -130,28 +130,28 @@ print_dapack: call print_char mov bx, [DAPACK.addr + 2] - call print_num + call print_hex mov bx, [DAPACK.addr] - call print_num + call print_hex mov al, '#' call print_char mov bx, [DAPACK.count] - call print_num + call print_hex mov al, ' ' call print_char mov bx, [DAPACK.seg] - call print_num + call print_hex mov al, ':' call print_char mov bx, [DAPACK.buf] - call print_num + call print_hex ret @@ -160,7 +160,7 @@ error: mov bh, 0 mov bl, ah - call print_num + call print_hex mov al, ' ' call print_char @@ -173,7 +173,7 @@ error: hlt jmp .halt -%include "print16.asm" +%include "print.asm" name: db "Redox Loader - Stage One",0 errored: db "Could not read disk",0 diff --git a/x86_64/print16.asm b/x86_64/print.asm similarity index 89% rename from x86_64/print16.asm rename to x86_64/print.asm index 06b9fb120cc69e426a333bc18b3558404416d54d..a2340d9133407cb902a3fe71150cab06b7ff5f55 100644 --- a/x86_64/print16.asm +++ b/x86_64/print.asm @@ -15,8 +15,9 @@ print_line: ; IN ; si: points at zero-terminated String ; CLOBBER -; ax +; si, ax print: + pushf cld .loop: lodsb @@ -25,24 +26,26 @@ print: call print_char jmp .loop .done: + popf ret ; print a character ; IN ; al: character to print -; CLOBBER -; ah print_char: + pusha + mov bx, 7 mov ah, 0x0e int 0x10 + popa ret ; print a number in hex ; IN ; bx: the number ; CLOBBER -; cx, ax -print_num: +; al, cx +print_hex: mov cx, 4 .lp: mov al, bh diff --git a/x86_64/redoxfs.asm b/x86_64/redoxfs.asm index b9a26da30ed8237b8fbd1f94ee5ce35613140f70..65ac2c53f1dbe82f222f5029057e9912c92f5f90 100644 --- a/x86_64/redoxfs.asm +++ b/x86_64/redoxfs.asm @@ -92,7 +92,31 @@ redoxfs.open: jl .ver lea si, [redoxfs.header + Header.signature] - call printrm + call print + mov al, ' ' + call print_char + + xor si, si + .uuid: + cmp si, 4 + je .dash + cmp si, 6 + je .dash + cmp si, 8 + je .dash + cmp si, 10 + je .dash + jmp .no_dash + .dash: + mov al, '-' + call print_char + .no_dash: + mov bx, [redoxfs.header + Header.uuid + si] + rol bx, 8 + call print_hex + add si, 2 + cmp si, 16 + jb .uuid call print_line xor ax, ax @@ -104,20 +128,20 @@ redoxfs.open: .sig_err: mov si, .err_msg - call printrm + call print mov si, .sig_err_msg - call printrm + call print mov ax, 1 ret .ver_err: mov si, .err_msg - call printrm + call print mov si, .ver_err_msg - call printrm + call print mov ax, 1 ret @@ -128,7 +152,7 @@ redoxfs.open: redoxfs.root: lea si, [redoxfs.dir + Node.name] - call printrm + call print call print_line .lp: @@ -197,10 +221,10 @@ redoxfs.root: .no_kernel: mov si, .no_kernel_msg - call printrm + call print mov si, .kernel_name - call printrm + call print call print_line @@ -212,10 +236,10 @@ redoxfs.root: redoxfs.kernel: lea si, [redoxfs.file + Node.name] - call printrm + call print call print_line - mov edi, [kernel_base] + mov edi, [args.kernel_base] .lp: mov bx, 0 .ext: @@ -264,8 +288,8 @@ redoxfs.kernel: jmp .lp .done: - sub edi, [kernel_base] - mov [kernel_size], edi + sub edi, [args.kernel_base] + mov [args.kernel_size], edi xor eax, eax ret diff --git a/x86_64/startup-common.asm b/x86_64/startup-common.asm index 06641cd2500ed499cd02d1d6623f6fa4255adc01..4c3bace0903b3d236511eb4f2494cac4b725259c 100644 --- a/x86_64/startup-common.asm +++ b/x86_64/startup-common.asm @@ -1,8 +1,11 @@ SECTION .text USE16 -kernel_base dq 0x100000 -kernel_size dq 0 +args: + .kernel_base dq 0x100000 + .kernel_size dq 0 + .stack_base dq 0 + .stack_size dq 0 startup: ; enable A20-Line via IO-Port 92, might not work on all motherboards @@ -11,9 +14,9 @@ startup: out 0x92, al %ifdef KERNEL - mov edi, [kernel_base] + mov edi, [args.kernel_base] mov ecx, (kernel_file.end - kernel_file) - mov [kernel_size], ecx + mov [args.kernel_size], ecx mov eax, (kernel_file - boot)/512 add ecx, 511 @@ -31,15 +34,15 @@ startup: call vesa mov si, init_fpu_msg - call printrm + call print call initialize.fpu mov si, init_sse_msg - call printrm + call print call initialize.sse mov si, startup_arch_msg - call printrm + call print jmp startup_arch diff --git a/x86_64/startup-x86_64.asm b/x86_64/startup-x86_64.asm index 17883cd20cfdf97d1fccd69f424bc689faaf0d7d..8909c431d0c7157ef874e12d10ed019e96f4b75f 100644 --- a/x86_64/startup-x86_64.asm +++ b/x86_64/startup-x86_64.asm @@ -122,23 +122,24 @@ long_mode: mov gs, rax mov ss, rax - ; kernel_base - mov rdi, [kernel_base] - ; kernel_size - mov rsi, [kernel_size] ; stack_base mov rdx, 0xFFFFFF0000080000 + mov [args.stack_base], rdx ; stack_size mov rcx, 0x1F000 + mov [args.stack_size], rcx ; set stack pointer mov rsp, rdx add rsp, rcx sub rsp, 256 + ; set args + mov rdi, args + ; entry point - mov rax, [rdi + 0x18] - jmp rax + mov rax, [args.kernel_base] + jmp [rax + 0x18] long_mode_ap: mov rax, gdt.kernel_data @@ -148,13 +149,11 @@ long_mode_ap: mov gs, rax mov ss, rax - mov rdi, [trampoline.cpu_id] - mov rsi, [trampoline.page_table] - mov rdx, [trampoline.stack_start] mov rcx, [trampoline.stack_end] - lea rsp, [rcx - 256] + mov rdi, trampoline.cpu_id + mov rax, [trampoline.code] mov qword [trampoline.ready], 1 jmp rax diff --git a/x86_64/vesa.asm b/x86_64/vesa.asm index 4fe03e8f4ebd304b35c5635b2795b92a1fe38a9e..367b2c210e7bb2b42b6c2fa3534440c0e08b77f6 100644 --- a/x86_64/vesa.asm +++ b/x86_64/vesa.asm @@ -69,26 +69,26 @@ vesa: jb .searchmodes .testgood: mov al, 13 - call charrm + call print_char mov cx, [.currentmode] mov [.goodmode], cx push esi - ; call decshowrm + ; call print_dec ; mov al, ':' - ; call charrm + ; call print_char mov cx, [VBEModeInfo.xresolution] - call decshowrm + call print_dec mov al, 'x' - call charrm + call print_char mov cx, [VBEModeInfo.yresolution] - call decshowrm + call print_dec mov al, '@' - call charrm + call print_char xor ch, ch mov cl, [VBEModeInfo.bitsperpixel] - call decshowrm + call print_dec mov si, .modeok - call printrm + call print xor ax, ax int 0x16 pop esi @@ -128,7 +128,12 @@ vesa: .currentmode dw 0 ;useful functions -decshowrm: +; print a number in decimal +; IN +; cx: the number +; CLOBBER +; al, cx, si +print_dec: mov si, .number .clear: mov al, "0" @@ -137,7 +142,7 @@ decshowrm: cmp si, .numberend jb .clear dec si - call convertrm + call convert_dec mov si, .number .lp: lodsb @@ -147,13 +152,13 @@ decshowrm: jbe .lp .end: dec si - call printrm + call print ret .number times 7 db 0 .numberend db 0 -convertrm: +convert_dec: dec si mov bx, si ;place to convert into must be in si, number to convert must be in cx .cnvrt: @@ -191,19 +196,3 @@ convertrm: jmp .cnvrt .return: ret - -printrm: - mov al, [si] - test al, al - jz .return - call charrm - inc si - jmp printrm -.return: - ret - -charrm: ;char must be in al - mov bx, 7 - mov ah, 0xE - int 10h - ret