Subversion Repositories Kolibri OS

Rev

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