Summary: | either gptzfsboot or zfsloader hangs during boot after kernel and pool upgrade | ||
---|---|---|---|
Product: | Base System | Reporter: | mark |
Component: | kern | Assignee: | freebsd-bugs (Nobody) <bugs> |
Status: | Closed Feedback Timeout | ||
Severity: | Affects Some People | CC: | ae, grahamperrin, mark |
Priority: | --- | Keywords: | loader, needs-qa |
Version: | 8.4-STABLE | ||
Hardware: | amd64 | ||
OS: | Any |
Description
mark
2014-09-18 20:41:11 UTC
This forum posting sounds very close to what I found. https://forums.freebsd.org/viewtopic.php?&t=42419 So I'll also point out I have the following in /boot.config -hD 115200 Obviously the serial console worked fine with the prior version of gptzfsboot (from 8.2) I've someone e-mail me indicating they had the same issue and that using the gptzfsboot code from the 9.2 release resolved the issue. I've not yet had a chance to try that, but as far as I can tell the only difference in zfsboot between 8.4 and 9.2 were a couple of lines relating to serial console handling, suggesting like the forum comment that gptzfsboot is hanging in some serial console related code. So, if this is the root of the issue I would guess that some serial console code for boot loaders changed between 8.2 and 8.4, but that zfsboot, at least wasn't updated until 9.2 or earlier. http://freebsd.1045724.n5.nabble.com/Upgrade-of-RELENG-8-ZFS-boot-pool-leads-to-unbootable-system-td5774091.html also talks about the /boot.config line interfering with booting. Following a suggestion from Matt Reimer, I've updated the bootcode gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0 but using a gptzfsboot from FreeBSD 9.2-release. So my immediate problem is resolved, but it does mean there's a bug in the gptzfsboot for FreeBSD 8.4 at least. So there's a bug here still. (In reply to mark from comment #2) > chance to try that, but as far as I can tell the only difference in zfsboot > between 8.4 and 9.2 were a couple of lines relating to serial console > handling, suggesting like the forum comment that gptzfsboot is hanging in > some serial console related code. The difference between 8.x and 9.x+ is very big. 9.x includes this commit and many other fixes https://svnweb.freebsd.org/base?view=revision&revision=243243 Ok, I was looking at the difference between 8.4 and 9.2 just for the zfsboot directory. There is more to gptzfsboot than just zfsboot and I'd didn't look at all the contributions separately. $ svn diff https://svn0.eu.freebsd.org/base/releng/8.4/sys/boot/i386/zfsboot https://svn0.eu.freebsd.org/base/releng/9.2/sys/boot/i386/zfsboot Index: zfsboot.c =================================================================== --- zfsboot.c (.../8.4/sys/boot/i386/zfsboot) (revision 273837) +++ zfsboot.c (.../9.2/sys/boot/i386/zfsboot) (revision 273837) @@ -54,7 +54,7 @@ #define NOPT 14 #define NDEV 3 -#define BIOS_NUMDRIVES 0x475 +#define BIOS_NUMDRIVES 0x475 #define DRV_HARD 0x80 #define DRV_MASK 0x7f @@ -489,7 +489,12 @@ * will find any other available pools and it may fill in missing * vdevs for the boot pool. */ - for (i = 0; i < *(unsigned char *)PTOV(BIOS_NUMDRIVES); i++) { +#ifndef VIRTUALBOX + for (i = 0; i < *(unsigned char *)PTOV(BIOS_NUMDRIVES); i++) +#else + for (i = 0; i < MAXBDDEV; i++) +#endif + { if ((i | DRV_HARD) == *(uint8_t *)PTOV(ARGS)) continue; @@ -780,8 +785,10 @@ } ioctrl = OPT_CHECK(RBX_DUAL) ? (IO_SERIAL|IO_KEYBOARD) : OPT_CHECK(RBX_SERIAL) ? IO_SERIAL : IO_KEYBOARD; - if (ioctrl & IO_SERIAL) - sio_init(115200 / comspeed); + if (ioctrl & IO_SERIAL) { + if (sio_init(115200 / comspeed) != 0) + ioctrl &= ~IO_SERIAL; + } } if (c == '?') { dnode_phys_t dn; Index: Makefile =================================================================== --- Makefile (.../8.4/sys/boot/i386/zfsboot) (revision 273837) +++ Makefile (.../9.2/sys/boot/i386/zfsboot) (revision 273837) @@ -16,7 +16,6 @@ CFLAGS= -DBOOTPROG=\"zfsboot\" \ -O1 \ - -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 \ -DBOOT2 \ -DSIOPRT=${BOOT_COMCONSOLE_PORT} \ -DSIOFMT=${B2SIOFMT} \ @@ -78,7 +77,7 @@ SRCS= zfsboot.c -.if ${MACHINE_ARCH} == "amd64" +.if ${MACHINE_CPUARCH} == "amd64" beforedepend zfsboot.o: machine CLEANFILES+= machine machine: @@ -86,3 +85,7 @@ .endif .include <bsd.prog.mk> + +# XXX: clang integrated-as doesn't grok .codeNN directives yet +CFLAGS.zfsldr.S= ${CLANG_NO_IAS} +CFLAGS+= ${CFLAGS.${.IMPSRC:T}} With OpenZFS and FreeBSD 13.0-RELEASE or greater, is this still an issue? |