tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

armv6 on QEMU (was Re: armv6 support for rust)

In a previous message I replied that I wondered if a GENERIC armv6
kernel / image could exist (in the original message, for the purposes of
building a armv6 rust version).  By default it is not made, but it
appears that it is possible to create one manually that functions with

1) Build the earmv6hf release.  You will need to do this to get the TOOL
chain.  You can probably just build the tools if you like and pull the
rest of the parts from precompiled images.  The goal is to create a
image that will be bootable with UEFI and contains a armv6 kernel and
armv6 userland binaries.

2) Assuming your source tree is in /usr/src.  Create
/usr/src/sys/arch/evbarm/conf/GENERICV6 that contains the following:

include "arch/evbarm/conf/GENERIC"

makeoptions     CPUFLAGS="-mcpu=cortex-a7 -mfpu=neon"

3) set your $PATH to have the TOOL chain for earmv6hf first and do this
to build the GENERICV6 kernel using the earmv6hf tools:

nbconfig GENERICV6
cd ../compile/GENERICV6
nbmake-evbarm depend && nbmake-evbarm

If everything worked as expected you will have a netbsd kernel built
with the desired tools.

4) Pull a copy down of the armv7.img.gz or build the earmv7hf release.

5) Pull down a copy of rpi.img.gz or use the one from your earmv6hf
build if you did a full release.

6) There are a couple of ways to proceed at this point..  if you can get
the FFS mounted from the armv7.img and rpi.img images you can create the
needed parts from those (I was not able to do this from a amd64 box,
BTW, but YMMV).  If that doesn't work for whatever reason, create a
image with a MSDOS MBR on it that has a 80MB 32bit FAT and a FFS format
1 filesystem for the rest of the disk (newfs -O1 ....).  Don't forget to
put a MBR on it with fdisk and make the MS-DOS filesystem active.

7) What you will want to create is a image with the following in it:

On the MS-DOS filesystem:
mkdir -p EFI/BOOT
copy to EFI/BOOT the bootarm.efi from the MSDOS filesystem from armv7.img

On the FFS:
Put the entire contents of the FFS from rpi.img or the entire contents
from a earmv6hf release build.  If you do the second, make sure that you
fix up the fstab and rc.conf files and MAKEDEV the devices.

Also put the GENERICV6 netbsd kernel that you built in #3 in the root of
this FFS.  Note that this is the real kernel, not the .img or .ub

How you do #7 is up to you. The simplest may be to get the rpi.img
filesystems mounted and just add EFI/BOOT to the MSDOS filesystem and
the GENERICV6 kernel to the root of the FFS.  (Again, I had trouble
mounting the FFS of these images on a amd64 box ...  it didn't like the
superblock and I can't figure out why).

If the image was created as expected you should be able to invoke it
like this with QEMU:

qemu-system-arm -M virt -cpu cortex-a7 -smp 1 -m 1g -drive if=none,file=armv6.img,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device virtio-net-device,netdev=net0,mac=00:11:22:33:44:77 -bios QEMU_EFI.fd -nographic

The location of QEMU_EFI.fd is: 

Note that the above qmeu-system-arm command creates a bridged network
arrangement for the guest.  If you do not wish to do that, adjust
accordingly.  See for

What this system appears to be is something like a Raspberry PI 2
running a armv6 release.  Not strictly speaking a v6 processor, but the
closest thing you can get to one with QEMU.  QEMU does not appear to
support the virt machine type with a real v6 CPU (only the cortex-a*
CPUs can be a virt machine, it seems) and I am not sure what the EFI
firmware would think of a true v6 cpu anyway.

armv6# dmesg|head -30
[     1.000000] Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
[     1.000000]     2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
[     1.000000]     2018, 2019, 2020, 2021, 2022
[     1.000000]     The NetBSD Foundation, Inc.  All rights reserved.
[     1.000000] Copyright (c) 1982, 1986, 1989, 1991, 1993
[     1.000000]     The Regents of the University of California.  All rights reserved.

[     1.000000] NetBSD 9.99.101 (GENERICV6) #0: Fri Oct 21 12:48:46 EDT 2022
[     1.000000]
[     1.000000] total memory = 1024 MB
[     1.000000] avail memory = 983 MB
[     1.000000] timecounter: Timecounters tick every 10.000 msec
[     1.000000] Kernelized RAIDframe activated
[     1.000000] armfdt0 (root)
[     1.000000] armfdt0: using EFI runtime services for RTC
[     1.000000] simplebus0 at armfdt0
[     1.000000] cpus0 at simplebus0
[     1.000000] simplebus1 at simplebus0
[     1.000000] simplebus2 at simplebus0
[     1.000000] cpu0 at cpus0: Cortex-A7 r0p5 (Cortex V7A core)
[     1.000000] cpu0: DC enabled IC enabled WB enabled LABT branch prediction enabled
[     1.000000] cpu0: L1 32KB/64B 2-way (256 set) VIPT Instruction cache
[     1.000000] cpu0: L1 32KB/64B 2-way (256 set) write-back-locking-C PIPT Data cache
[     1.000000] cpu0: L2 2304KB/64B 16-way (2304 set) write-through PIPT Unified cache
[     1.000000] vfp0 at cpu0: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
[     1.000000] fclock0 at simplebus0: 24000000 Hz fixed clock (clk24mhz)
[     1.000000] gic0 at simplebus0: GIC
[     1.000000] armgic0 at gic0: Generic Interrupt Controller, 288 sources (288 valid)
[     1.000000] armgic0: 256 Priorities, 256 SPIs, 16 PPIs, 16 SGIs
[     1.000000] armgic0: GICv2m @ 0x8020000, SPIs 80-143
armv6# uname -p

One should be able to add more than one CPU and add more memory.
Package builds should be possible from such an arrangement that should
work on any real armv6 board.  A problem that might be encountered is if
a software build probed the CPU directly to see what features were
supported and built itself according to what it found.  This sort of
thing would be a problem even on real hardware too, of course.  As long
as stuff uses the same information as "uname -p" everything should be

Brad Spencer - - KC8VKS -

Home | Main Index | Thread Index | Old Index