LINUX.ORG.RU

ixp422 mm corruption


0

1

Вторая недели бесполезной возни с железкой.

Сабж. одноплатка EM-436B v2.1

CPU: XScale-IXP42x Family rev 2 (v5b), 266МГц (на корпусе нацарапано «PRIXP422ABB»)
RAM: 4x256Мбит = 128мегабайт (самсунги K4S561632H-UC75)
PCI-контроллер Promise PDC20275, на который навешан CompactFlash и всякий прочий эзернет.

Ничего вроде бы особенного, вот только объявились проблемы со старосборным ядром 2.6.20, без проблем работающим на ixp425 (ланнеровская железка FW-3600 A/B). Аппаратная разница по идее не настолько велика, чтоб всё дошло до несовместимости, но стойкое (100%) появление «Unable to handle kernel NULL pointer dereference at virtual address такой-то» при попытке ядра распаковать initrd приводило в уныние.

Дабы не гадать на тему бажности старого ядра и собственной косорукости при его давней сборке, я быстренько взял имеющееся под рукой 2.6.35.7, собрал его со страшной силой и максимально дефолтным конфигом. Ну и затеял грузить его с простейшим initrd, размером менее мегабайта, тоже быстро слепленным в тестовых целях.

Наконец, удалось получить шелл. Но радость была преждевременна. При самый осторожных движениях и безобидных командах валились ядерные ошибки при доступе памяти. Вызов ps мог повалить ядро. Или cat /proc/что-то_там. Ну а dd if=/dev/zero of=/tmp/file bs=1M count=16 убивало девайс стопроцентно (/tmp - это tmpfs).

Причём всегда в бектрейсе фигурировали функции kmem_cache_(alloc|free) и прочие из той же оперы. Принципиально ошибки в логе были теми же самыми, что и при запуске 2.6.20, собранного торвальдс знает когда.

Причём на ixp425(FW-3600) и старая (что давно отлажено) и новые (тестовые) сборки запускаются и работают без каких-либо проблем. Правда, на ixp425 имеем 64M рамы, а здесь на ixp422 аж 128. Причём redboot определяет 256, так что ядру приходится указывать реальный размер. Впрочем, с ограничениями по размеру я как только не экспериментировал - принципиальной разницы не наблюдается. Только DMA на CF то работает, то нет.

Вариант с запуском сборки наисвежайшего 2.6.37.2 также ничего не изменил. Разве только что вместо NULL pointer валит что-нибудь вроде

# dd if=/dev/zero of=/tmp/0 bs=1M count=16
Kernel panic - not syncing: Attempted to kill init!
[<c0032e94>] (unwind_backtrace+0x0/0xf0) from [<c02a27b4>] (panic+0x58/0x17c)
[<c02a27b4>] (panic+0x58/0x17c) from [<c0041f0c>] (do_exit+0x6c/0x60c)
[<c0041f0c>] (do_exit+0x6c/0x60c) from [<c0042538>] (do_group_exit+0x8c/0xc0)
[<c0042538>] (do_group_exit+0x8c/0xc0) from [<c004c2fc>] (get_signal_to_deliver+0x2d8/0x310)
[<c004c2fc>] (get_signal_to_deliver+0x2d8/0x310) from [<c002fd80>] (do_signal+0x50/0x5a8)
[<c002fd80>] (do_signal+0x50/0x5a8) from [<c00302f0>] (do_notify_resume+0x18/0x4c)
[<c00302f0>] (do_notify_resume+0x18/0x4c) from [<c002d694>] (work_pending+0x24/0x28)

и благополучно переходит в состояние агонии: не даёт запустить апплеты бизибокса (permission denied), а прямой вызов вроде /bin/busybox ls выдаёт какоё-нибудь sigsegv.

В общем налицо неверная работа ядра с памятью. Причём на другой похожей одноплатке (v2.0, а не 2.1) проблемы полностью аналогичны.

Изгалялся я всячески, крутил и вертел параметры, понавключал дебагги везде и всюду. Причём ядро то успевало ругнуться дебаггом аллокатора на «перезаписывание паддинга» или «нарушение Redzone», то благополучно валилось в exception со своими проклятыми пойнтерами.

Пример бэктрейса приведу.

Уже немного отчаялся и помышляю писать куда-нибудь в Спортлото кернелтрап, но сначала спрошу здесь: есть у кого мысли какие-нибудь?

Грешить на неверную инициализцию железа редбутом? Так ядро всё равно всё с нуля делает.
Что я криво что-то собрал? Перепробованы 3 версии ядра с разными конфигами. Не работает на ixp422, но работает на 425.
Сколько было соображений - все перепробовал - толку нет.

I need help!

Пример бектрейса

# dd if=/dev/zero of=/tmp/0 bs=1M count=16
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c7018000
[00000000] *pgd=07fb9031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
last sysfs file: /sys/devices/virtual/mtd/mtd2ro/dev
Modules linked in:
CPU: 0    Not tainted  (2.6.35.7-00020-g73e4db1-dirty #25)
PC is at fget_light+0x4c/0xb4
LR is at sys_read+0x14/0x68
pc : [<c00ad214>]    lr : [<c00acdd8>]    psr: 80000013
sp : c7fbbf78  ip : 00000000  fp : be869c4c
r10: 00000000  r9 : c7fba000  r8 : c0027f48
r7 : 00000003  r6 : 00100000  r5 : 40237008  r4 : 00000000
r3 : 00000000  r2 : 00000000  r1 : c7fbbf8c  r0 : 00000000
Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 000039ff  Table: 07018000  DAC: 00000015
Process dd (pid: 928, stack limit = 0xc7fba270)
Stack: (0xc7fbbf78 to 0xc7fbc000)
bf60:                                                       00000000 c00acdd8
bf80: 00000000 40237008 00100000 00000000 00000000 00000000 00000000 c0027f48
bfa0: c7fba000 c0027da0 00000000 00000000 00000000 40237008 00100000 00000010
bfc0: 00000000 00000000 00000000 00000003 00000000 00000000 40024fb0 be869c4c
bfe0: 00000000 be869c30 00013944 401bee7c 40000010 00000000 aaaaaaaa aaaaaaaa
[<c00ad214>] (fget_light+0x4c/0xb4) from [<c00acdd8>] (sys_read+0x14/0x68)
[<c00acdd8>] (sys_read+0x14/0x68) from [<c0027da0>] (ret_fast_syscall+0x0/0x2c)
Code: e5933004 e7930100 e8bd8010 e5933004 (e5932000) 
---[ end trace 4b819bf8948ddba0 ]---
Unable to handle kernel NULL pointer dereference at virtual address 00000004
pgd = c0004000
[00000004] *pgd=00000000
Internal error: Oops: 17 [#2]
last sysfs file: /sys/devices/virtual/mtd/mtd2ro/dev
Modules linked in:
CPU: 0    Tainted: G      D      (2.6.35.7-00020-g73e4db1-dirty #25)
PC is at kmem_cache_free+0x44/0xc4
LR is at unlink_anon_vmas+0x74/0x98
pc : [<c00a8b78>]    lr : [<c009df28>]    psr: 40000093
sp : c7fbbd10  ip : fffffff8  fp : 00000000
r10: 00008000  r9 : c7fb4990  r8 : 00100100
r7 : 00200200  r6 : c009df28  r5 : 40000013  r4 : c7fce4c8
r3 : 00000000  r2 : 400000c2  r1 : c411f8f8  r0 : c7c01400
Flags: nZcv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 000039ff  Table: 07018000  DAC: 00000015
Process dd (pid: 928, stack limit = 0xc7fba270)
Stack: (0xc7fbbd10 to 0xc7fbc000)
bd00:                                     c7fce4c8 c7fb43e8 c7fb43f0 c009df28
bd20: c7fb43b8 00000000 00001000 c03c10bc c7fb4440 c0097bdc c03c10bc c7fb4440
.......................................................
bfc0: 00000000 00000000 00000000 00000003 00000000 00000000 40024fb0 be869c4c
bfe0: 00000000 be869c30 00013944 401bee7c 40000010 00000000 aaaaaaaa aaaaaaaa
[<c00a8b78>] (kmem_cache_free+0x44/0xc4) from [<c009df28>] (unlink_anon_vmas+0x74/0x98)
[<c009df28>] (unlink_anon_vmas+0x74/0x98) from [<c0097bdc>] (free_pgtables+0x3c/0x9c)
[<c0097bdc>] (free_pgtables+0x3c/0x9c) from [<c0099840>] (exit_mmap+0xd0/0x138)
[<c0099840>] (exit_mmap+0xd0/0x138) from [<c003e36c>] (mmput+0x38/0xc8)
[<c003e36c>] (mmput+0x38/0xc8) from [<c0041ae0>] (exit_mm+0xf0/0xf8)
[<c0041ae0>] (exit_mm+0xf0/0xf8) from [<c0043224>] (do_exit+0x188/0x5fc)
[<c0043224>] (do_exit+0x188/0x5fc) from [<c002b630>] (die+0x264/0x2a4)
[<c002b630>] (die+0x264/0x2a4) from [<c002e55c>] (__do_kernel_fault+0x64/0x88)
[<c002e55c>] (__do_kernel_fault+0x64/0x88) from [<c002e74c>] (do_page_fault+0x1cc/0x1e0)
[<c002e74c>] (do_page_fault+0x1cc/0x1e0) from [<c0027254>] (do_DataAbort+0x34/0x94)
[<c0027254>] (do_DataAbort+0x34/0x94) from [<c00279ac>] (__dabt_svc+0x4c/0x60)
Exception stack(0xc7fbbf30 to 0xc7fbbf78)
bf20:                                     00000000 c7fbbf8c 00000000 00000000
bf40: 00000000 40237008 00100000 00000003 c0027f48 c7fba000 00000000 be869c4c
bf60: 00000000 c7fbbf78 c00acdd8 c00ad214 80000013 ffffffff
[<c00279ac>] (__dabt_svc+0x4c/0x60) from [<c00ad214>] (fget_light+0x4c/0xb4)
[<c00ad214>] (fget_light+0x4c/0xb4) from [<c00acdd8>] (sys_read+0x14/0x68)
[<c00acdd8>] (sys_read+0x14/0x68) from [<c0027da0>] (ret_fast_syscall+0x0/0x2c)
Code: e10f5000 e3853080 e121f003 e5903000 (e5932004) 
---[ end trace 4b819bf8948ddba1 ]---
Fixing recursive fault but reboot is needed!
.................................................
farisey
() автор топика
Ответ на: Пример бектрейса от farisey

Comment: Пример бектрейса

Там где длинные многоточия: в первом случае поскипана бОльшая часть дампа стека (остались только края) - нет смысла имхо волочить набор хексов. Ну и там подобного дампа ещё ниже хватает, но он принципиально таков же.

farisey
() автор топика

В первую очередь рекомендую изучить даташиты по обоим платам, в первую очередь обратить внимание на организацию адресного пространства.

По каким адресам располагаются порты, как организован доступ к оперативной памяти. У каждой борды могут быть довольно большие различия друг от друга.

tamerlan311
()
Ответ на: комментарий от tamerlan311

Если б ещё даташит по 422 был, то вообще всё было б много проще. Но его нет. В общем тишина, что и следовало ожидать от местной публики. Жаль:-/

farisey
() автор топика

1) Смотри memory map, которую исполльзует ядро. Возможно, что-то изменилось

2) Смотри, как загрузчик/ядро иницализируют контроллер DRAM (если вообще инициализируют)

3) Напиши свой мемори-тест и погоняй его до загрузчика, после загрузчика, и в самом начале загрузки ядра.

anonymous
()
Ответ на: комментарий от anonymous

> 1) Смотри memory map, которую исполльзует ядро. Возможно, что-то изменилось

memory map для ixp422 и ixp425 одинаковы.

2) Смотри, как загрузчик/ядро иницализируют контроллер DRAM (если вообще инициализируют)

Сильно сомневаюсь, что без рабочего контроллера ядро бы распаковалось, запустилось, зацепило компакт-флеш и отдало шелл. Валится только на активных операциях kmem_cache.

3) Напиши свой мемори-тест и погоняй его до загрузчика, после загрузчика, и в самом начале загрузки ядра.

вот как раз обдумывал что такой тест должен делать. Хотя на 99% уверен, что поведение ядра не изменится. Просто data abort будет выскакивать при некотором доступе к памяти. Свет на причины это вряд ли прольёт. Но согласен, что это единственное, что приходит в голову.

farisey
() автор топика
Ответ на: комментарий от Puzan

>> Если б ещё даташит по 422 был

У меня их есть.

Полезный про отличия в работе с памятью между 422 и 425 или просто полумаркетинговый pdf'ник со списком фич и набором красивых диаграмм? Такого добра и у меня хватает:(

farisey
() автор топика
Ответ на: комментарий от anonymous

> Мануал гуглится за минуту. ТС, видимо, сильно ленивый

какой мануал? может пруфлинк? или имеется в виду руководство для анонимусов по киданию понтов и какашек? Спасибо, конечно, но думаю перебьюсь как-нить...

farisey
() автор топика
Ответ на: комментарий от farisey

http://www.cse.unsw.edu.au /~cs9242/10/doc/ ixp42x_dev_man.pdf

или имеется в виду руководство для анонимусов по киданию понтов и какашек?

Я тебя тоже очень сильно люблю. Но гуглом не уметь пользовться - это таки слишком ;)

anonymous
()
Ответ на: комментарий от farisey

> Сильно сомневаюсь, что без рабочего контроллера ядро бы распаковалось, запустилось, зацепило компакт-флеш и отдало шелл. Валится только на активных операциях kmem_cache.

Ты вообще представляешь, что такое ошибки при работе с памятью и чем они могут быть вызванны?

вот как раз обдумывал что такой тест должен делать. Хотя на 99% уверен, что поведение ядра не изменится. Просто data abort будет выскакивать при некотором доступе к памяти. Свет на причины это вряд ли прольёт. Но согласен, что это единственное, что приходит в голову.

Очевидно, сначала писать, а потом в/из память/и

1) Тебе нужно убедиться, что все банки работают, доступны, и нигде нет ошибок. Проверить паттерны 0xaaaaaaaa 0x55555555 0xff00ff00 0xffff0000 0xaa55aa55 0x55aa55aa 0x5555aaaa 0xaaaa5555 0xffffffff 0x00000000 + плюс какие-нибудь псевдорандомные.

Если всё будет работать - можешь начинать дебажить платформо-специфичные драйвера (начать с тех, которые активно работают с DMA)

2) Если у тебя есть шелл и ядро хоть как-то шевелится - попробуй запустить nbench bytemark. Нельзя исключать, что у тебя просто «кривой» код - например, слишком новый компайлер или просто так «повезло», что процессор сбоит на некоторых операциях.

anonymous
()
Ответ на: комментарий от farisey

Полезный про отличия в работе с памятью между 422 и 425

Отличий в работе с памятью между 422 и 425 нет. Это тебе подсказка, если самому лень почитать мануал.

Puzan ★★★★★
()
Ответ на: комментарий от farisey

И вообще, при поиске причин нужно, таки, применять системный подход, а не «изгаляться я всячески, крутить и вертеть параметры». Для начала убедиться, что железо работоспособно. Можно, например, проверить ядро на аналогичной железке.

Puzan ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.