Files
RockOS/kernel/scheduler.S

31 lines
611 B
ArmAsm

.code32
.global yield
.extern schedule_next_task
yield: # void yield()
cli
pushfl
pushl %cs
movl 8(%esp), %eax
pushl %eax
movl 4(%esp), %ebx # Get CS
movl %ebx, 8(%esp) # Move CS over Old EIP
movl 0(%esp), %ebx # Get Return EIP
movl %ebx, 4(%esp) # Move Return EIP over CS
addl $4, %esp # Adjust stack pointer up.
# the stack now looks like a hardware interrupt just happened, even though we never called one.
pushal
pushl %esp
call switch_context
movl %eax, %esp
popal
sti
iret