diff --git a/x86_64/redoxfs.asm b/x86_64/redoxfs.asm index 65ac2c53f1dbe82f222f5029057e9912c92f5f90..d32c725668d6eab1b92f59037927722035e35975 100644 --- a/x86_64/redoxfs.asm +++ b/x86_64/redoxfs.asm @@ -67,6 +67,13 @@ redoxfs: .file: times 512 db 0 + .env: + db "REDOXFS_UUID=" + .env.uuid: + db "00000000-0000-0000-0000-000000000000" + .env.end: + db 0 + redoxfs.open: mov eax, 0 mov bx, redoxfs.header @@ -96,27 +103,49 @@ redoxfs.open: mov al, ' ' call print_char + mov di, redoxfs.env.uuid xor si, si .uuid: cmp si, 4 - je .dash + je .uuid.dash cmp si, 6 - je .dash + je .uuid.dash cmp si, 8 - je .dash + je .uuid.dash cmp si, 10 - je .dash - jmp .no_dash - .dash: + je .uuid.dash + jmp .uuid.no_dash + .uuid.dash: mov al, '-' - call print_char - .no_dash: + mov [di], al + inc di + .uuid.no_dash: mov bx, [redoxfs.header + Header.uuid + si] rol bx, 8 - call print_hex + + mov cx, 4 + .uuid.char: + mov al, bh + shr al, 4 + + cmp al, 0xA + jb .uuid.below_0xA + + add al, 'a' - 0xA - '0' + .uuid.below_0xA: + add al, '0' + + mov [di], al + inc di + + shl bx, 4 + loop .uuid.char + add si, 2 cmp si, 16 jb .uuid + + call print call print_line xor ax, ax diff --git a/x86_64/startup-common.asm b/x86_64/startup-common.asm index 4c3bace0903b3d236511eb4f2494cac4b725259c..8aea484bcfb6b9dacf35cefcf9b740820d7995f8 100644 --- a/x86_64/startup-common.asm +++ b/x86_64/startup-common.asm @@ -6,6 +6,8 @@ args: .kernel_size dq 0 .stack_base dq 0 .stack_size dq 0 + .env_base dq 0 + .env_size dq 0 startup: ; enable A20-Line via IO-Port 92, might not work on all motherboards diff --git a/x86_64/startup-x86_64.asm b/x86_64/startup-x86_64.asm index 8909c431d0c7157ef874e12d10ed019e96f4b75f..1c18163e176921f682b1e5e3e0a0040c9bacb09f 100644 --- a/x86_64/startup-x86_64.asm +++ b/x86_64/startup-x86_64.asm @@ -123,23 +123,48 @@ long_mode: mov ss, rax ; stack_base - mov rdx, 0xFFFFFF0000080000 - mov [args.stack_base], rdx + mov rsi, 0xFFFFFF0000080000 + mov [args.stack_base], rsi ; stack_size mov rcx, 0x1F000 mov [args.stack_size], rcx ; set stack pointer - mov rsp, rdx + mov rsp, rsi add rsp, rcx - sub rsp, 256 + + ; copy env to stack +%ifdef KERNEL + mov rsi, 0 + mov rcx, 0 +%else + mov rsi, redoxfs.env + mov rcx, redoxfs.env.end - redoxfs.env +%endif + mov [args.env_size], rcx + cmp rcx, 0 + je .no_env +.copy_env: + mov al, [rsi + rcx] + dec rsp + mov [rsp], al + loop .copy_env +.no_env + mov [args.env_base], rsp + + ; align stack + and rsp, 0xFFFFFFFFFFFFFFF0 ; set args mov rdi, args ; entry point mov rax, [args.kernel_base] - jmp [rax + 0x18] + call [rax + 0x18] +.halt: + cli + hlt + jmp .halt long_mode_ap: mov rax, gdt.kernel_data