Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 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
 
8
$Revision: 2288 $
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
145
except_7:                  ;#NM exception handler
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
183
endg