Subversion Repositories Kolibri OS

Rev

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

  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: 593 $
  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. e7:                        ;#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 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.  
  201.            mov ebx, [CURRENT_TASK]
  202.            shl ebx, 8
  203.  
  204.            mov eax, [ebx+SLOT_BASE+APPDATA.fpu_handler]
  205.            test eax, eax
  206.            jz .default
  207.  
  208.            mov ecx, [reg_eip]
  209.            mov edx, [reg_esp]
  210.            sub edx, 4
  211.            mov [edx], ecx
  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.  
  245.            mov ebx, [current_slot]
  246.  
  247.            mov eax, [ebx+APPDATA.sse_handler]
  248.            test eax, eax
  249.            jz .default
  250.  
  251.            mov ecx, [reg_eip]
  252.            mov edx, [reg_esp]
  253.            sub edx, 4
  254.            mov [edx], ecx
  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.  
  284.  
  285.