Vineet Gupta | bf90e1e | 2013-01-18 15:12:18 +0530 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) |
| 3 | * |
| 4 | * This program is free software; you can redistribute it and/or modify |
| 5 | * it under the terms of the GNU General Public License version 2 as |
| 6 | * published by the Free Software Foundation. |
| 7 | * |
| 8 | * Vineetg: Aug 2009 |
| 9 | * -Moved core context switch macro out of entry.S into this file. |
| 10 | * -This is the more "natural" hand written assembler |
| 11 | */ |
| 12 | |
| 13 | #include <asm/entry.h> /* For the SAVE_* macros */ |
| 14 | #include <asm/asm-offsets.h> |
| 15 | #include <asm/linkage.h> |
| 16 | |
Vineet Gupta | 57e26e5 | 2013-11-01 10:46:40 +0530 | [diff] [blame] | 17 | #define KSP_WORD_OFF ((TASK_THREAD + THREAD_KSP) / 4) |
| 18 | |
Vineet Gupta | bf90e1e | 2013-01-18 15:12:18 +0530 | [diff] [blame] | 19 | ;################### Low Level Context Switch ########################## |
| 20 | |
| 21 | .section .sched.text,"ax",@progbits |
| 22 | .align 4 |
| 23 | .global __switch_to |
| 24 | .type __switch_to, @function |
| 25 | __switch_to: |
| 26 | |
| 27 | /* Save regs on kernel mode stack of task */ |
| 28 | st.a blink, [sp, -4] |
| 29 | st.a fp, [sp, -4] |
| 30 | SAVE_CALLEE_SAVED_KERNEL |
| 31 | |
| 32 | /* Save the now KSP in task->thread.ksp */ |
Vineet Gupta | 57e26e5 | 2013-11-01 10:46:40 +0530 | [diff] [blame] | 33 | #if KSP_WORD_OFF <= 255 |
| 34 | st.as sp, [r0, KSP_WORD_OFF] |
| 35 | #else |
| 36 | /* Workaround for NR_CPUS=4k as ST.as can only take s9 offset */ |
| 37 | add2 r24, r0, KSP_WORD_OFF |
| 38 | st sp, [r24] |
| 39 | #endif |
Vineet Gupta | bf90e1e | 2013-01-18 15:12:18 +0530 | [diff] [blame] | 40 | /* |
| 41 | * Return last task in r0 (return reg) |
| 42 | * On ARC, Return reg = First Arg reg = r0. |
| 43 | * Since we already have last task in r0, |
| 44 | * don't need to do anything special to return it |
| 45 | */ |
| 46 | |
| 47 | /* hardware memory barrier */ |
| 48 | sync |
| 49 | |
| 50 | /* |
| 51 | * switch to new task, contained in r1 |
| 52 | * Temp reg r3 is required to get the ptr to store val |
| 53 | */ |
| 54 | SET_CURR_TASK_ON_CPU r1, r3 |
| 55 | |
| 56 | /* reload SP with kernel mode stack pointer in task->thread.ksp */ |
| 57 | ld.as sp, [r1, (TASK_THREAD + THREAD_KSP)/4] |
| 58 | |
| 59 | /* restore the registers */ |
| 60 | RESTORE_CALLEE_SAVED_KERNEL |
| 61 | ld.ab fp, [sp, 4] |
| 62 | ld.ab blink, [sp, 4] |
| 63 | j [blink] |
| 64 | |
Vineet Gupta | ec7ac6a | 2014-02-07 13:47:43 +0530 | [diff] [blame] | 65 | END(__switch_to) |