LINUX.ORG.RU

Undefined instruction на свежесобраном ядре cubieboard

 , ,


0

2

Добрый день!

Благодаря хорошим людям с форума у меня наконец есть UART и возможность посмотреть почему у меня не запускается самосборное Mainline ядро.

Смотрю я в консоль и вижу следующее:

U-Boot 2014.01-rc1-00878-gaf9f405 (Feb 07 2014 - 05:41:43) Allwinner Technology

CPU:   Allwinner A10 (SUN4I)
Board: Cubieboard
I2C:   ready
DRAM:  1 GiB
MMC:   SUNXI SD/MMC: 0
In:    serial
Out:   serial
Err:   serial
Net:   emac
Hit any key to stop autoboot:  0 
264 bytes read in 15 ms (16.6 KiB/s)
Loaded environment from uEnv.txt
256 bytes read in 10 ms (24.4 KiB/s)
Jumping to boot.scr
## Executing script at 44000000
43724 bytes read in 15 ms (2.8 MiB/s)
4221392 bytes read in 209 ms (19.3 MiB/s)
## Booting kernel from Legacy Image at 48000000 ...
   Image Name:   Linux-5.4.6
   Created:      2019-12-22   7:21:53 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4221328 Bytes = 4 MiB
   Load Address: 48000000
   Entry Point:  48000000
   Verifying Checksum ... OK
   XIP Kernel Image ... OK

Starting kernel ...

undefined instruction
pc : [<48000028>]	   lr : [<7ff8841c>]
sp : 7fe67b88  ip : 0000000c	 fp : 7ffb94a4
r10: 7ffb8dc0  r9 : 7fe67f40	 r8 : 7fe69d54
r7 : 00000000  r6 : 48000000	 r5 : 7ffb94a4  r4 : 00000000
r3 : 7fe67fe0  r2 : 40000100	 r1 : 00001008  r0 : 7fe67fe0
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...

resetting ...

И далее по кругу.

Есть подозренее что собираю я не под ту архитектуру, хотя все шаги делал по Wiki. Кросс-компилятор видимо из реп:

Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabihf/8/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 8.3.0-2' --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-multiarch --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --includedir=/usr/arm-linux-gnueabihf/include
Thread model: posix
gcc version 8.3.0 (Debian 8.3.0-2) 

Как бы мне узать, для какой платформы я сгенерировал код ядра? Спасибо!

упрощенно воспользуйся командой

file файл_ядра

$ file /boot/vmlinuz-5.4.0-gentoo
/boot/vmlinuz-5.4.0-gentoo: Linux kernel x86 boot executable bzImage, version 5.4.0-gentoo (root@locahost) #4 SMP Sun Dec 1 10:02:21 +01 2019, RO-rootFS, swap_dev 0x5, Normal VGA

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

https://www.debian.org/releases/stretch/armhf/ch02s01.html.ru
The armmp kernel supports several development boards and embedded systems based on the Allwinner A10 (architecture codename «sun4i»)
Гугль находит такую магию:

git clone git://github.com/linux-sunxi/linux-sunxi.git
cd linux-sunxi
Первые две может быть уже и не надо, если ванильное уже полностью поддерживает. Дальше кросс, возможно у тебя как-то по другому.
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sun4i_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules
arch/arm/boot/uImage <-- здесь возможно будет лежать готовое ядро
Установка модулей:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=куда modules_install

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

pc : [<48000028>]

Это всё ещё ассемблер. Натрави objdump на vmlinux и запости сюда что по этому адресу находится

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

Ух, не так то это просто оказалось.

Если посмотреть что это вообще за uImage используя binwalk то можно увидеть следующее:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             uImage header, header size: 64 bytes, header CRC: 0xCC8D4669, created: 2019-12-22 10:21:24, image size: 3832480 bytes, Data Address: 0x48000000, Entry Point: 0x48000000, data CRC: 0xFEBDF2FB, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "Linux-5.4.6"
64            0x40            Linux kernel ARM boot executable zImage (little-endian)
2528          0x9E0           device tree image (dtb)
14972         0x3A7C          device tree image (dtb)
22400         0x5780          device tree image (dtb)
26691         0x6843          gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)

Предполагаю что мне нужна вторая секция, или последняя.

Если достать первую и посмотреть что там по смещению 28 то будет вот это:

 > arm-linux-gnueabihf-objdump -D -b binary -marm uImage_part | grep " 28:"
  28:   00000000        andeq   r0, r0, r0

А вот если достать данные из последней секции то будет следующее:

 > arm-linux-gnueabihf-objdump -D -b binary -marm uImage_data | grep " 28:"
      28:       e12ef30e        msr     ELR_hyp, lr

Не знаю точно на чем из этого фейл, попробую вникнуть что за опкоды там в этих двух случаях, и когда они появились.

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

Забей на andeq - это ты попытался диссассемблировать данные (0x0) которые совпадают с ореолом andeq.

Для спавки, andeq это условная инструкция and которая будет выполняться если ранее полученное условие дало код eq

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

msr ELR_hyp, lr

Вот это интересно - ядро пытается перейти из режима гипервизора (hyp) в режим супервизора (sv), т.е. даунгред уровня привелегий. Этот код там со времен поддержки kvm, так что если действительно валится на этой инструкции, то возможно бутлоадер что-то недокофигурировал

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

Понял, у меня там uboot стоит старый, с того же образа который содержал кастомное ядро версии 3.4. Наверное надо не только образ ядра собирать, но и загрузчик сразу новый. Займусь этим.

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

это штатный кросс-префикс генту. у дебиана вроде тот что Вами указан, НО только hardfloat.

и да, ядро 3.4 умерло. не надо его использовать. есть мейнлайн где все должно работать.

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

KVM в 3.9 добавили. Вангую что бутлоадер «отпускает» ядро в secure mode, а там, как известно, hyp неопеределен.

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

ну в любом случае надо первым делом обновить ядро до мейнлайна.

Да и ядро товарищ вроде использует родное для данного загрузчика..

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

Да, верно.

Ядро я взял свежнее. Правда собирал я именно uImage а не zImage как следовало делать по доке, из целей совместимости с текущим древним(2014.1) u-boot’ом. По хорошему то надо как там и описано собирать zImage и обновлять загрузчик, но мне такое не под силу.

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

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

а адреса для загрузки указаны верно?

там для uImage вроде как задается в явном виде адрес.

был бы дома Cubie мог бы поразвлечься собрать образ )

но есть только odroid-c и малинки 3 и 4

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

возьмите sd с archlinuxarm сделайте, там загрузчик свежий относительно. когда будет грузиться уже можно изучать дальше.

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