Subversion Repositories Kolibri OS

Rev

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