Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Dec 2015 11:51:07 +0100
From:      Sylvain Garrigues <sylgar@gmail.com>
To:        Tim Kientzle <tim@kientzle.com>
Cc:        freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Re: Booting the ELF kernel without ubldr on Raspberry Pi
Message-ID:  <8F62699C-126D-492D-8B7E-8C250ED5BC07@gmail.com>
In-Reply-To: <32849B9F-C7B8-4A86-B8F1-043F62D2E64C@kientzle.com>
References:  <C6819C94-DF61-447F-AC61-FD3E061A6F76@gmail.com> <32849B9F-C7B8-4A86-B8F1-043F62D2E64C@kientzle.com>

next in thread | previous in thread | raw e-mail | index | archive | help
If I look at what gonzo did for VERSATILEPB, I think it can be done =
easily by writing a tiny assembly code that does something like what he =
did:

# set r0..r3 to zero
    /usr/bin/printf "\0\0\240\343" > ${WORKDIR}/first_commands
    /usr/bin/printf "\0\020\240\343" >> ${WORKDIR}/first_commands
    /usr/bin/printf "\0\040\240\343" >> ${WORKDIR}/first_commands
    /usr/bin/printf "\0\060\240\343" >> ${WORKDIR}/first_commands
   =20
# jump to kernel entry point
    /usr/bin/printf "\001\366\240\343" >> ${WORKDIR}/first_commands
   =20
# install kernel
    [ ! -d ${WORKDIR}/_.kernel.bin ] && mkdir ${WORKDIR}/_.kernel.bin
    board_default_installkernel ${WORKDIR}/_.kernel.bin

    dd of=3D$VERSATILEPB_FLASH bs=3D1M count=3D4 if=3D/dev/zero
    dd of=3D$VERSATILEPB_FLASH bs=3D1 conv=3Dnotrunc =
if=3D${WORKDIR}/first_commands
    dd of=3D$VERSATILEPB_FLASH bs=3D64k oseek=3D15 conv=3Dnotrunc =
if=3D${WORKDIR}/_.kernel.bin/boot/kernel/kernel.bin

The only problem for the Raspberry pi is that, if I am correct, the DTB =
is modified by the firmware (bootcode.bin) so I can=E2=80=99t statically =
compile the DTB in the kernel like for VERSATILEPB :( I would need to =
mimic what loader does and create a kernel environment variable which =
contains the address to the DTB.

This is a good exercice, but it doesn=E2=80=99t solve my project which =
is to:

1/ have a self-extracting kernel or have a loader which uncompress the =
kernel, so that it takes much less time to start (my benchmark is =
raspbian or openelec).=20
=3D=3D> I compiled ubldr with LOADER_GZIP_SUPPORT and compressed kernel =
to kernel.gz, reducing the size by 2. The loader does manage to load, =
uncompress and boot the kernel.gz, but the loading time is worse than =
when uncompressed, so I=E2=80=99m stuck I don=E2=80=99t know what=E2=80=99=
s wrong?

2/ have the bootloader / kernel display a nice splash screen while the =
kernel boots
=3D=3D> for that I looked at u-boot splash screen but the quality of the =
rendering is too poor (8-bit bitmap). I looked at the VT frame buffer =
but the slash screen feature is also limited. So I might now look into =
the misc/raspberrypi-userland port and understand how the hello_jpeg =
sample code does that with the GPU, then I plan to port it in the kernel =
initialization code, not sure it=E2=80=99s going to work)=20

Have a good day

> Le 24 d=C3=A9c. 2015 =C3=A0 07:18, Tim Kientzle <tim@kientzle.com> a =
=C3=A9crit :
>=20
> Actually, it would be more interesting to go a step further and boot =
the FreeBSD kernel directly from the firmware, bypassing both U-Boot and =
ubldr.
>=20
> Warner did some work long ago to allow the FreeBSD kernel to boot from =
a Linux boot loader, which should make this possible.  You might try =
looking at that code and seeing if you can get it to work.
>=20
> Cheers,
>=20
> Tim
>=20
>=20
>> On Dec 21, 2015, at 7:48 PM, Sylvain Garrigues <sylgar@gmail.com =
<mailto:sylgar@gmail.com>> wrote:
>>=20
>> Hello,
>>=20
>> I=E2=80=99d like to boot FreeBSD directly with u-boot, without ubldr, =
using an image provided by the u-boot mkimage tool. The reason is =
simple: mkimage can deal with compressed kernels and will therefore =
speed my boot time. And I want to try it anyway, as it seems possible =
reading =
http://bsdcan.org/2008/schedule/attachments/49_2008_uboot_freebsd.pdf =
<http://bsdcan.org/2008/schedule/attachments/49_2008_uboot_freebsd.pdf><ht=
tp://bsdcan.org/2008/schedule/attachments/49_2008_uboot_freebsd.pdf =
<http://bsdcan.org/2008/schedule/attachments/49_2008_uboot_freebsd.pdf>>; =
and various other=20
>>=20
>> Before going there and using an mkimage, I=E2=80=99d like to boot the =
kernel image just with the same bootelf version provided by the =
sysutils/u-boot-rpi2 port. It doesn=E2=80=99t display anything and =
crashes (I think I can see =C2=AB illegal instruction =C2=BB just before =
the board reboots). I don=E2=80=99t understand why, and this is my first =
question.
>>=20
>> Then I looked at the mkimage utility, although we can specify and =
freebsd kernel type through the -O flag, the bootm command only =
understands linux and NetBSD. I guess I should use linux there?
>>=20
>> Thanks for your help,
>> Sylvain
>>=20
>>=20
>> PS: FYI, below is:
>>=20
>> 1/ info about my kernel (I can see the entry point is at 0xc0100100), =
copied into the fat partition
>>=20
>> # readelf -h =
/root/crochet/work/obj/arm.armv6/root/crochet/src/sys/RPI2/kernel        =
                 =20
>> ELF Header:
>> Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00=20
>> Class:                             ELF32
>> Data:                              2's complement, little endian
>> Version:                           1 (current)
>> OS/ABI:                            UNIX - System V
>> ABI Version:                       0
>> Type:                              EXEC (Executable file)
>> Machine:                           ARM
>> Version:                           0x1
>> Entry point address:               0xc0100100
>> Start of program headers:          52 (bytes into file)
>> Start of section headers:          6235080 (bytes into file)
>> Flags:                             0x5000202, has entry point, =
Version5 EABI, <unknown>
>> Size of this header:               52 (bytes)
>> Size of program headers:           32 (bytes)
>> Number of program headers:         6
>> Size of section headers:           40 (bytes)
>> Number of section headers:         38
>> Section header string table index: 35
>> [root@clad /usr/ports/sysutils/u-boot-rpi2]# =20
>>=20
>> 2/ the interesting part of my include/configs/rpi-common.h from =
u-boot:
>>=20
>> #define CONFIG_EXTRA_ENV_SETTINGS \
>>       ENV_DEVICE_SETTINGS \
>>       "loadaddr=3D0x02000000\0" \
>>       "Fatboot=3D" \
>>         "env exists loaderdev || env set loaderdev ${fatdev}; " \
>>         "echo Booting from: ${fatdev} ${bootfile}; " \
>>         "fatload ${fatdev} ${loadaddr} ${bootfile} && bootelf =
${loadaddr}; " \
>>       "\0" \
>>       "preboot=3D" \
>>         "fdt addr 0x100; " \
>>         "env set bootfile kernel; " \ =20
>>         "env set fatdev 'mmc 0'; " \
>>       "\0"
>> #undef  CONFIG_BOOTCOMMAND
>> #define CONFIG_BOOTCOMMAND     "run Fatboot"
>> #undef  CONFIG_PREBOOT
>> #define CONFIG_PREBOOT         "run preboot"
>> _______________________________________________
>> freebsd-arm@freebsd.org <mailto:freebsd-arm@freebsd.org> mailing list
>> https://lists.freebsd.org/mailman/listinfo/freebsd-arm =
<https://lists.freebsd.org/mailman/listinfo/freebsd-arm>;
>> To unsubscribe, send any mail to "freebsd-arm-unsubscribe@freebsd.org =
<mailto:freebsd-arm-unsubscribe@freebsd.org>"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8F62699C-126D-492D-8B7E-8C250ED5BC07>