Subversion Repositories Kolibri OS

Rev

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

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