Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пн июл 24, 2017 5:40 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 52 сообщения ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
СообщениеДобавлено: Чт июл 04, 2013 3:55 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
Serge писал(а):
Хак писала Вероника. Имхо в этом случае лучше включить APIC, пусть это и требует некоторых телодвижений.

Я тоже так думаю, но при текущем уровне развития системы это не вариант - даже если считать инструкцию по включению APIC очевидной, она таки требует, чтобы система могла хоть как-то загрузиться.
Mario_r4 писал(а):
Меня смущает процедура irq_serv в файле core/irq.inc. Пришлось убрать:

Это зря.
Mario_r4 писал(а):
а также добавить:

Вот это правильно.

_________________
Сделаем мир лучше!


Вернуться к началу
СообщениеДобавлено: Чт июл 04, 2013 4:03 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
CleverMouse писал(а):
Mario_r4 писал(а):
Меня смущает процедура irq_serv в файле core/irq.inc. Пришлось убрать:

Это зря.

Можно расширенное толкование?

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Чт июл 04, 2013 4:48 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
Mario_r4, весь этот хак предназначен для случая "драйвер устройства повесил обработчик на прерывание A, а устройство генерирует прерывание Б". Если управляющему коду приходит прерывание Б и все драйверы, сидящие на Б, говорят "нет, это не моё прерывание", то управляющий код начинает опрашивать всех-всех-всех с остальных прерываний, вдруг кто сознается. Очевидно, что для корректной работы этого механизма нужно, чтобы драйверы не врали в ответ на вопрос "твоё ли это прерывание?" Но некоторые врут, поэтому их нужно исключать при опросах.

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

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

_________________
Сделаем мир лучше!


Вернуться к началу
СообщениеДобавлено: Пт июл 05, 2013 12:44 am 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
CleverMouse писал(а):
Поэтому отсюда 14 и 15 убирать нельзя, пока нет нормального обработчика.

Что подразумевается под "нормальным обработчиком"?
Я пока сделал так:
Спойлер: Показать
Код:
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
;-----------------------------------------------------------------------------

Оба назначаются через:
Код:
   stdcall attach_int_handler, 14, hdd_irq14, 0
   stdcall attach_int_handler, 15, hdd_irq15, 0

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

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Пт июл 05, 2013 1:41 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3927
Цитата:
И мне, к сожалению, так и никто не прояснил, какие данные передаются через третий параметр
Цитата:
Третий параметр может быть любым. Ядро передаёт его в установленный обработчик прерывания. Удобно передавать указатель на данные контроллера.


Вернуться к началу
СообщениеДобавлено: Пт июл 05, 2013 2:15 am 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
Serge писал(а):
Третий параметр может быть любым. Ядро передаёт его в установленный обработчик прерывания. Удобно передавать указатель на данные контроллера.

Виноват - провтыкал...

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Пт июл 05, 2013 8:36 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
Mario_r4 писал(а):
Что подразумевается под "нормальным обработчиком"?

Обработчик, регистрируемый через attach_int_handler. Если таковой есть, но всегда возвращает единицу, то добавлять в часть А сравнения с 14,15 можно, но бессмысленно - они никогда не сработают.

_________________
Сделаем мир лучше!


Вернуться к началу
СообщениеДобавлено: Пт июл 05, 2013 10:07 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
CleverMouse писал(а):
добавлять в часть А сравнения с 14,15 можно, но бессмысленно - они никогда не сработают.

Сейчас код выглядит так:
Спойлер: Показать
Код:
; 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:

Следует ли понимать что "часть А" это:
Спойлер: Показать
Код:
        cmp     ebp, 14
        jz      .fail
        cmp     ebp, 15
        jz      .fail

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


Было замечание:
Спойлер: Показать
CleverMouse писал(а):
Mario_r4 писал(а):
Меня смущает процедура irq_serv в файле core/irq.inc. Пришлось убрать:

Это зря.

Как следует понимать эти два противоречащих друг другу утверждения?

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Пт июл 05, 2013 10:11 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
Извини, на тот момент я не поняла, что обработчик, зарегистрированный через attach_int_handler, уже есть. Тогда всё в порядке.

_________________
Сделаем мир лучше!


Вернуться к началу
СообщениеДобавлено: Пт июл 05, 2013 10:13 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
Еще раз уточню, чтобы избежать непоняток - следует ли удалить:
Код:
        cmp     ebp, 14
        jz      .fail
        cmp     ebp, 15
        jz      .fail

из текущего кода?

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Последний раз редактировалось Mario_r4 Пт июл 05, 2013 10:14 pm, всего редактировалось 1 раз.

Вернуться к началу
СообщениеДобавлено: Пт июл 05, 2013 10:13 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1596
Да.

_________________
Сделаем мир лучше!


Вернуться к началу
СообщениеДобавлено: Сб июл 06, 2013 1:23 am 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
Есть ли смысл перевести на attach_int_handler также обработчик IRQ6?

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Сб июл 06, 2013 9:04 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3927
Mario_r4
Да.


Вернуться к началу
СообщениеДобавлено: Сб июл 06, 2013 2:40 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
SVN r.3771 - динамическая установка обработчика прерывания Floppy - IRQ6, через attach_int_handler.

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

После этого флопик работает нормально. Сразу предупреждаю - это не идеальное решение и автор шедулера может предложить (и я уверен что предложит), что то более подходящее. Заткнул проблему как сумел.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Пн июл 08, 2013 1:10 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3927
Рестарт ядра снова виснет. Пишет установка обработчиков IDE и всё. Причем у меня установлен AHCI, и контроллеров IDE нет.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 52 сообщения ]  На страницу Пред. 1 2 3 4 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB