1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 4 * 5 * Vineetg: Aug 2009 6 * -Moved core context switch macro out of entry.S into this file. 7 * -This is the more "natural" hand written assembler 8 */ 9 10#include <linux/linkage.h> 11#include <asm/entry.h> /* For the SAVE_* macros */ 12#include <asm/asm-offsets.h> 13 14; IN 15; - r0: prev task (also current) 16; - r1: next task 17; OUT 18; - r0: prev task (so r0 not touched) 19 20 .section .sched.text,"ax",@progbits 21ENTRY_CFI(__switch_to) 22 23 /* save kernel stack frame regs of @prev task */ 24 push blink 25 CFI_DEF_CFA_OFFSET 4 26 CFI_OFFSET r31, -4 27 28 push fp 29 CFI_DEF_CFA_OFFSET 8 30 CFI_OFFSET r27, -8 31 32 mov fp, sp 33 CFI_DEF_CFA_REGISTER r27 34 35 /* kernel mode callee regs of @prev */ 36 SAVE_CALLEE_SAVED_KERNEL 37 38 /* 39 * save final SP to @prev->thread_info.ksp 40 * @prev is "current" so thread_info derived from SP 41 */ 42 GET_CURR_THR_INFO_FROM_SP r10 43 st sp, [r10, THREAD_INFO_KSP] 44 45 /* update @next in _current_task[] and GP register caching it */ 46 SET_CURR_TASK_ON_CPU r1, r10 47 48 /* load SP from @next->thread_info.ksp */ 49 ld r10, [r1, TASK_THREAD_INFO] 50 ld sp, [r10, THREAD_INFO_KSP] 51 52 /* restore callee regs, stack frame regs of @next */ 53 RESTORE_CALLEE_SAVED_KERNEL 54 55 pop fp 56 CFI_RESTORE r27 57 CFI_DEF_CFA r28, 4 58 59 pop blink 60 CFI_RESTORE r31 61 CFI_DEF_CFA_OFFSET 0 62 63 j [blink] 64END_CFI(__switch_to) 65