Subversion Repositories Kolibri OS

Rev

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

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