X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fstart64.asm;h=b0a85868ceb4b5ba4ad60056d6d3f3d96d38396f;hb=952891ddb96a341c0e24ecb7dec6361c7bbeaece;hp=04bac26918e35e35576286b5a622b1dcca5a91ce;hpb=d8b11d2074b48f17f999d44c75b1f76fdffd970b;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/start64.asm b/Kernel/arch/x86_64/start64.asm index 04bac269..b0a85868 100644 --- a/Kernel/arch/x86_64/start64.asm +++ b/Kernel/arch/x86_64/start64.asm @@ -2,7 +2,8 @@ ; Acess2 x86_64 Port ; [bits 64] -KERNEL_BASE equ 0xFFFF800000000000 +;KERNEL_BASE equ 0xFFFF800000000000 +KERNEL_BASE equ 0xFFFFFFFF80000000 [extern kmain] @@ -24,6 +25,9 @@ start64: jmp rax .himem: + xor rax, rax + mov dr0, rax ; Set CPU0 + ; Clear the screen mov rax, 0x1F201F201F201F20 ; Set the screen to White on blue, space (4 characters) mov edi, 0xB8000 @@ -50,10 +54,10 @@ GetRIP: [global GetCPUNum] GetCPUNum: - str ax - mov gs, ax xor rax, rax - mov al, [gs:104] ; End of TSS + str ax + sub ax, 0x38 ; TSS Base + shr ax, 4 ; One 16-byte TSS per CPU ret KSTACK_USERSTATE_SIZE equ (16+1+5)*8 ; GPRegs, CPU, IRET @@ -102,16 +106,53 @@ Proc_ReturnToUser: CallWithArgArray: push rbp mov rbp, rsp - mov rcx, [rbp+3*8] ; Get NArgs - mov rdx, [rbp+4*8] - -.top: - mov rax, [rdx+rcx*8-8] - push rax - loop .top + push r10 + push r11 - mov rax, [rbp+2*8] + mov [rbp+2*8], rdi ; Save Ptr to stack + + mov r11, rsi ; NArgs + mov r10, rdx ; Args + + ; Arg 1: RDI + mov rdi, [r10] + add r10, 8 + dec r11 + jz .call + ; Arg 2: RSI + mov rsi, [r10] + add r10, 8 + dec r11 + jz .call + ; Arg 3: RDX + mov rdx, [r10] + add r10, 8 + dec r11 + jz .call + ; Arg 4: RCX + mov rcx, [r10] + add r10, 8 + dec r11 + jz .call + ; Arg 5: R8 + mov r8, [r10] + add r10, 8 + dec r11 + jz .call + ; Arg 6: R9 + mov r9, [r10] + add r10, 8 + dec r11 + jz .call + ; No support for more + +.call: + mov rax, [rbp+2*8] ; Ptr call rax + + pop r11 + pop r10 + lea rsp, [rbp] pop rbp ret