Subversion Repositories Kolibri OS

Rev

Rev 2138 | Rev 2229 | 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.  
  9. IRQ_POOL_SIZE equ 48
  10.  
  11. uglobal
  12.  
  13. align 16
  14. irqh_tab            rd LHEAD.sizeof * IRQ_RESERVED / 4
  15.  
  16. irqh_pool           rd IRQH.sizeof * IRQ_POOL_SIZE /4
  17. next_irqh           rd 1
  18.  
  19. irq_active_set      rd 1
  20. irq_failed          rd IRQ_RESERVED
  21.  
  22. endg
  23.  
  24. align 4
  25. proc attach_int_handler stdcall, irq:dword, handler:dword, user_data:dword
  26.          locals
  27.            .irqh dd ?
  28.          endl
  29.  
  30.          and [.irqh], 0
  31.  
  32.          push ebx
  33.  
  34.          mov  ebx, [irq]            ;irq num
  35.          test ebx, ebx
  36.          jz   .err
  37.  
  38.          cmp  ebx, IRQ_RESERVED
  39.          jae  .err
  40.  
  41.          mov  edx, [handler]
  42.          test edx, edx
  43.          jz   .err
  44.  
  45.          pushfd
  46.          cli
  47.  
  48. ;allocate handler
  49.  
  50.          mov ecx, [next_irqh]
  51.          test ecx, ecx
  52.          jz .fail
  53.  
  54.          mov eax, [ecx]
  55.          mov [next_irqh], eax
  56.          mov [.irqh], ecx
  57.  
  58.          mov [irq_failed+ebx*4], 0  ;clear counter
  59.  
  60.          mov eax, [user_data]
  61.          mov [ecx+IRQH.handler], edx
  62.          mov [ecx+IRQH.data],    eax
  63.  
  64.          lea edx, [irqh_tab+ebx*8]
  65.          list_add_tail ecx, edx     ;clobber eax
  66.          stdcall enable_irq, ebx
  67.  
  68. .fail:
  69.          popfd
  70. .err:
  71.          pop ebx
  72.          mov eax, [.irqh]
  73.          ret
  74.  
  75. endp
  76.  
  77. if 0
  78. align 4
  79. proc get_int_handler stdcall, irq:dword
  80.  
  81.         mov eax, [irq]
  82.         cmp eax, 15
  83.         ja .fail
  84.         mov eax, [irq_tab + 4 * eax]
  85.         ret
  86. .fail:
  87.         xor eax, eax
  88.         ret
  89. endp
  90. end if
  91.  
  92.  
  93. align 4
  94. proc  detach_int_handler
  95.  
  96.        ret
  97. endp
  98.  
  99.  
  100. macro irq_serv_h [num] {
  101.     forward
  102. align 4
  103.   .irq_#num :
  104.     push num
  105.        jmp .main
  106. }
  107.  
  108. align 16
  109. irq_serv:
  110.  
  111. ; .irq_1:
  112. ;      push 1
  113. ;      jmp .main
  114. ; etc...
  115.  
  116. irq_serv_h 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15
  117. irq_serv_h 16, 17, 18, 19, 20, 21, 22, 23
  118.  
  119. purge irq_serv_h
  120.  
  121. align 16
  122. .main:
  123.        save_ring3_context
  124.  
  125.        mov   ebp, [esp + 32]
  126.        mov   bx, app_data  ;os_data
  127.        mov   ds, bx
  128.        mov   es, bx
  129.  
  130.        cmp   [v86_irqhooks+ebp*8], 0
  131.        jnz   v86_irq
  132.  
  133.        cmp   bp, 6
  134.        jnz   @f
  135.        push  ebp
  136.        call  [fdc_irq_func]
  137.        pop   ebp
  138. @@:
  139.  
  140.        cmp   bp, 14
  141.        jnz   @f
  142.        push  ebp
  143.        call  [irq14_func]
  144.        pop   ebp
  145. @@:
  146.        cmp   bp, 15
  147.        jnz   @f
  148.        push  ebp
  149.        call  [irq15_func]
  150.        pop   ebp
  151. @@:
  152.        bts [irq_active_set], ebp
  153.  
  154.        lea esi, [irqh_tab+ebp*8]        ; esi= list head
  155.        mov ebx, esi
  156. .next:
  157.        mov ebx, [ebx+IRQH.list.next]    ; ebx= irqh pointer
  158.        cmp ebx, esi
  159.        je .done
  160.  
  161.        push ebx                         ; FIX THIS
  162.        push edi
  163.        push esi
  164.  
  165.        push [ebx+IRQH.data]
  166.        call [ebx+IRQH.handler]
  167.        add esp, 4
  168.  
  169.        pop esi
  170.        pop edi
  171.        pop ebx
  172.  
  173.        test eax, eax
  174.        jz .next
  175.  
  176.        btr [irq_active_set], ebp
  177.        jmp .next
  178.  
  179. .done:
  180.        btr [irq_active_set], ebp
  181.        jnc .exit
  182.  
  183.        inc [irq_failed+ebp*4]
  184. .exit:
  185.        mov  [check_idle_semaphore],5
  186.  
  187.        mov ecx, ebp
  188.        call irq_eoi
  189.  
  190.        restore_ring3_context
  191.        add   esp, 4
  192.        iret
  193.  
  194. align 4
  195. irqD:
  196.         push  eax
  197.         push  ecx
  198.         xor   eax,eax
  199.         out   0xf0,al
  200.         mov   cl, 13
  201.         call  irq_eoi
  202.         pop   ecx
  203.         pop   eax
  204.         iret
  205.  
  206.