Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Aug 2022 12:23:59 -0600
From:      Warner Losh <imp@bsdimp.com>
To:        FreeBSD User <freebsd@walstatt-de.de>
Cc:        Warner Losh <imp@freebsd.org>, src-committers <src-committers@freebsd.org>,  "<dev-commits-src-all@freebsd.org>" <dev-commits-src-all@freebsd.org>, dev-commits-src-main@freebsd.org
Subject:   Re: git: 39fdad34e220 - main - stand: impose 510,000 byte limit for /boot/loader and /boot/pxeldr
Message-ID:  <CANCZdfq-Nr2%2B48dJhBq7jz%2BK6iBpGzRko21j3vwgGfNP81JKcA@mail.gmail.com>
In-Reply-To: <20220811202204.106f7188@thor.intern.walstatt.dynvpn.de>
References:  <202208110331.27B3Va7M007335@gitrepo.freebsd.org> <20220811202204.106f7188@thor.intern.walstatt.dynvpn.de>

next in thread | previous in thread | raw e-mail | index | archive | help
--0000000000009a1ded05e5fb4574
Content-Type: text/plain; charset="UTF-8"

On Thu, Aug 11, 2022 at 12:22 PM FreeBSD User <freebsd@walstatt-de.de>
wrote:

> Am Thu, 11 Aug 2022 03:31:36 GMT
> Warner Losh <imp@FreeBSD.org> schrieb:
>
> > The branch main has been updated by imp:
> >
> > URL:
> https://cgit.FreeBSD.org/src/commit/?id=39fdad34e220c52a433e78f20c8c39412429014e
> >
> > commit 39fdad34e220c52a433e78f20c8c39412429014e
> > Author:     Warner Losh <imp@FreeBSD.org>
> > AuthorDate: 2022-08-11 03:19:01 +0000
> > Commit:     Warner Losh <imp@FreeBSD.org>
> > CommitDate: 2022-08-11 03:29:20 +0000
> >
> >     stand: impose 510,000 byte limit for /boot/loader and /boot/pxeldr
> >
> >     The BIOS method of booting imposes an absolute limit of 640k for the
> >     size of the program being run due to btx. In practice, this means
> that
> >     programs larger than about 500kiB will fail in odd ways as the stack
> /
> >     heap will overflow.
> >
> >     Pick 510,000 as the cutoff line semi-arbitrarily. loader_lua is now
> >     almost too big and we want to break the build when it crosses this
> >     threshold. In my experience, below 500,000 always works, above
> 520,000
> >     always seems to fail with things getting bad somewhere between
> 512,000
> >     to 515,000. 510,000 is as close to the line as I think we can go,
> though
> >     experience may dictate we need to lower this in the future.
> >
> >     This is at-best a stop-breakage until we have a better way to subset
> the
> >     boot loader for BIOS booting to allow better, more fined-tuned
> >     /boot/loaders for the many different environments they have to run
> >     in. This likely means we'll have a graphical loader than understands
> a
> >     few filesystmes for installation, and a non-graphical loader that
> >     understands the most filesystems possible for everything else in the
> >     future. Our build infrastructure needs some work before we can do
> that,
> >     however.
> >
> >     At this late date, it likely isn't worth the efforts to move parts of
> >     the loader into high memory. There's a number of assumptions about
> where
> >     the stack is, where buffers reside, etc that are fulfilled when it
> lives
> >     in the first 640k that would need bounce buffers and/or other counter
> >     measures if we were to split it up. All BIOS calls are done in 16-bit
> >     mode with SEG:OFF addresses, requiring them to be in the first 640k
> of
> >     RAM. And nearly all machines in the last decade can boot with UEFI
> >     (though there's some exceptions, so it isn't worth killing outright
> >     yet).
> >
> >     Sponsored by:           Netflix
> >     Reviewed by:            kevans
> >     Differential Revision:  https://reviews.freebsd.org/D36129
> > ---
> >  stand/i386/loader/Makefile | 5 +++++
> >  stand/i386/pxeldr/Makefile | 3 +++
> >  2 files changed, 8 insertions(+)
> >
> > diff --git a/stand/i386/loader/Makefile b/stand/i386/loader/Makefile
> > index 3685281ffd2c..cde1513aac06 100644
> > --- a/stand/i386/loader/Makefile
> > +++ b/stand/i386/loader/Makefile
> > @@ -19,6 +19,8 @@ PROG=               ${LOADER}.sym
> >  INTERNALPROG=
> >  NEWVERSWHAT?=        "bootstrap loader" x86
> >  VERSION_FILE=        ${.CURDIR}/../loader/version
> > +LOADERSIZE=  510000          # Largest known safe size
> > +
> >
> >  .PATH:               ${BOOTSRC}/i386/loader
> >
> > @@ -79,9 +81,12 @@ CFLAGS+=   -I${BOOTSRC}/i386
> >  8x16.c: ${SRCTOP}/contrib/terminus/ter-u16b.bdf
> >       vtfontcvt -f compressed-source -o ${.TARGET} ${.ALLSRC}
> >
> > +
> >  ${LOADER}: ${LOADER}.bin ${BTXLDR} ${BTXKERN}
> >       btxld -v -f elf -e ${LOADER_ADDRESS} -o ${.TARGET} -l ${BTXLDR} \
> >               -b ${BTXKERN} ${LOADER}.bin
> > +     @set -- `${SIZE} ${.TARGET} | tail -1` ;
> x=$$((${LOADERSIZE}-$$4)); \
> > +         echo "$$x bytes available"; test $$x -ge 0
> >
> >  ${LOADER}.bin: ${LOADER}.sym
> >       ${STRIPBIN} -R .comment -R .note -o ${.TARGET} ${.ALLSRC}
> > diff --git a/stand/i386/pxeldr/Makefile b/stand/i386/pxeldr/Makefile
> > index a44dc0de2885..f8bc1eae9a31 100644
> > --- a/stand/i386/pxeldr/Makefile
> > +++ b/stand/i386/pxeldr/Makefile
> > @@ -13,6 +13,7 @@ BOOT=       pxeboot
> >  LDR= pxeldr
> >  ORG= 0x7c00
> >  LOADER=      loader
> > +PXELDRSIZE= 510000           # Largest known safe size
> >
> >  .if defined(BOOT_PXELDR_PROBE_KEYBOARD)
> >  CFLAGS+=-DPROBE_KEYBOARD
> > @@ -41,5 +42,7 @@ CLEANFILES+= ${LOADER}
> >  ${LOADER}: ${LOADERBIN} ${BTXLDR} ${BTXKERN}
> >       btxld -v -f elf -e ${LOADER_ADDRESS} -o ${.TARGET} -l ${BTXLDR} \
> >           -b ${BTXKERN} ${LOADERBIN}
> > +     @set -- `${SIZE} ${.TARGET} | tail -1` ;
> x=$$((${PXELDRSIZE}-$$4)); \
> > +         echo "$$x bytes available"; test $$x -ge 0
> >
> >  .include <bsd.prog.mk>
> >
>
> On recent CURRENT (FreeBSD 14.0-CURRENT #10 main-n257258-348164aa9e5d: Wed
> Aug 10 22:39:17
> CEST 2022 amd64), buildworld fails here on several boxes:
>
> [...]
>
> ===> lib/flua/libjail (all)
> --- all_subdir_stand ---
> --- loader ---
> btxld -v -f elf -e 0x200000 -o loader -l
> /usr/obj/usr/src/amd64.amd64/stand/i386/btx/btxldr/btxldr  -b
> /usr/obj/usr/src/amd64.amd64/stand/i386/btx/btx/btx
> /usr/obj/usr/src/amd64.amd64/stand/i386/loader_lua/loader_lua.bin kernel:
> ver=1.02 size=690
> load=9000 entry=9010 map=16M pgctl=0:84 client: fmt=elf size=8a3f0
> text=836bc data=5238
> bss=8070 entry=0 output: fmt=elf size=8ae39 text=289 data=8aa80 org=200000
> entry=200000
> -58585 bytes available 6.64 real
> 8.48 user         2.84 sys
>

I'm sorry, but however you are building /boot/loader, it won't work when
it's that big. What are your settings that increase its size by so much?

Warner

--0000000000009a1ded05e5fb4574
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><br></div><br><div class=3D"gmail_quote">=
<div dir=3D"ltr" class=3D"gmail_attr">On Thu, Aug 11, 2022 at 12:22 PM Free=
BSD User &lt;<a href=3D"mailto:freebsd@walstatt-de.de">freebsd@walstatt-de.=
de</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margi=
n:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex=
">Am Thu, 11 Aug 2022 03:31:36 GMT<br>
Warner Losh &lt;imp@FreeBSD.org&gt; schrieb:<br>
<br>
&gt; The branch main has been updated by imp:<br>
&gt; <br>
&gt; URL: <a href=3D"https://cgit.FreeBSD.org/src/commit/?id=3D39fdad34e220=
c52a433e78f20c8c39412429014e" rel=3D"noreferrer" target=3D"_blank">https://=
cgit.FreeBSD.org/src/commit/?id=3D39fdad34e220c52a433e78f20c8c39412429014e<=
/a><br>
&gt; <br>
&gt; commit 39fdad34e220c52a433e78f20c8c39412429014e<br>
&gt; Author:=C2=A0 =C2=A0 =C2=A0Warner Losh &lt;imp@FreeBSD.org&gt;<br>
&gt; AuthorDate: 2022-08-11 03:19:01 +0000<br>
&gt; Commit:=C2=A0 =C2=A0 =C2=A0Warner Losh &lt;imp@FreeBSD.org&gt;<br>
&gt; CommitDate: 2022-08-11 03:29:20 +0000<br>
&gt; <br>
&gt;=C2=A0 =C2=A0 =C2=A0stand: impose 510,000 byte limit for /boot/loader a=
nd /boot/pxeldr<br>
&gt;=C2=A0 =C2=A0 =C2=A0<br>
&gt;=C2=A0 =C2=A0 =C2=A0The BIOS method of booting imposes an absolute limi=
t of 640k for the<br>
&gt;=C2=A0 =C2=A0 =C2=A0size of the program being run due to btx. In practi=
ce, this means that<br>
&gt;=C2=A0 =C2=A0 =C2=A0programs larger than about 500kiB will fail in odd =
ways as the stack /<br>
&gt;=C2=A0 =C2=A0 =C2=A0heap will overflow.<br>
&gt;=C2=A0 =C2=A0 =C2=A0<br>
&gt;=C2=A0 =C2=A0 =C2=A0Pick 510,000 as the cutoff line semi-arbitrarily. l=
oader_lua is now<br>
&gt;=C2=A0 =C2=A0 =C2=A0almost too big and we want to break the build when =
it crosses this<br>
&gt;=C2=A0 =C2=A0 =C2=A0threshold. In my experience, below 500,000 always w=
orks, above 520,000<br>
&gt;=C2=A0 =C2=A0 =C2=A0always seems to fail with things getting bad somewh=
ere between 512,000<br>
&gt;=C2=A0 =C2=A0 =C2=A0to 515,000. 510,000 is as close to the line as I th=
ink we can go, though<br>
&gt;=C2=A0 =C2=A0 =C2=A0experience may dictate we need to lower this in the=
 future.<br>
&gt;=C2=A0 =C2=A0 =C2=A0<br>
&gt;=C2=A0 =C2=A0 =C2=A0This is at-best a stop-breakage until we have a bet=
ter way to subset the<br>
&gt;=C2=A0 =C2=A0 =C2=A0boot loader for BIOS booting to allow better, more =
fined-tuned<br>
&gt;=C2=A0 =C2=A0 =C2=A0/boot/loaders for the many different environments t=
hey have to run<br>
&gt;=C2=A0 =C2=A0 =C2=A0in. This likely means we&#39;ll have a graphical lo=
ader than understands a<br>
&gt;=C2=A0 =C2=A0 =C2=A0few filesystmes for installation, and a non-graphic=
al loader that<br>
&gt;=C2=A0 =C2=A0 =C2=A0understands the most filesystems possible for every=
thing else in the<br>
&gt;=C2=A0 =C2=A0 =C2=A0future. Our build infrastructure needs some work be=
fore we can do that,<br>
&gt;=C2=A0 =C2=A0 =C2=A0however.<br>
&gt;=C2=A0 =C2=A0 =C2=A0<br>
&gt;=C2=A0 =C2=A0 =C2=A0At this late date, it likely isn&#39;t worth the ef=
forts to move parts of<br>
&gt;=C2=A0 =C2=A0 =C2=A0the loader into high memory. There&#39;s a number o=
f assumptions about where<br>
&gt;=C2=A0 =C2=A0 =C2=A0the stack is, where buffers reside, etc that are fu=
lfilled when it lives<br>
&gt;=C2=A0 =C2=A0 =C2=A0in the first 640k that would need bounce buffers an=
d/or other counter<br>
&gt;=C2=A0 =C2=A0 =C2=A0measures if we were to split it up. All BIOS calls =
are done in 16-bit<br>
&gt;=C2=A0 =C2=A0 =C2=A0mode with SEG:OFF addresses, requiring them to be i=
n the first 640k of<br>
&gt;=C2=A0 =C2=A0 =C2=A0RAM. And nearly all machines in the last decade can=
 boot with UEFI<br>
&gt;=C2=A0 =C2=A0 =C2=A0(though there&#39;s some exceptions, so it isn&#39;=
t worth killing outright<br>
&gt;=C2=A0 =C2=A0 =C2=A0yet).<br>
&gt;=C2=A0 =C2=A0 =C2=A0<br>
&gt;=C2=A0 =C2=A0 =C2=A0Sponsored by:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0Netflix<br>
&gt;=C2=A0 =C2=A0 =C2=A0Reviewed by:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 kevans<br>
&gt;=C2=A0 =C2=A0 =C2=A0Differential Revision:=C2=A0 <a href=3D"https://rev=
iews.freebsd.org/D36129" rel=3D"noreferrer" target=3D"_blank">https://revie=
ws.freebsd.org/D36129</a><br>
&gt; ---<br>
&gt;=C2=A0 stand/i386/loader/Makefile | 5 +++++<br>
&gt;=C2=A0 stand/i386/pxeldr/Makefile | 3 +++<br>
&gt;=C2=A0 2 files changed, 8 insertions(+)<br>
&gt; <br>
&gt; diff --git a/stand/i386/loader/Makefile b/stand/i386/loader/Makefile<b=
r>
&gt; index 3685281ffd2c..cde1513aac06 100644<br>
&gt; --- a/stand/i386/loader/Makefile<br>
&gt; +++ b/stand/i386/loader/Makefile<br>
&gt; @@ -19,6 +19,8 @@ PROG=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0${LOADER}.sym<br>
&gt;=C2=A0 INTERNALPROG=3D<br>
&gt;=C2=A0 NEWVERSWHAT?=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot;bootstrap loade=
r&quot; x86<br>
&gt;=C2=A0 VERSION_FILE=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0 ${.CURDIR}/../loader/=
version<br>
&gt; +LOADERSIZE=3D=C2=A0 510000=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # Larges=
t known safe size<br>
&gt; +<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 .PATH:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0${B=
OOTSRC}/i386/loader<br>
&gt;=C2=A0 <br>
&gt; @@ -79,9 +81,12 @@ CFLAGS+=3D=C2=A0 =C2=A0-I${BOOTSRC}/i386<br>
&gt;=C2=A0 8x16.c: ${SRCTOP}/contrib/terminus/ter-u16b.bdf<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0vtfontcvt -f compressed-source -o ${.TARGET}=
 ${.ALLSRC}<br>
&gt;=C2=A0 <br>
&gt; +<br>
&gt;=C2=A0 ${LOADER}: ${LOADER}.bin ${BTXLDR} ${BTXKERN}<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0btxld -v -f elf -e ${LOADER_ADDRESS} -o ${.T=
ARGET} -l ${BTXLDR} \<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-b ${BTXKERN} ${=
LOADER}.bin<br>
&gt; +=C2=A0 =C2=A0 =C2=A0@set -- `${SIZE} ${.TARGET} | tail -1` ; x=3D$$((=
${LOADERSIZE}-$$4)); \<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0echo &quot;$$x bytes available&quot=
;; test $$x -ge 0<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 ${LOADER}.bin: ${LOADER}.sym<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0${STRIPBIN} -R .comment -R .note -o ${.TARGE=
T} ${.ALLSRC}<br>
&gt; diff --git a/stand/i386/pxeldr/Makefile b/stand/i386/pxeldr/Makefile<b=
r>
&gt; index a44dc0de2885..f8bc1eae9a31 100644<br>
&gt; --- a/stand/i386/pxeldr/Makefile<br>
&gt; +++ b/stand/i386/pxeldr/Makefile<br>
&gt; @@ -13,6 +13,7 @@ BOOT=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0pxeboot<br>
&gt;=C2=A0 LDR=3D pxeldr<br>
&gt;=C2=A0 ORG=3D 0x7c00<br>
&gt;=C2=A0 LOADER=3D=C2=A0 =C2=A0 =C2=A0 loader<br>
&gt; +PXELDRSIZE=3D 510000=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Larges=
t known safe size<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 .if defined(BOOT_PXELDR_PROBE_KEYBOARD)<br>
&gt;=C2=A0 CFLAGS+=3D-DPROBE_KEYBOARD<br>
&gt; @@ -41,5 +42,7 @@ CLEANFILES+=3D ${LOADER}<br>
&gt;=C2=A0 ${LOADER}: ${LOADERBIN} ${BTXLDR} ${BTXKERN}<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0btxld -v -f elf -e ${LOADER_ADDRESS} -o ${.T=
ARGET} -l ${BTXLDR} \<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-b ${BTXKERN} ${LOADERBIN}<br>
&gt; +=C2=A0 =C2=A0 =C2=A0@set -- `${SIZE} ${.TARGET} | tail -1` ; x=3D$$((=
${PXELDRSIZE}-$$4)); \<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0echo &quot;$$x bytes available&quot=
;; test $$x -ge 0<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 .include &lt;<a href=3D"http://bsd.prog.mk" rel=3D"noreferrer" t=
arget=3D"_blank">bsd.prog.mk</a>&gt;<br>
&gt; <br>
<br>
On recent CURRENT (FreeBSD 14.0-CURRENT #10 main-n257258-348164aa9e5d: Wed =
Aug 10 22:39:17<br>
CEST 2022 amd64), buildworld fails here on several boxes:<br>
<br>
[...]<br>
<br>
=3D=3D=3D&gt; lib/flua/libjail (all)<br>
--- all_subdir_stand ---<br>
--- loader ---<br>
btxld -v -f elf -e 0x200000 -o loader -l<br>
/usr/obj/usr/src/amd64.amd64/stand/i386/btx/btxldr/btxldr=C2=A0 -b<br>
/usr/obj/usr/src/amd64.amd64/stand/i386/btx/btx/btx<br>
/usr/obj/usr/src/amd64.amd64/stand/i386/loader_lua/loader_lua.bin kernel: v=
er=3D1.02 size=3D690<br>
load=3D9000 entry=3D9010 map=3D16M pgctl=3D0:84 client: fmt=3Delf size=3D8a=
3f0 text=3D836bc data=3D5238<br>
bss=3D8070 entry=3D0 output: fmt=3Delf size=3D8ae39 text=3D289 data=3D8aa80=
 org=3D200000 entry=3D200000 <br>
-58585 bytes available 6.64 real=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0<br>
8.48 user=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A02.84 sys<br></blockquote><div><b=
r></div><div>I&#39;m sorry, but however you are building /boot/loader, it w=
on&#39;t work when it&#39;s that big. What are your settings that increase =
its size by so much?</div><div><br></div><div>Warner</div></div></div>

--0000000000009a1ded05e5fb4574--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANCZdfq-Nr2%2B48dJhBq7jz%2BK6iBpGzRko21j3vwgGfNP81JKcA>