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)
113