Toshiba Tecra 710CDT bzImage boot problems

    Linux is a complete, free Unix-like operating system.  Read for more information about
Linux.  The kernel source code is available for download at and many other
anonymous ftp sites around the world.  Files referenced in this text
are to be found in the kernel source code archive.

    For booting the kernel, there is a choice of different types of
bootloaders, which install into the boot sector or master boot record
(MBR) of a hard disk (LILO), load directly from a raw floppy disk, or
load from DOS (loadlin), The two former ones have options to either
load the binary kernel image into low memory (<640K, "zImage type") or
into high memory (>1MB, "bzImage type").  The former limits the
maximum kernel size to about 500 KB, thereby reducing the number of
possible compiled-in device drivers.

    Booting the latter bzImage type kernels from either LILO or a raw
floppy disk fails on certain hardware platforms.  On a Toshiba Tecra
710CDT laptop computer (see
for further info), the computer is reset when executing the first
instructions after switching to protected mode.

    I have analyzed the problem extensively and can point to the
apparent cause of the problem. 

Booting the kernel

    This section details the major steps taken from when the binary
kernel image is loaded into the computer's main memory to when it
switches the processor to protected mode.  This is shown for the raw
floppy boot case, because it is the simplest to show the problem.  The
relevant code is in the files arch/i386/boot/{bootsect,setup}.S, this
code then jumps to the first instruction in
arch/i386/boot/compressed/head.S, which contains the beginning of the
protected mode instructions.  The bootsector loads the code in
compressed/head.S into high memory (>1MB).

bootsect.S (the bootsector):
 - loads the rest of the setup code
 - determines the floppy disk configuration
 - loads the binary kernel image file using BIOS INT 0x13 and moves it
   into high memory using BIOS INT  0x15 function 0x87 (64 KB chunks).
 - jumps to the beginning of setup.S

setup.S (real-mode setup):
 - gets the memory size (BIOS int 0x15 function 0x88)
 - sets the keyboard repeat rate
 - reads the hard drive configuration data from the BIOS data area
 - checks for a PS/2 mouse
 - checks for power management (APM)
 - disables interrupts and NMIs
 - loads the IDT and GDT
 - enables the A20 gate
 - resets the math coprocessor
 - reprograms the interrupt controller
 - switches the processor to protected mode
 - performs a far jump to the beginning of the 32bit code in
   compressed/head.S, which is at 0x100000.
 - at this point, on a Toshiba Tecra 710CDT, the computer does
   a hard power-on reset and reboots.


    Instructions in arch/i386/boot/compressed/head.S and the rest of
the kernel are loaded into high memory (0x100000 and above) by the
bootsector and setup code (arch/i386/boot/{bootsect,setup}.S) using
BIOS INT 15 function 0x87. Just before switching the processor to
Protected Mode, the A20 gate is enabled and then, a JMP FAR to
0x100000 occurs.

    On the Toshiba laptop, the first two bytes there are incorrect and
identical to those from address 0x000000 (which was an alias for
0x100000 before the A20 gate enable). At a second read from 0x100000
immediately afterwards, the correct memory content is returned.

    Asus P55TP5XE boards (Triton I chipset) show quite the same
problem, but there, only the first byte is incorrect and booting
bzImage kernels works fine.

    To me, this looks like some buffer or cache coherency problem,
although I think that caches are organized in at least 16 byte cache
lines. Any pointers to the real cause in the design of the
microprocessor and/or the PCI mainboard chipset are very welcome.


	Linux on the Toshiba Tecra 710CDT laptop WWW page at

Jens Maurer  12 Sep 1996