annotate packages/hal/sparclite/arch/current/src/vec_xvsr.S @ 40:a3cc6665b684 ecos-sw-1999-10-01

Merge from eCos master repository on 1999-10-01-07:47:04-BST
author jlarmour
date Fri, 01 Oct 1999 13:25:47 +0000
parents 443894e2e912
children c38311975d4f
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 // vec_xvsr.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 vectors: exception vector service routine
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 //===========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19 // the License.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 // September 30, 1998.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 //###COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29 //===========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 // Author(s): hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 // Contributors: hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Date: 1999-02-20
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Purpose: SPARClite vector code
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Description: see vectors.S; this is the default vector service routine
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // for exceptions.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 !-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 .file "vec_xvsr.S"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 !----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 #include <pkgconf/hal.h>
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 #ifdef CYGPKG_KERNEL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 # include <pkgconf/kernel.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 #endif
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 !------------------------------------------------------------------------
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 #include <cyg/hal/vectors.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 #define DELAYS_AFTER_WRPSR_SAME_WINDOW
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 #define DELAYS_AFTER_WRWIM
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 .text
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 !---------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 ! default exception handler VSR, which calls the appropriate ISR after
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 ! interrupt masking - much the same as the interrupt VSR but does not lock
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 ! scheduler or call interrupt_end().
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 .global hal_default_exception_vsr
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 hal_default_exception_vsr:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 ! here,locals have been set up as follows:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 ! %l0 = psr (with this CWP/window-level in it)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 ! %l1 = pc
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 ! %l2 = npc
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 ! %l3 = vector number (16-25 for traps)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 ! and we are in our own register window, though it is likely that
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 ! the next one will need to be saved before we can use it:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 ! ie. this one is the invalid register window.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 ! must establish a safe stack before re-enabling interrupts + traps
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 and %l0, __WINBITS, %l7 ! CWP extracted
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 2
diff changeset
85 ! no inc/dec here, so no need for special measures for not-8-windows
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 mov 1, %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 sll %l6, %l7, %l6 ! 1 << CWP
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 rd %wim, %l5
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 cmp %l5, %l6 ! are they the same?
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 bne 1f ! No, so the stack is OK as is.
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 ! now do by hand an overflow trap, effectively
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 mov %g1, %l7 ! (DELAY SLOT)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 srl %l5, 1, %l5
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 sll %l6, __WINSIZE-1, %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 or %l6, %l5, %g1 ! new WIM in %g1 so we can get it
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 ! within the save:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 save ! Slip into next window
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 mov %g1, %wim ! Install the new wim
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 ! (invalidates current window!)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 #ifdef DELAYS_AFTER_WRWIM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 std %l0, [%sp + 0 * 4] ! save L & I registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 std %l2, [%sp + 2 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 std %l4, [%sp + 4 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 std %l6, [%sp + 6 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 std %i0, [%sp + 8 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 std %i2, [%sp + 10 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 std %i4, [%sp + 12 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 std %i6, [%sp + 14 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 restore ! Go back to trap window.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 mov %l7, %g1 ! Restore %g1
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 1: ! now save away the regs we must preserve
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 sub %fp, 32 * 4, %sp
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 ! save a maximal context regardless: see also
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 std %l0, [%sp + 0 * 4] ! save L & I registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 std %l2, [%sp + 2 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 std %l4, [%sp + 4 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 std %l6, [%sp + 6 * 4]
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 std %i0, [%sp + 8 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 std %i2, [%sp + 10 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 std %i4, [%sp + 12 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 std %i6, [%sp + 14 * 4]
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 st %g1, [%sp + 17 * 4] ! save G registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 std %g2, [%sp + 18 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 std %g4, [%sp + 20 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 std %g6, [%sp + 22 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 ! no point whatsoever in saving O registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 ! and save the CWP in %g0 save place
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 st %l0, [%sp + 16 * 4]
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 sub %sp, 24 * 4, %sp ! fresh frame including
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 ! arg spill area for callees
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 ! do not lock the scheduler
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 ! HELP_GDB_WITH_BACKTRACE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 mov %i7, %l5 ! preserve it JIC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 mov %l1, %i7 ! bogus return link here
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 ! and we must preserve the Y register (multiply/divide auxiliary)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 ! over these calls; we will keep it in %l4 which is otherwise unused.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 rd %y, %l4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 ! Now we can reenable traps (preserving interrupt level)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 or %l0, 0x0e0, %l7 ! set ET (+S,PS), preserve PIL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 wr %l7, %psr ! and enable!
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 #ifdef DELAYS_AFTER_WRPSR_SAME_WINDOW
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 ! now call the XSR and so on with the appropriate args:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 ! ie.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 ! isr_retcode = (*(hal_interrupt_handlers[ vector ]))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 ! ( vector, hal_interrupt_data[ vector ], stackp );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 ! from hal_arch.h
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 !// ISR tables
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 !CYG_ADDRESS hal_interrupt_handlers[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 !CYG_ADDRWORD hal_interrupt_data[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 !CYG_ADDRESS hal_interrupt_objects[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 mov %l3, %o0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 sll %l3, 2, %l3 ! %l3 to a word offset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 sethi %hi(hal_interrupt_data), %l7
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 or %l7, %lo(hal_interrupt_data), %l7
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 ld [ %l7 + %l3 ], %o1 ! data
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 add %sp, 24 * 4, %o2 ! stackpointer of saved regset
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 sethi %hi(hal_interrupt_handlers), %l7
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 or %l7, %lo(hal_interrupt_handlers), %l7
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 ld [ %l7 + %l3 ], %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 call %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 ! do not call _interrupt_end()
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 ! restore the Y register having done our callouts to C
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 wr %l4, %y
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 ! We can reinstall the original CWP here; even if interrupt_end()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 ! performed a reschedule (ie. yield/resume pair) we will be in the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 ! same window. The window is preserved by reschedule precisely
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 ! because it is impossible atomically to disable traps here without
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 ! involving a CWP living in a register for a time when other
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 ! interrupts may occur.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 ! disable traps (using the saved psr is fastest way)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 wr %l0, %psr ! restores flags, disables traps, same PIL.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 #ifdef DELAYS_AFTER_WRPSR_SAME_WINDOW
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 ! HELP_GDB_WITH_BACKTRACE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 mov %l5, %i7 ! restore (unused) return link
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 ! and restore other saved regs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 add %sp, 24 * 4, %sp ! undo fresh frame
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 ! restore a maximal context regardless: see also
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 ldd [%sp + 0 * 4], %l0 ! restore L & I registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 ldd [%sp + 2 * 4], %l2 ! to support the handler
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 ldd [%sp + 4 * 4], %l4 ! having messed with them.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 ldd [%sp + 6 * 4], %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 ldd [%sp + 8 * 4], %i0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 ldd [%sp + 10 * 4], %i2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222 ldd [%sp + 12 * 4], %i4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 ldd [%sp + 14 * 4], %i6
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 ld [%sp + 17 * 4], %g1 ! and G registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 ldd [%sp + 18 * 4], %g2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 ldd [%sp + 20 * 4], %g4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 ldd [%sp + 22 * 4], %g6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 ! no point whatsoever in loading back O registers.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 ! Now test for window underflow here and fix up if needs be.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 !
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 ! Why? interrupt_end() might have yielded us, when only
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 ! its own frame was restored; its own return to us caused a
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 ! window underflow trap, as would our return to interruptee
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 ! unless we deal with it now.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 add %l0, 1, %l7 ! interruptee~s CWP plus noise
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 and %l7, __WINBITS, %l7 ! CWP only
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 2
diff changeset
240 #if 8 == __WINSIZE
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 2
diff changeset
241 ! it is in range already
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 2
diff changeset
242 #else // expect 5 or 6 or 7 windows
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 2
diff changeset
243 cmp %l7, __WINSIZE
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 2
diff changeset
244 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: 2
diff changeset
245 mov 0, %l7 ! only if .ge. above
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 2
diff changeset
246 567:
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 2
diff changeset
247 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 mov 1, %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 sll %l6, %l7, %l6 ! 1 << CWP
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 rd %wim, %l5
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 cmp %l5, %l6 ! are they the same?
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 bne 2f ! No, so the stack is OK as is.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 ! now do by hand an underflow trap, effectively
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 sll %l5, 1, %l5 ! Rotate wim left
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 srl %l6, __WINSIZE-1, %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 wr %l5, %l6, %wim
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 #ifdef DELAYS_AFTER_WRWIM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 nop ! are these delays needed?
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 nop ! (following restore uses wim)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 restore ! Interruptee~s window
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 ldd [%sp + 0 * 4], %l0 ! restore L & I registers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 ldd [%sp + 2 * 4], %l2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 ldd [%sp + 4 * 4], %l4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 ldd [%sp + 6 * 4], %l6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 ldd [%sp + 8 * 4], %i0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 ldd [%sp + 10 * 4], %i2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 ldd [%sp + 12 * 4], %i4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 ldd [%sp + 14 * 4], %i6
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 save ! Back to trap window
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 2: ! restore the condition codes, PSR and PIL and return from trap.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 wr %l0, %psr ! restores flags, disables traps, and old PIL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277 #ifdef DELAYS_AFTER_WRPSR_SAME_WINDOW
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 nop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 jmpl %l1, %g0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 rett %l2
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 ! end of vec_xvsr.S