Subversion Repositories Kolibri OS

Rev

Rev 420 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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