From 1e30c8e1c24596439029113e397081236bdad0ec Mon Sep 17 00:00:00 2001 From: "Sergey Semyonov (Serge)" Date: Fri, 1 Oct 2010 20:49:29 +0000 Subject: [PATCH] APIC patch from Ghost. Not tested. git-svn-id: svn://kolibrios.org@1638 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/branches/Kolibri-acpi/const.inc | 3 - kernel/branches/Kolibri-acpi/core/apic.inc | 487 ++++++++++++++++++++ kernel/branches/Kolibri-acpi/core/dll.inc | 171 +------ kernel/branches/Kolibri-acpi/core/sched.inc | 4 +- kernel/branches/Kolibri-acpi/core/sys32.inc | 68 ++- kernel/branches/Kolibri-acpi/core/v86.inc | 12 +- kernel/branches/Kolibri-acpi/data32.inc | 35 +- kernel/branches/Kolibri-acpi/kernel.asm | 170 +++---- kernel/branches/Kolibri-acpi/kernel32.inc | 1 + 9 files changed, 641 insertions(+), 310 deletions(-) create mode 100644 kernel/branches/Kolibri-acpi/core/apic.inc diff --git a/kernel/branches/Kolibri-acpi/const.inc b/kernel/branches/Kolibri-acpi/const.inc index 5f9f66769a..b6f4a6590c 100644 --- a/kernel/branches/Kolibri-acpi/const.inc +++ b/kernel/branches/Kolibri-acpi/const.inc @@ -203,9 +203,6 @@ WIN_STACK equ (OS_BASE+0x000C000) WIN_POS equ (OS_BASE+0x000C400) FDD_BUFF equ (OS_BASE+0x000D000) -;unused ? only one reference -ENABLE_TASKSWITCH equ (OS_BASE+0x000E000) - PUTPIXEL equ (OS_BASE+0x000E020) GETPIXEL equ (OS_BASE+0x000E024) diff --git a/kernel/branches/Kolibri-acpi/core/apic.inc b/kernel/branches/Kolibri-acpi/core/apic.inc new file mode 100644 index 0000000000..fb901d04e6 --- /dev/null +++ b/kernel/branches/Kolibri-acpi/core/apic.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/core/dll.inc b/kernel/branches/Kolibri-acpi/core/dll.inc index 6e0a48cb3c..a4d2ee3737 100644 --- a/kernel/branches/Kolibri-acpi/core/dll.inc +++ b/kernel/branches/Kolibri-acpi/core/dll.inc @@ -22,8 +22,9 @@ proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword mov ebx, [irq] ;irq num test ebx, ebx jz .err - cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's - ja .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 @@ -54,7 +55,7 @@ endp uglobal - irq_rights rd 16 + irq_rights rd IRQ_RESERVE endg @@ -80,85 +81,31 @@ proc detach_int_handler ret 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 ;; proc irq_serv irq_serv: -.irq_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 +; .irq_1: + ; push 1 ; jmp .main +; etc... + +macro irq_serv_h [num] { + forward align 4 -.irq_7: - push 7 + .irq_#num : + push num jmp .main -align 4 -.irq_8: - push 8 - jmp .main -align 4 -.irq_9: - push 9 - jmp .main -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 +} + +irq_serv_h 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12 + +; I don`t known how to use IRQ_RESERVE +if IRQ_RESERVE > 16 +irq_serv_h 16, 17, 18, 19, 20, 21, 22, 23 +end if align 16 .main: @@ -178,15 +125,8 @@ align 16 call ebx mov [check_idle_semaphore],5 -.exit: - - cmp dword [esp + 32], 8 - mov al, 0x20 - jb @f - out 0xa0, al -@@: - out 0x20, al - +.exit: mov eax, [esp + 32] + call IRQ_EOI restore_ring3_context add esp, 4 @@ -1620,70 +1560,3 @@ destroy_kernel_object: call free ;release object memory 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 - - - - diff --git a/kernel/branches/Kolibri-acpi/core/sched.inc b/kernel/branches/Kolibri-acpi/core/sched.inc index 00b4551bca..dc6f5f7eae 100644 --- a/kernel/branches/Kolibri-acpi/core/sched.inc +++ b/kernel/branches/Kolibri-acpi/core/sched.inc @@ -27,8 +27,8 @@ irq0: add [next_usage_update],100 call updatecputimes .nocounter: - mov al,0x20 ; send End Of Interrupt signal - out 0x20,al + mov al, 0 ; send End Of Interrupt signal + call IRQ_EOI btr dword[DONT_SWITCH], 0 jc .return call find_next_task diff --git a/kernel/branches/Kolibri-acpi/core/sys32.inc b/kernel/branches/Kolibri-acpi/core/sys32.inc index 32c4e80a49..ecb16188c3 100644 --- a/kernel/branches/Kolibri-acpi/core/sys32.inc +++ b/kernel/branches/Kolibri-acpi/core/sys32.inc @@ -39,6 +39,7 @@ iglobal times 12 dd unknown_interrupt ;int_20..int_31 ;interrupt handlers addresses (for interrupt gate construction) + ; 0x20 .. 0x2F - IRQ handlers dd irq0, irq_serv.irq_1, irq_serv.irq_2 if USE_COM_IRQ dd irq_serv.irq_3, irq_serv.irq_4 @@ -47,9 +48,22 @@ iglobal end if 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_11, irq_serv.irq_12, irqD,p_irq14,p_irq15 - times 16 dd unknown_interrupt ;int_0x30..int_0x3F + dd irq_serv.irq_11, irq_serv.irq_12 + 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) dw i40 and 0xFFFF, os_code, 11101111b shl 8, i40 shr 16 @@ -122,8 +136,9 @@ exc_c: ; reg_esi equ esp+0x04 reg_edi equ esp+0x00 - Mov ds,ax,app_data ; çàãðóçèì ïðàâèëüíûå çíà÷åíèÿ - mov es,ax ; â ñåãìåíòíûå ðåãèñòðû + mov ax, app_data ;èñêëþ÷åíèå + mov ds, ax ;çàãðóçèì ïðàâèëüíûå çíà÷åíè + mov es, ax ;â ðåãèñòðû cld ; è ïðèâîäèì DF ê ñòàíäàðòó movzx ebx,bl ; redirect to V86 manager? (EFLAGS & 0x20000) != 0? @@ -186,10 +201,12 @@ IRetToUserHook: stosd mov [edi], ebx restore_ring3_context +; simply return control to interrupted process unknown_interrupt: iretd ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; bl - error vector show_error_parameters: mov edx,[TASK_BASE] ;not scratched below DEBUGF 1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid] @@ -228,6 +245,8 @@ show_error_parameters: restore reg_esi restore reg_edi +; IRQ runtime + ; irq1 -> hid/keyboard.inc macro irqh [num] { p_irq#num : @@ -235,9 +254,13 @@ macro irqh [num] { 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: +p_irq6: ; FDC save_ring3_context mov ax, app_data ;os_data mov ds, ax @@ -246,12 +269,28 @@ p_irq6: cmp [v86_irqhooks+edi*8], 0 jnz v86_irq2 call fdc_irq - call ready_for_next_irq + mov [check_idle_semaphore], 5 + mov al, 6 + call IRQ_EOI restore_ring3_context 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 mov ax, app_data ;os_data mov ds, ax @@ -261,10 +300,13 @@ p_irq14: jnz v86_irq2 ; mov byte [BOOT_VAR + 0x48E], 0xFF call [irq14_func] - call ready_for_next_irq_1 + mov [check_idle_semaphore], 5 + mov al, 14 + call IRQ_EOI restore_ring3_context iret -p_irq15: + +p_irq15: ; HDD2 save_ring3_context mov ax, app_data ;os_data mov ds, ax @@ -274,7 +316,9 @@ p_irq15: jnz v86_irq2 ; mov byte [BOOT_VAR + 0x48E], 0xFF call [irq15_func] - call ready_for_next_irq_1 + mov [check_idle_semaphore], 5 + mov al, 15 + call IRQ_EOI restore_ring3_context iret @@ -307,7 +351,7 @@ irqD: iret -irqh 2,3,4,5,7,8,9,10,11 +align 4 irqhandler: diff --git a/kernel/branches/Kolibri-acpi/core/v86.inc b/kernel/branches/Kolibri-acpi/core/v86.inc index d4be975cae..75c376af8c 100644 --- a/kernel/branches/Kolibri-acpi/core/v86.inc +++ b/kernel/branches/Kolibri-acpi/core/v86.inc @@ -328,7 +328,7 @@ v86_start: cmp edx, -1 jz .noirqhook uglobal -v86_irqhooks rd 16*2 +v86_irqhooks rd IRQ_RESERVE * 2 endg cmp [v86_irqhooks+edx*8], 0 jz @f @@ -898,12 +898,10 @@ v86_irq2: pop ecx .cont: loop .scan - mov al, 20h - out 20h, al - cmp edi, 8 - jb @f - out 0A0h, al -@@: + + mov eax, edi + call IRQ_EOI + popad iretd .found: diff --git a/kernel/branches/Kolibri-acpi/data32.inc b/kernel/branches/Kolibri-acpi/data32.inc index 90e307d33a..1eee040298 100644 --- a/kernel/branches/Kolibri-acpi/data32.inc +++ b/kernel/branches/Kolibri-acpi/data32.inc @@ -49,24 +49,21 @@ keymap_alt: boot_memdetect db 'Determining amount of memory',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_timer db 'Setting timer',0 - boot_irqs db 'Reprogramming IRQs',0 boot_setmouse db 'Setting mouse',0 boot_windefs db 'Setting window defaults',0 boot_bgr db 'Calculating background',0 boot_resirqports db 'Reserving IRQs & ports',0 - boot_setrports db 'Setting addresses for IRQs',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_cpufreq db 'CPU frequency is ',' ',' MHz',0 boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 boot_pal_vga db 'Setting VGA 640x480 palette',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 boot_tasking db 'All set - press ESC to start',0 end if @@ -262,28 +259,10 @@ cur_saved_data rb 4096 fpu_data: rb 512 ; device irq owners -irq_owner rd 16 ; process id - +irq_owner rd IRQ_RESERVE ; process id ; on irq read ports - -irq00read rd 16 -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 +irq00read rd 16 * IRQ_RESERVE +irq_tab rd IRQ_RESERVE mem_block_map rb 512 mem_block_list rd 64 diff --git a/kernel/branches/Kolibri-acpi/kernel.asm b/kernel/branches/Kolibri-acpi/kernel.asm index 203e64dab8..5f5d425bfc 100644 --- a/kernel/branches/Kolibri-acpi/kernel.asm +++ b/kernel/branches/Kolibri-acpi/kernel.asm @@ -591,28 +591,22 @@ high_code: ; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f - call rerouteirqs + call PIC_init ; Initialize system V86 machine call init_sys_v86 -; TIMER SET TO 1/100 S +; Initialize system timer (IRQ0) + call 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 +; Try to Initialize APIC + call APIC_init ; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15) ; they are used: when partitions are scanned, hd_read relies on timer -; Also enable IRQ2, because in some configurations -; IRQs from slave controller are not delivered until IRQ2 on master is enabled - mov al, 0xFA - out 0x21, al - mov al, 0x3F - out 0xA1, al + call unmask_timer + stdcall enable_irq, 14 + stdcall enable_irq, 15 ; Enable interrupts in IDE controller mov al, 0 @@ -662,6 +656,13 @@ end if mov esi,boot_fonts 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 mov esi, boot_memdetect call boot_log @@ -779,9 +780,6 @@ end if mov [CPU_FREQ],eax ; save tsc / sec ; mov ebx, 1000000 ; div ebx -; ¢®®¡é¥-â® ¯à®¨§¢®¤¨â¥«ì­®áâì ¢ ¤ ­­®¬ ª®­ªà¥â­®¬ ¬¥á⥠-; ᮢ¥à襭­® ­¥ªà¨â¨ç­ , ­® çâ®¡ë § âª­ãâì «î¡¨â¥«¥© -; ®¯â¨¬¨§¨àãîé¨å ª®¬¯¨«ïâ®à®¢ Ÿ‚“... mov edx, 2251799814 mul edx shr edx, 19 @@ -805,7 +803,6 @@ end if ; SET MOUSE - ;call detect_devices stdcall load_driver, szPS2MDriver ; stdcall load_driver, szCOM_MDriver @@ -904,7 +901,7 @@ first_app_found: and al,00000010b loopnz @b - ; mov al, 0xED ; svetodiody - only for testing! + ; mov al, 0xED ; Keyboard LEDs - only for testing! ; call kb_write ; call kb_read ; mov al, 111b @@ -963,8 +960,9 @@ if defined debug_com_base end if -; START MULTITASKING +;-=-=-=-=-=-=- START MULTITASKING -=-=-=-=-=-=-=-=- +; A 'All set - press ESC to start' messages if need if preboot_blogesc mov esi, boot_tasking call boot_log @@ -973,7 +971,6 @@ if preboot_blogesc jne .bll1 end if -; mov [ENABLE_TASKSWITCH],byte 1 ; multitasking enabled ; UNMASK ALL IRQ'S @@ -994,8 +991,12 @@ end if ; 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, 1, irq1, 0 + stdcall attach_int_handler, dword 1, irq1, dword 0 ; keyboard ; mov [dma_hdd],1 cmp [IDEContrRegsBaseAddr], 0 @@ -1007,7 +1008,6 @@ end if jmp osloop -; jmp $ ; wait here for timer to take control ; Fly :) @@ -1042,8 +1042,8 @@ boot_log: align 32 osloop: call [draw_pointer] - call window_check_events - call mouse_check_events + call window_check_events + call mouse_check_events call checkmisc call checkVga_N13 call stack_handler @@ -1150,8 +1150,8 @@ reserve_irqs_ports: setirqreadports: - mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte - and dword [irq12read+4],0 ; end of port list + mov [irq00read+12*4*16],dword 0x60 + 0x01000000 ; read port 0x60 , byte + and dword [irq00read+12*4*16],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+4],dword 0 ; end of port list @@ -1240,7 +1240,7 @@ sys_outport: mov [esp+32],eax ret - + .sopl4: mov dx,cx ; read @@ -1549,13 +1549,13 @@ cd_base db 0 endg nsyse4: - + sub ebx,2 ; SYSTEM LANGUAGE jnz nsyse5 mov [syslang],ecx ret nsyse5: - + sub ebx,2 ; HD BASE jnz nsyse7 @@ -1762,7 +1762,7 @@ ngsyse12: mov [esp+32],dword 1 ret - + get_timer_ticks: mov eax,[timer_ticks] ret @@ -2936,7 +2936,7 @@ sheduler: dd sys_sheduler.03 dd sys_sheduler.04 endg -sys_sheduler: +sys_sheduler: ;rewritten by 29.12.2009 jmp dword [sheduler+ebx*4] ;.shed_counter: @@ -2949,7 +2949,7 @@ sys_sheduler: ;.perf_control: inc ebx ;before ebx=2, ebx=3 cmp ebx,ecx ;if ecx=3, ebx=3 - jz cache_disable + jz cache_disable dec ebx ;ebx=2 cmp ebx,ecx ; @@ -2965,7 +2965,7 @@ sys_sheduler: ret -.03: +.03: ;.rdmsr_instr: ;now counter in ecx ;(edx:eax) esi:edi => edx:esi @@ -3591,7 +3591,7 @@ siar1: ; * ecx = number start arrea of ports ; * edx = number end arrea of ports (include last number of port) ;Return value: -; * eax = 0 - succesful +; * eax = 0 - succesful ; * eax = 1 - error ; * The system has reserve this ports: ; 0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (include last number of port). @@ -3744,19 +3744,19 @@ reserve_free_irq: push ecx lea ecx, [irq_owner + 4 * ecx] - mov edx, [ecx] + mov edx, [ecx] ; IRQ owner PID mov eax, [TASK_BASE] - mov edi, [eax + TASKDATA.pid] + mov edi, [eax + TASKDATA.pid] ; current task PID pop eax dec ebx jnz reserve_irq - - cmp edx, edi + ; free irq + cmp edx, edi ; check owner jne ril1 dec esi - mov [ecx], esi + mov [ecx], esi ; esi = 0 - jmp ril1 + jmp ril1 ; return successful reserve_irq: @@ -3793,6 +3793,18 @@ f_irqs: dd p_irq14 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 drawbackground: @@ -4286,64 +4298,6 @@ _rdtsc: ret 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: pushad @@ -4806,27 +4760,27 @@ syscall_getarea: dec ebx ; eax - x, ebx - y mov edx,ecx - + shr ecx,16 and edx,0xffff mov esi,ecx ; ecx - size x, edx - size y - + mov ebp,edx dec ebp lea ebp,[ebp*3] - + imul ebp,esi - + mov esi,ecx dec esi lea esi,[esi*3] - + add ebp,esi add ebp,edi add ebx,edx - + .start_y: push ecx edx .start_x: @@ -4834,7 +4788,7 @@ syscall_getarea: add eax,ecx call dword [GETPIXEL] ; eax - x, ebx - y - + mov [ebp],cx shr ecx,16 mov [ebp+2],cl @@ -5118,9 +5072,7 @@ yes_shutdown_param: call restorefatchain - mov al, 0xFF - out 0x21, al - out 0xA1, al + call IRQ_mask_all if 0 mov word [OS_BASE+0x467+0],pr_mode_exit diff --git a/kernel/branches/Kolibri-acpi/kernel32.inc b/kernel/branches/Kolibri-acpi/kernel32.inc index b0707c178c..af94b8cef7 100644 --- a/kernel/branches/Kolibri-acpi/kernel32.inc +++ b/kernel/branches/Kolibri-acpi/kernel32.inc @@ -221,6 +221,7 @@ include "core/peload.inc" ; include "core/exports.inc" include "core/string.inc" include "core/v86.inc" ; virtual-8086 manager +include "core/apic.inc" ; Interrupt Controller functions ; GUI stuff include "gui/window.inc"