Subversion Repositories Kolibri OS

Rev

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