Netboot Mailing List (by thread)

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

Etherboot 4.5.5 released

I have released Etherboot 4.5.5 at

No, that is not a typo, this is a 4.5 release. The reason is Klaus
Espenlaub just did a fantastic job of reorganisation, rewriting, bug
fixing, and adding new features to Etherboot that I feel justified
in starting a new series. 4.5 will be a development series leading to
4.6. The 4.4 series will not be updated anymore except to backport any
critical bug fixes to 4.4. Hopefully within an iteration or two we can
get all the major glitches out and go to 4.6. So if you have a stake in
using Etherboot, please test this.

I attach his extensive notes at the bottom, but I want to mention the
major features:

+ Booting via NFS in addition to TFTP

+ Lance driver works for PCI Lance under VMware (could users with real
PCI Lance NICs please test?)

+ Rewrite of Makefiles, no more src-32 and src-16.

+ Rewrite of ELF and a.out loading

+ Comload fixed.


47a12fa5d9af686d1d079186c4f41bfe  etherboot-4.5.5.tar.bz2
0c790b9158d33f03aceb299369bd046e  etherboot-4.5.5.tar.gz

Klaus Espenlaub's notes:

The biggest change is the almost rewritten Makefiles (both in src and in
doc - the one in doc is still reasonably simple).  If you want to get
an overview - basically one Makefile now builds both /16 and /32 ROMs.
This involves quite a few make variables (similarly in Config), but it
should be mostly self-explaining.  I also converted the suffix rules to
pattern rules, because it is the only way to keep the build directories
for /16 and /32 apart.

Generally all /32 code is compiled in bin32, all /16 code is compiled
in bin16, and the code that works for both is in bin.

The names (object files, images, but NOT the final ROMs) used during
the build process for some PCI cards have changed (especially lancepci
and nepci).

I eliminated the driver.a file by adding yet more ugly code to
(no, I'm not very proud of the code I added there - I hate perl, but
at least it works), which now generates all sorts of make rules and
dependency information.  This eliminates the redundant recompile of all
other drivers if you specified a specific target at the make command line.

There are now automatic checks for the generated ROM size (3K safety
margin are used to allow for 1K BIOS EBDA and 2K stack).  This should
avoid most of the cases in which the stack overwrites code and/or data,
causing strange crashes.

On to the real code - I rewrote both the ELF and a.out loading (the
blocksize is now properly handled for all formats), and now most of the
code is identical.  Someone might want to merge the two.  I verified that
both a.out and ELF FreeBSD loading still works by booting the FreeBSD
2.2.8 and 3.4 install kernels (the ELF kernel you gave me didn't work
for whatever reason).  Actually I tested everything except NBI, but that
code is completely unchanged.

I eliminated config.h and created cards.h - just have a look and you
should get the idea.  The PCI/ISA prototype matching hack is now buried
in there.  All PCI drivers (and skel.c) have been converted to the new
include file.

The only file that is really new is nfs.c, which contains the code where
I started my journey.

The loader code is now merged into one file for both the normal and
compressed case.  Some bugs have been fixed along the way (the normal
loader copied too much data, potentially crashing the machine).  BTW: I
removed the block copy from comboot, because the first thing the loader
code does is - to copy the code to the right place.  Also copying it to
0x80000 prevents compressed ROMs (though there is no way in the Makefile
to create such a beast).  Also the stack changing code was wrong -
the overflow handling is missing: 0x9fxxxx-0x800000 is truncated to
fit in the 16 bit register, which is not quite what one would expect.
The stack pointer must be in the same segment, so for overflows just
load 0.  Anyway, we don't need a new stack for 4 bytes (the return
address).  Also the shifts won't work on an 8086/8088.  The ROM segment
and length code is also done once more in loader.S.  Finally the org
0x100 didn't work with my version of as86 - it prepended 256 null bytes.
Don't get me wrong - I see that comboot was just a quick and dirty hack.
It's now working...

I also fixed floppyload to read exactly the right amount of data (not
up to 65520 bytes more like the Linux code did) and ripped out some
unused code.

3c509.c: includes fixed, const added, static added, removed redundant code

3c90x.c: includes fixed, const added, shortened messages to save space,
made the transceiver selection bootrom fix optional (default: off),
updated 3c90x.txt

ansiesc.c: de-tftpified (now uses "download")

config.c: moved the driver prototypes to separate file, added a few const

cs89x0.c: ansified, const added, fixed timeout handling

eepro100.c: includes fixed, const added, static added, USE_INTERNAL_BUFFER
hack, passing globals as a parameter removed, timeout handling fixed,
comments fixed

epic100.c: comments fixed, const added, static added, USE_INTERNAL_BUFFER
hack, removed unused variables, changed debug code to use macro instead
of variable, allow broadcasts to be received (after all how did it
work before???)

etherboot.h: dual/serial console "cleanups", added NFS support, fixed
INTERNAL_BOOTP_DATA for pathologic cases, removed prototype within comment
(how did that end up there?), moved prototypes for config.c code here,
added consts all over the place

floppy.c: added static, changed cleanup code

floppyload.S: renamed from .asm I didn't write this :)

i82586.c: fixed includes, added const

lance.c: fixed DMA for PCI cards, removed leftovers from Linux driver,

linux-asm-io.h: added prototypes

linux-asm-string.h: added prototypes

loader.S: renamed from loader.asm, more comments see elsewhere in
this mail removed

main.c: includes fixed, static and const added, Etherboot/32 now prints
relocaddr, hooks for NFS support, drain the Rx queue in some strategic
places (after sleep), changed interface to await_reply: timeout handling,
new cleanup code

misc.c: ansified, twiddle code changed, strcasecmp enabled for
Etherboot/16 (smaller than the 16 bit libc version), clear A20 before
kernel is started (only for NBI), dual console fixes, removed bogus
comment about interrupt enabling using iskey()

nic.h: include guard added, added const

ns8390.c: fixed includes for PCI version, added const, ansified, renamed
internal functions

osdep.h: removed #include <asm/byteorder.h> - probably all #ifdef
__linux__ and __FreeBSD__ may be removed now.

osloader.c: see elsewhere in this mail. removed loads of debugging code.

otulip.c: removed unused variables, USE_INTERNAL_BUFFER hack, ansified,
added const

otultip.h: added const

pci.c: fixed signed comparison

pci.h: include guard added, const added

rtl8139.c: static added, const added, globals are no longer passes as
parameters, fixed probe loop

serial.S: removed the Makefile hack to calculate the divisor and replace
it by a CPP hack

sk_g16.c: added static/const

skel.c: updated

smc9000.c: fixed includes, added const, fixed timeout, removed unused

start16.S: changed stack pointer reloading

start32.S: cleaned up GAS295 support, fixed CPU detection, fixed memsize
for > 64MB, added basememsize()

tiara.c: fixed includes, added const, removed unused variable

tulip.c: fixed includes, added const, decreased oversized frame tolerance,
USE_INTERNAL_BUFFER hack, converted to C comments, fixed prototypes,
removed unused variable

via-rhine.c: fixed includes, converted to C comments, removed unused
functions, fixed timeout, USE_INTERNAL_BUFFER hack, removed unused
variable, const added

lzhuf.c was modified not to output ':' characters, because I find it
useful to search for them in a make log to spot all error messages.

Finally all symlinks have gone

I fixed sgml/vendortags.sgml (maybe it's more a workaround): sgml2txt
didn't like the ~~' sequence and ignored a whole line, making the .txt
file incomplete.  Also freebsd.txt was converted to sgml.

My standard patch to netboot-0.8.1/configure (to remove the "unknown") is
again in place - how is this file created? By hand?  I added serial/dual
console support to mknbi-linux.

Oh, and something I almost forgot: Etherboot now works under VMware.
VMware has a rather large EBDA (3K instead of 1K like most other
BIOS versions), so one might have to sacrifice a few nifty options.
Note that the Makefile check cannot detect this - maybe we should add a
runtime check, too?  One thing that doesn't work with VMware is the "Boot
Local" stuff - it's not terribly useful if you have to boot from disk,
but it shouldn't crash the machine (I've seen several triple faults,
depending on RELOCADDR and the stack usage).  I tracked it down to the
fact that VMware crashes on int 0x19 if the memory area 0x98000-0x9f3ff
is overwritten.  If one changes RELOCADDR to 0x8f000, everything works
nicely.  Someone should report the bug to VMware.  Also proper boot ROM
support should be added to VMware and they should upgrade the virtual
card to 100Mbps (don't laugh - they limit the bandwidth to 10Mbps even
if you have a real 100Mbps card!).  Maybe one could even use the flash
utility for the recent AMD PCnet cards...
This Mail was sent to netboot mailing list by:
Ken Yap <>
To get help about this list, send a mail with 'help' as the only string in
it's body to If you have problems with this list,
send a mail to

For requests or suggestions regarding this mailing list archive please write to