Page 3 of 4

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Thu Jul 04, 2013 3:55 pm
by CleverMouse
Serge wrote:Хак писала Вероника. Имхо в этом случае лучше включить APIC, пусть это и требует некоторых телодвижений.
Я тоже так думаю, но при текущем уровне развития системы это не вариант - даже если считать инструкцию по включению APIC очевидной, она таки требует, чтобы система могла хоть как-то загрузиться.
Mario_r4 wrote:Меня смущает процедура irq_serv в файле core/irq.inc. Пришлось убрать:
Это зря.
Mario_r4 wrote:а также добавить:
Вот это правильно.

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Thu Jul 04, 2013 4:03 pm
by Mario_r4
CleverMouse wrote:
Mario_r4 wrote:Меня смущает процедура irq_serv в файле core/irq.inc. Пришлось убрать:
Это зря.
Можно расширенное толкование?

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Thu Jul 04, 2013 4:48 pm
by CleverMouse
Mario_r4, весь этот хак предназначен для случая "драйвер устройства повесил обработчик на прерывание A, а устройство генерирует прерывание Б". Если управляющему коду приходит прерывание Б и все драйверы, сидящие на Б, говорят "нет, это не моё прерывание", то управляющий код начинает опрашивать всех-всех-всех с остальных прерываний, вдруг кто сознается. Очевидно, что для корректной работы этого механизма нужно, чтобы драйверы не врали в ответ на вопрос "твоё ли это прерывание?" Но некоторые врут, поэтому их нужно исключать при опросах.

Первая часть исключений, с "jz .fail", отвечает за то, чтобы не начинать опрос, если обработчик прерывания А говорит, что прерывание не его, хотя на самом деле оно его: таким свойством обладают А=6, 14, 15 - все они врут в отрицательную сторону. Поэтому отсюда 14 и 15 убирать нельзя, пока нет нормального обработчика.

Вторая часть исключений, с "jz .try_next_irq", отвечает за то, чтобы игнорировать обработчик прерывания Б, который говорит, что прерывание его, хотя на самом деле оно не его. Это как раз legacy ISA, Б=1, 12, где нет возможности проверить, действительно ли прерывание пришло от нужного источника. И сюда 14 и 15 добавить можно, если уж обработчик всегда говорит, что это его прерывание.

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Fri Jul 05, 2013 12:44 am
by Mario_r4
CleverMouse wrote:Поэтому отсюда 14 и 15 убирать нельзя, пока нет нормального обработчика.
Что подразумевается под "нормальным обработчиком"?
Я пока сделал так:
Spoiler:

Code: Select all

hdd_irq14:
        pushfd
        cli
        pushad
        mov     [irq14_func], hdd_irq_null
        mov     dx, [IDEContrRegsBaseAddr]
        mov     al, 0
        out     dx, al
        popad
        popfd
        mov     al, 1
align 4
hdd_irq_null:
        ret
;-----------------------------------------------------------------------------
align 4
hdd_irq15:
        pushfd
        cli
        pushad
        mov     [irq15_func], hdd_irq_null
        mov     dx, [IDEContrRegsBaseAddr]
        add     dx, 8
        mov     al, 0
        out     dx, al
        popad
        popfd
        mov     al, 1
        ret
;-----------------------------------------------------------------------------
Оба назначаются через:

Code: Select all

	stdcall attach_int_handler, 14, hdd_irq14, 0
	stdcall attach_int_handler, 15, hdd_irq15, 0
И мне, к сожалению, так и никто не прояснил, какие данные передаются через третий параметр (где сейчас 0).

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Fri Jul 05, 2013 1:41 am
by Serge
И мне, к сожалению, так и никто не прояснил, какие данные передаются через третий параметр
Третий параметр может быть любым. Ядро передаёт его в установленный обработчик прерывания. Удобно передавать указатель на данные контроллера.

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Fri Jul 05, 2013 2:15 am
by Mario_r4
Serge wrote:Третий параметр может быть любым. Ядро передаёт его в установленный обработчик прерывания. Удобно передавать указатель на данные контроллера.
Виноват - провтыкал...

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Fri Jul 05, 2013 8:36 pm
by CleverMouse
Mario_r4 wrote:Что подразумевается под "нормальным обработчиком"?
Обработчик, регистрируемый через attach_int_handler. Если таковой есть, но всегда возвращает единицу, то добавлять в часть А сравнения с 14,15 можно, но бессмысленно - они никогда не сработают.

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Fri Jul 05, 2013 10:07 pm
by Mario_r4
CleverMouse wrote:добавлять в часть А сравнения с 14,15 можно, но бессмысленно - они никогда не сработают.
Сейчас код выглядит так:
Spoiler:

Code: Select all

; There is at least one configuration with one device which generates IRQ
; that is not the same as it should be according to PCI config space.
; For that device, the handler is registered at wrong IRQ.
; As a workaround, when nobody acknowledges the generated IRQ,
; try to ask all other registered handlers; if some handler acknowledges
; the IRQ this time, relink it to the current IRQ list.
; To make this more reliable, for every handler keep number of times
; that it has acknowledged an IRQ, and assume that handlers with at least one
; acknowledged IRQ are registered properly.
; Note: this still isn't 100% correct, because two IRQs can fire simultaneously,
; the better way would be to find the correct IRQ, but I don't know how to do
; this in that case.
; Also, [fdc_irq_func], [irq14_func], [irq15_func] could process interrupt
; but do not return whether they did it, so just ignore IRQs 6, 14, 15.
        cmp     ebp, 6
        jz      .fail
        cmp     ebp, 14
        jz      .fail
        cmp     ebp, 15
        jz      .fail
        push    ebp
        xor     ebp, ebp
.try_other_irqs:
        cmp     ebp, [esp]
        jz      .try_next_irq
        cmp     ebp, 1
        jz      .try_next_irq
        cmp     ebp, 12
        jz      .try_next_irq
        cmp     ebp, 14
        jz      .try_next_irq
        cmp     ebp, 15
        jz      .try_next_irq
        lea     esi, [irqh_tab+ebp*8]
        mov     ebx, esi
.try_next_handler:
Следует ли понимать что "часть А" это:
Spoiler:

Code: Select all

        cmp     ebp, 14
        jz      .fail
        cmp     ebp, 15
        jz      .fail
Если так, то этот код там был до меня и на мое сообщение:
Spoiler:
Mario_r4 wrote:Меня смущает процедура irq_serv в файле core/irq.inc
Пришлось убрать:

Code: Select all

        cmp     ebp, 14
        jz      .fail
        cmp     ebp, 15
        jz      .fail
Было замечание:
Spoiler:
CleverMouse wrote:
Mario_r4 wrote:Меня смущает процедура irq_serv в файле core/irq.inc. Пришлось убрать:
Это зря.
Как следует понимать эти два противоречащих друг другу утверждения?

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Fri Jul 05, 2013 10:11 pm
by CleverMouse
Извини, на тот момент я не поняла, что обработчик, зарегистрированный через attach_int_handler, уже есть. Тогда всё в порядке.

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Fri Jul 05, 2013 10:13 pm
by Mario_r4
Еще раз уточню, чтобы избежать непоняток - следует ли удалить:

Code: Select all

        cmp     ebp, 14
        jz      .fail
        cmp     ebp, 15
        jz      .fail
из текущего кода?

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Fri Jul 05, 2013 10:13 pm
by CleverMouse
Да.

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Sat Jul 06, 2013 1:23 am
by Mario_r4
Есть ли смысл перевести на attach_int_handler также обработчик IRQ6?

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Sat Jul 06, 2013 9:04 am
by Serge
Mario_r4
Да.

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Sat Jul 06, 2013 2:40 pm
by Mario_r4
SVN r.3771 - динамическая установка обработчика прерывания Floppy - IRQ6, через attach_int_handler.

Как всегда не обошлось без сюрпризов. Ревизия связанная с новым шедулером сломала работу с флопиком. Почему-то в самый не продходящий момент гасится двигатель флопика и все кирдык. Временно закомментировал в kernel.asm
Spoiler:

Code: Select all

proc osloop_has_work?
        cmp     [osloop_nonperiodic_work], 0
        jnz     .yes
        call    stack_handler_has_work?
        jnz     .yes
;        call    check_fdd_motor_status_has_work?
;        jnz     .yes
        call    check_ATAPI_device_event_has_work?
        jnz     .yes
        call    check_lights_state_has_work?
        jnz     .yes
        call    check_timers_has_work?
        jnz     .yes
.no:
        xor     eax, eax
        ret
.yes:
        xor     eax, eax
        inc     eax
        ret
endp
После этого флопик работает нормально. Сразу предупреждаю - это не идеальное решение и автор шедулера может предложить (и я уверен что предложит), что то более подходящее. Заткнул проблему как сумел.

Re: 2 акт. обработчика PCI IRQ на разных линиях вешают систе

Posted: Mon Jul 08, 2013 1:10 pm
by Serge
Рестарт ядра снова виснет. Пишет установка обработчиков IDE и всё. Причем у меня установлен AHCI, и контроллеров IDE нет.