Subversion Repositories Kolibri OS

Rev

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