Himik писал(а):
Эта небольшая заметка может помочь
Увы, не помогла.
Написал такой код:
Код:
in al, 0x21
mov al, 11111111b ; Disable all IRQs
out 0x21, al
in al, 0xA1
mov al, 11111111b
out 0xA1, al
......
mov rsi, [LAPICAddr]
mov eax, [rsi+APIC_SPUR_REG] ; Setup Spurious interrupt vector
and eax, (not 01FFh)
or eax, (0100h or 030h)
mov [rsi+APIC_SPUR_REG], eax
mov eax, [rsi+APIC_LVT_LINT0_REG] ; Setup LINT0
and eax, 0FFFE58FFh
mov [rsi+APIC_LVT_LINT0_REG], eax
mov eax, [rsi+APIC_LVT_LINT1_REG] ; Setup LINT1
and eax, 0FFFE58FFh
or eax, 0400h
mov [rsi+APIC_LVT_LINT1_REG], eax
mov [rsi+APIC_TPR], dword 20h ; TaskPriority, ставил разные
mov [rsi+APIC_LVT_Timer_REG], dword 10000h ; Shut down timer
mov [rsi+APIC_PMC_REG], dword 10000h ; Shut down performance monitor
mov [rsi+APIC_ERROR_REG], dword 10000h ; Shut down error interrupt
mov eax, [rsi+20h]
mov [rsi+APIC_LDR_REG], dword eax ; Setup logical ID
mov [rsi+APIC_DFR_REG], dword (0Fh shl 28) ; Setup DFR mask
mov al, 70h
out 22h, al
mov al, 01h
out 23h, al
mov rsi, [IOAPICAddr]
;mov [rsi+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOAPICID ; Эти две строки и раскомментировал, и снова убирал.
;mov [rsi+IOAPIC_IOWIN_REG], dword 04000000h
mov [rsi+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOREDTBL0_low
mov [rsi+IOAPIC_IOWIN_REG], dword (1 shl 16)
mov [rsi+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOREDTBL0_hi
mov [rsi+IOAPIC_IOWIN_REG], dword (00h shl 24)
sti
Прерывания PIC запрещены. Дополнительные ядра не запускаю. После "sti" получаю как бы Exception 0Fh (который зарезервирован). Прерывание 0 замаскировал (в заметке пишут, что туда подключен PIC), остальные и так должны быть маскированы.
UPD: попробовал вручную всё замаскировать:
Код:
mov rbx, IOAPIC_IOREDTBL0_low
mov rcx, 24
@@:
mov [rsi+IOAPIC_IOREGSEL_REG], dword ebx
mov [rsi+IOAPIC_IOWIN_REG], dword (1 shl 16) ; low
inc rbx
mov [rsi+IOAPIC_IOREGSEL_REG], dword ebx
mov [rsi+IOAPIC_IOWIN_REG], dword (00h shl 24) ; high
inc rbx
loop @b
Не помогло.