Page 5 of 7
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 9:42 am
by lastar
вот фото со старой kolibri_IDEUSB_trytofix4_dbg и включенным пунктом D
http://yadi.sk/d/LTdL-PjVJDwZw никаких дополнительных сообщений на экране не было . Сейчас сделаю лог kolibri_IDEUSB_trytofix4_dbg2.7z
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 10:03 am
by lastar
kolibri_IDEUSB_trytofix4_dbg2.7z тоже висит и при обычной загрузке и при включении C и D пунктов :
http://yadi.sk/d/ByBZAPkYJDzWT
http://yadi.sk/d/vUzlVOinJDzWK
K: Kernel SVN r4575
K: 2 CPU detected
K: Attach Interrupt 6 Handler 8002FFF1
K: Set IDE IRQ6 return code 8005CD00
K: Dev: Optiarc DVD RW AD-5200S
K: PIO mode 00000003
K: Multiword DMA mode 00000007
K: Ultra DMA mode 0000203F
K: Primary Bus Master IDE Status Register 00000020
K: Secondary Bus Master IDE Status Register 00000060
K: Attach Interrupt 15 Handler 80031040
K: Set IDE IRQ15 return code 8005CD14
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 10:22 am
by Mario_r4
Итого: установленный обработчик IRQ15 для IDE контроллера
не вызывается совсем.
Я прописал там вывод отладочных сообщениий в:
kernel\trunk\blkdev\hd_drv.inc
Spoiler:
Code: Select all
;-----------------------------------------------------------------------------
align 4
IDE_irq_14_handler:
DEBUGF 1, "K : IDE_irq_14_handler \n"
cmp [IDE_common_irq_param], irq14_num
jne .exit
pushfd
cli
pushad
mov [IDE_common_irq_param], 0
mov dx, [IDEContrRegsBaseAddr]
; test whether it is our interrupt?
add edx, 2
in al, dx
test al, 100b
jz @f
; clear Bus Master IDE Status register
; clear Interrupt bit
out dx, al
; clear Bus Master IDE Command register
sub edx, 2
xor eax, eax
out dx, al
; read status register and remove the interrupt request
mov edx, [hdbase]
add edx, 0x7
in al, dx
popad
popfd
mov al, 1
ret
;--------------------------------------
align 4
@@:
popad
popfd
;--------------------------------------
align 4
.exit:
mov al, 0
ret
;-----------------------------------------------------------------------------
align 4
IDE_irq_15_handler:
DEBUGF 1, "K : IDE_irq_15_handler \n"
cmp [IDE_common_irq_param], irq15_num
jne .exit
pushfd
cli
pushad
mov [IDE_common_irq_param], 0
mov dx, [IDEContrRegsBaseAddr]
add dx, 8
; test whether it is our interrupt?
add edx, 2
in al, dx
test al, 100b
jz @f
; clear Bus Master IDE Status register
; clear Interrupt bit
out dx, al
; clear Bus Master IDE Command register
sub edx, 2
mov al, 0
out dx, al
; read status register and remove the interrupt request
mov edx, [hdbase]
add edx, 0x7
in al, dx
popad
popfd
mov al, 1
ret
;--------------------------------------
align 4
@@:
popad
popfd
;--------------------------------------
align 4
.exit:
mov al, 0
ret
;-----------------------------------------------------------------------------
align 4
IDE_common_irq_handler:
pushfd
cli
pushad
DEBUGF 1, "K : IDE_common_irq_handler \n"
xor ebx, ebx
mov eax, IDE_common_irq_param
DEBUGF 1, "K : [IDE_common_irq_param] %x \n", [eax]:2
mov [eax], bl
; test whether it is our interrupt?
mov dx, [IDEContrRegsBaseAddr]
add edx, 2
in al, dx
DEBUGF 1, "K : channel 1 interrupt? %x \n", eax
test al, 100b ; check channel 1 interrupt
jnz @f
add dx, 8
in al, dx
DEBUGF 1, "K : channel 2 interrupt? %x \n", eax
test al, 100b ; check channel 2 interrupt
jnz @f
DEBUGF 1, "K : IDE - no, it's not our interrupt \n"
popad
popfd
mov al, 0 ; no, it's not our interrupt
ret
;--------------------------------------
align 4
@@:
; clear Bus Master IDE Status register
; clear Interrupt bit
DEBUGF 1, "K : IDE - clear Interrupt bit \n"
out dx, al
; clear Bus Master IDE Command register
sub edx, 2
xor eax, eax
DEBUGF 1, "K : IDE - clear Bus Master IDE Command register \n"
out dx, al
; read status register and remove the interrupt request
mov edx, [hdbase]
add edx, 0x7
in al, dx
DEBUGF 1, "K : read status register and remove the interrupt request %x \n", eax
DEBUGF 1, "K : IDE - yes, this is our interrupt \n"
popad
popfd
mov al, 1 ; yes, this is our interrupt
ret
;-----------------------------------------------------------------------------
И получается контроллер IDE вроде и не при чем...
Что возвращает нас к вопросу:
Кто убил кролика Роджера?
Почему зависает при инициализации USB.
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 10:34 am
by lastar
Может все таки дело в usb драйвере . Хотя вам виднее я не программист . Как бывает в больницах врачи проводят заседания по сложным вопросам так и тут может стоит собрать разработчиков Колибри и устроить собеседование . Одна голова хорошо а две лучше .
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 1:48 pm
by CleverMouse
При чём тут IRQ15? Контроллер жёсткого диска 00:1f.1 висит на IRQ10, обработчик IRQ15 и не должен вызываться.
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 2:01 pm
by Mario_r4
CleverMouse wrote:При чём тут IRQ15? Контроллер жёсткого диска 00:1f.1 висит на IRQ10, обработчик IRQ15 и не должен вызываться.
Если посмотреть
фото, то можно увидеть, как 15 прерывание устанавливается на контроллер IDE диска, а затем согласно выводимому логу на 15 прерывание же вешается один из USB контроллеров. Тот контроллер, который повешен на IRQ10, вообще не трогается кодом работы с IDE. Получается парадокс - контроллер генерирует прерывание без какого-либо обращения к нему.
З.Ы. Сдается мне в текущей схеме, где кодом поддерживается только один контроллер проблема вообще не имеет решения.
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 2:13 pm
by CleverMouse
Mario_r4 wrote:CleverMouse wrote:При чём тут IRQ15? Контроллер жёсткого диска 00:1f.1 висит на IRQ10, обработчик IRQ15 и не должен вызываться.
Если посмотреть
фото, то можно увидеть, как 15 прерывание устанавливается на контроллер IDE диска, а затем согласно выводимому логу на 15 прерывание же вешается один из USB контроллеров. Тот контроллер, который повешен на IRQ10, вообще не трогается кодом работы с IDE. Получается парадокс - контроллер генерирует прерывание без какого-либо обращения к нему.
З.Ы. Сдается мне в текущей схеме, где кодом поддерживается только один контроллер проблема вообще не имеет решения.
Тот USB-контроллер, который вешается на IRQ15, молчит в тряпочку, зависание происходит сразу после того, как
следующий USB-контроллер - который тоже молчит в тряпочку и будет молчать как минимум 100 мс на USB-шный initial debounce, а если к нему ничего не подключено, то вообще пока не подключат что-нибудь - устанавливает свой обработчик на IRQ10 и размаскирует IRQ10. Почему вообще код контроллера IDE-диска думает, что IDE-диск всегда даёт IRQ15? Здесь он даёт IRQ10.
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 2:15 pm
by lastar
Вот тут решалась проблема работы моего контроллера в ReactOS
http://jira.reactos.org/browse/CORE-6668
Вот в этой теме похоже про это прерывание написал автор UniATA Alter :
Alter added a comment - 2012-09-17 13:14
Seems it is incorrectly handled USB Interrupt.
Infinite ISR loop happens immediately after connecting to IRQ 15 (which is shared between IDE and USB controllers)
There were no operations with IDE, those can cause and interrupt, thus, interrupt is treated as unexpected for IDE and should be passed to other handler.
Similar problem had already been observed in the past (I don't remember exact BUG ID).
---
00:1d.2 USB Controller [0c03]: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #3 [8086:27ca] (rev 01)
Subsystem: P5KPL-VM Motherboard [1043:8179]
Flags: bus master, medium devsel, latency 0, IRQ 15
I/O ports at b400 [size=1K]
Device is using IRQ 15! ISA Cards using that IRQ may fail!
Device is an Intel UHCI (USB) Controller. Turn off Legacy USB in your BIOS!
---
00:1f.1 IDE interface [0101]: Intel Corporation 82801G (ICH7 Family) IDE Controller [8086:27df] (rev 01)
Subsystem: P5KPL-VM Motherboard [1043:8179]
Flags: bus master, medium devsel, latency 0, IRQ 15
I/O ports at c080
I/O ports at c000 [size=16K]
I/O ports at 08f0
I/O ports at 08f8
I/O ports at b800 [size=2K]
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 2:20 pm
by Mario_r4
CleverMouse wrote:Почему вообще код контроллера IDE-диска думает, что IDE-диск всегда даёт IRQ15? Здесь он даёт IRQ10.
Потому что он получил это значение от BIOS, еще в Real Mode CPU
kernel\trunk\boot\bootcode.inc
Spoiler:
Code: Select all
; \begin{Mario79}
; find HDD IDE DMA PCI device
; check for PCI BIOS
mov ax, 0xB101
int 0x1A
jc .nopci
cmp edx, 'PCI '
jnz .nopci
; find PCI class code
; class 1 = mass storage
; subclass 1 = IDE controller
; a) class 1, subclass 1, programming interface 0x80
; This is a Parallel IDE Controller which uses IRQs 14 and 15.
mov ax, 0xB103
mov ecx, 1*10000h + 1*100h + 0x80
mov [es:BOOT_IDE_PI_16], cx
xor si, si ; device index = 0
int 0x1A
jnc .found_1 ; Parallel IDE Controller
; b) class 1, subclass 1, programming interface 0x8f
mov ax, 0xB103
mov ecx, 1*10000h + 1*100h + 0x8f
mov [es:BOOT_IDE_PI_16], cx
xor si, si ; device index = 0
int 0x1A
jnc .found_1
; c) class 1, subclass 1, programming interface 0x85
mov ax, 0xB103
mov ecx, 1*10000h + 1*100h + 0x85
mov [es:BOOT_IDE_PI_16], cx
xor si, si ; device index = 0
int 0x1A
jnc .found_1
; d) class 1, subclass 1, programming interface 0x8A
; This is a Parallel IDE Controller which uses IRQs 14 and 15.
mov ax, 0xB103
mov ecx, 1*10000h + 1*100h + 0x8A
mov [es:BOOT_IDE_PI_16], cx
xor si, si ; device index = 0
int 0x1A
jnc .found_1 ; Parallel IDE Controller
; Controller not found!
xor ax, ax
mov [es:BOOT_IDE_PI_16], ax
jmp .nopci
;--------------------------------------
.found_1:
; get memory base BAR4
mov ax, 0xB10A
mov di, 0x20 ; memory base is config register at 0x20
push cx
int 0x1A
jc .no_BAR4 ;.nopci
and cx, 0xFFFC ; clear address decode type
mov [es:BOOT_IDE_BASE_ADDR], cx
.no_BAR4:
pop cx
;--------------------------------------
.found:
; get Interrupt Line
mov ax, 0xB10A
mov di, 0x3c ; memory base is config register at 0x3c
push cx
int 0x1A
jc .no_Interrupt ;.nopci
mov [es:BOOT_IDE_INTERR_16], cx
.no_Interrupt:
pop cx
;--------------------------------------
; get memory base BAR0
mov ax, 0xB10A
mov di, 0x10 ; memory base is config register at 0x10
push cx
int 0x1A
jc .no_BAR0 ;.nopci
mov [es:BOOT_IDE_BAR0_16], cx
.no_BAR0:
pop cx
;--------------------------------------
; get memory base BAR1
mov ax, 0xB10A
mov di, 0x14 ; memory base is config register at 0x14
push cx
int 0x1A
jc .no_BAR1 ;.nopci
mov [es:BOOT_IDE_BAR1_16], cx
.no_BAR1:
pop cx
;--------------------------------------
; get memory base BAR2
mov ax, 0xB10A
mov di, 0x18 ; memory base is config register at 0x18
push cx
int 0x1A
jc .no_BAR2 ;.nopci
mov [es:BOOT_IDE_BAR2_16], cx
.no_BAR2:
pop cx
;--------------------------------------
; get memory base BAR3
mov ax, 0xB10A
mov di, 0x1C ; memory base is config register at 0x1c
push cx
int 0x1A
jc .no_BAR3 ;.nopci
mov [es:BOOT_IDE_BAR3_16], cx
.no_BAR3:
pop cx
;--------------------------------------
.nopci:
; \end{Mario79}
И мне почему то казалось, что прерывания после перехода в Protected Mode CPU не меняются. Если же они меняются, то мне интересно какой код это делает? Почему то у
lastar,
если отключен контроллер USB, то эта схема прокатывает, т.е. назначенный BIOS в Real Mode CPU номер прерывания не меняется после перехода в Protected Mode CPU.
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 2:24 pm
by CleverMouse
Mario_r4 wrote:CleverMouse wrote:Почему вообще код контроллера IDE-диска думает, что IDE-диск всегда даёт IRQ15? Здесь он даёт IRQ10.
Потому что он получил это значение от BIOS, еще в RealMode CPU
kernel\trunk\boot\bootcode.inc
И мне почему то казалось, что прерывания после перехода в Protected Mode CPU не меняются. Если же они меняются, то мне интересно какой код это делает? Почему то у lastar, если отключен контроллер USB, то эта схема прокатывает, т.е. назначенный BIOS в RealMode CPU номер прерывания не меняется после перехода в Protected Mode CPU.
Убедительно. Не меняются.
lastar, нужен лог от вот этой версии ядра, она показывает все PCI-устройства с точки зрения ядра.
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 2:33 pm
by lastar
все пошел на перезагрузку для теста
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 2:44 pm
by lastar
http://yadi.sk/d/6LKFaPerJExoK
http://yadi.sk/d/lqEYi_VuJEyB6
http://yadi.sk/d/tXlu9EMdJEycR
Если плохо видно и надо будет переписать в ручную лог с экрана то напишите
Вот тут решалась проблема работы моего контроллера в ReactOS
http://jira.reactos.org/browse/CORE-6668
Вот в этой теме похоже про это прерывание написал автор UniATA Alter :
Alter added a comment - 2012-09-17 13:14
Seems it is incorrectly handled USB Interrupt.
Infinite ISR loop happens immediately after connecting to IRQ 15 (which is shared between IDE and USB controllers)
There were no operations with IDE, those can cause and interrupt, thus, interrupt is treated as unexpected for IDE and should be passed to other handler.
Similar problem had already been observed in the past (I don't remember exact BUG ID).
---
00:1d.2 USB Controller [0c03]: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #3 [8086:27ca] (rev 01)
Subsystem: P5KPL-VM Motherboard [1043:8179]
Flags: bus master, medium devsel, latency 0, IRQ 15
I/O ports at b400 [size=1K]
Device is using IRQ 15! ISA Cards using that IRQ may fail!
Device is an Intel UHCI (USB) Controller. Turn off Legacy USB in your BIOS!
---
00:1f.1 IDE interface [0101]: Intel Corporation 82801G (ICH7 Family) IDE Controller [8086:27df] (rev 01)
Subsystem: P5KPL-VM Motherboard [1043:8179]
Flags: bus master, medium devsel, latency 0, IRQ 15
I/O ports at c080
I/O ports at c000 [size=16K]
I/O ports at 08f0
I/O ports at 08f8
I/O ports at b800 [size=2K]
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 3:03 pm
by lastar
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 3:11 pm
by CleverMouse
Проверь, пожалуйста, это ядро.
Re: Зависает при загрузке на реальном компьютере. Как снять
Posted: Thu Feb 20, 2014 3:39 pm
by lastar
CleverMouse Колибри загрузилась
1 BOARD лог со стандартными параметрами
http://yadi.sk/d/Py3J7WzXJFAx5
2 BOARD лог со включенным пунктом D
http://yadi.sk/d/G8p4QAW0JFAxb и скриншоты со включенным пунктом D
http://yadi.sk/d/K6cVZL0pJFBhK http://yadi.sk/d/bUea-bYQJFBjP http://yadi.sk/d/TXz9KMX2JFBmm
В чем же была проблема ?