e10216cbb6ccea4c3a37736658bcd29c5b010659
[bertos.git] / kern / switch_dsp56k.c
1 /*!
2  * \file
3  * Copyright 2004 Develer S.r.l. (http://www.develer.com/)
4  * All Rights Reserved.
5  *
6  * \version $Id$
7  *
8  * \author Giovanni Bajo <rasky@develer.com>
9  *
10  * \brief DSP5680x task switching support
11  */
12
13 /*
14  * $Log$
15  * Revision 1.1  2004/05/23 17:27:00  bernie
16  * Import kern/ subdirectory.
17  *
18  */
19
20 void asm_switch_context(void ** new_sp/*R2*/, void ** save_sp/*R3*/);
21 asm void asm_switch_context(void ** new_sp, void ** save_sp)
22 {
23         lea   (SP)+
24         move  n,x:(SP)+
25         move  x0,x:(SP)+
26         move  y0,x:(SP)+
27         move  y1,x:(SP)+
28         move  a0,x:(SP)+
29         move  a1,x:(SP)+
30         move  a2,x:(SP)+
31         move  b0,x:(SP)+
32         move  b1,x:(SP)+
33         move  b2,x:(SP)+
34         move  r0,x:(SP)+
35         move  r1,x:(SP)+
36         move  r2,x:(SP)+
37         move  r3,x:(SP)+
38
39         move  omr,x:(SP)+
40         move  la,x:(SP)+
41         move  m01,x:(SP)+
42         move  lc,x:(SP)+
43
44         ;
45         ; save hardware stack
46         ;
47         move  hws,x:(SP)+
48         move  hws,x:(SP)+
49
50         ; From the manual:
51         ; The compiler uses page 0 address locations X: 0x0030 - 0x003F as register
52         ; variables. Frequently accessed local variables are assigned to the page 0
53         ; registers instead of to stack locations so that load and store instructions
54         ; are shortened. Addresses X: 0x0030 - 0x0037 (page 0 registers MR0-MR7) are
55         ; volatile registers and can be overwritten. The remaining registers (page 0
56         ; registers MR8-MR15) are treated as non-volatile and, if used by a routine,
57         ; must be saved on entry and restored on exit.
58         ;
59         ; So, register 0x30-0x37 are caller-save, while 0x38-0x3F are callee-save.
60         move  x:<$38,y1
61         move  y1,x:(SP)+
62         move  x:<$39,y1
63         move  y1,x:(SP)+
64         move  x:<$3A,y1
65         move  y1,x:(SP)+
66         move  x:<$3B,y1
67         move  y1,x:(SP)+
68         move  x:<$3C,y1
69         move  y1,x:(SP)+
70         move  x:<$3D,y1
71         move  y1,x:(SP)+
72         move  x:<$3E,y1
73         move  y1,x:(SP)+
74         move  x:<$3F,y1
75         move  y1,x:(SP)
76         
77         ; 
78         ; 28 words have been pushed on the stack.
79         nop
80         move SP, x:(R3)
81         nop
82         move x:(R2), SP
83         nop
84
85         pop   y1
86         move  y1,x:<$3F
87         pop   y1
88         move  y1,x:<$3E
89         pop   y1
90         move  y1,x:<$3D
91         pop   y1
92         move  y1,x:<$3C
93         pop   y1
94         move  y1,x:<$3B
95         pop   y1
96         move  y1,x:<$3A
97         pop   y1
98         move  y1,x:<$39
99         pop   y1
100         move  y1,x:<$38
101
102         ;
103         ; restore hardware stack
104         ;
105         move  hws,la  ; Clear HWS to ensure proper reload
106         move  hws,la
107         pop   HWS
108         pop   HWS
109         
110         ;
111         ; restore all saved registers
112         ;
113         pop   lc
114         pop   m01
115         pop   la
116         pop   omr
117
118         pop   r3
119         pop   r2
120         pop   r1
121         pop   r0
122         pop   b2
123         pop   b1
124         pop   b0
125         pop   a2
126         pop   a1
127         pop   a0
128
129         pop   y1
130         pop   y0
131         pop   x0
132
133         pop   n
134         
135         rts
136 }