Subversion Repositories Kolibri OS

Rev

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