3333 ret ; \
3434 .endif
3535
36- #define SAVE_CP_REGS_TAB(x) \
37- .if XTENSA_HAVE_COPROCESSOR(x) ; \
38- .long .Lsave_cp_regs_cp##x ; \
39- .else ; \
40- .long 0 ; \
41- .endif ; \
42- .long THREAD_XTREGS_CP##x
43-
44-
4536#define LOAD_CP_REGS(x) \
4637 .if XTENSA_HAVE_COPROCESSOR(x) ; \
4738 . align 4 ; \
5041 ret ; \
5142 .endif
5243
53- #define LOAD_CP_REGS_TAB (x) \
44+ #define CP_REGS_TAB (x) \
5445 .if XTENSA_HAVE_COPROCESSOR(x) ; \
46+ .long .Lsave_cp_regs_cp##x ; \
5547 .long .Lload_cp_regs_cp##x ; \
5648 .else ; \
57- .long 0 ; \
49+ .long 0 , 0 ; \
5850 .endif ; \
5951 .long THREAD_XTREGS_CP##x
6052
53+ #define CP_REGS_TAB_SAVE 0
54+ #define CP_REGS_TAB_LOAD 4
55+ #define CP_REGS_TAB_OFFSET 8
56+
6157 __XTENSA_HANDLER
6258
6359 SAVE_CP_REGS( 0 )
7975 LOAD_CP_REGS( 7 )
8076
8177 . align 4
82- .Lsave_cp_regs_jump_table:
83- SAVE_CP_REGS_TAB( 0 )
84- SAVE_CP_REGS_TAB( 1 )
85- SAVE_CP_REGS_TAB( 2 )
86- SAVE_CP_REGS_TAB( 3 )
87- SAVE_CP_REGS_TAB( 4 )
88- SAVE_CP_REGS_TAB( 5 )
89- SAVE_CP_REGS_TAB( 6 )
90- SAVE_CP_REGS_TAB( 7 )
91-
92- .Lload_cp_regs_jump_table:
93- LOAD_CP_REGS_TAB( 0 )
94- LOAD_CP_REGS_TAB( 1 )
95- LOAD_CP_REGS_TAB( 2 )
96- LOAD_CP_REGS_TAB( 3 )
97- LOAD_CP_REGS_TAB( 4 )
98- LOAD_CP_REGS_TAB( 5 )
99- LOAD_CP_REGS_TAB( 6 )
100- LOAD_CP_REGS_TAB( 7 )
78+ .Lcp_regs_jump_table:
79+ CP_REGS_TAB( 0 )
80+ CP_REGS_TAB( 1 )
81+ CP_REGS_TAB( 2 )
82+ CP_REGS_TAB( 3 )
83+ CP_REGS_TAB( 4 )
84+ CP_REGS_TAB( 5 )
85+ CP_REGS_TAB( 6 )
86+ CP_REGS_TAB( 7 )
10187
10288/ *
10389 * Entry condition:
@@ -125,13 +111,12 @@ ENTRY(fast_coprocessor)
125111 rsr a2 , depc
126112 s32i a2 , a1 , PT_AREG2
127113
128- / *
129- * The hal macros require up to 4 temporary registers. We use a3..a6.
130- * /
114+ / * The hal macros require up to 4 temporary registers. We use a3..a6. * /
131115
132116 s32i a4 , a1 , PT_AREG4
133117 s32i a5 , a1 , PT_AREG5
134118 s32i a6 , a1 , PT_AREG6
119+ s32i a7 , a1 , PT_AREG7
135120
136121 / * Find coprocessor number. Subtract first CP EXCCAUSE from EXCCAUSE * /
137122
@@ -148,6 +133,12 @@ ENTRY(fast_coprocessor)
148133 wsr a0 , cpenable
149134 rsync
150135
136+ / * Get coprocessor save/load table entry (a7). * /
137+
138+ movi a7 , .Lcp_regs_jump_table
139+ addx8 a7 , a3 , a7
140+ addx4 a7 , a3 , a7
141+
151142 / * Retrieve previous owner. (a3 still holds CP number) * /
152143
153144 movi a0 , coprocessor_owner # list of owners
@@ -167,10 +158,8 @@ ENTRY(fast_coprocessor)
167158 * (a4 still holds previous owner (thread_info) , a3 CP number)
168159 * /
169160
170- movi a5 , .Lsave_cp_regs_jump_table
171- addx8 a3 , a3 , a5 # a3: coprocessor number
172- l32i a2 , a3 , 4 # a2: xtregs offset
173- l32i a3 , a3 , 0 # a3: jump address
161+ l32i a2 , a7 , CP_REGS_TAB_OFFSET
162+ l32i a3 , a7 , CP_REGS_TAB_SAVE
174163 add a2 , a2 , a4
175164 callx0 a3
176165
@@ -188,15 +177,14 @@ ENTRY(fast_coprocessor)
188177
189178 / * Get context save area and call load routine. * /
190179
191- movi a5 , .Lload_cp_regs_jump_table
192- addx8 a3 , a3 , a5
193- l32i a2 , a3 , 4 # a2: xtregs offset
194- l32i a3 , a3 , 0 # a3: jump address
180+ l32i a2 , a7 , CP_REGS_TAB_OFFSET
181+ l32i a3 , a7 , CP_REGS_TAB_LOAD
195182 add a2 , a2 , a4
196183 callx0 a3
197184
198185 / * Restore all registers and return from exception handler. * /
199186
187+ l32i a7 , a1 , PT_AREG7
200188 l32i a6 , a1 , PT_AREG6
201189 l32i a5 , a1 , PT_AREG5
202190 l32i a4 , a1 , PT_AREG4
@@ -232,13 +220,14 @@ ENTRY(coprocessor_flush)
232220 abi_entry( 4 )
233221
234222 s32i a0 , a1 , 0
235- movi a0 , .Lsave_cp_regs_jump_table
236- addx8 a3 , a3 , a0
237- l32i a4 , a3 , 4
238- l32i a3 , a3 , 0
239- add a2 , a2 , a4
240- beqz a3 , 1f
241- callx0 a3
223+ movi a4 , .Lcp_regs_jump_table
224+ addx8 a4 , a3 , a4
225+ addx4 a3 , a3 , a4
226+ l32i a4 , a3 , CP_REGS_TAB_SAVE
227+ beqz a4 , 1f
228+ l32i a3 , a3 , CP_REGS_TAB_OFFSET
229+ add a2 , a2 , a3
230+ callx0 a4
2422311 : l32i a0 , a1 , 0
243232
244233 abi_ret( 4 )
0 commit comments