source: soft/giet_vm/sys/switch.s @ 253

Last change on this file since 253 was 238, checked in by alain, 11 years ago

Major evolution to support physical addresses larger than 32 bits.
The map.xml format has been modified: the vsegs associated to schedulers
are now explicitely defined and mapped in the page tables.

File size: 4.7 KB
Line 
1/******************************************************************************
2* This function receives two arguments that are the current task context
3* (virtual) addresses and the next task context (virtual) address.
4******************************************************************************/
5
6    .globl  _task_switch
7    .func   _task_switch
8    .type   _task_switch, %function
9
10_task_switch:
11
12    /* save _current task context */
13    add     $27,    $4,     $0  /* $27 <= &context[curr_task_id] */
14
15    .set noat
16    sw      $1,     1*4($27)    /* ctx[1] <= $1 */
17    .set at
18    sw      $2,     2*4($27)    /* ctx[2] <= $2 */
19    sw      $3,     3*4($27)    /* ctx[3] <= $3 */
20    sw      $4,     4*4($27)    /* ctx[4] <= $4 */
21    sw      $5,     5*4($27)    /* ctx[5] <= $5 */
22    sw      $6,     6*4($27)    /* ctx[6] <= $6 */
23    sw      $7,     7*4($27)    /* ctx[7] <= $7 */
24    sw      $8,     8*4($27)    /* ctx[8] <= $8 */
25    sw      $9,     9*4($27)    /* ctx[9] <= $9 */
26    sw      $10,    10*4($27)   /* ctx[10] <= $10 */
27    sw      $11,    11*4($27)   /* ctx[11] <= $11 */
28    sw      $12,    12*4($27)   /* ctx[12] <= $12 */
29    sw      $13,    13*4($27)   /* ctx[13] <= $13 */
30    sw      $14,    14*4($27)   /* ctx[14] <= $14 */
31    sw      $15,    15*4($27)   /* ctx[15] <= $15 */
32    sw      $16,    16*4($27)   /* ctx[16] <= $16 */
33    sw      $17,    17*4($27)   /* ctx[17] <= $17 */
34    sw      $18,    18*4($27)   /* ctx[18] <= $18 */
35    sw      $19,    19*4($27)   /* ctx[19] <= $19 */
36    sw      $20,    20*4($27)   /* ctx[20] <= $20 */
37    sw      $21,    21*4($27)   /* ctx[21] <= $21 */
38    sw      $22,    22*4($27)   /* ctx[22] <= $22 */
39    sw      $23,    23*4($27)   /* ctx[23] <= $23 */
40    sw      $24,    24*4($27)   /* ctx[24] <= $24 */
41    sw      $25,    25*4($27)   /* ctx[25] <= $25 */
42    mflo    $26
43    sw      $26,    26*4($27)   /* ctx[26] <= LO  */
44    mfhi    $26
45    sw      $26,    27*4($27)   /* ctx[27] <= H1  */
46    sw      $28,    28*4($27)   /* ctx[28] <= $28 */
47    sw      $29,    29*4($27)   /* ctx[29] <= $29 */
48    sw      $30,    30*4($27)   /* ctx[30] <= $30 */
49    sw      $31,    31*4($27)   /* ctx[31] <= $31 */
50    mfc0    $26,    $14
51    sw      $26,    32*4($27)   /* ctx[32] <= EPC */
52    mfc0    $26,    $13
53    sw      $26,    33*4($27)   /* ctx[33] <= CR  */
54    mfc0    $26,    $12
55    sw      $26,    34*4($27)   /* ctx[34] <= SR  */
56    mfc0    $26,    $8
57    sw      $26,    35*4($27)   /* ctx[34] <= BVAR */
58    mfc2    $26,    $0
59    sw      $26,    39*4($27)   /* ctx[35] <= PTPR */
60
61    /* restore next task context */
62    add     $27,    $5,     $0  /* $27<= &context[next_task_id] */
63
64    .set noat
65    lw      $1,     1*4($27)    /* restore $1 */
66    .set at
67    lw      $2,     2*4($27)    /* restore $2 */
68    lw      $3,     3*4($27)    /* restore $3 */
69    lw      $4,     4*4($27)    /* restore $4 */
70    lw      $5,     5*4($27)    /* restore $5 */
71    lw      $6,     6*4($27)    /* restore $6 */
72    lw      $7,     7*4($27)    /* restore $7 */
73    lw      $8,     8*4($27)    /* restore $8 */
74    lw      $9,     9*4($27)    /* restore $9 */
75    lw      $10,    10*4($27)   /* restore $10 */
76    lw      $11,    11*4($27)   /* restore $11 */
77    lw      $12,    12*4($27)   /* restore $12 */
78    lw      $13,    13*4($27)   /* restore $13 */
79    lw      $14,    14*4($27)   /* restore $14 */
80    lw      $15,    15*4($27)   /* restore $15 */
81    lw      $16,    16*4($27)   /* restore $16 */
82    lw      $17,    17*4($27)   /* restore $17 */
83    lw      $18,    18*4($27)   /* restore $18 */
84    lw      $19,    19*4($27)   /* restore $19 */
85    lw      $20,    20*4($27)   /* restore $20 */
86    lw      $21,    21*4($27)   /* restore $21 */
87    lw      $22,    22*4($27)   /* restore $22 */
88    lw      $23,    23*4($27)   /* restore $23 */
89    lw      $24,    24*4($27)   /* restore $24 */
90    lw      $25,    25*4($27)   /* restore $25 */
91    lw      $26,    26*4($27)
92    mtlo    $26                 /* restore LO */
93    lw      $26,    27*4($27)
94    mthi    $26                 /* restore HI */
95    lw      $28,    28*4($27)   /* restore $28 */
96    lw      $29,    29*4($27)   /* restore $29 */
97    lw      $30,    30*4($27)   /* restore $30 */
98    lw      $31,    31*4($27)   /* restore $31 */
99    lw      $26,    32*4($27)
100    mtc0    $26,    $14         /* restore EPC */
101    lw      $26,    33*4($27)
102    mtc0    $26,    $13         /* restore CR */
103    lw      $26,    34*4($27)
104    mtc0    $26,    $12         /* restore SR */
105    lw      $26,    35*4($27)
106    mtc0    $26,    $8          /* restore BVAR */
107    lw      $26,    39*4($27)
108    mtc2    $26,    $0          /* restore PTPR */
109
110    /* returns to caller */
111    jr      $31 
112
113    .endfunc
114    .size _task_switch, .-_task_switch
115
Note: See TracBrowser for help on using the repository browser.