Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1159 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
1206 hidnplayr 8
$Revision: 1206 $
1159 hidnplayr 9
 
10
 
11
init_fpu:
12
           clts
13
           fninit
14
 
15
           bt [cpu_caps], CAPS_SSE
16
           jnc .no_SSE
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
38
           fxsave [fpu_data]  ;[eax]
39
           ret
40
.no_SSE:
41
           mov ecx, cr0
42
           and ecx, not CR0_EM
43
           or ecx, CR0_MP+CR0_NE
44
           mov cr0, ecx
45
           fnsave [fpu_data]
46
           ret
47
 
48
; param
49
;  eax= 512 bytes memory area
50
 
51
align 4
52
fpu_save:
53
           push ecx
54
           push esi
55
           push edi
56
 
57
           pushfd
58
           cli
59
 
60
           clts
61
           mov edi, eax
62
 
63
           mov ecx, [fpu_owner]
64
           mov esi, [CURRENT_TASK]
65
           cmp ecx, esi
66
           jne .save
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]
80
           mov ecx, 512/4
81
           cld
82
           rep movsd
83
           fninit
84
.exit:
85
           popfd
86
           pop edi
87
           pop esi
88
           pop ecx
89
           ret
90
 
91
align 4
92
save_context:
93
           bt [cpu_caps], CAPS_SSE
94
           jnc .no_SSE
95
 
96
           fxsave [eax]
97
           ret
98
.no_SSE:
99
           fnsave [eax]
100
           ret
101
 
102
align 4
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
118
           bt [cpu_caps], CAPS_SSE
119
           jnc .no_SSE
120
 
121
           fxrstor [esi]
122
           popfd
123
           pop esi
124
           pop ecx
125
           ret
126
.no_SSE:
127
           fnclex               ;fix possible problems
128
           frstor [esi]
129
           popfd
130
           pop esi
131
           pop ecx
132
           ret
133
.copy:
134
           shl eax, 8
135
           mov edi, [eax+SLOT_BASE+APPDATA.fpu_state]
136
           mov ecx, 512/4
137
           cld
138
           rep movsd
139
           popfd
140
           pop esi
141
           pop ecx
142
           ret
143
 
144
align 4
1198 clevermous 145
except_7:                  ;#NM exception handler
1159 hidnplayr 146
        save_ring3_context
147
        clts
148
        mov ax, app_data  ;
149
        mov ds, ax
150
        mov es, ax
151
 
152
        mov ebx, [fpu_owner]
153
        cmp ebx, [CURRENT_TASK]
154
        je .exit
155
 
156
        shl ebx, 8
157
        mov eax, [ebx+SLOT_BASE+APPDATA.fpu_state]
158
        bt [cpu_caps], CAPS_SSE
159
        jnc .no_SSE
160
 
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]
167
.exit:
168
        restore_ring3_context
169
        iret
170
 
171
.no_SSE:
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
180
 
181
iglobal
182
  fpu_owner dd 0
1198 clevermous 183
endg