Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2465 Serge 3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
214 serge 7
 
593 mikedld 8
$Revision: 2465 $
9
 
10
 
214 serge 11
init_fpu:
2434 Serge 12
        clts
13
        fninit
214 serge 14
 
2434 Serge 15
        bt      [cpu_caps], CAPS_SSE
16
        jnc     .no_SSE
214 serge 17
 
2434 Serge 18
        mov     ebx, cr4
19
        mov     ecx, cr0
20
        or      ebx, CR4_OSFXSR+CR4_OSXMMEXPT
21
        mov     cr4, ebx
214 serge 22
 
2434 Serge 23
        and     ecx, not (CR0_MP+CR0_EM)
24
        or      ecx, CR0_NE
25
        mov     cr0, ecx
214 serge 26
 
2434 Serge 27
        mov     dword [esp-4], SSE_INIT
28
        ldmxcsr [esp-4]
214 serge 29
 
2434 Serge 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
221 serge 40
.no_SSE:
2434 Serge 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
214 serge 47
 
378 serge 48
; param
49
;  eax= 512 bytes memory area
50
 
214 serge 51
align 4
378 serge 52
fpu_save:
2434 Serge 53
        push    ecx
54
        push    esi
55
        push    edi
378 serge 56
 
2434 Serge 57
        pushfd
58
        cli
378 serge 59
 
2434 Serge 60
        clts
61
        mov     edi, eax
214 serge 62
 
2434 Serge 63
        mov     ecx, [fpu_owner]
64
        mov     esi, [CURRENT_TASK]
65
        cmp     ecx, esi
66
        jne     .save
435 serge 67
 
2434 Serge 68
        call    save_context
69
        jmp     .exit
435 serge 70
.save:
2434 Serge 71
        mov     [fpu_owner], esi
435 serge 72
 
2434 Serge 73
        shl     ecx, 8
74
        mov     eax, [ecx+SLOT_BASE+APPDATA.fpu_state]
435 serge 75
 
2434 Serge 76
        call    save_context
435 serge 77
 
2434 Serge 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
435 serge 84
.exit:
2434 Serge 85
        popfd
86
        pop     edi
87
        pop     esi
88
        pop     ecx
89
        ret
378 serge 90
 
435 serge 91
align 4
92
save_context:
2434 Serge 93
        bt      [cpu_caps], CAPS_SSE
94
        jnc     .no_SSE
214 serge 95
 
2434 Serge 96
        fxsave  [eax]
97
        ret
214 serge 98
.no_SSE:
2434 Serge 99
        fnsave  [eax]
100
        ret
214 serge 101
 
102
align 4
378 serge 103
fpu_restore:
2434 Serge 104
        push    ecx
105
        push    esi
378 serge 106
 
2434 Serge 107
        mov     esi, eax
378 serge 108
 
2434 Serge 109
        pushfd
110
        cli
378 serge 111
 
2434 Serge 112
        mov     ecx, [fpu_owner]
113
        mov     eax, [CURRENT_TASK]
114
        cmp     ecx, eax
115
        jne     .copy
378 serge 116
 
2434 Serge 117
        clts
118
        bt      [cpu_caps], CAPS_SSE
119
        jnc     .no_SSE
214 serge 120
 
2434 Serge 121
        fxrstor [esi]
122
        popfd
123
        pop     esi
124
        pop     ecx
125
        ret
214 serge 126
.no_SSE:
2434 Serge 127
        fnclex                  ;fix possible problems
128
        frstor  [esi]
129
        popfd
130
        pop     esi
131
        pop     ecx
132
        ret
378 serge 133
.copy:
2434 Serge 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
214 serge 143
 
144
align 4
1056 Galkov 145
except_7:                  ;#NM exception handler
465 serge 146
        save_ring3_context
147
        clts
2434 Serge 148
        mov     ax, app_data;
149
        mov     ds, ax
150
        mov     es, ax
214 serge 151
 
2434 Serge 152
        mov     ebx, [fpu_owner]
153
        cmp     ebx, [CURRENT_TASK]
154
        je      .exit
214 serge 155
 
2434 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
 
2434 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]
465 serge 166
        fxrstor [eax]
214 serge 167
.exit:
465 serge 168
        restore_ring3_context
169
        iret
214 serge 170
 
171
.no_SSE:
2434 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]
465 serge 178
        restore_ring3_context
179
        iret
214 serge 180
 
181
iglobal
709 diamond 182
  fpu_owner dd 0
1056 Galkov 183
endg