Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 04 Sep 2014 13:53:13 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        "Sinha, Prokash" <psinha@panasas.com>
Cc:        "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   Re: PXE boot
Message-ID:  <2303890.kxxKhV23z4@ralph.baldwin.cx>
In-Reply-To: <D02DE270.18AA%psinha@panasas.com>
References:  <D02C8BE1.179F%psinha@panasas.com> <D02DE132.18A0%psinha@panasas.com> <D02DE270.18AA%psinha@panasas.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday, September 04, 2014 04:33:46 PM Sinha, Prokash wrote:
> On 9/4/14 9:31 AM, "Sinha, Prokash" <psinha@panasas.com> wrote:
> >Thanks once again...
> >
> >This is the part - that you spelled out is why I had a trace in the
> >pxe_enable(...) routine. As well as at pxe_init( ...) routine, just =
to be
> >sure
> >the pxe.c routines are working like ( as you said ) devsw invocation=
. But
> >did not see the trace messages, could be serial console is not actin=
g (
> >though I doubt it).
> >
> >Now gave me a base, off of what I could debug ...

Hmm, the console should be working (cons_probe() is called before=20
pxe_enable()).  However, if you are using 'console=3Dcomconsole' in loa=
der.conf=20
to set a serial console, you won't see early messages because loader.co=
nf is=20
processed after main() calls interact() at the bottom of the function. =
 If you=20
want to see early loader messages on serial, you will need to build pxe=
boot=20
with BOOT_PXELDR_ALWAYS_SERIAL defined as a make variable (so on the co=
mmand=20
line, or in /etc/make.conf or /etc/src.conf).  That will force a serial=
=20
console for early loader messages.

> >
> >-prokash
> >
> >On 9/4/14 7:57 AM, "John Baldwin" <jhb@freebsd.org> wrote:
> >>On Wednesday, September 03, 2014 11:16:05 PM Sinha, Prokash wrote:
> >>> Thanks much, John !
> >>>=20
> >>> When it starts executing ? How ?. Who starts executing these. Fro=
m the
> >>> Makefile it's org is 0x7c00. So I would assume that it would be l=
oaded
> >>>
> >>>at
> >>>
> >>> that absolute real-mode address !. I don't understand this part. =
But,
> >>>
> >>>if I
> >>>
> >>> put traces, I see pxe_open, and pxe_close are being called, but a=
fter
> >>>
> >>>all
> >>>
> >>> these pxe_calls are done, the loader's main is invoked at Rebooti=
ng =C5=A0
> >>>
> >>>time.
> >>>
> >>> We are using a net boot server, and I see mountd- authenticated =C5=
=A0
> >>>
> >>>message
> >>>
> >>> storm on the boot server side.
> >>>=20
> >>> Wondering what could cause such a message storm, while pxe_open()=
 ->
> >>>
> >>>net
> >>>
> >>> if_open( ) executes.
> >>
> >>The PXE BIOS uses TFTP to fetch the pxeboot binary (and it will do =
its
> >>own
> >>DHCP, etc. as part of doing that).  It writes the binary it downloa=
ds
> >>starting
> >>at address 0x7c00.  Once the download is complete, it jumps to 0x7c=
00
> >>similar
> >>to how booting from a disk loads the first sector at address 0x7c00=
 and
> >>then
> >>jumps to it.
> >>
> >>The PXE calls in libi386 should not be invoked until the loader mai=
n()
> >>routine
> >>
> >>runs:
> >>    /*
> >>   =20
> >>     * Special handling for PXE and CD booting.
> >>     */
> >>   =20
> >>    if (kargs->bootinfo =3D=3D 0) {
> >>=09
> >>=09/*
> >>=09
> >>=09 * We only want the PXE disk to try to init itself in the below
> >>=09 * walk through devsw if we actually booted off of PXE.
> >>=09 */
> >>=09
> >>=09if (kargs->bootflags & KARGS_FLAGS_PXE)
> >>=09
> >>=09    pxe_enable(kargs->pxeinfo ? PTOV(kargs->pxeinfo) : NULL);
> >>=09
> >>=09else if (kargs->bootflags & KARGS_FLAGS_CD)
> >>=09
> >>=09    bc_add(initial_bootdev);
> >>   =20
> >>    }
> >>
> >>That enables the PXE devsw driver so that it will do something late=
r when
> >>
> >>main() calls all the devsw init routines:
> >>    /*
> >>   =20
> >>     * March through the device switch probing for things.
> >>     */
> >>   =20
> >>    for (i =3D 0; devsw[i] !=3D NULL; i++)
> >>=09
> >>=09if (devsw[i]->dv_init !=3D NULL)
> >>=09
> >>=09    (devsw[i]->dv_init)();
> >>   =20
> >>    printf("BIOS %dkB/%dkB available memory\n", bios_basemem / 1024=
,
> >>
> >>bios_extmem / 1024);

--=20
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2303890.kxxKhV23z4>