| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| /* | |
| * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | |
| * | |
| * Vineetg: Aug 2009 | |
| * -Moved core context switch macro out of entry.S into this file. | |
| * -This is the more "natural" hand written assembler | |
| */ | |
| #include <linux/linkage.h> | |
| #include <asm/entry.h> /* For the SAVE_* macros */ | |
| #include <asm/asm-offsets.h> | |
| ; IN | |
| ; - r0: prev task (also current) | |
| ; - r1: next task | |
| ; OUT | |
| ; - r0: prev task (so r0 not touched) | |
| .section .sched.text,"ax",@progbits | |
| ENTRY_CFI(__switch_to) | |
| /* save kernel stack frame regs of @prev task */ | |
| push blink | |
| CFI_DEF_CFA_OFFSET 4 | |
| CFI_OFFSET r31, -4 | |
| push fp | |
| CFI_DEF_CFA_OFFSET 8 | |
| CFI_OFFSET r27, -8 | |
| mov fp, sp | |
| CFI_DEF_CFA_REGISTER r27 | |
| /* kernel mode callee regs of @prev */ | |
| SAVE_CALLEE_SAVED_KERNEL | |
| /* | |
| * save final SP to @prev->thread_info.ksp | |
| * @prev is "current" so thread_info derived from SP | |
| */ | |
| GET_CURR_THR_INFO_FROM_SP r10 | |
| st sp, [r10, THREAD_INFO_KSP] | |
| /* update @next in _current_task[] and GP register caching it */ | |
| SET_CURR_TASK_ON_CPU r1, r10 | |
| /* load SP from @next->thread_info.ksp */ | |
| ld r10, [r1, TASK_THREAD_INFO] | |
| ld sp, [r10, THREAD_INFO_KSP] | |
| /* restore callee regs, stack frame regs of @next */ | |
| RESTORE_CALLEE_SAVED_KERNEL | |
| pop fp | |
| CFI_RESTORE r27 | |
| CFI_DEF_CFA r28, 4 | |
| pop blink | |
| CFI_RESTORE r31 | |
| CFI_DEF_CFA_OFFSET 0 | |
| j [blink] | |
| END_CFI(__switch_to) |