]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
doc: Bring in FIT x86 boot
authorSimon Glass <sjg@chromium.org>
Fri, 23 Jun 2023 12:22:05 +0000 (13:22 +0100)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Fri, 23 Jun 2023 14:28:13 +0000 (16:28 +0200)
Bring this file into the documentation.

Signed-off-by: Simon Glass <sjg@chromium.org>
doc/uImage.FIT/x86-fit-boot.txt [deleted file]
doc/usage/fit/index.rst
doc/usage/fit/x86-fit-boot.rst [new file with mode: 0644]

diff --git a/doc/uImage.FIT/x86-fit-boot.txt b/doc/uImage.FIT/x86-fit-boot.txt
deleted file mode 100644 (file)
index 88d3460..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-Booting Linux on x86 with FIT
-=============================
-
-Background
-----------
-
-(corrections to the text below are welcome)
-
-Generally Linux x86 uses its own very complex booting method. There is a setup
-binary which contains all sorts of parameters and a compressed self-extracting
-binary for the kernel itself, often with a small built-in serial driver to
-display decompression progress.
-
-The x86 CPU has various processor modes. I am no expert on these, but my
-understanding is that an x86 CPU (even a really new one) starts up in a 16-bit
-'real' mode where only 1MB of memory is visible, moves to 32-bit 'protected'
-mode where 4GB is visible (or more with special memory access techniques) and
-then to 64-bit 'long' mode if 64-bit execution is required.
-
-Partly the self-extracting nature of Linux was introduced to cope with boot
-loaders that were barely capable of loading anything. Even changing to 32-bit
-mode was something of a challenge, so putting this logic in the kernel seemed
-to make sense.
-
-Bit by bit more and more logic has been added to this post-boot pre-Linux
-wrapper:
-
-- Changing to 32-bit mode
-- Decompression
-- Serial output (with drivers for various chips)
-- Load address randomisation
-- Elf loader complete with relocation (for the above)
-- Random number generator via 3 methods (again for the above)
-- Some sort of EFI mini-loader (1000+ glorious lines of code)
-- Locating and tacking on a device tree and ramdisk
-
-To my mind, if you sit back and look at things from first principles, this
-doesn't make a huge amount of sense. Any boot loader worth its salts already
-has most of the above features and more besides. The boot loader already knows
-the layout of memory, has a serial driver, can decompress things, includes an
-ELF loader and supports device tree and ramdisks. The decision to duplicate
-all these features in a Linux wrapper caters for the lowest common
-denominator: a boot loader which consists of a BIOS call to load something off
-disk, followed by a jmp instruction.
-
-(Aside: On ARM systems, we worry that the boot loader won't know where to load
-the kernel. It might be easier to just provide that information in the image,
-or in the boot loader rather than adding a self-relocator to put it in the
-right place. Or just use ELF?
-
-As a result, the x86 kernel boot process is needlessly complex. The file
-format is also complex, and obfuscates the contents to a degree that it is
-quite a challenge to extract anything from it. This bzImage format has become
-so prevalent that is actually isn't possible to produce the 'raw' kernel build
-outputs with the standard Makefile (as it is on ARM for example, at least at
-the time of writing).
-
-This document describes an alternative boot process which uses simple raw
-images which are loaded into the right place by the boot loader and then
-executed.
-
-
-Build the kernel
-----------------
-
-Note: these instructions assume a 32-bit kernel. U-Boot also supports directly
-booting a 64-bit kernel by jumping into 64-bit mode first (see below).
-
-You can build the kernel as normal with 'make'. This will create a file called
-'vmlinux'. This is a standard ELF file and you can look at it if you like:
-
-$ objdump -h vmlinux
-
-vmlinux:     file format elf32-i386
-
-Sections:
-Idx Name          Size      VMA       LMA       File off  Algn
-  0 .text         00416850  81000000  01000000  00001000  2**5
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
-  1 .notes        00000024  81416850  01416850  00417850  2**2
-                  CONTENTS, ALLOC, LOAD, READONLY, CODE
-  2 __ex_table    00000c50  81416880  01416880  00417880  2**3
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
-  3 .rodata       00154b9e  81418000  01418000  00419000  2**5
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
-  4 __bug_table   0000597c  8156cba0  0156cba0  0056dba0  2**0
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
-  5 .pci_fixup    00001b80  8157251c  0157251c  0057351c  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
-  6 .tracedata    00000024  8157409c  0157409c  0057509c  2**0
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
-  7 __ksymtab     00007ec0  815740c0  015740c0  005750c0  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
-  8 __ksymtab_gpl 00004a28  8157bf80  0157bf80  0057cf80  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
-  9 __ksymtab_strings 0001d6fc  815809a8  015809a8  005819a8  2**0
-                  CONTENTS, ALLOC, LOAD, READONLY, DATA
- 10 __init_rodata 00001c3c  8159e0a4  0159e0a4  0059f0a4  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
- 11 __param       00000ff0  8159fce0  0159fce0  005a0ce0  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
- 12 __modver      00000330  815a0cd0  015a0cd0  005a1cd0  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
- 13 .data         00063000  815a1000  015a1000  005a2000  2**12
-                  CONTENTS, ALLOC, LOAD, RELOC, DATA
- 14 .init.text    0002f104  81604000  01604000  00605000  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
- 15 .init.data    00040cdc  81634000  01634000  00635000  2**12
-                  CONTENTS, ALLOC, LOAD, RELOC, DATA
- 16 .x86_cpu_dev.init 0000001c  81674cdc  01674cdc  00675cdc  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
- 17 .altinstructions 0000267c  81674cf8  01674cf8  00675cf8  2**0
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
- 18 .altinstr_replacement 00000942  81677374  01677374  00678374  2**0
-                  CONTENTS, ALLOC, LOAD, READONLY, CODE
- 19 .iommu_table  00000014  81677cb8  01677cb8  00678cb8  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
- 20 .apicdrivers  00000004  81677cd0  01677cd0  00678cd0  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, DATA
- 21 .exit.text    00001a80  81677cd8  01677cd8  00678cd8  2**0
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
- 22 .data..percpu 00007880  8167a000  0167a000  0067b000  2**12
-                  CONTENTS, ALLOC, LOAD, RELOC, DATA
- 23 .smp_locks    00003000  81682000  01682000  00683000  2**2
-                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
- 24 .bss          000a1000  81685000  01685000  00686000  2**12
-                  ALLOC
- 25 .brk          00424000  81726000  01726000  00686000  2**0
-                  ALLOC
- 26 .comment      00000049  00000000  00000000  00686000  2**0
-                  CONTENTS, READONLY
- 27 .GCC.command.line 0003e055  00000000  00000000  00686049  2**0
-                  CONTENTS, READONLY
- 28 .debug_aranges 0000f4c8  00000000  00000000  006c40a0  2**3
-                  CONTENTS, RELOC, READONLY, DEBUGGING
- 29 .debug_info   0440b0df  00000000  00000000  006d3568  2**0
-                  CONTENTS, RELOC, READONLY, DEBUGGING
- 30 .debug_abbrev 0022a83b  00000000  00000000  04ade647  2**0
-                  CONTENTS, READONLY, DEBUGGING
- 31 .debug_line   004ead0d  00000000  00000000  04d08e82  2**0
-                  CONTENTS, RELOC, READONLY, DEBUGGING
- 32 .debug_frame  0010a960  00000000  00000000  051f3b90  2**2
-                  CONTENTS, RELOC, READONLY, DEBUGGING
- 33 .debug_str    001b442d  00000000  00000000  052fe4f0  2**0
-                  CONTENTS, READONLY, DEBUGGING
- 34 .debug_loc    007c7fa9  00000000  00000000  054b291d  2**0
-                  CONTENTS, RELOC, READONLY, DEBUGGING
- 35 .debug_ranges 00098828  00000000  00000000  05c7a8c8  2**3
-                  CONTENTS, RELOC, READONLY, DEBUGGING
-
-There is also the setup binary mentioned earlier. This is at
-arch/x86/boot/setup.bin and is about 12KB in size. It includes the command
-line and various settings need by the kernel. Arguably the boot loader should
-provide all of this also, but setting it up is some complex that the kernel
-helps by providing a head start.
-
-As you can see the code loads to address 0x01000000 and everything else
-follows after that. We could load this image using the 'bootelf' command but
-we would still need to provide the setup binary. This is not supported by
-U-Boot although I suppose you could mostly script it. This would permit the
-use of a relocatable kernel.
-
-All we need to boot is the vmlinux file and the setup.bin file.
-
-
-Create a FIT
-------------
-
-To create a FIT you will need a source file describing what should go in the
-FIT. See kernel.its for an example for x86 and also instructions on setting
-the 'arch' value for booting 64-bit kernels if desired. Put this into a file
-called image.its.
-
-Note that setup is loaded to the special address of 0x90000 (a special address
-you just have to know) and the kernel is loaded to 0x01000000 (the address you
-saw above). This means that you will need to load your FIT to a different
-address so that U-Boot doesn't overwrite it when decompressing. Something like
-0x02000000 will do so you can set CONFIG_SYS_LOAD_ADDR to that.
-
-In that example the kernel is compressed with lzo. Also we need to provide a
-flat binary, not an ELF. So the steps needed to set things are are:
-
-   # Create a flat binary
-   objcopy -O binary vmlinux vmlinux.bin
-
-   # Compress it into LZO format
-   lzop vmlinux.bin
-
-   # Build a FIT image
-   mkimage -f image.its image.fit
-
-(be careful to run the mkimage from your U-Boot tools directory since it
-will have x86_setup support.)
-
-You can take a look at the resulting fit file if you like:
-
-$ dumpimage -l image.fit
-FIT description: Simple image with single Linux kernel on x86
-Created:         Tue Oct  7 10:57:24 2014
- Image 0 (kernel)
-  Description:  Vanilla Linux kernel
-  Created:      Tue Oct  7 10:57:24 2014
-  Type:         Kernel Image
-  Compression:  lzo compressed
-  Data Size:    4591767 Bytes = 4484.15 kB = 4.38 MB
-  Architecture: Intel x86
-  OS:           Linux
-  Load Address: 0x01000000
-  Entry Point:  0x00000000
-  Hash algo:    sha1
-  Hash value:   446b5163ebfe0fb6ee20cbb7a8501b263cd92392
- Image 1 (setup)
-  Description:  Linux setup.bin
-  Created:      Tue Oct  7 10:57:24 2014
-  Type:         x86 setup.bin
-  Compression:  uncompressed
-  Data Size:    12912 Bytes = 12.61 kB = 0.01 MB
-  Hash algo:    sha1
-  Hash value:   a1f2099cf47ff9816236cd534c77af86e713faad
- Default Configuration: 'config-1'
- Configuration 0 (config-1)
-  Description:  Boot Linux kernel
-  Kernel:       kernel
-
-
-Booting the FIT
----------------
-
-To make it boot you need to load it and then use 'bootm' to boot it. A
-suitable script to do this from a network server is:
-
-   bootp
-   tftp image.fit
-   bootm
-
-This will load the image from the network and boot it. The command line (from
-the 'bootargs' environment variable) will be passed to the kernel.
-
-If you want a ramdisk you can add it as normal with FIT. If you want a device
-tree then x86 doesn't normally use those - it has ACPI instead.
-
-
-Why Bother?
------------
-
-1. It demystifies the process of booting an x86 kernel
-2. It allows use of the standard U-Boot boot file format
-3. It allows U-Boot to perform decompression - problems will provide an error
-message and you are still in the boot loader. It is possible to investigate.
-4. It avoids all the pre-loader code in the kernel which is quite complex to
-follow
-5. You can use verified/secure boot and other features which haven't yet been
-added to the pre-Linux
-6. It makes x86 more like other architectures in the way it boots a kernel.
-You can potentially use the same file format for the kernel, and the same
-procedure for building and packaging it.
-
-
-References
-----------
-
-In the Linux kernel, Documentation/x86/boot.txt defines the boot protocol for
-the kernel including the setup.bin format. This is handled in U-Boot in
-arch/x86/lib/zimage.c and arch/x86/lib/bootm.c.
-
-Various files in the same directory as this file describe the FIT format.
-
-
---
-Simon Glass
-sjg@chromium.org
-7-Oct-2014
index 93a96231903533786dd8f71a3a1abc863d01d8c5..0635d06b811a191d9b5c4333dd06ef5edadb30be 100644 (file)
@@ -11,3 +11,4 @@ doc/uImage.FIT
     :maxdepth: 1
 
     source_file_format
+    x86-fit-boot
diff --git a/doc/usage/fit/x86-fit-boot.rst b/doc/usage/fit/x86-fit-boot.rst
new file mode 100644 (file)
index 0000000..93b73bb
--- /dev/null
@@ -0,0 +1,269 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+Booting Linux on x86 with FIT
+=============================
+
+Background
+----------
+
+Generally Linux x86 uses its own very complex booting method. There is a setup
+binary which contains all sorts of parameters and a compressed self-extracting
+binary for the kernel itself, often with a small built-in serial driver to
+display decompression progress.
+
+The x86 CPU has various processor modes. I am no expert on these, but my
+understanding is that an x86 CPU (even a really new one) starts up in a 16-bit
+'real' mode where only 1MB of memory is visible, moves to 32-bit 'protected'
+mode where 4GB is visible (or more with special memory access techniques) and
+then to 64-bit 'long' mode if 64-bit execution is required.
+
+Partly the self-extracting nature of Linux was introduced to cope with boot
+loaders that were barely capable of loading anything. Even changing to 32-bit
+mode was something of a challenge, so putting this logic in the kernel seemed
+to make sense.
+
+Bit by bit more and more logic has been added to this post-boot pre-Linux
+wrapper:
+
+- Changing to 32-bit mode
+- Decompression
+- Serial output (with drivers for various chips)
+- Load address randomisation
+- Elf loader complete with relocation (for the above)
+- Random number generator via 3 methods (again for the above)
+- Some sort of EFI mini-loader (1000+ glorious lines of code)
+- Locating and tacking on a device tree and ramdisk
+
+To my mind, if you sit back and look at things from first principles, this
+doesn't make a huge amount of sense. Any boot loader worth its salts already
+has most of the above features and more besides. The boot loader already knows
+the layout of memory, has a serial driver, can decompress things, includes an
+ELF loader and supports device tree and ramdisks. The decision to duplicate
+all these features in a Linux wrapper caters for the lowest common
+denominator: a boot loader which consists of a BIOS call to load something off
+disk, followed by a jmp instruction.
+
+(Aside: On ARM systems, we worry that the boot loader won't know where to load
+the kernel. It might be easier to just provide that information in the image,
+or in the boot loader rather than adding a self-relocator to put it in the
+right place. Or just use ELF?
+
+As a result, the x86 kernel boot process is needlessly complex. The file
+format is also complex, and obfuscates the contents to a degree that it is
+quite a challenge to extract anything from it. This bzImage format has become
+so prevalent that is actually isn't possible to produce the 'raw' kernel build
+outputs with the standard Makefile (as it is on ARM for example, at least at
+the time of writing).
+
+This document describes an alternative boot process which uses simple raw
+images which are loaded into the right place by the boot loader and then
+executed.
+
+
+Build the kernel
+----------------
+
+Note: these instructions assume a 32-bit kernel. U-Boot also supports directly
+booting a 64-bit kernel by jumping into 64-bit mode first (see below).
+
+You can build the kernel as normal with 'make'. This will create a file called
+'vmlinux'. This is a standard ELF file and you can look at it if you like::
+
+    $ objdump -h vmlinux
+
+    vmlinux:     file format elf32-i386
+
+    Sections:
+    Idx Name          Size      VMA       LMA       File off  Algn
+      0 .text         00416850  81000000  01000000  00001000  2**5
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+      1 .notes        00000024  81416850  01416850  00417850  2**2
+                      CONTENTS, ALLOC, LOAD, READONLY, CODE
+      2 __ex_table    00000c50  81416880  01416880  00417880  2**3
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+      3 .rodata       00154b9e  81418000  01418000  00419000  2**5
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+      4 __bug_table   0000597c  8156cba0  0156cba0  0056dba0  2**0
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+      5 .pci_fixup    00001b80  8157251c  0157251c  0057351c  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+      6 .tracedata    00000024  8157409c  0157409c  0057509c  2**0
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+      7 __ksymtab     00007ec0  815740c0  015740c0  005750c0  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+      8 __ksymtab_gpl 00004a28  8157bf80  0157bf80  0057cf80  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+      9 __ksymtab_strings 0001d6fc  815809a8  015809a8  005819a8  2**0
+                      CONTENTS, ALLOC, LOAD, READONLY, DATA
+     10 __init_rodata 00001c3c  8159e0a4  0159e0a4  0059f0a4  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+     11 __param       00000ff0  8159fce0  0159fce0  005a0ce0  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+     12 __modver      00000330  815a0cd0  015a0cd0  005a1cd0  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+     13 .data         00063000  815a1000  015a1000  005a2000  2**12
+                      CONTENTS, ALLOC, LOAD, RELOC, DATA
+     14 .init.text    0002f104  81604000  01604000  00605000  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+     15 .init.data    00040cdc  81634000  01634000  00635000  2**12
+                      CONTENTS, ALLOC, LOAD, RELOC, DATA
+     16 .x86_cpu_dev.init 0000001c  81674cdc  01674cdc  00675cdc  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+     17 .altinstructions 0000267c  81674cf8  01674cf8  00675cf8  2**0
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+     18 .altinstr_replacement 00000942  81677374  01677374  00678374  2**0
+                      CONTENTS, ALLOC, LOAD, READONLY, CODE
+     19 .iommu_table  00000014  81677cb8  01677cb8  00678cb8  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+     20 .apicdrivers  00000004  81677cd0  01677cd0  00678cd0  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, DATA
+     21 .exit.text    00001a80  81677cd8  01677cd8  00678cd8  2**0
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
+     22 .data..percpu 00007880  8167a000  0167a000  0067b000  2**12
+                      CONTENTS, ALLOC, LOAD, RELOC, DATA
+     23 .smp_locks    00003000  81682000  01682000  00683000  2**2
+                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
+     24 .bss          000a1000  81685000  01685000  00686000  2**12
+                      ALLOC
+     25 .brk          00424000  81726000  01726000  00686000  2**0
+                      ALLOC
+     26 .comment      00000049  00000000  00000000  00686000  2**0
+                      CONTENTS, READONLY
+     27 .GCC.command.line 0003e055  00000000  00000000  00686049  2**0
+                      CONTENTS, READONLY
+     28 .debug_aranges 0000f4c8  00000000  00000000  006c40a0  2**3
+                      CONTENTS, RELOC, READONLY, DEBUGGING
+     29 .debug_info   0440b0df  00000000  00000000  006d3568  2**0
+                      CONTENTS, RELOC, READONLY, DEBUGGING
+     30 .debug_abbrev 0022a83b  00000000  00000000  04ade647  2**0
+                      CONTENTS, READONLY, DEBUGGING
+     31 .debug_line   004ead0d  00000000  00000000  04d08e82  2**0
+                      CONTENTS, RELOC, READONLY, DEBUGGING
+     32 .debug_frame  0010a960  00000000  00000000  051f3b90  2**2
+                      CONTENTS, RELOC, READONLY, DEBUGGING
+     33 .debug_str    001b442d  00000000  00000000  052fe4f0  2**0
+                      CONTENTS, READONLY, DEBUGGING
+     34 .debug_loc    007c7fa9  00000000  00000000  054b291d  2**0
+                      CONTENTS, RELOC, READONLY, DEBUGGING
+     35 .debug_ranges 00098828  00000000  00000000  05c7a8c8  2**3
+                      CONTENTS, RELOC, READONLY, DEBUGGING
+
+There is also the setup binary mentioned earlier. This is at
+arch/x86/boot/setup.bin and is about 12KB in size. It includes the command
+line and various settings need by the kernel. Arguably the boot loader should
+provide all of this also, but setting it up is some complex that the kernel
+helps by providing a head start.
+
+As you can see the code loads to address 0x01000000 and everything else
+follows after that. We could load this image using the 'bootelf' command but
+we would still need to provide the setup binary. This is not supported by
+U-Boot although I suppose you could mostly script it. This would permit the
+use of a relocatable kernel.
+
+All we need to boot is the vmlinux file and the setup.bin file.
+
+
+Create a FIT
+------------
+
+To create a FIT you will need a source file describing what should go in the
+FIT. See kernel.its for an example for x86 and also instructions on setting
+the 'arch' value for booting 64-bit kernels if desired. Put this into a file
+called image.its.
+
+Note that setup is loaded to the special address of 0x90000 (a special address
+you just have to know) and the kernel is loaded to 0x01000000 (the address you
+saw above). This means that you will need to load your FIT to a different
+address so that U-Boot doesn't overwrite it when decompressing. Something like
+0x02000000 will do so you can set CONFIG_SYS_LOAD_ADDR to that.
+
+In that example the kernel is compressed with lzo. Also we need to provide a
+flat binary, not an ELF. So the steps needed to set things are are::
+
+    # Create a flat binary
+    objcopy -O binary vmlinux vmlinux.bin
+
+    # Compress it into LZO format
+    lzop vmlinux.bin
+
+    # Build a FIT image
+    mkimage -f image.its image.fit
+
+(be careful to run the mkimage from your U-Boot tools directory since it
+will have x86_setup support.)
+
+You can take a look at the resulting fit file if you like::
+
+    $ dumpimage -l image.fit
+    FIT description: Simple image with single Linux kernel on x86
+    Created:         Tue Oct  7 10:57:24 2014
+     Image 0 (kernel)
+      Description:  Vanilla Linux kernel
+      Created:      Tue Oct  7 10:57:24 2014
+      Type:         Kernel Image
+      Compression:  lzo compressed
+      Data Size:    4591767 Bytes = 4484.15 kB = 4.38 MB
+      Architecture: Intel x86
+      OS:           Linux
+      Load Address: 0x01000000
+      Entry Point:  0x00000000
+      Hash algo:    sha1
+      Hash value:   446b5163ebfe0fb6ee20cbb7a8501b263cd92392
+     Image 1 (setup)
+      Description:  Linux setup.bin
+      Created:      Tue Oct  7 10:57:24 2014
+      Type:         x86 setup.bin
+      Compression:  uncompressed
+      Data Size:    12912 Bytes = 12.61 kB = 0.01 MB
+      Hash algo:    sha1
+      Hash value:   a1f2099cf47ff9816236cd534c77af86e713faad
+     Default Configuration: 'config-1'
+     Configuration 0 (config-1)
+      Description:  Boot Linux kernel
+      Kernel:       kernel
+
+
+Booting the FIT
+---------------
+
+To make it boot you need to load it and then use 'bootm' to boot it. A
+suitable script to do this from a network server is::
+
+    bootp
+    tftp image.fit
+    bootm
+
+This will load the image from the network and boot it. The command line (from
+the 'bootargs' environment variable) will be passed to the kernel.
+
+If you want a ramdisk you can add it as normal with FIT. If you want a device
+tree then x86 doesn't normally use those - it has ACPI instead.
+
+
+Why Bother?
+-----------
+
+#. It demystifies the process of booting an x86 kernel
+#. It allows use of the standard U-Boot boot file format
+#. It allows U-Boot to perform decompression - problems will provide an error
+   message and you are still in the boot loader. It is possible to investigate.
+#. It avoids all the pre-loader code in the kernel which is quite complex to
+   follow
+#. You can use verified/secure boot and other features which haven't yet been
+   added to the pre-Linux
+#. It makes x86 more like other architectures in the way it boots a kernel.
+   You can potentially use the same file format for the kernel, and the same
+   procedure for building and packaging it.
+
+
+References
+----------
+
+In the Linux kernel, Documentation/x86/boot.txt defines the boot protocol for
+the kernel including the setup.bin format. This is handled in U-Boot in
+arch/x86/lib/zimage.c and arch/x86/lib/bootm.c.
+
+Various files in the same directory as this file describe the FIT format.
+
+
+.. sectionauthor:: Simon Glass <sjg@chromium.org> 7-Oct-2014