Subversion Repositories Kolibri OS

Rev

Rev 2288 | Rev 3534 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 2455 $
  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
  184.