source: trunk/libs/newlib/src/libgloss/sparc_leon/kernel_context.S @ 453

Last change on this file since 453 was 444, checked in by satin@…, 7 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 3.2 KB
Line 
1/*
2 * Copyright (c) 2011 Aeroflex Gaisler
3 *
4 * BSD license:
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25
26#include <asm-leon/elfmacro.h>
27#include <asm-leon/leon.h>
28#include <asm-leon/leonstack.h>
29#include <asm-leon/contextswitch.h>
30#include <asm-leon/winmacros.h>
31#include <asm-leon/leonbare_kernel.h>
32
33        FUNC_EXPORT(_leonbare_kernel_switchto)
34        FUNC_EXPORT(_leonbare_Stop)
35
36        FUNC_IMPORT(leonbare_disable_traps)
37
38        .text
39       
40/* unsigned int _leonbare_kernel_switchto(struct leonbare_thread_ctx *thread,struct leonbare_thread_ctx *thread) */
41FUNC_BEGIN(_leonbare_kernel_switchto)
42       
43        /* =================================*/
44        /*        save context              */
45        /* =================================*/
46       
47        mov     %o0, %g1
48        mov     %o1, %g2
49        mov     %o7, %g3
50        rd      %psr, %g4                       /* psr.cwp should stay same because irq path rely on it. */
51       
52        call    leonbare_disable_traps          /* psr in %o0, modify %o0, %o1, %o7 */
53         nop
54
55        set     TACODE_IRQCALL_FLUSH,%o1
56        ta      TACODE_IRQCALL
57       
58        st      %g4, [%g1 + LEONBARE_THREAD_CTX_STACK_PSR]      /* psr */
59        set     LEONBARE_THREAD_CTX_MAGIC,%g4
60        st      %g4, [%g1 + LEONBARE_THREAD_CTX_STACK_MAGIC]
61       
62        mov     %g3, %o7                        ! restore %o7
63       
64        LEONBARE_THREAD_CTX_STORE_INS(g1)
65        LEONBARE_THREAD_CTX_STORE_LOCALS(g1)
66        LEONBARE_THREAD_CTX_STORE_OUTS(g1)
67
68        /* =================================*/
69        /*        restore context           */
70        /* =================================*/
71       
72        /* check valid context stack area */
73        ld      [%g2 + LEONBARE_THREAD_CTX_STACK_MAGIC], %o1
74        set     LEONBARE_THREAD_CTX_MAGIC,%o2
75        cmp     %o1, %o2
76        beq     1f
77         nop
78       
79        /* stop all */
80        ta      0x0
81       
821:     
83        /* get psr */
84        ld      [%g2 + LEONBARE_THREAD_CTX_STACK_PSR],%g1            /* psr.cwp should stay same because irq path rely on it. */
85        set     SPARC_PSR_EF_MASK,%g3           ! clear ef bit
86        andn    %g1, %g3, %g1           
87       
88        wr      %g0,%wim
89        nop; nop; nop;
90
91        andn    %g1, SPARC_PSR_ET_MASK, %g3     ! disable traps, up to PSR_EF imm andn ok
92        wr      %g3, %psr
93        nop; nop; nop;
94
95        LEONBARE_THREAD_CTX_LOAD_INS(g2)
96        LEONBARE_THREAD_CTX_LOAD_LOCALS(g2)
97        LEONBARE_THREAD_CTX_LOAD_OUTS(g2)
98       
99        SET_WIM_CWPMIN1(g1,o1,o2,o3,o4)         ! calc wim from psr_cwp so that next restore traps
100       
101        wr      %g1,%psr
102        nop; nop; nop;
103       
104        retl
105         nop
106       
107FUNC_END(_leonbare_kernel_switchto)
108
109
110FUNC_BEGIN(_leonbare_Stop)
111        ta 0x0
112FUNC_END(_leonbare_Stop)
Note: See TracBrowser for help on using the repository browser.