annotate packages/hal/sparclite/arch/current/src/context.S @ 2729:74dbf4c3f2e1 after-copyright-change-20090129

Update all copyright banners to reflect FSF ownership; fix and improve licence text.
author jlarmour
date Thu, 29 Jan 2009 17:47:46 +0000
parents d2c90368aeef
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 /*=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // context.S
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // SPARClite context switch code
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //=============================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 66
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 // Author(s): nickg, gthomas, hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 // Contributors: nickg, gthomas, hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 // Date: 1998-12-15
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 // Purpose: SPARClite context switch code
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 // Description: This file contains implementations of the thread context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 // switch routines. It also contains the longjmp() and setjmp()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 // routines.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 //===========================================================================*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 #include <cyg/hal/vectors.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 #define DELAYS_AFTER_WRPSR_SAME_WINDOW
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 #define DELAYS_AFTER_WRWIM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 .text
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 ! ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 ! hal_thread_switch_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 ! Switch thread contexts
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 ! %o0 = address of sp of next thread to execute
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 ! %o1 = address of sp save location of current thread
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 .global hal_thread_switch_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 hal_thread_switch_context:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 ! First take the stack down to make room for the saved register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 ! state, including a window save area at the base. Leave the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 ! current window save area undisturbed. It is unused within the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 ! save but will become current again when we continue in this
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 ! context. This lets us do this whole piece of work without
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 ! diabling interrupts for too long, since, for example, we can
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 ! lower the stack atomically with one instruction:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 sub %sp, SAVE_REGS_SIZE, %sp
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 st %sp, [ %o1 ] ! return SP for this thread
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 std %l0, [%sp + 0 * 4] ! save L & I registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 std %l2, [%sp + 2 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 std %l4, [%sp + 4 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 std %l6, [%sp + 6 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 std %i0, [%sp + 8 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 std %i2, [%sp + 10 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 std %i4, [%sp + 12 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 std %i6, [%sp + 14 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 #ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 st %o7, [%sp + 31 * 4] ! save only the return address
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 ! and no need to preserve %o0 even though it is restored
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 #else // save a maximal context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 st %g1, [%sp + 17 * 4] ! save G & O registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 std %g2, [%sp + 18 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 std %g4, [%sp + 20 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 std %g6, [%sp + 22 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 std %o0, [%sp + 24 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 std %o2, [%sp + 26 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 std %o4, [%sp + 28 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 std %o6, [%sp + 30 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 #endif // !CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 ! and save the CWP in %g0 save place
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 rd %psr, %g7
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 st %g7, [%sp + 16 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 ! Now load the destination thread by dropping through
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 ! to hal_thread_load_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 ! ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 ! hal_thread_load_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 ! Load thread context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 ! %o0 = address of sp of next thread to execute
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 ! Note that this function is also the second half of hal_thread_switch_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 ! and is simply dropped into from it.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 .global hal_thread_load_context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 hal_thread_load_context:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 ! Here, we are a leaf routine but with slightly odd properties.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 ! The stack is still the callers at this point but the register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 ! set is up for grabs. So we can use globals:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 ld [ %o0 ], %g7 ! Get the next saved SP
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 ! DISABLE INTERRUPTS *ONLY* NOT TRAPS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 rd %psr, %g6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 or %g6, 0xfe0, %g5 ! PIL up to 15 leave traps enabled
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 wr %g5, %psr
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 ! force out all our callers register sets onto the stack
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 ! if necessary: the system will handily take care of this for
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 ! us as follows:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 save %sp, -16 * 4, %sp ! need all these to preserve
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 save %sp, -16 * 4, %sp ! the linked list property...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 save %sp, -16 * 4, %sp
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 save %sp, -16 * 4, %sp
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
141 #if 6 < __WINSIZE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 save %sp, -16 * 4, %sp
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
143 #if 7 < __WINSIZE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 save %sp, -16 * 4, %sp
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
145 #endif
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
146 #endif
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
147 ! Fewer saves if fewer register windows. For 8 register windows,
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 ! six of these is correct; a seventh would force out the current
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 ! set that was already saved manually above. Note that minimal
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 ! space is allowed on stack for locals and ins in case this
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 ! sequence itself gets interrupted and recurses too deep.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 ! now select the new window with traps disabled...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154
8
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
155 ! get the new PSR and CWP that we will ultimately restore
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
156 ! from the %g0 save place...
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
157 ld [%g7 + 16 * 4], %g6 ! %g7 holds the new stack pointer
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
158 andn %g6, 0x20, %g5 ! clear ET into %g5
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
159 and %g6, __WINBITS, %g4 ! CWP bits only in %g4
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 ! calculate a new WIM...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 add %g4, 1, %g3 ! required invalid window number
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
163 #if 8 == __WINSIZE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 and %g3, __WINBITS, %g3 ! modulo 8
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
165 #else // expect 5 or 6 or 7 windows
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
166 cmp %g3, __WINSIZE
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
167 bge,a 567f ! taken: do delay slot, handle overflow
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
168 mov 0, %g3 ! only if .ge. above
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
169 567:
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
170 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 mov 1, %g2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 sll %g2, %g3, %g2 ! converted to a mask for the WIM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173
8
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
174 ! DISABLE INTERRUPTS (TRAPS)
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
175 wr %g5, %psr ! set CWP to new window, disable traps
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 wr %g2, %wim ! and WIM to new value
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 ! Must do this atomically so that the registers match the stack.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 ! After locals and ins are loaded, we are conformant to the PCS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 ! so can re-enable interrupts.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 mov %g7, %sp ! target sp in situ (%sp = %o6)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 ldd [%sp + 0 * 4], %l0 ! restore L & I registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 ldd [%sp + 2 * 4], %l2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 ldd [%sp + 4 * 4], %l4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 ldd [%sp + 6 * 4], %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 ldd [%sp + 8 * 4], %i0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 ldd [%sp + 10 * 4], %i2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 ldd [%sp + 12 * 4], %i4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 ldd [%sp + 14 * 4], %i6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195
8
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
196 ! RESTORE INTERRUPTS to saved state
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
197 wr %g6, %psr ! set new CWP and old ET and PIL
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201
8
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
202 ! now load the rest of the context; we can be interrupted here
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
203 ! (if the saved context was a voluntary yield or threadstart)
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
204 ! but that is OK, other state will be preserved in that case...
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 #ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 ld [%sp + 24 * 4], %o0 ! must load the initial argument
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 #else // restore a maximal context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 ld [%sp + 17 * 4], %g1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 ldd [%sp + 18 * 4], %g2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 ldd [%sp + 20 * 4], %g4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 ldd [%sp + 22 * 4], %g6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 ldd [%sp + 24 * 4], %o0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 ldd [%sp + 26 * 4], %o2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 ldd [%sp + 28 * 4], %o4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 #endif // !CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 ! %o6 = %sp, already set up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 ld [%sp + 31 * 4], %o7 ! "return" address
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 retl
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222 add %sp, SAVE_REGS_SIZE, %sp ! and set the stack back
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 ! to its entrant value
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 ! ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 ! HAL longjmp, setjmp implementations
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 !FUNC_START(hal_setjmp)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 .global hal_setjmp
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 hal_setjmp:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 ! Treat this as a leaf routine, may as well.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 ! %o0 is the address of the buffer.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 std %l0, [%o0 + 0 * 4] ! save L & I registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 std %l2, [%o0 + 2 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 std %l4, [%o0 + 4 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 std %l6, [%o0 + 6 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 std %i0, [%o0 + 8 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 std %i2, [%o0 + 10 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 std %i4, [%o0 + 12 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 std %i6, [%o0 + 14 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 #ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 std %o6, [%o0 + 30 * 4] ! just save %sp and return address
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 #else // save a maximal context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 st %g1, [%o0 + 17 * 4] ! save G & O registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 std %g2, [%o0 + 18 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 std %g4, [%o0 + 20 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 std %g6, [%o0 + 22 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 std %o0, [%o0 + 24 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 std %o2, [%o0 + 26 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 std %o4, [%o0 + 28 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 std %o6, [%o0 + 30 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 #endif // !CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 ! and save the CWP in %g0 save place
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 rd %psr, %g7
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 st %g7, [%o0 + 16 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 ! DISABLE INTERRUPTS *ONLY* NOT TRAPS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 or %g7, 0xfe0, %g6 ! PIL up to 15 leave traps enabled
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 wr %g6, %psr
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 ! force out all our callers register sets onto the stack
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 ! if necessary: the system will handily take care of this for
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 ! us as follows:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 save %sp, -16 * 4, %sp ! need all these to preserve
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 save %sp, -16 * 4, %sp ! the linked list property...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 save %sp, -16 * 4, %sp
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 save %sp, -16 * 4, %sp
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
273 #if 6 < __WINSIZE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 save %sp, -16 * 4, %sp
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
275 #if 7 < __WINSIZE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 save %sp, -16 * 4, %sp
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
277 #endif
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
278 #endif
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
279 ! Fewer saves if fewer register windows. For 8 register windows,
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 ! six of these is correct; a seventh would force out the current
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 ! set that was already saved manually above. Note that minimal
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 ! space is allowed on stack for locals and ins in case this
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 ! sequence itself gets interrupted and recurses too deep.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285 ! (after all, we are about to call deeper not shallower, otherwise
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 ! using setjmp is inappropriate)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 ! ENABLE INTERRUPTS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 wr %g7, %psr ! set CWP back to as-was
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 ldd [%o0 + 22 * 4], %g6 ! preserve %g7 and %g6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298 retl ! ret and return zero to indicate
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
299 mov 0, %o0 ! not longjumped-to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301 ! hal_longjmp loads state from arg0 and returns arg1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302 !FUNC_START(hal_longjmp)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 .global hal_longjmp
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304 hal_longjmp:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 ! This is kind of a leaf routine, it returns elsewhere
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306 ! %o0 is the address of the buffer.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
307 ! %o1 is the value to return in %o0 (since we are a leaf)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
308
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 mov %o0, %g7 ! keep the pointer handy
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
310 mov %o1, %g1 ! and the return value
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
311 ! now select the new window with traps disabled...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
312 rd %psr, %g6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
313 ! preserve ET, clear CWP
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
314 andn %g6, __WINBITS_MAXIMAL, %g6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
315 andn %g6, 0x20, %g5 ! clear ET also into %g5
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317 ! get new CWP from %g0 save place...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318 ld [%g7 + 16 * 4], %g4 ! %g7 holds the new stack pointer
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
319 and %g4, __WINBITS, %g4 ! preserve CWP bits
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
320
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321 ! calculate a new WIM...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
322 add %g4, 1, %g3 ! required invalid window number
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
323 #if 8 == __WINSIZE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
324 and %g3, __WINBITS, %g3 ! modulo 8
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
325 #else // expect 5 or 6 or 7 windows
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
326 cmp %g3, __WINSIZE
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
327 bge,a 567f ! taken: do delay slot, handle overflow
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
328 mov 0, %g3 ! only if .ge. above
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
329 567:
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 8
diff changeset
330 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
331 mov 1, %g2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332 sll %g2, %g3, %g2 ! converted to a mask for the WIM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334 ! DISABLE INTERRUPTS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
335 wr %g5, %g4, %psr ! set CWP to new window, disable traps
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
336 wr %g2, %wim ! and WIM to new value
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
337 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
338 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
339 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
340
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
341 ! Must do this atomically so that the registers match the stack.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
342 ! After locals and ins are loaded, we are conformant to the PCS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
343 ! so can re-enable interrupts.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
344
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
345 ldd [%g7 + 0 * 4], %l0 ! restore L & I registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
346 ldd [%g7 + 2 * 4], %l2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
347 ldd [%g7 + 4 * 4], %l4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348 ldd [%g7 + 6 * 4], %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
350 ldd [%g7 + 8 * 4], %i0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351 ldd [%g7 + 10 * 4], %i2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352 ldd [%g7 + 12 * 4], %i4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353 ldd [%g7 + 14 * 4], %i6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
355 ld [%g7 + 30 * 4], %sp ! %o6 = %sp, set up now so as to conform
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
356 ! to PCS and so be interruptible
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
357 ! ENABLE INTERRUPTS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
358 wr %g6, %g4, %psr ! set new CWP and old ET
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
359 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
360 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
361 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
362
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
363 ! now load the rest of the context; we can be interrupted here, but
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
364 ! that is OK, other state will be preserved in that case...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
365 #ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
366 ! we are not preserving globals...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
367 ! %o6 = %sp, already set up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
368 ld [%g7 + 31 * 4], %o7 ! "return" address
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
369 retl ! %g1 still holds the return value
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
370 mov %g1, %o0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
371
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
372 #else // load a maximal context
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
373 mov %g7, %o0 ! original pointer was in %o0 anyway
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
374
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
375 ldd [%o0 + 18 * 4], %g2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
376 ldd [%o0 + 20 * 4], %g4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
377 ldd [%o0 + 22 * 4], %g6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
378
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
379 ld [%o0 + 25 * 4], %o1 ! %o0 = original pointer
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
380 ldd [%o0 + 26 * 4], %o2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
381 ldd [%o0 + 28 * 4], %o4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
382 ! %o6 = %sp, already set up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
383 ld [%o0 + 31 * 4], %o7 ! "return" address
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
384
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
385 ! %g1 still holds the return value; want to get this into %o0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
386 ! and restore %g1 from the saved state; %o0 is the state pointer:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
387 ! g1 = R, o0 = P
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
388 xor %o0, %g1, %g1 ! g1 = R^P, o0 = P
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
389 xor %o0, %g1, %o0 ! g1 = R^P, o0 = R
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
390 xor %o0, %g1, %g1 ! g1 = P, o0 = R all done
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
391
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392 retl
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
393 ld [%g1 + 17 * 4], %g1 ! and finally restore %g1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
394 #endif // !CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
395
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
396 ! ------------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
397 ! end of context.S
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
398
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
399
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
400