diff --git a/kernel/trunk/core/apic.inc b/kernel/trunk/core/apic.inc index 47ffc128e..60aa3de09 100644 --- a/kernel/trunk/core/apic.inc +++ b/kernel/trunk/core/apic.inc @@ -61,7 +61,7 @@ APIC_init: call IRQ_mask_all ; IOAPIC init - stdcall map_io_mem, [acpi_ioapic_base], 0x20, PG_SW + stdcall map_io_mem, [acpi_ioapic_base], 0x20, PG_SW+PG_NOCACHE mov [IOAPIC_base], eax mov eax, IOAPIC_VER @@ -121,14 +121,11 @@ APIC_init: ;=========================================================== 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, [acpi_lapic_base], 0x1000, PG_SW + cmp [LAPIC_BASE], 0 + jne .done + + stdcall map_io_mem, [acpi_lapic_base], 0x1000, PG_SW+PG_NOCACHE mov [LAPIC_BASE], eax mov esi, eax @@ -200,6 +197,8 @@ LAPIC_init: ; Start (every 0.01 sec) mov dword[esi + APIC_LVT_timer], 0x30020; periodic int 0x20 mov dword[esi + APIC_timer_init], eax + +.done: ret ;=========================================================== diff --git a/kernel/trunk/gui/window.inc b/kernel/trunk/gui/window.inc index 91d062886..c641c7955 100644 --- a/kernel/trunk/gui/window.inc +++ b/kernel/trunk/gui/window.inc @@ -548,6 +548,7 @@ align 4 align 4 .exit: pop ebp + inc [_display.mask_seqno] popfd pop esi ret @@ -998,6 +999,7 @@ waredraw: ;//////////////////////////////////////////////////////////////////// mov edi, [TASK_COUNT] movzx esi, word[WIN_POS + edi * 2] call window._.set_screen + inc [_display.mask_seqno] popad ; tell application to redraw itself @@ -1102,7 +1104,7 @@ align 4 add ecx, eax add edx, ebx call ebp - + inc [_display.mask_seqno] mov byte[MOUSE_BACKGROUND], 0 ;-------------------------------------- align 4 @@ -1204,6 +1206,7 @@ align 4 ;-------------------------------------- align 4 .exit: + inc [_display.mask_seqno] ret ;------------------------------------------------------------------------------ align 4 @@ -1949,6 +1952,7 @@ align 4 align 4 .exit: popad + inc [_display.mask_seqno] ret ;-------------------------------------- align 4 diff --git a/kernel/trunk/init.inc b/kernel/trunk/init.inc index 8f9627778..f70e2eed6 100644 --- a/kernel/trunk/init.inc +++ b/kernel/trunk/init.inc @@ -432,6 +432,11 @@ proc test_cpu ret endp +iglobal +align 4 +acpi_lapic_base dd 0xfee00000 ; default local apic base +endg + uglobal align 4 acpi_rsdp rd 1 @@ -443,8 +448,10 @@ acpi_dev_size rd 1 acpi_rsdt_base rd 1 acpi_madt_base rd 1 -acpi_lapic_base rd 1 acpi_ioapic_base rd 1 + +cpu_count rd 1 +smpt rd 16 endg ACPI_HI_RSDP_WINDOW_START equ 0x000E0000 @@ -493,6 +500,7 @@ rsdt_find: ;ecx= rsdt edx= SIG lea ebx, [ecx+36] mov esi, [ecx+4] add esi, ecx +align 4 .next: mov eax, [ebx] cmp [eax], edx @@ -513,9 +521,7 @@ rsdt_find: ;ecx= rsdt edx= SIG pop ebx ret - align 4 - check_acpi: call acpi_locate @@ -533,22 +539,47 @@ check_acpi: mov ecx, [eax+36] mov [acpi_lapic_base-OS_BASE], ecx + mov edi, smpt-OS_BASE + mov ebx, [ecx+0x20] + shr ebx, 24 ; read APIC ID + + mov [edi], ebx ; bootstrap always first + inc [cpu_count-OS_BASE] + add edi, 4 + lea edx, [eax+44] mov ecx, [eax+4] add ecx, eax .check: mov eax, [edx] - cmp al, 1 - je .ioapic + cmp al, 0 + jne .io_apic + shr eax, 24 ; get APIC ID + cmp eax, ebx ; skip self + je .next + + test [edx+4], byte 1 ; is enabled ? + jz .next + + cmp [cpu_count-OS_BASE], 16 + jae .next + + stosd ; store APIC ID + inc [cpu_count-OS_BASE] .next: + mov eax, [edx] movzx eax, ah add edx, eax cmp edx, ecx jb .check .done: ret -.ioapic: + +.io_apic: + cmp al, 1 + jne .next + mov eax, [edx+4] mov [acpi_ioapic_base-OS_BASE], eax - ret + jmp .next diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 412b3ebcf..ffd415600 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -295,6 +295,8 @@ include 'init.inc' org OS_BASE+$ +include 'fdo.inc' + align 4 high_code: mov ax, os_stack @@ -980,6 +982,13 @@ if defined debug_com_base end if + mov eax, [cpu_count] + test eax, eax + jnz @F + mov al, 1 ; at least one CPU +@@: + DEBUGF 1, "K : %d CPU detected\n", eax + ; START MULTITASKING ; A 'All set - press ESC to start' messages if need @@ -1005,7 +1014,6 @@ end if ; Fly :) include 'unpacker.inc' -include 'fdo.inc' align 4 boot_log: