Subversion Repositories Kolibri OS

Rev

Rev 557 | Rev 662 | 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. DRV_COMPAT   equ  5  ;minimal required drivers version
  12. DRV_CURRENT  equ  5  ;current drivers model version
  13.  
  14. DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
  15.  
  16. align 4
  17. proc attach_int_handler stdcall, irq:dword, handler:dword
  18.  
  19.          mov ebx, [irq]        ;irq num
  20.          test ebx, ebx
  21.          jz .err
  22.          mov eax, [handler]
  23.          test eax, eax
  24.          jz .err
  25.          mov [irq_tab+ebx*4], eax
  26.          stdcall enable_irq, [irq]
  27.          ret
  28. .err:
  29.          xor eax, eax
  30.          ret
  31. endp
  32.  
  33. align 4
  34. proc  detach_int_handler
  35.  
  36.            ret
  37. endp
  38.  
  39. align 4
  40. proc enable_irq stdcall, irq_line:dword
  41.            mov ebx, [irq_line]
  42.            mov edx, 0x21
  43.            cmp ebx, 8
  44.            jb @F
  45.            mov edx, 0xA1
  46.            sub ebx,8
  47. @@:
  48.            in al,dx
  49.            btr eax, ebx
  50.            out dx, al
  51.            ret
  52. endp
  53.  
  54. align 16
  55. ;; proc irq_serv
  56.  
  57. irq_serv:
  58.  
  59. .irq_1:
  60.            push eax
  61.            mov eax, 1
  62.            jmp .main
  63. align 4
  64. .irq_2:
  65.            push eax
  66.            mov eax, 2
  67.            jmp .main
  68. align 4
  69. .irq_3:
  70.            push eax
  71.            mov eax, 3
  72.            jmp .main
  73. align 4
  74. .irq_4:
  75.            push eax
  76.            mov eax, 4
  77.            jmp .main
  78. align 4
  79. .irq_5:
  80.            push eax
  81.            mov eax, 5
  82.            jmp .main
  83. align 4
  84. .irq_6:
  85.            push eax
  86.            mov eax, 6
  87.            jmp .main
  88. align 4
  89. .irq_7:
  90.            push eax
  91.            mov eax, 7
  92.            jmp .main
  93. align 4
  94. .irq_8:
  95.            push eax
  96.            mov eax, 8
  97.            jmp .main
  98. align 4
  99. .irq_9:
  100.            push eax
  101.            mov eax, 9
  102.            jmp .main
  103. align 4
  104. .irq_10:
  105.            push eax
  106.            mov eax, 10
  107.            jmp .main
  108. align 4
  109. .irq_11:
  110.            push eax
  111.            mov eax, 11
  112.            jmp .main
  113. align 4
  114. .irq_12:
  115.            push eax
  116.            mov eax, 12
  117.            jmp .main
  118. align 4
  119. .irq_13:
  120.            push eax
  121.            mov eax, 13
  122.            jmp .main
  123. align 4
  124. .irq_14:
  125.            push eax
  126.            mov eax, 14
  127.            jmp .main
  128. align 4
  129. .irq_15:
  130.            push eax
  131.            mov eax, 15
  132.            jmp .main
  133.  
  134. align 16
  135. .main:
  136.            save_ring3_context
  137.            mov   bx, app_data  ;os_data
  138.            mov   ds, bx
  139.            mov   es, bx
  140.  
  141.            mov ebx, [irq_tab+eax*4]
  142.            test ebx, ebx
  143.            jz .exit
  144.  
  145.            call ebx
  146.            mov  [check_idle_semaphore],5
  147.  
  148. .exit:
  149.            restore_ring3_context
  150.  
  151.            cmp eax, 8
  152.            mov al, 0x20
  153.            jb @f
  154.            out 0xa0, al
  155. @@:
  156.            out 0x20, al
  157.  
  158.            pop eax
  159.            iret
  160.  
  161. align 4
  162. proc get_notify stdcall, p_ev:dword
  163.  
  164. .wait:
  165.            mov ebx,[current_slot]
  166.            test dword [ebx+APPDATA.event_mask],EVENT_NOTIFY
  167.            jz @f
  168.            and dword [ebx+APPDATA.event_mask], not EVENT_NOTIFY
  169.            mov edi, [p_ev]
  170.            mov dword [edi], EV_INTR
  171.            mov eax, [ebx+APPDATA.event]
  172.            mov dword [edi+4], eax
  173.            ret
  174. @@:
  175.            call change_task
  176.            jmp .wait
  177. endp
  178.  
  179. align 4
  180. proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
  181.            xor eax, eax
  182.            xor ebx, ebx
  183.            mov ah, byte [bus]
  184.            mov al, 6
  185.            mov bh, byte [devfn]
  186.            mov bl, byte [reg]
  187.            call pci_read_reg
  188.            ret
  189. endp
  190.  
  191. align 4
  192. proc pci_read16 stdcall, bus:dword, devfn:dword, reg:dword
  193.            xor eax, eax
  194.            xor ebx, ebx
  195.            mov ah, byte [bus]
  196.            mov al, 5
  197.            mov bh, byte [devfn]
  198.            mov bl, byte [reg]
  199.            call pci_read_reg
  200.            ret
  201. endp
  202.  
  203. align 4
  204. proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
  205.            xor eax, eax
  206.            xor ebx, ebx
  207.            mov ah, byte [bus]
  208.            mov al, 4
  209.            mov bh, byte [devfn]
  210.            mov bl, byte [reg]
  211.            call pci_read_reg
  212.            ret
  213. endp
  214.  
  215. align 4
  216. proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
  217.            xor eax, eax
  218.            xor ebx, ebx
  219.            mov ah, byte [bus]
  220.            mov al, 8
  221.            mov bh, byte [devfn]
  222.            mov bl, byte [reg]
  223.            mov ecx, [val]
  224.            call pci_write_reg
  225.            ret
  226. endp
  227.  
  228. align 4
  229. proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
  230.            xor eax, eax
  231.            xor ebx, ebx
  232.            mov ah, byte [bus]
  233.            mov al, 9
  234.            mov bh, byte [devfn]
  235.            mov bl, byte [reg]
  236.            mov ecx, [val]
  237.            call pci_write_reg
  238.            ret
  239. endp
  240.  
  241. handle     equ  IOCTL.handle
  242. io_code    equ  IOCTL.io_code
  243. input      equ  IOCTL.input
  244. inp_size   equ  IOCTL.inp_size
  245. output     equ  IOCTL.output
  246. out_size   equ  IOCTL.out_size
  247.  
  248.  
  249. align 4
  250. proc srv_handler stdcall, ioctl:dword
  251.            mov esi, [ioctl]
  252.            test esi, esi
  253.            jz .err
  254.  
  255.            mov edi, [esi+handle]
  256.            cmp [edi+SRV.magic], ' SRV'
  257.            jne .fail
  258.  
  259.            cmp [edi+SRV.size], SRV_SIZE
  260.            jne .fail
  261.  
  262.            stdcall [edi+SRV.srv_proc], esi
  263.            ret
  264. .fail:
  265.            xor eax, eax
  266.            not eax
  267.            mov [esi+output], eax
  268.            mov [esi+out_size], 4
  269.            ret
  270. .err:
  271.            xor eax, eax
  272.            not eax
  273.            ret
  274. endp
  275.  
  276. ; param
  277. ;  ebx= io_control
  278. ;
  279. ; retval
  280. ;  eax= error code
  281.  
  282. align 4
  283. srv_handlerEx:
  284.            cmp ebx, OS_BASE
  285.            jae .fail
  286.  
  287.            mov eax, [ebx+handle]
  288.            cmp [eax+SRV.magic], ' SRV'
  289.            jne .fail
  290.  
  291.            cmp [eax+SRV.size], SRV_SIZE
  292.            jne .fail
  293.  
  294.            stdcall [eax+SRV.srv_proc], ebx
  295.            ret
  296. .fail:
  297.            or eax, -1
  298.            ret
  299.  
  300. restore  handle
  301. restore  io_code
  302. restore  input
  303. restore  inp_size
  304. restore  output
  305. restore  out_size
  306.  
  307. align 4
  308. proc get_service stdcall, sz_name:dword
  309.            mov eax, [sz_name]
  310.            test eax, eax
  311.            jnz @F
  312.            ret
  313. @@:
  314.            mov edx, [srv.fd]
  315. @@:
  316.            cmp edx, srv.fd-SRV_FD_OFFSET
  317.            je .not_load
  318.  
  319.            stdcall strncmp, edx, [sz_name], 16
  320.            test eax, eax
  321.            je .ok
  322.  
  323.            mov edx, [edx+SRV.fd]
  324.            jmp @B
  325. .not_load:
  326.            pop ebp
  327.            jmp load_driver
  328. .ok:
  329.            mov eax, edx
  330.            ret
  331. endp
  332.  
  333. align 4
  334. reg_service:
  335. .sz_name equ esp+4
  336. .handler equ esp+8
  337.            mov eax, [.sz_name]
  338.            test eax, eax
  339.            jz .fail
  340.  
  341.            mov ebx, [.handler]
  342.            test ebx, ebx
  343.            jz .fail
  344.  
  345.            mov eax, SRV_SIZE
  346.            call malloc           ;call alloc_service
  347.            test eax, eax
  348.            jz .fail
  349.  
  350.            mov edi, eax
  351.            mov esi, [.sz_name]
  352.            mov ecx, 16/4
  353.            rep movsd
  354.  
  355.            mov [eax+SRV.magic], ' SRV'
  356.            mov [eax+SRV.size], SRV_SIZE
  357.  
  358.            mov ebx, srv.fd-SRV_FD_OFFSET
  359.            mov edx, [ebx+SRV.fd]
  360.            mov [eax+SRV.fd], edx
  361.            mov [eax+SRV.bk], ebx
  362.            mov [ebx+SRV.fd], eax
  363.            mov [edx+SRV.bk], eax
  364.  
  365.            mov ecx, [.handler]
  366.            mov [eax+SRV.srv_proc], ecx
  367.            ret 8
  368. .fail:
  369.            xor eax, eax
  370.            ret 8
  371.  
  372. align 4
  373. proc get_proc stdcall, exp:dword, sz_name:dword
  374.  
  375.            mov edx, [exp]
  376. .next:
  377.            mov eax, [edx]
  378.            test eax, eax
  379.            jz .end
  380.  
  381.            push edx
  382.            stdcall strncmp, eax, [sz_name], 16
  383.            pop edx
  384.            test eax, eax
  385.            jz .ok
  386.  
  387.            add edx,8
  388.            jmp .next
  389. .ok:
  390.            mov eax, [edx+4]
  391. .end:
  392.            ret
  393. endp
  394.  
  395. align 4
  396. proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
  397.  
  398. @@:
  399.            stdcall strncmp, [pSym], [sz_sym], 8
  400.            test eax,eax
  401.            jz .ok
  402.            add [pSym], 18
  403.            dec [count]
  404.            jnz @b
  405.            xor eax, eax
  406.            ret
  407. .ok:
  408.            mov ebx, [pSym]
  409.            mov eax, [ebx+8]
  410.            ret
  411. endp
  412.  
  413. align 4
  414. proc get_curr_task
  415.            mov eax,[CURRENT_TASK]
  416.            shl eax, 8
  417.            ret
  418. endp
  419.  
  420. align 4
  421. proc get_fileinfo stdcall, file_name:dword, info:dword
  422.            locals
  423.              cmd     dd ?
  424.              offset  dd ?
  425.                      dd ?
  426.              count   dd ?
  427.              buff    dd ?
  428.                      db ?
  429.              name    dd ?
  430.            endl
  431.  
  432.            xor eax, eax
  433.            mov ebx, [file_name]
  434.     ;       sub ebx, new_app_base
  435.            mov ecx, [info]
  436.     ;       sub ecx, new_app_base
  437.  
  438.            mov [cmd], 5
  439.            mov [offset], eax
  440.            mov [offset+4], eax
  441.            mov [count], eax
  442.            mov [buff], ecx
  443.            mov byte [buff+4], al
  444.            mov [name], ebx
  445.  
  446.            mov eax, 70
  447.            lea ebx, [cmd]
  448.      ;      sub ebx, new_app_base
  449.            int 0x40
  450.            ret
  451. endp
  452.  
  453. align 4
  454. proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
  455.                                      bytes:dword
  456.            locals
  457.              cmd     dd ?
  458.              offset  dd ?
  459.                      dd ?
  460.              count   dd ?
  461.              buff    dd ?
  462.                      db ?
  463.              name    dd ?
  464.            endl
  465.  
  466.            xor eax, eax
  467.            mov ebx, [file_name]
  468.            mov ecx, [off]
  469.            mov edx, [bytes]
  470.            mov esi, [buffer]
  471.  
  472.            mov [cmd], eax
  473.            mov [offset], ecx
  474.            mov [offset+4], eax
  475.            mov [count], edx
  476.            mov [buff], esi
  477.            mov byte [buff+4], al
  478.            mov [name], ebx
  479.  
  480.            pushad
  481.            push eax
  482.            lea eax, [cmd]
  483.            call file_system_lfn
  484.            pop eax
  485.            popad
  486.            ret
  487. endp
  488.  
  489. ; description
  490. ;  allocate kernel memory and loads the specified file
  491. ;
  492. ; param
  493. ;  file_name= full path to file
  494. ;
  495. ; retval
  496. ;  eax= file image in kernel memory
  497. ;  ebx= size of file
  498. ;
  499. ; warging
  500. ;  You mast call kernel_free() to delete each file
  501. ;  loaded by the load_file() function
  502.  
  503. align 4
  504. proc load_file stdcall, file_name:dword
  505.            locals
  506.              attr       dd ?
  507.              flags      dd ?
  508.              cr_time    dd ?
  509.              cr_date    dd ?
  510.              acc_time   dd ?
  511.              acc_date   dd ?
  512.              mod_time   dd ?
  513.              mod_date   dd ?
  514.              file_size  dd ?
  515.  
  516.              file       dd ?
  517.              file2      dd ?
  518.            endl
  519.  
  520.            lea eax, [attr]
  521.            stdcall get_fileinfo, [file_name], eax
  522.            test eax, eax
  523.            jnz .fail
  524.  
  525.            mov eax, [file_size]
  526.            cmp eax, 1024*1024*16
  527.            ja .fail
  528.  
  529.            stdcall kernel_alloc, [file_size]
  530.            mov [file], eax
  531.  
  532.            stdcall read_file, [file_name], eax, dword 0, [file_size]
  533.            cmp ebx, [file_size]
  534.            jne .cleanup
  535.  
  536.            mov eax, [file]
  537.            cmp dword [eax], 0x4B43504B
  538.            jne .exit
  539.            mov ebx, [eax+4]
  540.            mov [file_size], ebx
  541.            stdcall kernel_alloc, ebx
  542.  
  543.            test eax, eax
  544.            jz .cleanup
  545.  
  546.            mov [file2], eax
  547.            stdcall unpack, [file], eax
  548.            stdcall kernel_free, [file]
  549.            mov eax, [file2]
  550.            mov ebx, [file_size]
  551. .exit:
  552.            push eax
  553.            lea edi, [eax+ebx]     ;cleanup remain space
  554.            mov ecx, 4096          ;from file end
  555.            and ebx, 4095
  556.            jz  @f
  557.            sub ecx, ebx
  558.            xor eax, eax
  559.            cld
  560.            rep stosb
  561. @@:
  562.            mov ebx, [file_size]
  563.            pop eax
  564.            ret
  565. .cleanup:
  566.            stdcall kernel_free, [file]
  567. .fail:
  568.            xor eax, eax
  569.            xor ebx, ebx
  570.            ret
  571. endp
  572.  
  573. align 4
  574. proc get_proc_ex stdcall, proc_name:dword, imports:dword
  575.  
  576. .look_up:
  577.            mov edx, [imports]
  578.            test edx, edx
  579.            jz .end
  580.            mov edx, [edx]
  581.            test edx, edx
  582.            jz .end
  583. .next:
  584.            mov eax, [edx]
  585.            test eax, eax
  586.            jz .next_table
  587.  
  588.            push edx
  589.            stdcall strncmp, eax, [proc_name], 16
  590.            pop edx
  591.            test eax, eax
  592.            jz .ok
  593.  
  594.            add edx,8
  595.            jmp .next
  596. .next_table:
  597.            add [imports], 4
  598.            jmp .look_up
  599. .ok:
  600.            mov eax, [edx+4]
  601.            ret
  602. .end:
  603.            xor eax, eax
  604.            ret
  605. endp
  606.  
  607. align 4
  608. proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
  609.                       sym_count:dword, strings:dword, imports:dword
  610.            locals
  611.              retval dd ?
  612.            endl
  613.  
  614.            mov edi, [symbols]
  615.            mov [retval], 1
  616. .fix:
  617.            movzx ebx, [edi+CSYM.SectionNumber]
  618.            test ebx, ebx
  619.            jnz .internal
  620.            mov eax, dword [edi+CSYM.Name]
  621.            test eax, eax
  622.            jnz @F
  623.  
  624.            mov edi, [edi+4]
  625.            add edi, [strings]
  626. @@:
  627.            push edi
  628.            stdcall get_proc_ex, edi,[imports]
  629.            pop edi
  630.  
  631.            xor ebx, ebx
  632.            test eax, eax
  633.            jnz @F
  634.  
  635.            mov esi, msg_unresolved
  636.            call sys_msg_board_str
  637.            mov esi, edi
  638.            call sys_msg_board_str
  639.            mov esi, msg_CR
  640.            call sys_msg_board_str
  641.  
  642.            mov [retval],0
  643. @@:
  644.            mov edi, [symbols]
  645.            mov [edi+CSYM.Value], eax
  646.            jmp .next
  647. .internal:
  648.            cmp bx, -1
  649.            je .next
  650.            cmp bx, -2
  651.            je .next
  652.  
  653.            dec ebx
  654.            shl ebx, 3
  655.            lea ebx, [ebx+ebx*4]
  656.            add ebx, [sec]
  657.  
  658.            mov eax, [ebx+CFS.VirtualAddress]
  659.            add [edi+CSYM.Value], eax
  660. .next:
  661.            add edi, CSYM_SIZE
  662.            mov [symbols], edi
  663.            dec [sym_count]
  664.            jnz .fix
  665.            mov eax, [retval]
  666.            ret
  667. endp
  668.  
  669. align 4
  670. proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
  671.            locals
  672.              n_sec     dd ?
  673.            endl
  674.  
  675.            mov eax, [coff]
  676.            movzx ebx, [eax+CFH.nSections]
  677.            mov [n_sec], ebx
  678. .fix_sec:
  679.            mov esi, [sec]
  680.            mov edi, [esi+CFS.PtrReloc]
  681.            add edi, [coff]
  682.  
  683.            movzx ecx, [esi+CFS.NumReloc]
  684.            test ecx, ecx
  685.            jz .next
  686. .next_reloc:
  687.            mov ebx, [edi+CRELOC.SymIndex]
  688.            add ebx,ebx
  689.            lea ebx,[ebx+ebx*8]
  690.            add ebx, [sym]
  691.  
  692.            mov edx, [ebx+CSYM.Value]
  693.  
  694.            cmp [edi+CRELOC.Type], 6
  695.            je .dir_32
  696.  
  697.            cmp [edi+CRELOC.Type], 20
  698.            jne .next_reloc
  699. .rel_32:
  700.            mov eax, [edi+CRELOC.VirtualAddress]
  701.            add eax, [esi+CFS.VirtualAddress]
  702.            sub edx, eax
  703.            sub edx, 4
  704.            jmp .fix
  705. .dir_32:
  706.            mov eax, [edi+CRELOC.VirtualAddress]
  707.            add eax, [esi+CFS.VirtualAddress]
  708. .fix:
  709.            add [eax], edx
  710.            add edi, 10
  711.            dec ecx
  712.            jnz .next_reloc
  713. .next:
  714.            add [sec], COFF_SECTION_SIZE
  715.            dec [n_sec]
  716.            jnz .fix_sec
  717. .exit:
  718.            ret
  719. endp
  720.  
  721. align 4
  722. proc load_driver stdcall, driver_name:dword
  723.            locals
  724.              coff      dd ?
  725.              sym       dd ?
  726.              strings   dd ?
  727.              img_size  dd ?
  728.              img_base  dd ?
  729.              start     dd ?
  730.  
  731.              exports   dd ?   ;fake exports table
  732.                        dd ?
  733.              file_name rb 13+16+4+1      ; '/sys/drivers/<up-to-16-chars>.obj'
  734.            endl
  735.  
  736.            lea     edx, [file_name]
  737.            mov     dword [edx], '/sys'
  738.            mov     dword [edx+4], '/dri'
  739.            mov     dword [edx+8], 'vers'
  740.            mov     byte [edx+12], '/'
  741.            mov     esi, [driver_name]
  742.            lea     edi, [edx+13]
  743.            mov     ecx, 16
  744. @@:
  745.            lodsb
  746.            test    al, al
  747.            jz      @f
  748.            stosb
  749.            loop    @b
  750. @@:
  751.            mov     dword [edi], '.obj'
  752.            mov     byte [edi+4], 0
  753.            stdcall load_file, edx
  754.  
  755.            test eax, eax
  756.            jz .exit
  757.  
  758.            mov [coff], eax
  759.  
  760.            movzx ecx, [eax+CFH.nSections]
  761.            xor ebx, ebx
  762.  
  763.            lea edx, [eax+20]
  764. @@:
  765.            add ebx, [edx+CFS.SizeOfRawData]
  766.            add ebx, 15
  767.            and ebx, not 15
  768.            add edx, COFF_SECTION_SIZE
  769.            dec ecx
  770.            jnz @B
  771.            mov [img_size], ebx
  772.  
  773.            stdcall kernel_alloc, ebx
  774.            test eax, eax
  775.            jz .fail
  776.            mov [img_base], eax
  777.  
  778.            mov edi, eax
  779.            xor eax, eax
  780.            mov ecx, [img_size]
  781.            add ecx, 4095
  782.            and ecx, not 4095
  783.            shr ecx, 2
  784.            cld
  785.            rep stosd
  786.  
  787.            mov edx, [coff]
  788.            movzx ebx, [edx+CFH.nSections]
  789.            mov edi, [img_base]
  790.            lea eax, [edx+20]
  791. @@:
  792.            mov [eax+CFS.VirtualAddress], edi
  793.            mov esi, [eax+CFS.PtrRawData]
  794.            test esi, esi
  795.            jnz .copy
  796.            add edi, [eax+CFS.SizeOfRawData]
  797.            jmp .next
  798. .copy:
  799.            add esi, edx
  800.            mov ecx, [eax+CFS.SizeOfRawData]
  801.            cld
  802.            rep movsb
  803. .next:
  804.            add edi, 15
  805.            and edi, not 15
  806.            add eax, COFF_SECTION_SIZE
  807.            dec ebx
  808.            jnz @B
  809.  
  810.            mov ebx, [edx+CFH.pSymTable]
  811.            add ebx, edx
  812.            mov [sym], ebx
  813.            mov ecx, [edx+CFH.nSymbols]
  814.            add ecx,ecx
  815.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  816.            add ecx, [sym]
  817.            mov [strings], ecx
  818.  
  819.            lea ebx, [exports]
  820.            mov dword [ebx], kernel_export
  821.            mov dword [ebx+4], 0
  822.            lea eax, [edx+20]
  823.  
  824.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  825.                                      [strings], ebx
  826.            test eax, eax
  827.            jz .link_fail
  828.  
  829.            mov ebx, [coff]
  830.            add ebx, 20
  831.            stdcall fix_coff_relocs, [coff], ebx, [sym]
  832.  
  833.            mov ebx, [coff]
  834.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
  835.            test eax, eax
  836.            jz .link_fail
  837.  
  838.            mov eax, [eax]
  839.            shr eax, 16
  840.            cmp eax, DRV_COMPAT
  841.            jb .ver_fail
  842.  
  843.            cmp eax, DRV_CURRENT
  844.            ja .ver_fail
  845.  
  846.            mov ebx, [coff]
  847.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
  848.            mov [start], eax
  849.  
  850.            stdcall kernel_free, [coff]
  851.  
  852.            mov ebx, [start]
  853.            stdcall ebx, DRV_ENTRY
  854.            test eax, eax
  855.            jnz .ok
  856.  
  857.            stdcall kernel_free, [img_base]
  858.            xor eax, eax
  859.            ret
  860. .ok:
  861.            mov ebx, [img_base]
  862.            mov [eax+SRV.base], ebx
  863.            mov ecx, [start]
  864.            mov [eax+SRV.entry], ecx
  865.            ret
  866.  
  867. .ver_fail:
  868.            mov esi, msg_CR
  869.            call sys_msg_board_str
  870.            mov esi, [driver_name]
  871.            call sys_msg_board_str
  872.            mov esi, msg_CR
  873.            call sys_msg_board_str
  874.            mov esi, msg_version
  875.            call sys_msg_board_str
  876.            mov esi, msg_www
  877.            call sys_msg_board_str
  878.            jmp .cleanup
  879.  
  880. .link_fail:
  881.            mov esi, msg_module
  882.            call sys_msg_board_str
  883.            mov esi, [driver_name]
  884.            call sys_msg_board_str
  885.            mov esi, msg_CR
  886.            call sys_msg_board_str
  887. .cleanup:
  888.            stdcall kernel_free,[img_base]
  889. .fail:
  890.            stdcall kernel_free, [coff]
  891. .exit:
  892.            xor eax, eax
  893.            ret
  894. endp
  895.  
  896. align 4
  897. proc load_library stdcall, file_name:dword
  898.            locals
  899.              coff      dd ?
  900.              sym       dd ?
  901.              strings   dd ?
  902.              img_size  dd ?
  903.              img_base  dd ?
  904.              exports   dd ?
  905.            endl
  906.  
  907.            cli
  908.  
  909.            stdcall load_file, [file_name]
  910.            test eax, eax
  911.            jz .fail
  912.  
  913.            mov [coff], eax
  914.            movzx ecx, [eax+CFH.nSections]
  915.            xor ebx, ebx
  916.  
  917.            lea edx, [eax+20]
  918. @@:
  919.            add ebx, [edx+CFS.SizeOfRawData]
  920.            add ebx, 15
  921.            and ebx, not 15
  922.            add edx, COFF_SECTION_SIZE
  923.            dec ecx
  924.            jnz @B
  925.            mov [img_size], ebx
  926.  
  927.            call init_heap
  928.            stdcall user_alloc, [img_size]
  929.  
  930.            test eax, eax
  931.            jz .fail
  932.            mov [img_base], eax
  933.  
  934.            mov edx, [coff]
  935.            movzx ebx, [edx+CFH.nSections]
  936.            mov edi, [img_base]
  937.            lea eax, [edx+20]
  938. @@:
  939.            mov [eax+CFS.VirtualAddress], edi
  940.            mov esi, [eax+CFS.PtrRawData]
  941.            test esi, esi
  942.            jnz .copy
  943.            add edi, [eax+CFS.SizeOfRawData]
  944.            jmp .next
  945. .copy:
  946.            add esi, edx
  947.     ;       add edi, new_app_base
  948.            mov ecx, [eax+CFS.SizeOfRawData]
  949.            cld
  950.            rep movsb
  951. .next:
  952.            add edi, 15 ;-new_app_base
  953.            and edi, -16
  954.            add eax, COFF_SECTION_SIZE
  955.            dec ebx
  956.            jnz @B
  957.  
  958.            mov ebx, [edx+CFH.pSymTable]
  959.            add ebx, edx
  960.            mov [sym], ebx
  961.            mov ecx, [edx+CFH.nSymbols]
  962.            add ecx,ecx
  963.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  964.            add ecx, [sym]
  965.            mov [strings], ecx
  966.  
  967.            lea eax, [edx+20]
  968.  
  969.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  970.                                      [strings], dword 0
  971.            test eax, eax
  972.            jnz @F
  973.  
  974. @@:
  975.            mov edx, [coff]
  976.            movzx ebx, [edx+CFH.nSections]
  977.            mov edi, new_app_base
  978.            lea eax, [edx+20]
  979. @@:
  980.            add [eax+CFS.VirtualAddress], edi  ;patch user space offset
  981.            add eax, COFF_SECTION_SIZE
  982.            dec ebx
  983.            jnz @B
  984.  
  985.            add edx, 20
  986.            stdcall fix_coff_relocs, [coff], edx, [sym]
  987.  
  988.            mov ebx, [coff]
  989.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
  990.            mov [exports], eax
  991.  
  992.            stdcall kernel_free, [coff]
  993.            mov eax, [exports]
  994.            ret
  995. .fail:
  996.            xor eax, eax
  997.            ret
  998. endp
  999.  
  1000. align 4
  1001. proc stop_all_services
  1002.  
  1003.            mov edx, [srv.fd]
  1004. .next:
  1005.            cmp edx,  srv.fd-SRV_FD_OFFSET
  1006.            je .done
  1007.            cmp [edx+SRV.magic], ' SRV'
  1008.            jne .next
  1009.            cmp [edx+SRV.size], SRV_SIZE
  1010.            jne .next
  1011.            mov ebx, [edx+SRV.entry]
  1012.            mov edx, [edx+SRV.fd]
  1013.            push edx
  1014.            stdcall ebx, dword -1
  1015.            pop edx
  1016.            jmp .next
  1017. .done:
  1018.            ret
  1019. endp
  1020.  
  1021. ; param
  1022. ;  eax= size
  1023. ;  ebx= pid
  1024.  
  1025. align 4
  1026. create_kernel_object:
  1027.  
  1028.            push ebx
  1029.            call malloc
  1030.            pop ebx
  1031.            test eax, eax
  1032.            jz .fail
  1033.  
  1034.            mov ecx,[current_slot]
  1035.            add ecx, APP_OBJ_OFFSET
  1036.  
  1037.            pushfd
  1038.            cli
  1039.            mov edx, [ecx+APPOBJ.fd]
  1040.            mov [eax+APPOBJ.fd], edx
  1041.            mov [eax+APPOBJ.bk], ecx
  1042.            mov [eax+APPOBJ.pid], ebx
  1043.  
  1044.            mov [ecx+APPOBJ.fd], eax
  1045.            mov [edx+APPOBJ.bk], eax
  1046.            popfd
  1047. .fail:
  1048.            ret
  1049.  
  1050. ; param
  1051. ;  eax= object
  1052.  
  1053. align 4
  1054. destroy_kernel_object:
  1055.  
  1056.            pushfd
  1057.            cli
  1058.            mov ebx, [eax+APPOBJ.fd]
  1059.            mov ecx, [eax+APPOBJ.bk]
  1060.            mov [ebx+APPOBJ.bk], ecx
  1061.            mov [ecx+APPOBJ.fd], ebx
  1062.            popfd
  1063.  
  1064.            xor edx, edx        ;clear common header
  1065.            mov [eax], edx
  1066.            mov [eax+4], edx
  1067.            mov [eax+8], edx
  1068.            mov [eax+12], edx
  1069.            mov [eax+16], edx
  1070.  
  1071.            call free           ;release object memory
  1072.            ret
  1073.  
  1074.  
  1075.  
  1076. if 0
  1077.  
  1078. irq:
  1079.  
  1080. .irq0:
  1081.            pusfd
  1082.            pushad
  1083.            push IRQ_0
  1084.            jmp .master
  1085. .irq_1:
  1086.            pusfd
  1087.            pushad
  1088.            push IRQ_1
  1089.            jmp .master
  1090.  
  1091. .master:
  1092.            mov ax, app_data
  1093.            mov ds, eax
  1094.            mov es, eax
  1095.            mov ebx, [esp+4]  ;IRQ_xx
  1096.            mov eax, [irq_handlers+ebx+4]
  1097.            call intr_handler
  1098.            mov ecx, [esp+4]
  1099.            cmp [irq_actids+ecx*4], 0
  1100.            je @F
  1101.            in al, 0x21
  1102.            bts eax, ecx
  1103.            out 0x21, al
  1104.            mov al, 0x20
  1105.            out 0x20, al
  1106.            jmp .restart
  1107.  
  1108. .slave:
  1109.            mov ax, app_data
  1110.            mov ds, eax
  1111.            mov es, eax
  1112.            mov ebx, [esp+4]  ;IRQ_xx
  1113.            mov eax, [irq_handlers+ebx+4]
  1114.            call intr_handler
  1115.            mov ecx, [esp+4]
  1116.            sub ecx, 8
  1117.            cmp [irq_actids+ecx*4], 0
  1118.            je @F
  1119.            in al, 0xA1
  1120.            bts eax, ecx
  1121.            out 0xA1, al
  1122.            mov al, 0x20
  1123.            out 0xA0, al
  1124.            out 0x20, al
  1125. .restart:
  1126.            mov ebx, [next_slot]
  1127.            test ebx, ebx
  1128.            jz @F
  1129.            mov [next_task],0
  1130.            mov esi, [prev_slot]
  1131.            call do_change_task
  1132.            add esp, 4
  1133.            iretd
  1134.  
  1135. end if
  1136.  
  1137.  
  1138.  
  1139.  
  1140.