source: trunk/hal/tsar_mips32/core/hal_switch.S @ 657

Last change on this file since 657 was 625, checked in by alain, 6 years ago

Fix a bug in the vmm_remove_vseg() function: the physical pages
associated to an user DATA vseg were released to the kernel when
the target process descriptor was in the reference cluster.
This physical pages release should be done only when the page
forks counter value is zero.
All other modifications are cosmetic.

File size: 9.8 KB
Line 
1/*
2 * hal_witch.S - CPU context switch function for TSAR-MIPS32
3 *
4 * Author  Alain Greiner    (2016,2017,2018,2019)
5 *
6 * Copyright (c)  UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH.is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH.is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-MKH.; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24    .section   .switch , "ax" , @progbits
25
26    .global  hal_do_cpu_switch
27    .global  hal_do_cpu_save
28    .global  hal_do_cpu_restore
29
30    .set     noat
31    .set     noreorder
32
33#---------------------------------------------------------------------------------
34# The hal_do_cpu_switch() function makes the following assumptions:
35# - register $4 contains a pointer on the old thread context.
36# - register $5 contains a pointer on the new thread context.
37#---------------------------------------------------------------------------------
38hal_do_cpu_switch:
39
40    /* save old thread context */
41 
42    move    $26,   $4                  /* $26 <= ctx_old */
43
44    mfc0    $27,   $14             
45    sw      $27,   0*4($26)            /* save c0_epc to slot 0 */
46 
47    sw      $1,    1*4($26)         
48    sw      $2,    2*4($26)         
49    sw      $3,    3*4($26)         
50    sw      $4,    4*4($26)         
51    sw      $5,    5*4($26)         
52    sw      $6,    6*4($26)         
53    sw      $7,    7*4($26)         
54    sw      $8,    8*4($26)         
55    sw      $9,    9*4($26)         
56    sw      $10,  10*4($26)         
57    sw      $11,  11*4($26)         
58    sw      $12,  12*4($26)         
59    sw      $13,  13*4($26)         
60    sw      $14,  14*4($26)         
61    sw      $15,  15*4($26)         
62    sw      $16,  16*4($26)         
63    sw      $17,  17*4($26)         
64    sw      $18,  18*4($26)         
65    sw      $19,  19*4($26)         
66    sw      $20,  20*4($26)         
67    sw      $21,  21*4($26)         
68    sw      $22,  22*4($26)         
69    sw      $23,  23*4($26)         
70    sw      $24,  24*4($26)         
71    sw      $25,  25*4($26)         
72
73    mfhi    $27                     
74    sw      $27,  26*4($26)            /* save hi to slot 26 */
75    mflo    $27                     
76    sw      $27,  27*4($26)            /* save lo to slot 27 */
77
78    sw      $28,  28*4($26)         
79    sw      $29,  29*4($26)         
80    sw      $30,  30*4($26)         
81    sw      $31,  31*4($26)         
82
83    mfc0    $27,  $12               
84        sw      $27,  34*4($26)           /* save c0_sr to slot 34 */
85    mfc0    $27,  $4, 2             
86        sw      $27,  35*4($26)           /* save c0_th to slot 35 */
87
88        mfc2    $27,  $0               
89        sw      $27,  32*4($26)           /* save c2_ptpr to slot 32 */
90        mfc2    $27,  $1               
91        sw      $27,  33*4($26)           /* save c2_mode to slot 33 */
92
93    sync                           
94
95    /* restore new thread context */
96 
97    move    $26,   $5                  /* $26 <= ctx_new */
98
99    lw      $27,   0*4($26)         
100    mtc0    $27,   $14                 /* restore C0_epc from slot 0 */
101
102    lw      $1,    1*4($26)         
103    lw      $2,    2*4($26)         
104    lw      $3,    3*4($26)         
105    lw      $4,    4*4($26)         
106    lw      $5,    5*4($26)         
107    lw      $6,    6*4($26)         
108    lw      $7,    7*4($26)         
109    lw      $8,    8*4($26)         
110    lw      $9,    9*4($26)         
111    lw      $10,  10*4($26)         
112    lw      $11,  11*4($26)         
113    lw      $12,  12*4($26)         
114    lw      $13,  13*4($26)         
115    lw      $14,  14*4($26)         
116    lw      $15,  15*4($26)         
117        lw      $16,  16*4($26)         
118        lw      $17,  17*4($26)         
119    lw      $18,  18*4($26)         
120    lw      $19,  19*4($26)         
121    lw      $20,  20*4($26)         
122    lw      $21,  21*4($26)         
123    lw      $22,  22*4($26)         
124    lw      $23,  23*4($26)         
125    lw      $24,  24*4($26)         
126    lw      $25,  25*4($26)         
127
128    lw      $27,  26*4($26)         
129    mthi    $27                        /* restore hi from slot 26 */
130    lw      $27,  27*4($26)         
131    mtlo    $27                        /* restore lo from slot 27 */
132
133        lw      $28,  28*4($26)         
134        lw      $29,  29*4($26)         
135        lw      $30,  30*4($26)         
136        lw      $31,  31*4($26)            /* restore ra from slot 31 */
137
138        lw      $27,  32*4($26)
139        mtc2    $27,  $0                   /* restore c2_ptpr from slot 32 */
140
141        lw      $27,  35*4($26)     
142    mtc0        $27,  $4, 2                /* restore c0_th from slot 35 */
143
144        lw      $27,  33*4($26)
145        lw      $26,  34*4($26)
146
147        mtc2    $27,  $1                   /* restore c2_mode from slot 33 */
148    mtc0        $26,  $12                  /* restore c0_sr from slot 34 */
149
150    jr      $31                        /* return to caller */
151    nop
152
153#---------------------------------------------------------------------------------
154# The hal_do_cpu_save()function makes the following assumption:
155# - register $4 contains a pointer on the target thread context.
156#---------------------------------------------------------------------------------
157hal_do_cpu_save:
158
159    move    $26,  $4                  /* $26 <= &context */
160
161    mfc0    $27,  $14               
162    sw      $27,   0*4($26)           /* save c0_epc to slot 0 */
163
164    sw      $1,    1*4($26)         
165    sw      $2,    2*4($26)         
166    sw      $3,    3*4($26)         
167    sw      $4,    4*4($26)         
168    sw      $5,    5*4($26)         
169    sw      $6,    6*4($26)         
170    sw      $7,    7*4($26)         
171    sw      $8,    8*4($26)         
172    sw      $9,    9*4($26)         
173    sw      $10,  10*4($26)         
174    sw      $11,  11*4($26)         
175    sw      $12,  12*4($26)         
176    sw      $13,  13*4($26)         
177    sw      $14,  14*4($26)         
178    sw      $15,  15*4($26)         
179    sw      $16,  16*4($26)         
180    sw      $17,  17*4($26)         
181    sw      $18,  18*4($26)         
182    sw      $19,  19*4($26)         
183    sw      $20,  20*4($26)         
184    sw      $21,  21*4($26)         
185    sw      $22,  22*4($26)         
186    sw      $23,  23*4($26)         
187    sw      $24,  24*4($26)         
188    sw      $25,  25*4($26)
189         
190    mfhi    $27                     
191    sw      $27,  26*4($26)           /* save hi      to slot 26 */
192    mflo    $27                     
193    sw      $27,  27*4($26)           /* save lo      to slot 27 */
194
195    sw      $28,  28*4($26)           /* save gp      to slot 28 */
196    sw      $29,  29*4($26)           /* save sp      to slot 29 */
197    sw      $30,  30*4($26)           /* save s8      to slot 30 */
198    sw      $31,  31*4($26)           /* save ra      to slot 31 */
199
200        mfc2    $27,  $0               
201        sw      $27,  32*4($26)           /* save c2_ptpr to slot 32 */
202        mfc2    $27,  $1               
203        sw      $27,  33*4($26)           /* save c2_mode to slot 33 */
204    mfc0    $27,  $12             
205        sw      $27,  34*4($26)           /* save c0_sr   to slot 34 */
206    mfc0    $27,  $4, 2             
207        sw      $27,  35*4($26)           /* save c0_th   to slot 35 */
208
209    sync
210
211    jr      $31                       /* return to caller */
212    nop
213
214#---------------------------------------------------------------------------------
215# The hal_do_cpu_restore()function makes the following assumption:
216# - register $4 contains a pointer on the target thread context.
217#---------------------------------------------------------------------------------
218hal_do_cpu_restore:
219
220    move    $26,  $4                  /* $26 <= &context */
221
222    lw      $27,   0*4($26)         
223    mtc0    $27,   $14                 /* restore C0_epc from slot 0 */
224
225    lw      $1,    1*4($26)         
226    lw      $2,    2*4($26)         
227    lw      $3,    3*4($26)         
228    lw      $4,    4*4($26)         
229    lw      $5,    5*4($26)         
230    lw      $6,    6*4($26)         
231    lw      $7,    7*4($26)         
232    lw      $8,    8*4($26)         
233    lw      $9,    9*4($26)         
234    lw      $10,  10*4($26)         
235    lw      $11,  11*4($26)         
236    lw      $12,  12*4($26)         
237    lw      $13,  13*4($26)         
238    lw      $14,  14*4($26)         
239    lw      $15,  15*4($26)         
240        lw      $16,  16*4($26)         
241        lw      $17,  17*4($26)         
242    lw      $18,  18*4($26)         
243    lw      $19,  19*4($26)         
244    lw      $20,  20*4($26)         
245    lw      $21,  21*4($26)         
246    lw      $22,  22*4($26)         
247    lw      $23,  23*4($26)         
248    lw      $24,  24*4($26)         
249    lw      $25,  25*4($26)         
250
251    lw      $27,  26*4($26)         
252    mthi    $27                        /* restore hi from slot 26 */
253    lw      $27,  27*4($26)         
254    mtlo    $27                        /* restore lo from slot 27 */
255
256        lw      $28,  28*4($26)         
257        lw      $29,  29*4($26)         
258        lw      $30,  30*4($26)         
259        lw      $31,  31*4($26)            /* restore ra from slot 31 */
260
261        lw      $27,  32*4($26)
262        mtc2    $27,  $0                   /* restore c2_ptpr from slot 32 */
263
264        lw      $27,  35*4($26)     
265    mtc0        $27,  $4, 2                /* restore c0_th from slot 35 */
266
267        lw      $27,  33*4($26)
268        lw      $26,  34*4($26)
269
270        mtc2    $27,  $1                   /* restore c2_mode from slot 33 */
271    mtc0        $26,  $12                  /* restore c0_sr from slot 34 */
272
273    jr      $31                        /* return to caller */
274    nop
275
276        .set reorder                   
277    .set at                         
278
Note: See TracBrowser for help on using the repository browser.