1 ; AcessOS Microkernel Version
6 KERNEL_BASE equ 0xC0000000
8 KSTACK_USERSTATE_SIZE equ (4+8+1+5)*4 ; SRegs, GPRegs, CPU, IRET
12 [extern giMP_TimerCount]
13 [extern gpMP_LocalAPIC]
15 [global SetAPICTimerCount]
29 mov eax, [gpMP_LocalAPIC]
33 mov DWORD [eax+0x380], 0xFFFFFFFF ; Set Initial Count
34 mov DWORD [eax+0x320], 0x000000F0 ; Enable the timer on IVT#0xEF (One Shot)
41 mov DWORD [giMP_TimerCount], ecx
43 mov DWORD [eax+0x320], 0x000100EF
44 mov DWORD [eax+0x380], 0
46 ; Update Timer IRQ to the IRQ code
47 mov eax, SchedulerBase
49 mov DWORD [Isr240.jmp+1], eax
51 ;xchg bx, bx ; MAGIC BREAK
62 ; No Error code / int num
68 [extern Proc_Scheduler]
69 [global SchedulerBase]
78 push eax ; Debug Register 0, Current Thread
89 push eax ; Push as argument
95 [global scheduler_return]
96 scheduler_return: ; Used by some hackery in Proc_DumpThreadCPUState
98 add esp, 4 ; Remove CPU Number (thread is poped later)
106 out 0x20, al ; ACK IRQ
111 mov eax, DWORD [gpMP_LocalAPIC]
112 mov DWORD [eax+0x0B0], 0
115 pop eax ; Debug Register 0, Current Thread
125 ; No Error code / int num
129 [extern Threads_Exit]
132 ; Call Proc_Clone with Flags=0
137 add esp, 8 ; Remove arguments from stack
142 ; In child, so now set up stack frame
143 mov ebx, [esp+4] ; Child Function
144 mov edx, [esp+8] ; Argument
149 push 0 ; Kill this thread
150 call Threads_Exit ; Kill Thread
155 ; void Proc_ReturnToUser(void *Method, Uint Parameter)
156 ; Calls a user fault handler
158 [global Proc_ReturnToUser]
159 [extern Proc_GetCurThread]
163 ; [EBP+8]: handler to use
164 ; [EBP+12]: parameter
165 ; [EBP+16]: kernel stack top
167 ;call Proc_GetCurThread
169 ; EAX is the current thread
171 ;mov eax, [ebx+12*4] ; Get Kernel Stack
172 mov eax, [ebp+16] ; Get Kernel Stack
173 sub eax, KSTACK_USERSTATE_SIZE
176 ; NOTE: This can cause corruption if the signal happens while the user
177 ; has called a kernel operation.
178 ; Good thing this can only be called on a user fault.
183 mov edx, [eax+KSTACK_USERSTATE_SIZE-12] ; User ESP is at top of kstack - 3*4
189 test BYTE [0xFC3F0000+ecx*4], 1
195 test BYTE [0xFC000000+ecx*4], 1
204 test BYTE [0xFC3F0000+ecx*4], 1
210 test BYTE [0xFC000000+ecx*4], 1
213 ; Get and alter User SP
215 mov edx, [ebp+12] ; Get parameter
216 mov [edi+4], edx ; save to user stack
217 mov [edi], DWORD User_Syscall_RetAndExit ; Return Address
219 ; Restore Segment Registers
228 push 0x202 ; EFLAGS (IP and Rsvd)
230 mov eax, [ebp+8] ; Method to call
235 ; Just kill the bleeding thing
236 ; (I know it calls int 0xAC in kernel mode, but meh)
244 GetCPUNum: ; TODO: Store in debug registers
248 ; shr ax, 3 ; ax /= 8
252 ; Usermode code exported by the kernel
254 ; Export a place for the user to jump to to call a syscall
255 ; - Allows the kernel to change the method easily
257 xchg bx, bx ; MAGIC BREAKPOINT
260 ; A place to return to and exit
261 User_Syscall_RetAndExit:
263 call User_Syscall_Exit