Subversion Repositories Kolibri OS

Rev

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