/* * Copyright (c) 2020, 2021 Antony Pavlov * * based on arch/riscv/core/swap.S * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include /* * unsigned int arch_swap(unsigned int key) * * Always called with interrupts locked * key is stored in a0 register */ GTEXT(arch_swap) SECTION_FUNC(exception.other, arch_swap) /* Make a system call to perform context switch */ syscall /* * when thread is rescheduled, unlock irq and return. * Restored register v0 contains IRQ lock state of thread. */ la k0, _kernel /* Get pointer to _kernel.current */ lw k1, _kernel_offset_to_current(k0) /* Load return value of arch_swap function in register v0 */ lw v0, _thread_offset_to_swap_return_value(k1) /* * Unlock irq, following IRQ lock state in v0 register. */ mfc0 k0, CP0_STATUS or k0, k0, a0 mtc0 k0, CP0_STATUS ehb /* Return */ jr ra