Subversion Repositories Kolibri OS

Rev

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