forked from KolibriOS/kolibrios
new irq handling
git-svn-id: svn://kolibrios.org@2050 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
416dc8b600
commit
4e1ac7b0d6
@ -575,17 +575,6 @@ proc attach_int_handler_ex stdcall, irq:dword, handler:dword, user_data:dword
|
|||||||
mov [ecx+IRQH.handler], edx
|
mov [ecx+IRQH.handler], edx
|
||||||
mov [ecx+IRQH.data], eax
|
mov [ecx+IRQH.data], eax
|
||||||
|
|
||||||
mov eax, [irqh_set]
|
|
||||||
bt [pci_irq_set], ebx ;check irq type
|
|
||||||
jc .pci_irq
|
|
||||||
|
|
||||||
.isa_irq:
|
|
||||||
bts eax, ebx ;check for installed handler
|
|
||||||
jc .fail
|
|
||||||
|
|
||||||
.set_handler:
|
|
||||||
mov [irqh_set], eax
|
|
||||||
|
|
||||||
lea edx, [irqh_tab+ebx*8]
|
lea edx, [irqh_tab+ebx*8]
|
||||||
list_add_tail ecx, edx ;clobber eax
|
list_add_tail ecx, edx ;clobber eax
|
||||||
|
|
||||||
@ -598,9 +587,4 @@ proc attach_int_handler_ex stdcall, irq:dword, handler:dword, user_data:dword
|
|||||||
mov eax, [.irqh]
|
mov eax, [.irqh]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.pci_irq:
|
|
||||||
bts ecx, ebx ;check for installed handler
|
|
||||||
jmp .set_handler
|
|
||||||
|
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
@ -14,49 +14,6 @@ DRV_CURRENT equ 5 ;current drivers model version
|
|||||||
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
|
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
|
||||||
PID_KERNEL equ 1 ;os_idle thread
|
PID_KERNEL equ 1 ;os_idle thread
|
||||||
|
|
||||||
align 4
|
|
||||||
proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword
|
|
||||||
|
|
||||||
pushfd
|
|
||||||
cli
|
|
||||||
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov ebx, [irq] ;irq num
|
|
||||||
test ebx, ebx
|
|
||||||
jz .err
|
|
||||||
cmp ebx, [IRQ_COUNT] ; hidnplayr says: we only have 16 IRQ's
|
|
||||||
; Ghost says: we can have more...
|
|
||||||
jae .err
|
|
||||||
mov eax, [handler]
|
|
||||||
test eax, eax
|
|
||||||
jz .err
|
|
||||||
cmp [irq_owner + 4 * ebx], 0
|
|
||||||
je @f
|
|
||||||
|
|
||||||
mov ecx, [irq_rights + 4 * ebx] ; Rights : 0 - full access, 1 - read only, 2 - forbidden
|
|
||||||
test ecx, ecx
|
|
||||||
jnz .err
|
|
||||||
|
|
||||||
@@:
|
|
||||||
mov [irq_tab+ebx*4], eax
|
|
||||||
|
|
||||||
mov eax, [access_rights]
|
|
||||||
mov [irq_rights + 4 * ebx], eax
|
|
||||||
|
|
||||||
mov [irq_owner + 4 * ebx], PID_KERNEL ; all handlers belong to a kernel
|
|
||||||
|
|
||||||
stdcall enable_irq, [irq]
|
|
||||||
pop ebx
|
|
||||||
mov eax, 1
|
|
||||||
popfd
|
|
||||||
ret
|
|
||||||
.err:
|
|
||||||
pop ebx
|
|
||||||
xor eax, eax
|
|
||||||
popfd
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
uglobal
|
uglobal
|
||||||
|
|
||||||
@ -115,43 +72,71 @@ end if
|
|||||||
align 16
|
align 16
|
||||||
.main:
|
.main:
|
||||||
save_ring3_context
|
save_ring3_context
|
||||||
mov eax, [esp + 32]
|
mov ebp, [esp + 32]
|
||||||
mov bx, app_data ;os_data
|
mov bx, app_data ;os_data
|
||||||
mov ds, bx
|
mov ds, bx
|
||||||
mov es, bx
|
mov es, bx
|
||||||
|
|
||||||
cmp [v86_irqhooks+eax*8], 0
|
cmp [v86_irqhooks+ebp*8], 0
|
||||||
jnz v86_irq
|
jnz v86_irq
|
||||||
|
|
||||||
cmp al, 6
|
cmp bp, 6
|
||||||
jnz @f
|
jnz @f
|
||||||
push eax
|
push ebp
|
||||||
call [fdc_irq_func]
|
call [fdc_irq_func]
|
||||||
pop eax
|
pop ebp
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
cmp al, 14
|
cmp bp, 14
|
||||||
jnz @f
|
jnz @f
|
||||||
push eax
|
push ebp
|
||||||
call [irq14_func]
|
call [irq14_func]
|
||||||
pop eax
|
pop ebp
|
||||||
@@:
|
@@:
|
||||||
cmp al, 15
|
cmp bp, 15
|
||||||
jnz @f
|
jnz @f
|
||||||
push eax
|
push ebp
|
||||||
call [irq15_func]
|
call [irq15_func]
|
||||||
pop eax
|
pop ebp
|
||||||
@@:
|
@@:
|
||||||
|
bts [pending_irq_set], ebp
|
||||||
|
|
||||||
mov ebx, [irq_tab+eax*4]
|
lea esi, [irqh_tab+ebp*8] ; esi= list head
|
||||||
test ebx, ebx
|
mov ebx, esi
|
||||||
jz .exit
|
.next:
|
||||||
|
mov ebx, [ebx+IRQH.list.next] ; ebx= irqh pointer
|
||||||
|
cmp ebx, esi
|
||||||
|
je .done
|
||||||
|
|
||||||
call ebx
|
push ebx ; FIX THIS
|
||||||
mov [check_idle_semaphore],5
|
push edi
|
||||||
|
push esi
|
||||||
|
|
||||||
.exit: mov eax, [esp + 32]
|
push [ebx+IRQH.data]
|
||||||
call IRQ_EOI
|
call [ebx+IRQH.handler]
|
||||||
|
add esp, 4
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
pop edi
|
||||||
|
pop ebx
|
||||||
|
|
||||||
|
test eax, eax
|
||||||
|
jz .next
|
||||||
|
|
||||||
|
btr [pending_irq_set], ebp
|
||||||
|
jmp .next
|
||||||
|
|
||||||
|
.done:
|
||||||
|
btr [pending_irq_set], ebp
|
||||||
|
jnc .exit
|
||||||
|
|
||||||
|
inc [bogus_irq+ebp*4]
|
||||||
|
.exit:
|
||||||
|
mov [check_idle_semaphore],5
|
||||||
|
|
||||||
|
mov eax, ebp
|
||||||
|
|
||||||
|
call IRQ_EOI
|
||||||
restore_ring3_context
|
restore_ring3_context
|
||||||
add esp, 4
|
add esp, 4
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ kernel_export:
|
|||||||
dd szRegService , reg_service
|
dd szRegService , reg_service
|
||||||
dd szGetService , get_service
|
dd szGetService , get_service
|
||||||
dd szServiceHandler , srv_handler
|
dd szServiceHandler , srv_handler
|
||||||
dd szAttachIntHandler, attach_int_handler
|
dd szAttachIntHandler, attach_int_handler_ex
|
||||||
dd szGetIntHandler , get_int_handler
|
dd szGetIntHandler , get_int_handler
|
||||||
dd szFpuSave , fpu_save
|
dd szFpuSave , fpu_save
|
||||||
dd szFpuRestore , fpu_restore
|
dd szFpuRestore , fpu_restore
|
||||||
|
@ -316,7 +316,7 @@ __exports:
|
|||||||
\
|
\
|
||||||
get_service, 'GetService', \ ;
|
get_service, 'GetService', \ ;
|
||||||
reg_service, 'RegService', \ ; stdcall
|
reg_service, 'RegService', \ ; stdcall
|
||||||
attach_int_handler, 'AttachIntHandler', \ ; stdcall
|
attach_int_handler_ex, 'AttachIntHandler', \ ; stdcall
|
||||||
user_alloc, 'UserAlloc', \ ; stdcall
|
user_alloc, 'UserAlloc', \ ; stdcall
|
||||||
user_free, 'UserFree', \ ; stdcall
|
user_free, 'UserFree', \ ; stdcall
|
||||||
unmap_pages, 'UnmapPages', \ ; eax, ecx
|
unmap_pages, 'UnmapPages', \ ; eax, ecx
|
||||||
|
@ -262,25 +262,29 @@ endofcode:
|
|||||||
gdte:
|
gdte:
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
cur_saved_data rb 4096
|
cur_saved_data rb 4096
|
||||||
fpu_data: rb 512
|
fpu_data: rb 512
|
||||||
|
|
||||||
; device irq owners
|
; device irq owners
|
||||||
irq_owner rd IRQ_RESERVE ; process id
|
irq_owner rd IRQ_RESERVE ; process id
|
||||||
; on irq read ports
|
; on irq read ports
|
||||||
irq00read rd 16 * IRQ_RESERVE
|
irq00read rd 16 * IRQ_RESERVE
|
||||||
irq_tab rd IRQ_RESERVE
|
irq_tab rd IRQ_RESERVE
|
||||||
|
|
||||||
irqh_tab rd LHEAD.sizeof * IRQ_RESERVE / 4
|
irqh_tab rd LHEAD.sizeof * IRQ_RESERVE / 4
|
||||||
|
|
||||||
irqh_array rd IRQH.sizeof *48 /4
|
irqh_array rd IRQH.sizeof *48 /4
|
||||||
next_irqh rd 1
|
bogus_irq rd IRQ_RESERVE
|
||||||
|
next_irqh rd 1
|
||||||
|
pending_irq_set rd 1
|
||||||
|
|
||||||
mem_block_map rb 512
|
align 16
|
||||||
mem_block_list rd 64
|
|
||||||
large_block_list rd 31
|
mem_block_map rb 512
|
||||||
mem_block_mask rd 2
|
mem_block_list rd 64
|
||||||
large_block_mask rd 1
|
large_block_list rd 31
|
||||||
|
mem_block_mask rd 2
|
||||||
|
large_block_mask rd 1
|
||||||
|
|
||||||
mem_used.fd rd 1
|
mem_used.fd rd 1
|
||||||
mem_used.bk rd 1
|
mem_used.bk rd 1
|
||||||
@ -306,9 +310,6 @@ os_stack_seg rd 1
|
|||||||
srv.fd rd 1
|
srv.fd rd 1
|
||||||
srv.bk rd 1
|
srv.bk rd 1
|
||||||
|
|
||||||
irqh_set rd 1
|
|
||||||
pci_irq_set rd 1
|
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
|
|
||||||
_display display_t
|
_display display_t
|
||||||
|
@ -992,33 +992,11 @@ if preboot_blogesc
|
|||||||
jne .bll1
|
jne .bll1
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
cli ;guarantee forbidance of interrupts.
|
||||||
; UNMASK ALL IRQ'S
|
stdcall enable_irq, 2 ; @#$%! PIC
|
||||||
|
stdcall enable_irq, 6 ; FDD
|
||||||
; mov esi,boot_allirqs
|
stdcall enable_irq, 13 ; co-processor
|
||||||
; call boot_log
|
|
||||||
;
|
|
||||||
; cli ;guarantee forbidance of interrupts.
|
|
||||||
; mov al,0 ; unmask all irq's
|
|
||||||
; out 0xA1,al
|
|
||||||
; out 0x21,al
|
|
||||||
;
|
|
||||||
; mov ecx,32
|
|
||||||
;
|
|
||||||
; ready_for_irqs:
|
|
||||||
;
|
|
||||||
; mov al,0x20 ; ready for irqs
|
|
||||||
; out 0x20,al
|
|
||||||
; out 0xa0,al
|
|
||||||
;
|
|
||||||
; loop ready_for_irqs ; flush the queue
|
|
||||||
cli ;guarantee forbidance of interrupts.
|
|
||||||
stdcall enable_irq, 2 ; @#$%! PIC
|
|
||||||
stdcall enable_irq, 6 ; FDD
|
|
||||||
stdcall enable_irq, 13 ; co-processor
|
|
||||||
|
|
||||||
stdcall attach_int_handler_ex, 1, irq1, 0
|
stdcall attach_int_handler_ex, 1, irq1, 0
|
||||||
; mov [dma_hdd],1
|
|
||||||
cmp [IDEContrRegsBaseAddr], 0
|
cmp [IDEContrRegsBaseAddr], 0
|
||||||
setnz [dma_hdd]
|
setnz [dma_hdd]
|
||||||
mov [timer_ticks_enable],1 ; for cd driver
|
mov [timer_ticks_enable],1 ; for cd driver
|
||||||
@ -3789,7 +3767,7 @@ reserve_free_irq:
|
|||||||
|
|
||||||
mov ebx, [f_irqs + 4 * eax]
|
mov ebx, [f_irqs + 4 * eax]
|
||||||
|
|
||||||
stdcall attach_int_handler, eax, ebx, dword 0
|
stdcall attach_int_handler_ex, eax, ebx, dword 0
|
||||||
|
|
||||||
mov [ecx], edi
|
mov [ecx], edi
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user