diff options
Diffstat (limited to 'cpukit/score/cpu/epiphany/epiphany-context-switch.S')
-rw-r--r-- | cpukit/score/cpu/epiphany/epiphany-context-switch.S | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/cpukit/score/cpu/epiphany/epiphany-context-switch.S b/cpukit/score/cpu/epiphany/epiphany-context-switch.S new file mode 100644 index 0000000000..6d08389713 --- /dev/null +++ b/cpukit/score/cpu/epiphany/epiphany-context-switch.S @@ -0,0 +1,216 @@ +/* + * Epiphany CPU Dependent Source + * + * Copyright (c) 2015 University of York. + * Hesham ALMatary <hmka501@york.ac.uk> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include <rtems/asm.h> + +.section .text,"ax" +.align 4 + +PUBLIC(_CPU_Context_switch) +PUBLIC(_CPU_Context_restore) +PUBLIC(_CPU_Context_restore_fp) +PUBLIC(_CPU_Context_save_fp) +PUBLIC(restore) + +SYM(_CPU_Context_switch): + /* Disable interrupts and store all registers */ + gid + + str r0, [r0] + str r1, [r0,1] + str r2, [r0,2] + str r3, [r0,3] + str r4, [r0,4] + str r5, [r0,5] + str r6, [r0,6] + str r7, [r0,7] + str r8, [r0,8] + str r9, [r0,9] + str r10, [r0,10] + str fp, [r0,11] + str r12, [r0,12] + str sp, [r0,13] + str lr, [r0,14] + str r15, [r0,15] + str r16, [r0,16] + str r17, [r0,17] + str r18, [r0,18] + str r19, [r0,19] + str r20, [r0,20] + str r21, [r0,21] + str r22, [r0,22] + str r23, [r0,23] + str r24, [r0,24] + str r25, [r0,25] + str r26, [r0,26] + str r27, [r0,27] + str r28, [r0,28] + str r29, [r0,29] + str r30, [r0,30] + str r31, [r0,31] + str r32, [r0,32] + str r33, [r0,33] + str r34, [r0,34] + str r35, [r0,35] + str r36, [r0,36] + str r37, [r0,37] + str r38, [r0,38] + str r39, [r0,39] + str r40, [r0,40] + str r41, [r0,41] + str r42, [r0,42] + str r43, [r0,43] + str r44, [r0,44] + str r45, [r0,45] + str r46, [r0,46] + str r47, [r0,47] + str r48, [r0,48] + str r49, [r0,49] + str r50, [r0,50] + str r51, [r0,51] + str r52, [r0,52] + str r53, [r0,53] + str r54, [r0,54] + str r55, [r0,55] + str r56, [r0,56] + str r57, [r0,57] + str r58, [r0,58] + str r59, [r0,59] + str r60, [r0,60] + str r61, [r0,61] + str r62, [r0,62] + str r63, [r0,63] + + /* Store status register */ + movfs r27, status + str r27, [r0,64] + + /* Store config register */ + movfs r27, config + str r27, [r0,65] + + /* Store interrupt return address register */ + movfs r27, iret + str r27, [r0,66] + +SYM(restore): + + /* r1 contains buffer address, skip it */ + ldr r2, [r1,2] + ldr r3, [r1,3] + ldr r4, [r1,4] + ldr r5, [r1,5] + ldr r6, [r1,6] + ldr r7, [r1,7] + ldr r8, [r1,8] + ldr r9, [r1,9] + ldr r10, [r1,10] + ldr fp, [r1,11] + ldr r12, [r1,12] + ldr sp, [r1,13] + ldr lr, [r1,14] + ldr r15, [r1,15] + ldr r16, [r1,16] + ldr r17, [r1,17] + ldr r18, [r1,18] + ldr r19, [r1,19] + ldr r20, [r1,20] + ldr r21, [r1,21] + ldr r22, [r1,22] + ldr r23, [r1,23] + ldr r24, [r1,24] + ldr r25, [r1,25] + ldr r26, [r1,26] + ldr r27, [r1,27] + ldr r32, [r1,32] + ldr r33, [r1,33] + ldr r34, [r1,34] + ldr r35, [r1,35] + ldr r36, [r1,36] + ldr r37, [r1,37] + ldr r38, [r1,38] + ldr r39, [r1,39] + ldr r40, [r1,40] + ldr r41, [r1,41] + ldr r42, [r1,42] + ldr r43, [r1,43] + ldr r44, [r1,44] + ldr r45, [r1,45] + ldr r46, [r1,46] + ldr r47, [r1,47] + ldr r48, [r1,48] + ldr r49, [r1,49] + ldr r50, [r1,50] + ldr r51, [r1,51] + ldr r52, [r1,52] + ldr r53, [r1,53] + ldr r54, [r1,54] + ldr r55, [r1,55] + ldr r56, [r1,56] + ldr r57, [r1,57] + ldr r58, [r1,58] + ldr r59, [r1,59] + ldr r60, [r1,60] + ldr r61, [r1,61] + ldr r62, [r1,62] + ldr r63, [r1,63] + + /* Load status register */ + ldr r0, [r1,64] + movts status, r0 + + /* Load config register */ + ldr r0, [r1,65] + movts config, r0 + + /* Load interrupt return address register */ + ldr r0,[r1,66] + movts iret, r0 + + ldr r0,[r1] + ldr r1,[r1,1] + + /* Enable interrupts and return */ + gie + jr lr + +SYM(_CPU_Context_restore): + mov r1, r0 + b _restore + nop + +/* No FP support for Epiphany yet */ +SYM(_CPU_Context_restore_fp): + nop + + SYM(_CPU_Context_save_fp): + nop |