Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Я пишу, а точнее переношу драйвер под IDE-контроллер (ядро 2.4) с платформы х86 на спарковую машину. Драйвер под PCI-шину уже есть и нормально работает. Под 2.4 отдельного драйвера для моего контроллера (Promise 133tx2) нет. Он (драйвер) входит в общий драйвер для IDE-интерфейса (который поддерживает и поиск контроллера на PCI-шине) и вызывает, как свою чатсь, драйвер для контроллера.

Вопрос вот какой.

Вот печати инициализации драйвера (выводятся в консоли):

Uniform Multi-Platform E-IDE driver Revision: 6.31

ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx

PDC20269: IDE controller on PCI bus 00 dev 28

PDC20269: chipset revision 2

PDC20269: not 100% native mode: will probe irqs later

И это есть всё правильно и нормально. Контроллер найден и дальше IDE-драйвер пробует передать управление процедуре инициализации моего контроллера (его части: драйверу контроллера). И на этом самом месте процесс убивается ядром вот с такими матюгами:

Unable to handle kernel paging request at virtual address 02000000

tsk->{mm,active_mm}->context = 000002ca

tsk->{mm,active_mm}->pgd = fc079400

\|/ ____ \|/

"@'/ ,. \`@"

/_| \__/ |_\

\__U_/

insmod(732): Oops

PSR: 418000c1 PC: ff44dfc8 NPC: ff44dfcc Y: 00000000 Not tainted

g0: f22d5000 g1: 41800fe0 g2: 00000001 g3: 41400fe1 g4: f002d2b8 g5: 53545556 g6: f2220000 g7: 00000000

o0: ff451000 o1: 000015c1 o2: f020ac00 o3: 000015c2 o4: 00004000 o5: f020ac00 sp: f2221b40 o7: f002d1b8

l0: f01b8400 l1: f02068fe l2: 02000520 l3: f020ac00 l4: f01b86a4 l5: f01b83e0 l6: f2220000 l7: f37313e0

i0: f053a800 i1: ff44fd30 i2: ff44dfbc i3: f01b86ac i4: 00004000 i5: f020ac00 fp: f2221bb0 i7: ff44a650

Caller[ff44a650]

Caller[ff44b004]

Caller[ff44b044]

Caller[ff447d44]

Caller[ff447d58]

Caller[ff448358]

Caller[ff448428]

Caller[f002e308]

Caller[f00113b8]

Caller[000378b0]

Instruction DUMP: 9de3bf90 e40620d4 113fd144 <e80ca01f> 90122368 e60ca01a a2100014 e00ca01b 7c2f7c13

Что это такое? И как с этим можно справиться?

Опубликовано

Сдается мне, что в процедуре инициализации драйвер лезет куда не надо в память, вот ядро и матерится. Впрочем, я не уверен. Может исходничек процедуры сюда, хотя бы частично? Или это закрытый проект?

Опубликовано

Да нет, какой закрытый. Линух же всё-таки. К тому же этот кусочек - стандартный драйвер для 2.4

Вот он (выдаю только значащие строки):

Есть файл ide.c, он, собственно, всем заправляет. В том числе и файлом ide-pci.c, который ищет устройства на PCI-шине.

Но он в данном случае скорее всего верно работает. Тем не менее, вид всё это имеет такой:

В ide-pci.c опеределены такие штуки:

extern unsigned int pci_init_pdc202xx(struct pci_dev *, const char *); (це процедура инифиализации драйвера самого контроллера, именно на вызове её всё, как мне представляется, и сыпется)

extern unsigned int ata66_pdc202xx(ide_hwif_t *); (это прочие прибамбасы, связанные с заданием парметров DMA и самого жесткого диска - см. ниже строчкой)

extern void ide_init_pdc202xx(ide_hwif_t *);

#define PCI_PDC202XX &pci_init_pdc202xx (это макросы соответственно)

#define ATA66_PDC202XX &ata66_pdc202xx

#define INIT_PDC202XX &ide_init_pdc202xx

...

#define DEVID_PDC20269 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20269})

Далее, есть typedef^

typedef struct ide_pci_device_s {

ide_pci_devid_t devid;

char *name;

unsigned int (*init_chipset)(struct pci_dev *dev, const char *name);

unsigned int (*ata66_check)(ide_hwif_t *hwif);

void (*init_hwif)(ide_hwif_t *hwif);

void (*dma_init)(ide_hwif_t *hwif, unsigned long dmabase);

ide_pci_enablebit_t enablebits[2];

byte bootable;

unsigned int extra;

} ide_pci_device_t;

и структура, вот нужный из неё кусок:

static ide_pci_device_t ide_pci_chipsets[] __initdata = {

...

{DEVID_PDC20269,"PDC20269", PCI_PDC202XX, ATA66_PDC202XX, INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, 16 },

...

}

Это, собственно, параметры инициализации контроллера в случае его нахождения на шине.

Далее, есть процедурка, которая делает следующее:

ide_pci_device_t *d

...

pciirq = (d->init_chipset) ? d->init_chipset(dev, d->name) : ide_special_settings(dev, d->name);

*d, естественно, указывает на наш кусок структуры, который выше описан. То есть, как видно, последняя строка кода вызвает процедуру pci_init_pdc202xx (она находится в файле pdc202xx.c) и на неё и засыпается. И эта процедура есть процедура инициализации дравера контроллера Promise Ultra133 tx2.

Вот такая примерно схема. Очень буду признателен любым идеям. Smile

Опубликовано

То есть, он выводит, что "not 100% native mode, will probe irqs later", а к установке портов уже не переходит? Да, хотел посоветовать проверить указатель на d, потом дошло, что раз он выводит d->name, то указатель нормальный. Бум думать... =)

Кстати, такой вопрос: а что такое tsk->{mm,active_mm} и tsk->{mm,active_mm}? Что-то линуховое, связанное с памятью, или конкретно в ide*.c?

З.Ы. Самому интересно теперь стало... =)

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...