Subversion Repositories Kolibri OS

Rev

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