Booting FreeBSD from eMMC on BeagleBone Black

Ian Lepore ian at FreeBSD.org
Mon Mar 17 13:57:47 UTC 2014


On Sun, 2014-03-16 at 22:16 -0400, Patrick Kelsey wrote:
> On Sun, Mar 16, 2014 at 9:33 PM, Rui Paulo <rpaulo at freebsd.org> wrote:
> 
> > On 16 Mar 2014, at 14:59, Patrick Kelsey <kelsey at ieee.org> wrote:
> >
> > > - Improved disk probing support that will now by default find and use the
> > > first suitable partition among the available storage devices.
> >
> > I think this introduced a bug where, if you have a non-responsive boot
> > device, ubldr will stop and won't try network booting:
> >
> > ## Starting application at 0x01000054 ...
> > Consoles: U-Boot console
> > Compatible API signature found @1d800a8
> > Number of U-Boot devices: 2
> >
> > FreeBSD/armv6 U-Boot loader, Revision 1.2
> > (rpaulo at zedfs.local, Fri Mar 14 22:35:47 PDT 2014)
> > DRAM:    256MB
> > Unknown device type ''   <------------ this is new
> > Found U-Boot device: disk
> > Probing all storage devices...
> > Checking unit=0 slice=0 partition=-1...disk0: read failed, error=1
> >
> > Checking unit=1 slice=0 partition=-1...
> > Checking unit=2 slice=0 partition=-1...
> > Checking unit=3 slice=0 partition=-1...
> > Checking unit=4 slice=0 partition=-1...
> > Checking unit=5 slice=0 partition=-1...
> >
> > can't load 'kernel'
> >
> > Type '?' for a list of commands, 'help' for more detailed help.
> > loader>
> >
> > It stops here and doesn't try net0 booting.
> >
> >
> I think the problem is that some of the conditionals in
> sys/boot/uboot/common/main.c:main() are broken.  I believe I sowed the seed
> for this in the original patch I sent to Ian, which appears to have had an
> out-of-order set of tests in the disk conditional, which in hindsight
> turned out to work due to a friendly coincidence (namely disk appearing
> before net in the devsw).  That bad-pattern conditional seems to have
> gotten munged a bit further and propagated in some of the refactoring Ian
> did when integrating my patch.
> 
> I believe sys/boot/uboot/common/main.c, starting around line 442, should
> look like this:
> 
> 		if (strcmp(devsw[i]->dv_name, "disk") == 0 &&
> 		    (load_type == -1 || (load_type & DEV_TYP_STOR))) {
> 			if (probe_disks(i, load_type, load_unit, load_slice,
> 			    load_partition) == 0)
> 				break;
> 		}
> 
> 		if (strcmp(devsw[i]->dv_name, "net") == 0 &&
> 		    (load_type == -1 || (load_type & DEV_TYP_NET)))
> 			break;
> 
> 
> Can you give that a try?
> 
> -Patrick

This was my bad.  I think I was so enmeshed in whether the strange
original strncmp() calls were really just a silly form of strcmp() (they
were) that I didn't even notice I screwed up the overall logic.

Rather than putting the strcmp() first as shown above, I just adjusted
the parens in the network if() to be what I should have done originally.

-- Ian




More information about the freebsd-arm mailing list