5 KERNEL_BASE equ 0xFFFF800000000000
10 [extern gMultibootMagic]
23 mov rax, start64.himem
28 mov rax, 0x1F201F201F201F20 ; Set the screen to White on blue, space (4 characters)
34 mov rsp, gInitialKernelStack
37 mov edi, [gMultibootMagic - KERNEL_BASE]
38 mov esi, [gMultibootPtr - KERNEL_BASE]
55 sub ax, 0x38 ; TSS Base
56 shr ax, 4 ; One 16-byte TSS per CPU
59 KSTACK_USERSTATE_SIZE equ (16+1+5)*8 ; GPRegs, CPU, IRET
60 [global Proc_ReturnToUser]
61 [extern Proc_GetCurThread]
63 ; RBP is the handler to use
65 call Proc_GetCurThread
67 ; EAX is the current thread
69 mov rax, [rbx+40] ; Get Kernel Stack
70 sub rax, KSTACK_USERSTATE_SIZE
73 ; NOTE: This can cause corruption if the signal happens while the user
74 ; has called a kernel operation.
75 ; Good thing this can only be called on a user fault.
78 ; Get and alter User SP
79 mov rcx, [rax+KSTACK_USERSTATE_SIZE-3*8]
80 mov rdx, [rbx+60] ; Get Signal Number
82 mov rax, User_Syscall_RetAndExit
86 ; Restore Segment Registers
93 push 0x202 ; RFLAGS (IF and Rsvd)
99 ; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)
100 ; Call a function passing the array as arguments
101 [global CallWithArgArray]
105 mov rcx, [rbp+3*8] ; Get NArgs
109 mov rax, [rdx+rcx*8-8]
120 User_Syscall_RetAndExit:
122 jmp User_Syscall_Exit
129 [global gInitialKernelStack]
130 resd 1024*4 ; 4 Pages