Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; Kolibri Fast Calls test
  3. ;
  4. ;   Compile with FASM for Kolibri
  5. ;
  6. ;
  7. SYSENTER_VAR    equ     0
  8. use32
  9. org     0x0
  10.         db    'MENUET01'
  11.         dd     0x01
  12.         dd     START
  13.         dd     I_END
  14.         dd     0x1000
  15.         dd     0x1000
  16.         dd     0x0, 0x0
  17.  
  18. include 'macros.inc'
  19. include 'debug.inc'
  20.  
  21. START:  print   'Please wait'
  22.         ; ÷åðåç áûñòðûé âûçîâ (SYSENTER)
  23. test1:  mov     eax, 1
  24.         cpuid
  25.         test    edx, 0x800
  26.         jnz     .ok
  27.         dps     'unsupported     '
  28.         jmp     .end
  29. .ok:   
  30.         xor     eax, eax
  31.         cpuid
  32.         rdtsc
  33.         mov     [old_tsc], eax
  34.         mov     [old_tsc + 4], edx
  35.        
  36.         mov     ebx, 0x100000
  37.         mov     dword[SYSENTER_VAR], .ret_p
  38.         mov     [SYSENTER_VAR + 4], esp
  39.         align   32
  40. .nxt:   mov     eax, 19         ; ôóíêöèÿ ïóñòûøêà
  41.         sysenter                ; ïîðòÿòñÿ ecx, edx
  42. .ret_p: dec     ebx
  43.         jnz     .nxt
  44.  
  45.         xor     eax, eax
  46.         cpuid
  47.         rdtsc
  48.         cmp     eax, [old_tsc]
  49.         jnb     @f
  50.         dec     edx
  51. @@:     sub     eax, [old_tsc]
  52.         sub     edx, [old_tsc + 4]
  53.         debug_print_hex edx
  54.         debug_print_hex eax
  55. .end:   print   ' <- Fast call (SYSENTER)'
  56.        
  57.         ;----------------------------------------------
  58.         ; ÷åðåç áûñòðûé âûçîâ (SYSCALL)
  59. test2:  xor     eax, eax
  60.         cpuid
  61.         cmp     ecx, "cAMD"
  62.         je      .ok
  63. .nf:    dps     'unsupported     '
  64.         jmp     .end
  65. .ok:    mov     eax, 0x80000001
  66.         cpuid
  67.         test    edx, 0x800  ; bit_11 - SYSCALL/SYSRET support
  68.         jz      .nf
  69.        
  70.         xor     eax, eax
  71.         cpuid
  72.         rdtsc
  73.         mov     [old_tsc], eax
  74.         mov     [old_tsc + 4], edx
  75.        
  76.         mov     ebx, 0x100000
  77.         align   32
  78. .nxt:   mov     eax, 19
  79.         push    ecx
  80.         syscall
  81.         pop     ecx
  82.        
  83. .ret_p: dec     ebx
  84.         jnz     .nxt
  85.  
  86.         xor     eax, eax
  87.         cpuid
  88.         rdtsc
  89.         cmp     eax, [old_tsc]
  90.         jnb     @f
  91.         dec     edx
  92. @@:     sub     eax, [old_tsc]
  93.         sub     edx, [old_tsc + 4]
  94.         debug_print_hex edx
  95.         debug_print_hex eax
  96. .end:   print   ' <- Fast call (SYSCALL)'
  97.         ;----------------------------------------------
  98.         ; ÷åðåç øëþç ïðåðûâàíèÿ
  99.         xor     eax, eax
  100.         cpuid
  101.         rdtsc
  102.         mov     [old_tsc], eax
  103.         mov     [old_tsc + 4], edx
  104.        
  105. test3:  mov     ebx, 0x100000
  106.         align   32
  107. .nxt:   mov     eax, 19         ; ôóíêöèÿ ïóñòûøêà
  108.         int     0x40
  109.         dec     ebx
  110.         jnz     .nxt
  111.        
  112.         xor     eax, eax
  113.         cpuid
  114.         rdtsc
  115.         cmp     eax, [old_tsc]
  116.         jnb     @f
  117.         dec     edx
  118. @@:     sub     eax, [old_tsc]
  119.         sub     edx, [old_tsc + 4]
  120.         debug_print_hex edx
  121.         debug_print_hex eax
  122.         print   ' <- Interrupt'
  123.  
  124.         call    show_alive
  125.         mov     eax, -1
  126.         int     0x40
  127. ;---------------------------------------------
  128. show_alive:
  129.         ; ÷åðåç áûñòðûé âûçîâ, íàñòðàèâàåì ðåãèñòðû äëÿ âîçâðàòà
  130.         mov     eax, 63
  131.         mov     ebx, 1
  132.         mov     esi, msg_Ok
  133. .nxt:   mov     cl, [esi]
  134.         test    cl, cl
  135.         jz      .end
  136.  
  137.         mov     dword[SYSENTER_VAR], .ret_p
  138.         mov     [SYSENTER_VAR + 4], esp
  139.         sysenter                ; ïîðòÿòñÿ ecx, edx
  140.  
  141. .ret_p: inc     esi
  142.         jmp     .nxt
  143. .end:   ret
  144.         ; ÷åðåç øëþç ïðåðûâàíèÿ
  145.         ; mov   eax, 63
  146.         ; mov   ebx, 1
  147.         ; mov   esi, msg_Ok
  148. ; @@:   mov     cl, [esi]
  149.         ; test  cl, cl
  150.         ; jz    @f
  151.  
  152.         ; int   0x40
  153.  
  154.         ; inc   esi
  155.         ; jmp   @b
  156. ; @@:   ret
  157.  
  158.  
  159. old_tsc:        dd      0, 0
  160.  
  161. msg_Ok  db      'Alive!', 10, 13, 0
  162. I_END: