APIC patch from Ghost. Not tested.

git-svn-id: svn://kolibrios.org@1638 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2010-10-01 20:49:29 +00:00
parent 647985aea3
commit 1e30c8e1c2
9 changed files with 641 additions and 310 deletions

View File

@ -203,9 +203,6 @@ WIN_STACK equ (OS_BASE+0x000C000)
WIN_POS equ (OS_BASE+0x000C400) WIN_POS equ (OS_BASE+0x000C400)
FDD_BUFF equ (OS_BASE+0x000D000) FDD_BUFF equ (OS_BASE+0x000D000)
;unused ? only one reference
ENABLE_TASKSWITCH equ (OS_BASE+0x000E000)
PUTPIXEL equ (OS_BASE+0x000E020) PUTPIXEL equ (OS_BASE+0x000E020)
GETPIXEL equ (OS_BASE+0x000E024) GETPIXEL equ (OS_BASE+0x000E024)

View File

@ -0,0 +1,487 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2007-2008. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IRQ_RESERVE = 24 ; 16 or 24
iglobal
IRQ_COUNT dd 16
endg
uglobal
APIC: dd 0
LAPIC_BASE: dd 0
IOAPIC_base: dd 0
endg
APIC_ID equ 0x20
APIC_TPR equ 0x80
APIC_EOI equ 0xb0
APIC_LDR equ 0xd0
APIC_DFR equ 0xe0
APIC_SVR equ 0xf0
APIC_ISR equ 0x100
APIC_ESR equ 0x280
APIC_ICRL equ 0x300
APIC_ICRH equ 0x310
APIC_LVT_LINT0 equ 0x350
APIC_LVT_LINT1 equ 0x360
APIC_LVT_err equ 0x370
; APIC timer
APIC_LVT_timer equ 0x320
APIC_timer_div equ 0x3e0
APIC_timer_init equ 0x380
APIC_timer_cur equ 0x390
; IOAPIC
IOAPIC_ID equ 0x0
IOAPIC_VER equ 0x1
IOAPIC_ARB equ 0x2
IOAPIC_REDTBL equ 0x10
APIC_init:
mov dword[APIC], 0
; jmp .no_apic ; NO APIC
bt [cpu_caps], CAPS_APIC
jnc .no_apic
; Check for MP table
;.....
call IRQ_mask_all
; IOAPIC init
; 0xfec00000 - may be relocated, see chip reference... & MP table
stdcall map_io_mem, 0xfec00000, 0x20, PG_SW
mov [IOAPIC_base], eax
mov eax, IOAPIC_VER
call IOAPIC_read
shr eax, 16
inc al
movzx eax, al
cmp al, IRQ_RESERVE
jbe @f
mov al, IRQ_RESERVE
@@: mov [IRQ_COUNT], eax
; Reroute IOAPIC & mask all interrupts
xor ecx, ecx
mov eax, IOAPIC_REDTBL
@@: mov ebx, eax
call IOAPIC_read
mov ah, 0x09 ; Delivery Mode: Lowest Priority, Destination Mode: Logical
mov al, cl
add al, 0x20 ; vector
or eax, 0x10000 ; Mask Interrupt
cmp ecx, 16
jb .set
or eax, 0xa000 ;<<< level-triggered active-low for IRQ16+
.set:
xchg eax, ebx
call IOAPIC_write
inc eax
mov ebx, eax
call IOAPIC_read
or eax, 0xff000000 ; Destination Field
xchg eax, ebx
call IOAPIC_write
inc eax
inc ecx
cmp ecx, [IRQ_COUNT]
jb @b
call LAPIC_init
mov dword[APIC], 0xffffffff
; mov dword[irq_type_to_set], IRQ_TYPE_APIC
.no_apic:
ret
;===========================================================
align 4
LAPIC_init:
; Check MSR support
;....
; Get LAPIC base address
mov ecx, 0x1b
rdmsr ; it may be replaced to
and ax, 0xf000 ; mov eax, 0xfee00000
stdcall map_io_mem, eax, 0x1000, PG_SW
mov [LAPIC_BASE], eax
mov esi, eax
; Program Destination Format Register for Flat mode.
mov eax, [esi + APIC_DFR]
or eax, 0xf0000000
mov [esi + APIC_DFR], eax
; Program Logical Destination Register.
mov eax, [esi + APIC_LDR]
;and eax, 0xff000000
and eax, 0x00ffffff
or eax, 0x01000000 ;!!!!!!!!!!!!
mov [esi + APIC_LDR], eax
; Task Priority Register initialization.
mov eax, [esi + APIC_TPR]
and eax, 0xffffff00
mov [esi + APIC_TPR], eax
; Flush the queue
mov edx, 0
.nxt2: mov ecx, 32
mov eax, [esi + APIC_ISR + edx]
.nxt: shr eax, 1
jnc @f
mov dword [esi + APIC_EOI], 0 ; EOI
@@: loop .nxt
add edx, 0x10
cmp edx, 0x170
jbe .nxt2
; Spurious-Interrupt Vector Register initialization.
mov eax, [esi + APIC_SVR]
or eax, 0x1ff
and eax, 0xfffffdff
mov [esi + APIC_SVR], eax
; Initialize LVT LINT0 register. (INTR)
mov eax, 0x00700
; mov eax, 0x10700
mov [esi + APIC_LVT_LINT0], eax
; Initialize LVT LINT1 register. (NMI)
mov eax, 0x00400
mov [esi + APIC_LVT_LINT1], eax
; Initialize LVT Error register.
mov eax, [esi + APIC_LVT_err]
or eax, 0x10000 ; bit 16
mov [esi + APIC_LVT_err], eax
; LAPIC timer
; pre init
mov dword[esi + APIC_timer_div], 1011b ; 1
mov dword[esi + APIC_timer_init], 0xffffffff ; max val
push esi
mov esi, 640 ; wait 0.64 sec
call delay_ms
pop esi
mov eax, [esi + APIC_timer_cur] ; read current tick couner
xor eax, 0xffffffff ; eax = 0xffffffff - eax
shr eax, 6 ; eax /= 64; APIC ticks per 0.01 sec
; Start (every 0.01 sec)
mov dword[esi + APIC_LVT_timer], 0x30020 ; periodic int 0x20
mov dword[esi + APIC_timer_init], eax
ret
;===========================================================
; IOAPIC implementation
align 4
IOAPIC_read:
; in : EAX - IOAPIC register
; out: EAX - readed value
push esi
mov esi, [IOAPIC_base]
mov [esi], eax
mov eax, [esi + 0x10]
pop esi
ret
align 4
IOAPIC_write:
; in : EAX - IOAPIC register
; EBX - value
; out: none
push esi
mov esi, [IOAPIC_base]
mov [esi], eax
mov [esi + 0x10], ebx
pop esi
ret
;===========================================================
; Remap all IRQ to 0x20+ Vectors
; IRQ0 to vector 0x20, IRQ1 to vector 0x21....
PIC_init:
cli
mov al,0x11 ; icw4, edge triggered
out 0x20,al
call pic_delay
out 0xA0,al
call pic_delay
mov al,0x20 ; generate 0x20 +
out 0x21,al
call pic_delay
mov al,0x28 ; generate 0x28 +
out 0xA1,al
call pic_delay
mov al,0x04 ; slave at irq2
out 0x21,al
call pic_delay
mov al,0x02 ; at irq9
out 0xA1,al
call pic_delay
mov al,0x01 ; 8086 mode
out 0x21,al
call pic_delay
out 0xA1,al
call pic_delay
call IRQ_mask_all
cli
; mov dword[irq_type_to_set], IRQ_TYPE_PIC
ret
; -----------------------------------------
pic_delay:
jmp pdl1
pdl1: ret
; -----------------------------------------
; TIMER SET TO 1/100 S
PIT_init:
mov al,0x34 ; set to 100Hz
out 0x43,al
mov al,0x9b ; lsb 1193180 / 1193
out 0x40,al
mov al,0x2e ; msb
out 0x40,al
ret
; -----------------------------------------
unmask_timer:
test dword[APIC], 0xffffffff
jnz @f
stdcall enable_irq, 0
ret
@@:
; use PIT
; in some systems PIT no connected to IOAPIC
; mov eax, 0x14
; call IOAPIC_read
; mov ah, 0x09 ; Delivery Mode: Lowest Priority, Destination Mode: Logical
; mov al, 0x20
; or eax, 0x10000 ; Mask Interrupt
; mov ebx, eax
; mov eax, 0x14
; call IOAPIC_write
; stdcall enable_irq, 2
; ret
; use LAPIC timer
mov esi, [LAPIC_BASE]
mov eax, [esi + APIC_LVT_timer]
and eax, 0xfffeffff
mov [esi + APIC_LVT_timer], eax
ret
; -----------------------------------------
; Disable all IRQ
IRQ_mask_all:
test dword[APIC], 0xffffffff
jnz .APIC
mov al, 0xFF
out 0x21, al
out 0xA1, al
mov ecx,0x1000
cld
@@: call pic_delay
loop @b
ret
.APIC:
mov ecx, [IRQ_COUNT]
mov eax, 0x10
@@: mov ebx, eax
call IOAPIC_read
or eax, 0x10000 ; bit 16
xchg eax, ebx
call IOAPIC_write
inc eax
inc eax
loop @b
ret
; -----------------------------------------
; End Of Interrupt
; al - IRQ number
align 16
IRQ_EOI:
test dword[APIC], 0xffffffff
jnz .APIC
cmp al, 8
mov al, 0x20
jb @f
out 0xa0, al
@@: out 0x20, al
ret
.APIC:
mov eax, [LAPIC_BASE]
mov dword [eax + APIC_EOI], 0 ; EOI
ret
; -----------------------------------------
; from dll.inc
align 4
proc enable_irq stdcall, irq_line:dword
mov ebx, [irq_line]
test dword[APIC], 0xffffffff
jnz .APIC
mov edx, 0x21
cmp ebx, 8
jb @F
mov edx, 0xA1
sub ebx,8
@@:
in al,dx
btr eax, ebx
out dx, al
ret
.APIC:
shl ebx, 1
add ebx, 0x10
mov eax, ebx
call IOAPIC_read
and eax, 0xfffeffff ; bit 16
xchg eax, ebx
call IOAPIC_write
ret
endp
; IRQ_TYPE_DISABLE equ 0
; IRQ_TYPE_PIC equ 1
; IRQ_TYPE_APIC equ 2
; uglobal
; irq_type_to_set rd 1
; irq_types rd IRQ_RESERVE
; endg
; -----------------------------------------
; End Of Interrupt
; al - IRQ number
; align 16
; IRQ_EOI:
; movzx eax, al
; cmp dword[irq_types + eax * 4], IRQ_TYPE_APIC
; jne @f
; mov eax, [LAPIC_BASE]
; mov dword [eax + APIC_EOI], 0 ; EOI
; ret
; @@:
; cmp al, 8
; mov al, 0x20
; jb @f
; out 0xa0, al
; @@: out 0x20, al
; ret
; align 4
; proc enable_irq stdcall, irq_line:dword
; cmp dword[irq_type_to_set], IRQ_TYPE_APIC
; jne @f
; stdcall APIC_enable_irq, [irq_line]
; ret
; @@: stdcall PIC_enable_irq, [irq_line]
; ret
; endp
; align 4
; proc disable_irq stdcall, irq_line:dword
; push eax
; mov eax, [irq_line]
; cmp dword[irq_types + eax * 4], IRQ_TYPE_APIC
; jne @f
; stdcall APIC_disable_irq, eax
; pop eax
; ret
; @@: stdcall PIC_disable_irq, eax
; pop eax
; ret
; endp
; align 4
; proc PIC_enable_irq stdcall, irq_line:dword
; pusha
; mov ebx, [irq_line]
; mov eax, [irq_types + ebx * 4]
; cmp eax, IRQ_TYPE_DISABLE
; je @f
; cmp eax, IRQ_TYPE_PIC
; je @f
; stdcall disable_irq, ebx
; @@: mov dword[irq_types + ebx * 4], IRQ_TYPE_PIC
; mov edx, 0x21
; cmp ebx, 8
; jb @F
; mov edx, 0xA1
; sub ebx,8
; @@: in al,dx
; btr eax, ebx
; out dx, al
; popa
; ret
; endp
; align 4
; proc PIC_disable_irq stdcall, irq_line:dword
; pusha
; mov ebx, [irq_line]
; mov dword[irq_types + ebx * 4], IRQ_TYPE_DISABLE
; mov edx, 0x21
; cmp ebx, 8
; jb @F
; mov edx, 0xA1
; sub ebx,8
; @@: in al,dx
; bts eax, ebx
; out dx, al
; popa
; ret
; endp
; align 4
; proc APIC_enable_irq stdcall, irq_line:dword
; pusha
; mov ebx, [irq_line]
; mov eax, [irq_types + ebx * 4]
; cmp eax, IRQ_TYPE_DISABLE
; je @f
; cmp eax, IRQ_TYPE_APIC
; je @f
; stdcall disable_irq, ebx
; @@: mov dword[irq_types + ebx * 4], IRQ_TYPE_APIC
; shl ebx, 1
; add ebx, 0x10
; mov eax, ebx
; call IOAPIC_read
; and eax, 0xfffeffff ; bit 16
; xchg eax, ebx
; call IOAPIC_write
; popa
; ret
; endp
; align 4
; proc APIC_disable_irq stdcall, irq_line:dword
; pusha
; mov ebx, [irq_line]
; mov dword[irq_types + ebx * 4], IRQ_TYPE_DISABLE
; shl ebx, 1
; add ebx, 0x10
; mov eax, ebx
; call IOAPIC_read
; or eax, 0x10000
; xchg eax, ebx
; call IOAPIC_write
; popa
; ret
; endp

View File

@ -22,8 +22,9 @@ proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword
mov ebx, [irq] ;irq num mov ebx, [irq] ;irq num
test ebx, ebx test ebx, ebx
jz .err jz .err
cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's cmp ebx, [IRQ_COUNT] ; hidnplayr says: we only have 16 IRQ's
ja .err ; Ghost says: we can have more...
jae .err
mov eax, [handler] mov eax, [handler]
test eax, eax test eax, eax
jz .err jz .err
@ -54,7 +55,7 @@ endp
uglobal uglobal
irq_rights rd 16 irq_rights rd IRQ_RESERVE
endg endg
@ -80,85 +81,31 @@ proc detach_int_handler
ret ret
endp endp
align 4
proc enable_irq stdcall, irq_line:dword
mov ebx, [irq_line]
mov edx, 0x21
cmp ebx, 8
jb @F
mov edx, 0xA1
sub ebx,8
@@:
in al,dx
btr eax, ebx
out dx, al
ret
endp
align 16 align 16
;; proc irq_serv ;; proc irq_serv
irq_serv: irq_serv:
.irq_1: ; .irq_1:
push 1 ; push 1
jmp .main
align 4
.irq_2:
push 2
jmp .main
align 4
.irq_3:
push 3
jmp .main
align 4
.irq_4:
push 4
jmp .main
align 4
.irq_5:
push 5
jmp .main
; align 4
; .irq_6:
; push 6
; jmp .main ; jmp .main
; etc...
macro irq_serv_h [num] {
forward
align 4 align 4
.irq_7: .irq_#num :
push 7 push num
jmp .main jmp .main
align 4 }
.irq_8:
push 8 irq_serv_h 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12
jmp .main
align 4 ; I don`t known how to use IRQ_RESERVE
.irq_9: if IRQ_RESERVE > 16
push 9 irq_serv_h 16, 17, 18, 19, 20, 21, 22, 23
jmp .main end if
align 4
.irq_10:
push 10
jmp .main
align 4
.irq_11:
push 11
jmp .main
align 4
.irq_12:
push 12
jmp .main
; align 4
; .irq_13:
; push 13
; jmp .main
; align 4
; .irq_14:
; push 14
; jmp .main
; align 4
; .irq_15:
; push 15
; jmp .main
align 16 align 16
.main: .main:
@ -178,15 +125,8 @@ align 16
call ebx call ebx
mov [check_idle_semaphore],5 mov [check_idle_semaphore],5
.exit: .exit: mov eax, [esp + 32]
call IRQ_EOI
cmp dword [esp + 32], 8
mov al, 0x20
jb @f
out 0xa0, al
@@:
out 0x20, al
restore_ring3_context restore_ring3_context
add esp, 4 add esp, 4
@ -1620,70 +1560,3 @@ destroy_kernel_object:
call free ;release object memory call free ;release object memory
ret ret
if 0
irq:
.irq0:
pusfd
pushad
push IRQ_0
jmp .master
.irq_1:
pusfd
pushad
push IRQ_1
jmp .master
.master:
mov ax, app_data
mov ds, eax
mov es, eax
mov ebx, [esp+4] ;IRQ_xx
mov eax, [irq_handlers+ebx+4]
call intr_handler
mov ecx, [esp+4]
cmp [irq_actids+ecx*4], 0
je @F
in al, 0x21
bts eax, ecx
out 0x21, al
mov al, 0x20
out 0x20, al
jmp .restart
.slave:
mov ax, app_data
mov ds, eax
mov es, eax
mov ebx, [esp+4] ;IRQ_xx
mov eax, [irq_handlers+ebx+4]
call intr_handler
mov ecx, [esp+4]
sub ecx, 8
cmp [irq_actids+ecx*4], 0
je @F
in al, 0xA1
bts eax, ecx
out 0xA1, al
mov al, 0x20
out 0xA0, al
out 0x20, al
.restart:
mov ebx, [next_slot]
test ebx, ebx
jz @F
mov [next_task],0
mov esi, [prev_slot]
call do_change_task
add esp, 4
iretd
end if

View File

@ -27,8 +27,8 @@ irq0:
add [next_usage_update],100 add [next_usage_update],100
call updatecputimes call updatecputimes
.nocounter: .nocounter:
mov al,0x20 ; send End Of Interrupt signal mov al, 0 ; send End Of Interrupt signal
out 0x20,al call IRQ_EOI
btr dword[DONT_SWITCH], 0 btr dword[DONT_SWITCH], 0
jc .return jc .return
call find_next_task call find_next_task

View File

@ -39,6 +39,7 @@ iglobal
times 12 dd unknown_interrupt ;int_20..int_31 times 12 dd unknown_interrupt ;int_20..int_31
;interrupt handlers addresses (for interrupt gate construction) ;interrupt handlers addresses (for interrupt gate construction)
; 0x20 .. 0x2F - IRQ handlers
dd irq0, irq_serv.irq_1, irq_serv.irq_2 dd irq0, irq_serv.irq_1, irq_serv.irq_2
if USE_COM_IRQ if USE_COM_IRQ
dd irq_serv.irq_3, irq_serv.irq_4 dd irq_serv.irq_3, irq_serv.irq_4
@ -47,9 +48,22 @@ iglobal
end if end if
dd irq_serv.irq_5, p_irq6, irq_serv.irq_7 dd irq_serv.irq_5, p_irq6, irq_serv.irq_7
dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10 dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
dd irq_serv.irq_11, irq_serv.irq_12, irqD,p_irq14,p_irq15 dd irq_serv.irq_11, irq_serv.irq_12
times 16 dd unknown_interrupt ;int_0x30..int_0x3F dd irq13
dd p_irq14,p_irq15
; I don`t known how to use IRQ_RESERVE
if IRQ_RESERVE > 16
dd irq_serv.irq_16
dd irq_serv.irq_17
dd irq_serv.irq_18
dd irq_serv.irq_19
dd irq_serv.irq_20
dd irq_serv.irq_21
dd irq_serv.irq_22
dd irq_serv.irq_23
end if
times 32 - IRQ_RESERVE dd unknown_interrupt
;int_0x40 gate trap (for directly copied) ;int_0x40 gate trap (for directly copied)
dw i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16 dw i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16
@ -122,8 +136,9 @@ exc_c: ;
reg_esi equ esp+0x04 reg_esi equ esp+0x04
reg_edi equ esp+0x00 reg_edi equ esp+0x00
Mov ds,ax,app_data ; çàãðóçèì ïðàâèëüíûå çíà÷åíèÿ mov ax, app_data ;èñêëþ÷åíèå
mov es,ax ; â ñåãìåíòíûå ðåãèñòðû mov ds, ax ;çàãðóçèì ïðàâèëüíûå çíà÷åíè
mov es, ax ;â ðåãèñòðû
cld ; è ïðèâîäèì DF ê ñòàíäàðòó cld ; è ïðèâîäèì DF ê ñòàíäàðòó
movzx ebx,bl movzx ebx,bl
; redirect to V86 manager? (EFLAGS & 0x20000) != 0? ; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
@ -186,10 +201,12 @@ IRetToUserHook:
stosd stosd
mov [edi], ebx mov [edi], ebx
restore_ring3_context restore_ring3_context
; simply return control to interrupted process
unknown_interrupt: unknown_interrupt:
iretd iretd
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
; bl - error vector
show_error_parameters: show_error_parameters:
mov edx,[TASK_BASE] ;not scratched below mov edx,[TASK_BASE] ;not scratched below
DEBUGF 1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid] DEBUGF 1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid]
@ -228,6 +245,8 @@ show_error_parameters:
restore reg_esi restore reg_esi
restore reg_edi restore reg_edi
; IRQ runtime
; irq1 -> hid/keyboard.inc ; irq1 -> hid/keyboard.inc
macro irqh [num] { macro irqh [num] {
p_irq#num : p_irq#num :
@ -235,9 +254,13 @@ macro irqh [num] {
jmp irqhandler jmp irqhandler
} }
irqh 2,3,4,5,7,8,9,10,11
; I don`t known how to use IRQ_RESERVE
if IRQ_RESERVE > 16
irqh 16, 17, 18, 19, 20, 21, 22, 23
end if
p_irq6: ; FDC
p_irq6:
save_ring3_context save_ring3_context
mov ax, app_data ;os_data mov ax, app_data ;os_data
mov ds, ax mov ds, ax
@ -246,12 +269,28 @@ p_irq6:
cmp [v86_irqhooks+edi*8], 0 cmp [v86_irqhooks+edi*8], 0
jnz v86_irq2 jnz v86_irq2
call fdc_irq call fdc_irq
call ready_for_next_irq mov [check_idle_semaphore], 5
mov al, 6
call IRQ_EOI
restore_ring3_context restore_ring3_context
iret iret
irq13: ; Math coprocessor
save_ring3_context
mov ax, app_data ;os_data
mov ds, ax
mov es, ax
p_irq14: mov dx, 0xf0
mov al, 0
out dx, al
mov al, 13
call IRQ_EOI
restore_ring3_context
iret
p_irq14: ; HDD
save_ring3_context save_ring3_context
mov ax, app_data ;os_data mov ax, app_data ;os_data
mov ds, ax mov ds, ax
@ -261,10 +300,13 @@ p_irq14:
jnz v86_irq2 jnz v86_irq2
; mov byte [BOOT_VAR + 0x48E], 0xFF ; mov byte [BOOT_VAR + 0x48E], 0xFF
call [irq14_func] call [irq14_func]
call ready_for_next_irq_1 mov [check_idle_semaphore], 5
mov al, 14
call IRQ_EOI
restore_ring3_context restore_ring3_context
iret iret
p_irq15:
p_irq15: ; HDD2
save_ring3_context save_ring3_context
mov ax, app_data ;os_data mov ax, app_data ;os_data
mov ds, ax mov ds, ax
@ -274,7 +316,9 @@ p_irq15:
jnz v86_irq2 jnz v86_irq2
; mov byte [BOOT_VAR + 0x48E], 0xFF ; mov byte [BOOT_VAR + 0x48E], 0xFF
call [irq15_func] call [irq15_func]
call ready_for_next_irq_1 mov [check_idle_semaphore], 5
mov al, 15
call IRQ_EOI
restore_ring3_context restore_ring3_context
iret iret
@ -307,7 +351,7 @@ irqD:
iret iret
irqh 2,3,4,5,7,8,9,10,11 align 4
irqhandler: irqhandler:

View File

@ -328,7 +328,7 @@ v86_start:
cmp edx, -1 cmp edx, -1
jz .noirqhook jz .noirqhook
uglobal uglobal
v86_irqhooks rd 16*2 v86_irqhooks rd IRQ_RESERVE * 2
endg endg
cmp [v86_irqhooks+edx*8], 0 cmp [v86_irqhooks+edx*8], 0
jz @f jz @f
@ -898,12 +898,10 @@ v86_irq2:
pop ecx pop ecx
.cont: .cont:
loop .scan loop .scan
mov al, 20h
out 20h, al mov eax, edi
cmp edi, 8 call IRQ_EOI
jb @f
out 0A0h, al
@@:
popad popad
iretd iretd
.found: .found:

View File

@ -49,24 +49,21 @@ keymap_alt:
boot_memdetect db 'Determining amount of memory',0 boot_memdetect db 'Determining amount of memory',0
boot_fonts db 'Fonts loaded',0 boot_fonts db 'Fonts loaded',0
boot_tss db 'Setting TSSs',0
boot_cpuid db 'Reading CPUIDs',0
boot_devices db 'Detecting devices',0 boot_devices db 'Detecting devices',0
boot_timer db 'Setting timer',0
boot_irqs db 'Reprogramming IRQs',0
boot_setmouse db 'Setting mouse',0 boot_setmouse db 'Setting mouse',0
boot_windefs db 'Setting window defaults',0 boot_windefs db 'Setting window defaults',0
boot_bgr db 'Calculating background',0 boot_bgr db 'Calculating background',0
boot_resirqports db 'Reserving IRQs & ports',0 boot_resirqports db 'Reserving IRQs & ports',0
boot_setrports db 'Setting addresses for IRQs',0
boot_setostask db 'Setting OS task',0 boot_setostask db 'Setting OS task',0
boot_allirqs db 'Unmasking all IRQs',0 boot_allirqs db 'Unmasking IRQs',0
boot_tsc db 'Reading TSC',0 boot_tsc db 'Reading TSC',0
boot_cpufreq db 'CPU frequency is ',' ',' MHz',0 boot_cpufreq db 'CPU frequency is ',' ',' MHz',0
boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0
boot_pal_vga db 'Setting VGA 640x480 palette',0 boot_pal_vga db 'Setting VGA 640x480 palette',0
boot_failed db 'Failed to start first app',0 boot_failed db 'Failed to start first app',0
boot_mtrr db 'Setting MTRR',0 boot_APIC_found db 'APIC enabled', 0
boot_APIC_nfound db 'APIC not found', 0
if preboot_blogesc if preboot_blogesc
boot_tasking db 'All set - press ESC to start',0 boot_tasking db 'All set - press ESC to start',0
end if end if
@ -262,28 +259,10 @@ cur_saved_data rb 4096
fpu_data: rb 512 fpu_data: rb 512
; device irq owners ; device irq owners
irq_owner rd 16 ; 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_tab rd IRQ_RESERVE
irq01read rd 16
irq02read rd 16
irq03read rd 16
irq04read rd 16
irq05read rd 16
irq06read rd 16
irq07read rd 16
irq08read rd 16
irq09read rd 16
irq10read rd 16
irq11read rd 16
irq12read rd 16
irq13read rd 16
irq14read rd 16
irq15read rd 16
irq_tab rd 16
mem_block_map rb 512 mem_block_map rb 512
mem_block_list rd 64 mem_block_list rd 64

View File

@ -591,28 +591,22 @@ high_code:
; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f ; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f
call rerouteirqs call PIC_init
; Initialize system V86 machine ; Initialize system V86 machine
call init_sys_v86 call init_sys_v86
; TIMER SET TO 1/100 S ; Initialize system timer (IRQ0)
call PIT_init
mov al,0x34 ; set to 100Hz ; Try to Initialize APIC
out 0x43,al call APIC_init
mov al,0x9b ; lsb 1193180 / 1193
out 0x40,al
mov al,0x2e ; msb
out 0x40,al
; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15) ; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15)
; they are used: when partitions are scanned, hd_read relies on timer ; they are used: when partitions are scanned, hd_read relies on timer
; Also enable IRQ2, because in some configurations call unmask_timer
; IRQs from slave controller are not delivered until IRQ2 on master is enabled stdcall enable_irq, 14
mov al, 0xFA stdcall enable_irq, 15
out 0x21, al
mov al, 0x3F
out 0xA1, al
; Enable interrupts in IDE controller ; Enable interrupts in IDE controller
mov al, 0 mov al, 0
@ -662,6 +656,13 @@ end if
mov esi,boot_fonts mov esi,boot_fonts
call boot_log call boot_log
; Display APIC status
mov esi, boot_APIC_found
test dword[APIC], 0xffffffff
jnz @f
mov esi, boot_APIC_nfound
@@: call boot_log
; PRINT AMOUNT OF MEMORY ; PRINT AMOUNT OF MEMORY
mov esi, boot_memdetect mov esi, boot_memdetect
call boot_log call boot_log
@ -779,9 +780,6 @@ end if
mov [CPU_FREQ],eax ; save tsc / sec mov [CPU_FREQ],eax ; save tsc / sec
; mov ebx, 1000000 ; mov ebx, 1000000
; div ebx ; div ebx
; ¢®®¡é¥-â® ¯à®¨§¢®¤¨â¥«ì­®áâì ¢ ¤ ­­®¬ ª®­ªà¥â­®¬ ¬¥áâ¥
; ᮢ¥à襭­® ­¥ªà¨â¨ç­ , ­® çâ®¡ë § âª­ãâì «î¡¨â¥«¥©
; ®¯â¨¬¨§¨àãîé¨å ª®¬¯¨«ïâ®à®¢ Ÿ‚“...
mov edx, 2251799814 mov edx, 2251799814
mul edx mul edx
shr edx, 19 shr edx, 19
@ -805,7 +803,6 @@ end if
; SET MOUSE ; SET MOUSE
;call detect_devices
stdcall load_driver, szPS2MDriver stdcall load_driver, szPS2MDriver
; stdcall load_driver, szCOM_MDriver ; stdcall load_driver, szCOM_MDriver
@ -904,7 +901,7 @@ first_app_found:
and al,00000010b and al,00000010b
loopnz @b loopnz @b
; mov al, 0xED ; svetodiody - only for testing! ; mov al, 0xED ; Keyboard LEDs - only for testing!
; call kb_write ; call kb_write
; call kb_read ; call kb_read
; mov al, 111b ; mov al, 111b
@ -963,8 +960,9 @@ if defined debug_com_base
end if end if
; START MULTITASKING ;-=-=-=-=-=-=- START MULTITASKING -=-=-=-=-=-=-=-=-
; A 'All set - press ESC to start' messages if need
if preboot_blogesc if preboot_blogesc
mov esi, boot_tasking mov esi, boot_tasking
call boot_log call boot_log
@ -973,7 +971,6 @@ if preboot_blogesc
jne .bll1 jne .bll1
end if end if
; mov [ENABLE_TASKSWITCH],byte 1 ; multitasking enabled
; UNMASK ALL IRQ'S ; UNMASK ALL IRQ'S
@ -994,8 +991,12 @@ end if
; out 0xa0,al ; out 0xa0,al
; ;
; loop ready_for_irqs ; flush the queue ; 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, 1, irq1, 0 stdcall attach_int_handler, dword 1, irq1, dword 0 ; keyboard
; mov [dma_hdd],1 ; mov [dma_hdd],1
cmp [IDEContrRegsBaseAddr], 0 cmp [IDEContrRegsBaseAddr], 0
@ -1007,7 +1008,6 @@ end if
jmp osloop jmp osloop
; jmp $ ; wait here for timer to take control
; Fly :) ; Fly :)
@ -1150,8 +1150,8 @@ reserve_irqs_ports:
setirqreadports: setirqreadports:
mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte mov [irq00read+12*4*16],dword 0x60 + 0x01000000 ; read port 0x60 , byte
and dword [irq12read+4],0 ; end of port list and dword [irq00read+12*4*16],0 ; end of port list
; mov [irq12read+4],dword 0 ; end of port list ; mov [irq12read+4],dword 0 ; end of port list
;mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte ;mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte
;mov [irq04read+4],dword 0 ; end of port list ;mov [irq04read+4],dword 0 ; end of port list
@ -3744,19 +3744,19 @@ reserve_free_irq:
push ecx push ecx
lea ecx, [irq_owner + 4 * ecx] lea ecx, [irq_owner + 4 * ecx]
mov edx, [ecx] mov edx, [ecx] ; IRQ owner PID
mov eax, [TASK_BASE] mov eax, [TASK_BASE]
mov edi, [eax + TASKDATA.pid] mov edi, [eax + TASKDATA.pid] ; current task PID
pop eax pop eax
dec ebx dec ebx
jnz reserve_irq jnz reserve_irq
; free irq
cmp edx, edi cmp edx, edi ; check owner
jne ril1 jne ril1
dec esi dec esi
mov [ecx], esi mov [ecx], esi ; esi = 0
jmp ril1 jmp ril1 ; return successful
reserve_irq: reserve_irq:
@ -3793,6 +3793,18 @@ f_irqs:
dd p_irq14 dd p_irq14
dd p_irq15 dd p_irq15
; I don`t known how to use IRQ_RESERVE
if IRQ_RESERVE > 16
dd p_irq16
dd p_irq17
dd p_irq18
dd p_irq19
dd p_irq20
dd p_irq21
dd p_irq22
dd p_irq23
end if
endg endg
drawbackground: drawbackground:
@ -4286,64 +4298,6 @@ _rdtsc:
ret ret
end if end if
rerouteirqs:
cli
mov al,0x11 ; icw4, edge triggered
out 0x20,al
call pic_delay
out 0xA0,al
call pic_delay
mov al,0x20 ; generate 0x20 +
out 0x21,al
call pic_delay
mov al,0x28 ; generate 0x28 +
out 0xA1,al
call pic_delay
mov al,0x04 ; slave at irq2
out 0x21,al
call pic_delay
mov al,0x02 ; at irq9
out 0xA1,al
call pic_delay
mov al,0x01 ; 8086 mode
out 0x21,al
call pic_delay
out 0xA1,al
call pic_delay
mov al,255 ; mask all irq's
out 0xA1,al
call pic_delay
out 0x21,al
call pic_delay
mov ecx,0x1000
cld
picl1: call pic_delay
loop picl1
mov al,255 ; mask all irq's
out 0xA1,al
call pic_delay
out 0x21,al
call pic_delay
cli
ret
pic_delay:
jmp pdl1
pdl1: ret
sys_msg_board_str: sys_msg_board_str:
pushad pushad
@ -5118,9 +5072,7 @@ yes_shutdown_param:
call restorefatchain call restorefatchain
mov al, 0xFF call IRQ_mask_all
out 0x21, al
out 0xA1, al
if 0 if 0
mov word [OS_BASE+0x467+0],pr_mode_exit mov word [OS_BASE+0x467+0],pr_mode_exit

View File

@ -221,6 +221,7 @@ include "core/peload.inc" ;
include "core/exports.inc" include "core/exports.inc"
include "core/string.inc" include "core/string.inc"
include "core/v86.inc" ; virtual-8086 manager include "core/v86.inc" ; virtual-8086 manager
include "core/apic.inc" ; Interrupt Controller functions
; GUI stuff ; GUI stuff
include "gui/window.inc" include "gui/window.inc"