/* SPDX-License-Identifier: GPL-2.0-only */1/*2* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)3*4* Vineetg: Aug 20095* -Moved core context switch macro out of entry.S into this file.6* -This is the more "natural" hand written assembler7*/89#include <linux/linkage.h>10#include <asm/entry.h> /* For the SAVE_* macros */11#include <asm/asm-offsets.h>1213; IN14; - r0: prev task (also current)15; - r1: next task16; OUT17; - r0: prev task (so r0 not touched)1819.section .sched.text,"ax",@progbits20ENTRY_CFI(__switch_to)2122/* save kernel stack frame regs of @prev task */23push blink24CFI_DEF_CFA_OFFSET 425CFI_OFFSET r31, -42627push fp28CFI_DEF_CFA_OFFSET 829CFI_OFFSET r27, -83031mov fp, sp32CFI_DEF_CFA_REGISTER r273334/* kernel mode callee regs of @prev */35SAVE_CALLEE_SAVED_KERNEL3637/*38* save final SP to @prev->thread_info.ksp39* @prev is "current" so thread_info derived from SP40*/41GET_CURR_THR_INFO_FROM_SP r1042st sp, [r10, THREAD_INFO_KSP]4344/* update @next in _current_task[] and GP register caching it */45SET_CURR_TASK_ON_CPU r1, r104647/* load SP from @next->thread_info.ksp */48ld r10, [r1, TASK_THREAD_INFO]49ld sp, [r10, THREAD_INFO_KSP]5051/* restore callee regs, stack frame regs of @next */52RESTORE_CALLEE_SAVED_KERNEL5354pop fp55CFI_RESTORE r2756CFI_DEF_CFA r28, 45758pop blink59CFI_RESTORE r3160CFI_DEF_CFA_OFFSET 06162j [blink]63END_CFI(__switch_to)646566