31 lines
611 B
ArmAsm
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 |