Scheduler will now set a timer interrupt deadline for when it should get interrupted next. This fixes a big issue I've had for a long time where sleeping on an idle core would have to wait for the next periodic interrupt to wake up. This could cause 1 ms sleeps to be close to 10 ms. This currently only supports lapic timers and will still fallback to periodic interrupts when running with PIC. I should add deadline support to PIT/HPET but why would you run with APIC disabled ;)
30 lines
399 B
ArmAsm
30 lines
399 B
ArmAsm
.global asm_yield_trampoline
|
|
asm_yield_trampoline:
|
|
leaq 8(%rsp), %rcx
|
|
movq %rdi, %rsp
|
|
|
|
subq $8, %rsp
|
|
pushq -8(%rcx)
|
|
pushq %rcx
|
|
pushq %rax
|
|
pushq %rbx
|
|
pushq %rbp
|
|
pushq %r12
|
|
pushq %r13
|
|
pushq %r14
|
|
pushq %r15
|
|
|
|
movq %rsp, %rdi
|
|
call scheduler_on_yield_trampoline
|
|
|
|
popq %r15
|
|
popq %r14
|
|
popq %r13
|
|
popq %r12
|
|
popq %rbp
|
|
popq %rbx
|
|
popq %rax
|
|
movq 8(%rsp), %rcx
|
|
movq 0(%rsp), %rsp
|
|
jmp *%rcx
|