Subversion Repositories Kolibri OS

Rev

Rev 840 | Rev 886 | 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: 864 $
  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 ecx, [file_size]
  589.            cmp ecx, 1024*1024*16
  590.            ja .fail
  591.  
  592.            mov edx, PG_SW
  593.            call @mem_alloc@8
  594.            mov [file], eax
  595.            test eax, eax
  596.            jz .fail
  597.  
  598.            stdcall read_file, [file_name], eax, dword 0, [file_size]
  599.            cmp ebx, [file_size]
  600.            jne .cleanup
  601.  
  602.            mov eax, [file]
  603.            cmp dword [eax], 0x4B43504B
  604.            jne .exit
  605.  
  606.            mov ecx, [eax+4]
  607.            mov [file_size], ecx
  608.            mov edx, PG_SW
  609.            call @mem_alloc@8
  610.            test eax, eax
  611.            jz .cleanup
  612.  
  613.            mov [file2], eax
  614.            stdcall unpack, [file], eax
  615.            stdcall kernel_free, [file]
  616.            mov eax, [file2]
  617.            mov ebx, [file_size]
  618. .exit:
  619.            push eax
  620.            lea edi, [eax+ebx]     ;cleanup remain space
  621.            mov ecx, 4096          ;from file end
  622.            and ebx, 4095
  623.            jz  @f
  624.            sub ecx, ebx
  625.            xor eax, eax
  626.            cld
  627.            rep stosb
  628. @@:
  629.            mov ebx, [file_size]
  630.            pop eax
  631.            pop edi
  632.            pop esi
  633.            ret
  634. .cleanup:
  635.            stdcall kernel_free, [file]
  636. .fail:
  637.            xor eax, eax
  638.            xor ebx, ebx
  639.            pop edi
  640.            pop esi
  641.            ret
  642. endp
  643.  
  644. align 4
  645. proc get_proc_ex stdcall, proc_name:dword, imports:dword
  646.  
  647. .look_up:
  648.            mov edx, [imports]
  649.            test edx, edx
  650.            jz .end
  651.            mov edx, [edx]
  652.            test edx, edx
  653.            jz .end
  654. .next:
  655.            mov eax, [edx]
  656.            test eax, eax
  657.            jz .next_table
  658.  
  659.            push edx
  660.            stdcall strncmp, eax, [proc_name], 16
  661.            pop edx
  662.            test eax, eax
  663.            jz .ok
  664.  
  665.            add edx,8
  666.            jmp .next
  667. .next_table:
  668.            add [imports], 4
  669.            jmp .look_up
  670. .ok:
  671.            mov eax, [edx+4]
  672.            ret
  673. .end:
  674.            xor eax, eax
  675.            ret
  676. endp
  677.  
  678. align 4
  679. proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
  680.                       sym_count:dword, strings:dword, imports:dword
  681.            locals
  682.              retval dd ?
  683.            endl
  684.  
  685.            mov edi, [symbols]
  686.            mov [retval], 1
  687. .fix:
  688.            movzx ebx, [edi+CSYM.SectionNumber]
  689.            test ebx, ebx
  690.            jnz .internal
  691.            mov eax, dword [edi+CSYM.Name]
  692.            test eax, eax
  693.            jnz @F
  694.  
  695.            mov edi, [edi+4]
  696.            add edi, [strings]
  697. @@:
  698.            push edi
  699.            stdcall get_proc_ex, edi,[imports]
  700.            pop edi
  701.  
  702.            xor ebx, ebx
  703.            test eax, eax
  704.            jnz @F
  705.  
  706.            mov esi, msg_unresolved
  707.            call sys_msg_board_str
  708.            mov esi, edi
  709.            call sys_msg_board_str
  710.            mov esi, msg_CR
  711.            call sys_msg_board_str
  712.  
  713.            mov [retval],0
  714. @@:
  715.            mov edi, [symbols]
  716.            mov [edi+CSYM.Value], eax
  717.            jmp .next
  718. .internal:
  719.            cmp bx, -1
  720.            je .next
  721.            cmp bx, -2
  722.            je .next
  723.  
  724.            dec ebx
  725.            shl ebx, 3
  726.            lea ebx, [ebx+ebx*4]
  727.            add ebx, [sec]
  728.  
  729.            mov eax, [ebx+CFS.VirtualAddress]
  730.            add [edi+CSYM.Value], eax
  731. .next:
  732.            add edi, CSYM_SIZE
  733.            mov [symbols], edi
  734.            dec [sym_count]
  735.            jnz .fix
  736.            mov eax, [retval]
  737.            ret
  738. endp
  739.  
  740. align 4
  741. proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
  742.            locals
  743.              n_sec     dd ?
  744.            endl
  745.  
  746.            mov eax, [coff]
  747.            movzx ebx, [eax+CFH.nSections]
  748.            mov [n_sec], ebx
  749. .fix_sec:
  750.            mov esi, [sec]
  751.            mov edi, [esi+CFS.PtrReloc]
  752.            add edi, [coff]
  753.  
  754.            movzx ecx, [esi+CFS.NumReloc]
  755.            test ecx, ecx
  756.            jz .next
  757. .next_reloc:
  758.            mov ebx, [edi+CRELOC.SymIndex]
  759.            add ebx,ebx
  760.            lea ebx,[ebx+ebx*8]
  761.            add ebx, [sym]
  762.  
  763.            mov edx, [ebx+CSYM.Value]
  764.  
  765.            cmp [edi+CRELOC.Type], 6
  766.            je .dir_32
  767.  
  768.            cmp [edi+CRELOC.Type], 20
  769.            jne .next_reloc
  770. .rel_32:
  771.            mov eax, [edi+CRELOC.VirtualAddress]
  772.            add eax, [esi+CFS.VirtualAddress]
  773.            sub edx, eax
  774.            sub edx, 4
  775.            jmp .fix
  776. .dir_32:
  777.            mov eax, [edi+CRELOC.VirtualAddress]
  778.            add eax, [esi+CFS.VirtualAddress]
  779. .fix:
  780.            add [eax], edx
  781.            add edi, 10
  782.            dec ecx
  783.            jnz .next_reloc
  784. .next:
  785.            add [sec], COFF_SECTION_SIZE
  786.            dec [n_sec]
  787.            jnz .fix_sec
  788. .exit:
  789.            ret
  790. endp
  791.  
  792. align 4
  793. proc load_driver stdcall, driver_name:dword
  794.            locals
  795.              coff      dd ?
  796.              sym       dd ?
  797.              strings   dd ?
  798.              img_size  dd ?
  799.              img_base  dd ?
  800.              start     dd ?
  801.  
  802.              exports   dd ?   ;fake exports table
  803.                        dd ?
  804.              file_name rb 13+16+4+1      ; '/sys/drivers/<up-to-16-chars>.obj'
  805.            endl
  806.  
  807.            lea     edx, [file_name]
  808.            mov     dword [edx], '/sys'
  809.            mov     dword [edx+4], '/dri'
  810.            mov     dword [edx+8], 'vers'
  811.            mov     byte [edx+12], '/'
  812.            mov     esi, [driver_name]
  813.            lea     edi, [edx+13]
  814.            mov     ecx, 16
  815. @@:
  816.            lodsb
  817.            test    al, al
  818.            jz      @f
  819.            stosb
  820.            loop    @b
  821. @@:
  822.            mov     dword [edi], '.obj'
  823.            mov     byte [edi+4], 0
  824.            stdcall load_file, edx
  825.  
  826.            test eax, eax
  827.            jz .exit
  828.  
  829.            mov [coff], eax
  830.  
  831.            movzx ebx, [eax+CFH.nSections]
  832.            lea edx, [eax+20]
  833.            xor ecx, ecx
  834. @@:
  835.            add ecx, [edx+CFS.SizeOfRawData]
  836.            add ecx, 15
  837.            and ecx, not 15
  838.            add edx, COFF_SECTION_SIZE
  839.            dec ebx
  840.            jnz @B
  841.  
  842.            mov [img_size], ecx
  843.            mov edx, PG_SW
  844.            call @mem_alloc@8
  845.            test eax, eax
  846.            jz .fail
  847.            mov [img_base], eax
  848.  
  849.            mov edi, eax
  850.            xor eax, eax
  851.            mov ecx, [img_size]
  852.            add ecx, 4095
  853.            and ecx, not 4095
  854.            shr ecx, 2
  855.            cld
  856.            rep stosd
  857.  
  858.            mov edx, [coff]
  859.            movzx ebx, [edx+CFH.nSections]
  860.            mov edi, [img_base]
  861.            lea eax, [edx+20]
  862. @@:
  863.            mov [eax+CFS.VirtualAddress], edi
  864.            mov esi, [eax+CFS.PtrRawData]
  865.            test esi, esi
  866.            jnz .copy
  867.            add edi, [eax+CFS.SizeOfRawData]
  868.            jmp .next
  869. .copy:
  870.            add esi, edx
  871.            mov ecx, [eax+CFS.SizeOfRawData]
  872.            cld
  873.            rep movsb
  874. .next:
  875.            add edi, 15
  876.            and edi, not 15
  877.            add eax, COFF_SECTION_SIZE
  878.            dec ebx
  879.            jnz @B
  880.  
  881.            mov ebx, [edx+CFH.pSymTable]
  882.            add ebx, edx
  883.            mov [sym], ebx
  884.            mov ecx, [edx+CFH.nSymbols]
  885.            add ecx,ecx
  886.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  887.            add ecx, [sym]
  888.            mov [strings], ecx
  889.  
  890.            lea ebx, [exports]
  891.            mov dword [ebx], kernel_export
  892.            mov dword [ebx+4], 0
  893.            lea eax, [edx+20]
  894.  
  895.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  896.                                      [strings], ebx
  897.            test eax, eax
  898.            jz .link_fail
  899.  
  900.            mov ebx, [coff]
  901.            add ebx, 20
  902.            stdcall fix_coff_relocs, [coff], ebx, [sym]
  903.  
  904.            mov ebx, [coff]
  905.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
  906.            test eax, eax
  907.            jz .link_fail
  908.  
  909.            mov eax, [eax]
  910.            shr eax, 16
  911.            cmp eax, DRV_COMPAT
  912.            jb .ver_fail
  913.  
  914.            cmp eax, DRV_CURRENT
  915.            ja .ver_fail
  916.  
  917.            mov ebx, [coff]
  918.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
  919.            mov [start], eax
  920.  
  921.            stdcall kernel_free, [coff]
  922.  
  923.            mov ebx, [start]
  924.            stdcall ebx, DRV_ENTRY
  925.            test eax, eax
  926.            jnz .ok
  927.  
  928.            stdcall kernel_free, [img_base]
  929.            xor eax, eax
  930.            ret
  931. .ok:
  932.            mov ebx, [img_base]
  933.            mov [eax+SRV.base], ebx
  934.            mov ecx, [start]
  935.            mov [eax+SRV.entry], ecx
  936.            ret
  937.  
  938. .ver_fail:
  939.            mov esi, msg_CR
  940.            call sys_msg_board_str
  941.            mov esi, [driver_name]
  942.            call sys_msg_board_str
  943.            mov esi, msg_CR
  944.            call sys_msg_board_str
  945.            mov esi, msg_version
  946.            call sys_msg_board_str
  947.            mov esi, msg_www
  948.            call sys_msg_board_str
  949.            jmp .cleanup
  950.  
  951. .link_fail:
  952.            mov esi, msg_module
  953.            call sys_msg_board_str
  954.            mov esi, [driver_name]
  955.            call sys_msg_board_str
  956.            mov esi, msg_CR
  957.            call sys_msg_board_str
  958. .cleanup:
  959.            stdcall kernel_free,[img_base]
  960. .fail:
  961.            stdcall kernel_free, [coff]
  962. .exit:
  963.            xor eax, eax
  964.            ret
  965. endp
  966.  
  967. align 4
  968. proc load_library stdcall, file_name:dword
  969.            locals
  970.              coff      dd ?
  971.              sym       dd ?
  972.              strings   dd ?
  973.              img_size  dd ?
  974.              img_base  dd ?
  975.              exports   dd ?
  976.            endl
  977.  
  978.            cli
  979.  
  980.            stdcall load_file, [file_name]
  981.            test eax, eax
  982.            jz .fail
  983.  
  984.            mov [coff], eax
  985.            movzx ecx, [eax+CFH.nSections]
  986.            xor ebx, ebx
  987.  
  988.            lea edx, [eax+20]
  989. @@:
  990.            add ebx, [edx+CFS.SizeOfRawData]
  991.            add ebx, 15
  992.            and ebx, not 15
  993.            add edx, COFF_SECTION_SIZE
  994.            dec ecx
  995.            jnz @B
  996.            mov [img_size], ebx
  997.  
  998.            call init_heap
  999.            stdcall user_alloc, [img_size]
  1000.  
  1001.            test eax, eax
  1002.            jz .fail
  1003.            mov [img_base], eax
  1004.  
  1005.            mov edx, [coff]
  1006.            movzx ebx, [edx+CFH.nSections]
  1007.            mov edi, [img_base]
  1008.            lea eax, [edx+20]
  1009. @@:
  1010.            mov [eax+CFS.VirtualAddress], edi
  1011.            mov esi, [eax+CFS.PtrRawData]
  1012.            test esi, esi
  1013.            jnz .copy
  1014.            add edi, [eax+CFS.SizeOfRawData]
  1015.            jmp .next
  1016. .copy:
  1017.            add esi, edx
  1018.     ;       add edi, new_app_base
  1019.            mov ecx, [eax+CFS.SizeOfRawData]
  1020.            cld
  1021.            rep movsb
  1022. .next:
  1023.            add edi, 15 ;-new_app_base
  1024.            and edi, -16
  1025.            add eax, COFF_SECTION_SIZE
  1026.            dec ebx
  1027.            jnz @B
  1028.  
  1029.            mov ebx, [edx+CFH.pSymTable]
  1030.            add ebx, edx
  1031.            mov [sym], ebx
  1032.            mov ecx, [edx+CFH.nSymbols]
  1033.            add ecx,ecx
  1034.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  1035.            add ecx, [sym]
  1036.            mov [strings], ecx
  1037.  
  1038.            lea eax, [edx+20]
  1039.  
  1040.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  1041.                                      [strings], dword 0
  1042.            test eax, eax
  1043.            jnz @F
  1044.  
  1045. @@:
  1046.            mov edx, [coff]
  1047.  
  1048. ;           movzx ebx, [edx+CFH.nSections]
  1049. ;           xor edi, edi
  1050. ;           lea eax, [edx+20]
  1051. ;@@:
  1052. ;           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
  1053. ;           add eax, COFF_SECTION_SIZE
  1054. ;           dec ebx
  1055. ;           jnz @B
  1056.  
  1057.            add edx, 20
  1058.            stdcall fix_coff_relocs, [coff], edx, [sym]
  1059.  
  1060.            mov ebx, [coff]
  1061.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
  1062.            mov [exports], eax
  1063.  
  1064.            stdcall kernel_free, [coff]
  1065.            mov eax, [exports]
  1066.            ret
  1067. .fail:
  1068.            xor eax, eax
  1069.            ret
  1070. endp
  1071.  
  1072. align 4
  1073. proc stop_all_services
  1074.  
  1075.            mov edx, [srv.fd]
  1076. .next:
  1077.            cmp edx,  srv.fd-SRV_FD_OFFSET
  1078.            je .done
  1079.            cmp [edx+SRV.magic], ' SRV'
  1080.            jne .next
  1081.            cmp [edx+SRV.size], SRV_SIZE
  1082.            jne .next
  1083.  
  1084.            mov ebx, [edx+SRV.entry]
  1085.            mov edx, [edx+SRV.fd]
  1086.            test ebx, ebx
  1087.            jz .next
  1088.  
  1089.            push edx
  1090.            stdcall ebx, dword -1
  1091.            pop edx
  1092.            jmp .next
  1093. .done:
  1094.            ret
  1095. endp
  1096.  
  1097. ; param
  1098. ;  eax= size
  1099. ;  ebx= pid
  1100.  
  1101. align 4
  1102. create_kernel_object:
  1103.  
  1104.            push ebx
  1105.            call malloc
  1106.            pop ebx
  1107.            test eax, eax
  1108.            jz .fail
  1109.  
  1110.            mov ecx,[current_slot]
  1111.            add ecx, APP_OBJ_OFFSET
  1112.  
  1113.            pushfd
  1114.            cli
  1115.            mov edx, [ecx+APPOBJ.fd]
  1116.            mov [eax+APPOBJ.fd], edx
  1117.            mov [eax+APPOBJ.bk], ecx
  1118.            mov [eax+APPOBJ.pid], ebx
  1119.  
  1120.            mov [ecx+APPOBJ.fd], eax
  1121.            mov [edx+APPOBJ.bk], eax
  1122.            popfd
  1123. .fail:
  1124.            ret
  1125.  
  1126. ; param
  1127. ;  eax= object
  1128.  
  1129. align 4
  1130. destroy_kernel_object:
  1131.  
  1132.            pushfd
  1133.            cli
  1134.            mov ebx, [eax+APPOBJ.fd]
  1135.            mov ecx, [eax+APPOBJ.bk]
  1136.            mov [ebx+APPOBJ.bk], ecx
  1137.            mov [ecx+APPOBJ.fd], ebx
  1138.            popfd
  1139.  
  1140.            xor edx, edx        ;clear common header
  1141.            mov [eax], edx
  1142.            mov [eax+4], edx
  1143.            mov [eax+8], edx
  1144.            mov [eax+12], edx
  1145.            mov [eax+16], edx
  1146.  
  1147.            call free           ;release object memory
  1148.            ret
  1149.  
  1150.  
  1151.  
  1152. if 0
  1153.  
  1154. irq:
  1155.  
  1156. .irq0:
  1157.            pusfd
  1158.            pushad
  1159.            push IRQ_0
  1160.            jmp .master
  1161. .irq_1:
  1162.            pusfd
  1163.            pushad
  1164.            push IRQ_1
  1165.            jmp .master
  1166.  
  1167. .master:
  1168.            mov ax, app_data
  1169.            mov ds, eax
  1170.            mov es, eax
  1171.            mov ebx, [esp+4]  ;IRQ_xx
  1172.            mov eax, [irq_handlers+ebx+4]
  1173.            call intr_handler
  1174.            mov ecx, [esp+4]
  1175.            cmp [irq_actids+ecx*4], 0
  1176.            je @F
  1177.            in al, 0x21
  1178.            bts eax, ecx
  1179.            out 0x21, al
  1180.            mov al, 0x20
  1181.            out 0x20, al
  1182.            jmp .restart
  1183.  
  1184. .slave:
  1185.            mov ax, app_data
  1186.            mov ds, eax
  1187.            mov es, eax
  1188.            mov ebx, [esp+4]  ;IRQ_xx
  1189.            mov eax, [irq_handlers+ebx+4]
  1190.            call intr_handler
  1191.            mov ecx, [esp+4]
  1192.            sub ecx, 8
  1193.            cmp [irq_actids+ecx*4], 0
  1194.            je @F
  1195.            in al, 0xA1
  1196.            bts eax, ecx
  1197.            out 0xA1, al
  1198.            mov al, 0x20
  1199.            out 0xA0, al
  1200.            out 0x20, al
  1201. .restart:
  1202.            mov ebx, [next_slot]
  1203.            test ebx, ebx
  1204.            jz @F
  1205.            mov [next_task],0
  1206.            mov esi, [prev_slot]
  1207.            call do_change_task
  1208.            add esp, 4
  1209.            iretd
  1210.  
  1211. end if
  1212.  
  1213.  
  1214.  
  1215.  
  1216.