Subversion Repositories Kolibri OS

Rev

Rev 420 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
214 serge 1
 
2
           clts
3
           fninit
4
5
 
221 serge 6
           jnc .no_SSE
7
214 serge 8
 
9
           mov ecx, cr0
10
           or ebx, CR4_OSFXSR+CR4_OSXMMEXPT
11
           mov cr4, ebx
12
13
 
14
           or ecx, CR0_NE
15
           mov cr0, ecx
16
17
 
18
           ldmxcsr [esp-4]
19
20
 
21
           xorps xmm1, xmm1
22
           xorps xmm2, xmm2
23
           xorps xmm3, xmm3
24
           xorps xmm4, xmm4
25
           xorps xmm5, xmm5
26
           xorps xmm6, xmm6
27
           xorps xmm7, xmm7
28
           fxsave [fpu_data]  ;[eax]
357 serge 29
           ret
214 serge 30
.no_SSE:
221 serge 31
           mov ecx, cr0
214 serge 32
           and ecx, not CR0_EM
33
           or ecx, CR0_MP+CR0_NE
34
           mov cr0, ecx
35
           fnsave [fpu_data]
357 serge 36
           ret
214 serge 37
38
 
378 serge 39
;  eax= 512 bytes memory area
40
41
 
214 serge 42
fpu_save:
378 serge 43
           push ecx
44
           push esi
45
           push edi
46
47
 
48
           cli
49
50
 
214 serge 51
           mov edi, eax
378 serge 52
214 serge 53
 
378 serge 54
           mov eax, [CURRENT_TASK]
55
           cmp ecx, eax
56
           jne .save
57
.copy:
58
           shl eax, 8
59
           mov esi, [eax+SLOT_BASE+APPDATA.fpu_state]
380 serge 60
           mov ecx, 512/4
378 serge 61
           cld
62
           rep movsd
63
           fninit
64
65
 
66
           pop edi
67
           pop esi
68
           pop ecx
69
           ret
70
.save:
71
           mov [fpu_owner], eax
72
73
 
74
           mov ecx, [ecx+SLOT_BASE+APPDATA.fpu_state]
380 serge 75
378 serge 76
 
221 serge 77
           jnc .no_SSE
214 serge 78
79
 
378 serge 80
           jmp .copy
81
.no_SSE:
214 serge 82
           fnsave [ecx]
378 serge 83
           jmp .copy
84
214 serge 85
 
86
fpu_restore:
378 serge 87
           push ecx
88
           push esi
89
90
 
91
92
 
93
           cli
94
95
 
96
           mov eax, [CURRENT_TASK]
97
           cmp ecx, eax
98
           jne .copy
99
100
 
101
102
 
221 serge 103
           jnc .no_SSE
214 serge 104
105
 
378 serge 106
           popfd
107
           pop esi
108
           pop ecx
109
           ret
214 serge 110
.no_SSE:
111
           fnclex               ;fix possible problems
112
           frstor [esi]
378 serge 113
           popfd
114
           pop esi
115
           pop ecx
116
           ret
214 serge 117
.copy:
378 serge 118
           shl eax, 8
119
           mov edi, [eax+SLOT_BASE+APPDATA.fpu_state]
380 serge 120
           mov ecx, 512/4
378 serge 121
           cld
122
           rep movsd
123
           popfd
124
           pop esi
125
           pop ecx
126
           ret
127
214 serge 128
 
129
e7:                        ;#NM exception handler
130
        save_ring3_context
131
        clts
132
        mov ax, app_data  ;
420 serge 133
        mov ds, ax
214 serge 134
        mov es, ax
135
136
 
137
        cmp ebx, [CURRENT_TASK]
138
        je .exit
139
140
 
141
        mov eax, [ebx+SLOT_BASE+APPDATA.fpu_state]
380 serge 142
        bt [cpu_caps], CAPS_SSE
221 serge 143
        jnc .no_SSE
214 serge 144
145
 
146
        mov ebx, [CURRENT_TASK]
147
        mov [fpu_owner], ebx
148
        shl ebx, 8
149
        mov eax, [ebx+SLOT_BASE+APPDATA.fpu_state]
380 serge 150
        fxrstor [eax]
214 serge 151
.exit:
152
        restore_ring3_context
153
        iret
154
155
 
156
        fnsave [eax]
157
        mov ebx, [CURRENT_TASK]
158
        mov [fpu_owner], ebx
159
        shl ebx, 8
160
        mov eax, [ebx+SLOT_BASE+APPDATA.fpu_state]
380 serge 161
        frstor [eax]
214 serge 162
        restore_ring3_context
163
        iret
164
165
 
166
  fpu_owner dd 1
167
 endg
168
169
 
170
reg_cs        equ ebp+8
171
reg_eflags    equ ebp+12
172
reg_esp       equ ebp+16
173
reg_ss        equ ebp+20
174
175
 
176
except_16:           ;fpu native exceptions handler
177
           push ebp
178
           mov ebp, esp
179
180
 
181
           push ebx
182
           push ecx
183
           push edx
184
185
 
420 serge 186
           shl ebx, 8
214 serge 187
188
 
420 serge 189
           test eax, eax
214 serge 190
           jz .default
191
192
 
193
           mov edx, [reg_esp]
194
           sub edx, 4
195
           mov [edx], ecx
420 serge 196
           mov [reg_esp], edx
214 serge 197
           mov dword [reg_eip], eax
198
199
 
200
           pop ecx
201
           pop ebx
202
           pop eax
203
204
 
205
           iretd
206
207
 
208
           pop edx
209
           pop ecx
210
           pop ebx
211
           pop eax
212
           leave
213
214
 
215
216
 
217
           jmp exc_c
218
219
 
220
except_19:          ;sse exceptions handler
221
           push ebp
222
           mov ebp, esp
223
224
 
225
           push ebx
226
           push ecx
227
           push edx
228
229
 
427 serge 230
214 serge 231
 
427 serge 232
           test eax, eax
214 serge 233
           jz .default
234
235
 
236
           mov edx, [reg_esp]
237
           sub edx, 4
238
           mov [edx], ecx
420 serge 239
           mov [reg_esp], edx
214 serge 240
           mov dword [reg_eip], eax
241
242
 
243
           pop ecx
244
           pop ebx
245
           pop eax
246
247
 
248
           iretd
249
250
 
251
           pop edx
252
           pop ecx
253
           pop ebx
254
           pop eax
255
           leave
256
257
 
258
259
 
260
           jmp exc_c
261
262
 
263
restore reg_cs
264
restore reg_eflags
265
restore reg_esp
266
restore reg_ss
267