Convert multiline Redhat package list to one-line code markup. Change-Id: I1ba38bf2fc767a3f1694c55cf50e137ce10bfd75 Signed-off-by: Juan José García-Castro Crespo <jjgcc@posteo.net> Reviewed-on: https://review.coreboot.org/c/coreboot/+/80749 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nicholas Chin <nic.c3.14@gmail.com> Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
		
			
				
	
	
		
			311 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			311 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
Tutorial, part 1: Starting from scratch
 | 
						|
===========================================
 | 
						|
 | 
						|
This tutorial will guide you through the process of setting up a working
 | 
						|
coreboot toolchain. In same cases you will find specific instructions
 | 
						|
for Debian (apt-get), Fedora (dnf) and Arch Linux (pacman) based package
 | 
						|
management systems. Use the instructions according to your system.
 | 
						|
 | 
						|
To test the toolchain and make sure it works, we will build coreboot for
 | 
						|
an emulated system provided by QEMU. This allows you to get familiar
 | 
						|
with the general process of configuring and building coreboot without
 | 
						|
needing to flash any hardware.
 | 
						|
 | 
						|
**IMPORTANT:**
 | 
						|
**Do not attempt to flash the coreboot ROM built here to a real board**
 | 
						|
 | 
						|
coreboot is board specific, so a ROM built for one board model (such as
 | 
						|
the QEMU emulation boards) cannot be expected to work on a different
 | 
						|
board. You must reconfigure coreboot for your board and rebuild the ROM
 | 
						|
before flashing it to a physical system.
 | 
						|
 | 
						|
**Note: Summaries of each of the steps are at the end of the document.**
 | 
						|
 | 
						|
 | 
						|
Download, configure, and build coreboot
 | 
						|
---------------------------------------
 | 
						|
 | 
						|
 | 
						|
### Step 1 - Install tools and libraries needed for coreboot
 | 
						|
 | 
						|
Debian based distros:
 | 
						|
`sudo apt-get install -y bison build-essential curl flex git gnat
 | 
						|
libncurses5-dev libssl-dev m4 zlib1g-dev pkg-config`
 | 
						|
 | 
						|
Arch based distros:
 | 
						|
`sudo pacman -S base-devel curl git gcc-ada ncurses zlib`
 | 
						|
 | 
						|
Redhat based distros:
 | 
						|
`sudo dnf install git make gcc-gnat flex bison xz bzip2 gcc g++
 | 
						|
ncurses-devel wget zlib-devel patch`
 | 
						|
 | 
						|
 | 
						|
### Step 2 - Download coreboot source tree
 | 
						|
 | 
						|
```Bash
 | 
						|
git clone https://review.coreboot.org/coreboot
 | 
						|
cd coreboot
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
 | 
						|
### Step 3 - Build the coreboot toolchain
 | 
						|
 | 
						|
Please note that this can take a significant amount of time. Use `CPUS=`
 | 
						|
to specify number of `make` jobs to run in parallel.
 | 
						|
 | 
						|
This will list toolchain options and supported architectures:
 | 
						|
 | 
						|
```Bash
 | 
						|
make help_toolchain
 | 
						|
```
 | 
						|
 | 
						|
Here are some examples:
 | 
						|
 | 
						|
```Bash
 | 
						|
make crossgcc-i386 CPUS=$(nproc)       # build i386 toolchain
 | 
						|
make crossgcc-aarch64 CPUS=$(nproc)    # build Aarch64 toolchain
 | 
						|
make crossgcc-riscv CPUS=$(nproc)      # build RISC-V toolchain
 | 
						|
```
 | 
						|
 | 
						|
Note that the i386 toolchain is currently used for all x86 platforms,
 | 
						|
including x86_64. For this tutorial we only need the i386 toolchain.
 | 
						|
 | 
						|
Also note that you can possibly use your system toolchain, but the
 | 
						|
results are not reproducible, and may have issues, so this is not
 | 
						|
recommended.  See step 5 to use your system toolchain.
 | 
						|
 | 
						|
 | 
						|
### Step 4 - Build the payload - coreinfo
 | 
						|
 | 
						|
```Bash
 | 
						|
make -C payloads/coreinfo olddefconfig
 | 
						|
make -C payloads/coreinfo
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
### Step 5 - Configure the build
 | 
						|
 | 
						|
##### Configure your mainboard
 | 
						|
 | 
						|
```Bash
 | 
						|
make menuconfig
 | 
						|
```
 | 
						|
 | 
						|
Do the next steps in the menu:
 | 
						|
 | 
						|
```Text
 | 
						|
select 'Mainboard' menu
 | 
						|
Beside 'Mainboard vendor' should be '(Emulation)'
 | 
						|
Beside 'Mainboard model' should be 'QEMU x86 i440fx/piix4'
 | 
						|
select < Exit >
 | 
						|
```
 | 
						|
 | 
						|
These should be the default selections, so if anything else was set, run
 | 
						|
`make distclean` to remove your old config file and start over.
 | 
						|
 | 
						|
##### Optionally use your system toolchain (Again, not recommended)
 | 
						|
 | 
						|
```Text
 | 
						|
select 'General Setup' menu
 | 
						|
select 'Allow building with any toolchain'
 | 
						|
select < Exit >
 | 
						|
```
 | 
						|
 | 
						|
##### Select the payload
 | 
						|
 | 
						|
```Text
 | 
						|
select 'Payload' menu
 | 
						|
select 'Payload to add (SeaBIOS) --->'
 | 
						|
choose 'An ELF executable payload'
 | 
						|
select 'Payload path and filename'
 | 
						|
enter 'payloads/coreinfo/build/coreinfo.elf'
 | 
						|
select < Exit >
 | 
						|
select < Exit >
 | 
						|
select < Yes >
 | 
						|
```
 | 
						|
 | 
						|
##### Check your configuration (optional step):
 | 
						|
 | 
						|
```Bash
 | 
						|
make savedefconfig
 | 
						|
cat defconfig
 | 
						|
```
 | 
						|
 | 
						|
There should only be 9 lines (or 10 if you're using the system
 | 
						|
toolchain):
 | 
						|
 | 
						|
```Text
 | 
						|
CONFIG_CBFS_SIZE=0x00400000
 | 
						|
CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000
 | 
						|
CONFIG_SUBSYSTEM_VENDOR_ID=0x0000
 | 
						|
CONFIG_SUBSYSTEM_DEVICE_ID=0x0000
 | 
						|
CONFIG_I2C_TRANSFER_TIMEOUT_US=500000
 | 
						|
CONFIG_CONSOLE_QEMU_DEBUGCON_PORT=0x402
 | 
						|
CONFIG_POST_IO_PORT=0x80
 | 
						|
CONFIG_PAYLOAD_ELF=y
 | 
						|
CONFIG_PAYLOAD_FILE="payloads/coreinfo/build/coreinfo.elf"
 | 
						|
```
 | 
						|
 | 
						|
Note that this may differ depending on the revision of the coreboot
 | 
						|
source you are building from and should not be taken as the required
 | 
						|
contents of defconfig. 
 | 
						|
 | 
						|
### Step 6 - Build coreboot
 | 
						|
 | 
						|
```Bash
 | 
						|
make
 | 
						|
```
 | 
						|
 | 
						|
At the end of the build, you should see:
 | 
						|
 | 
						|
`Built emulation/qemu-i440fx (QEMU x86 i440fx/piix4)`
 | 
						|
 | 
						|
This means your build was successful. The output from the build is in
 | 
						|
the `build` directory. `build/coreboot.rom` is the full rom file.
 | 
						|
 | 
						|
 | 
						|
Test the image using QEMU
 | 
						|
-------------------------
 | 
						|
 | 
						|
 | 
						|
### Step 7 - Install QEMU
 | 
						|
 | 
						|
* Debian: `sudo apt-get install -y qemu-system`
 | 
						|
* Arch: `sudo pacman -S qemu`
 | 
						|
* Redhat: `sudo dnf install qemu`
 | 
						|
 | 
						|
 | 
						|
### Step 8 - Run QEMU
 | 
						|
 | 
						|
Start QEMU, and point it to the ROM you just built:
 | 
						|
 | 
						|
```Bash
 | 
						|
qemu-system-x86_64 -bios build/coreboot.rom -serial stdio
 | 
						|
```
 | 
						|
 | 
						|
You should see the serial output of coreboot in the original console
 | 
						|
window, and a new window will appear running the coreinfo payload.
 | 
						|
 | 
						|
 | 
						|
Summary
 | 
						|
-------
 | 
						|
 | 
						|
 | 
						|
### Step 1 summary - Install tools and libraries needed for coreboot
 | 
						|
 | 
						|
Depending on your distribution you have installed the minimum additional
 | 
						|
software requirements to continue with downloading and building
 | 
						|
coreboot.  Not every distribution has the tools, that would be required,
 | 
						|
installed by default. In the following we shortly introduce the purpose
 | 
						|
of the installed packages:
 | 
						|
 | 
						|
* `build-essential` or `base-devel` are the basic tools for building software.
 | 
						|
* `git` is needed to download coreboot from the coreboot git repository.
 | 
						|
* `libncurses5-dev` or `ncurses` is needed to build the menu for 'make menuconfig'
 | 
						|
* `m4, bison, curl, flex, zlib1g-dev, gcc, gnat` and `g++` or `clang`
 | 
						|
are needed to build the coreboot toolchain. `gcc` and `gnat` have to be
 | 
						|
of the same version.
 | 
						|
* `libssl-dev, pkg-config` are needed to build coreboot image (Step 6).
 | 
						|
In particular, `libcrypto` provided by `libssl-dev` package.
 | 
						|
 | 
						|
If you started with a different distribution or package management
 | 
						|
system you might need to install other packages. Most likely they are
 | 
						|
named slightly different. If that is the case for you, we'd like to
 | 
						|
encourage you to contribute to the project and submit a pull request
 | 
						|
with an update for this documentation for your system.
 | 
						|
 | 
						|
 | 
						|
### Step 2 summary - Download coreboot source tree
 | 
						|
 | 
						|
This will download a 'read-only' copy of the coreboot tree. This just
 | 
						|
means that if you made changes to the coreboot tree, you couldn't
 | 
						|
immediately contribute them back to the community. To pull a copy of
 | 
						|
coreboot that would allow you to contribute back, you would first need
 | 
						|
to sign up for an account on gerrit.
 | 
						|
 | 
						|
 | 
						|
### Step 3 summary - Build the coreboot toolchain.
 | 
						|
 | 
						|
This builds one of the coreboot cross-compiler toolchains for X86
 | 
						|
platforms.  Because of the variability of compilers and the other
 | 
						|
required tools between the various operating systems that coreboot can
 | 
						|
be built on, coreboot supplies and uses its own cross-compiler toolchain
 | 
						|
to build the binaries that end up as part of the coreboot ROM. The
 | 
						|
toolchain provided by the operating system (the 'host toolchain') is
 | 
						|
used to build various tools that will run on the local system during the
 | 
						|
build process.
 | 
						|
 | 
						|
 | 
						|
### Step 4 summary - Build the payload
 | 
						|
 | 
						|
To actually do anything useful with coreboot, you need to build a
 | 
						|
payload to include into the rom. The idea behind coreboot is that it
 | 
						|
does the minimum amount possible before passing control of the machine
 | 
						|
to a payload. There are various payloads such as grub or SeaBIOS that
 | 
						|
are typically used to boot the operating system. Instead, we used
 | 
						|
coreinfo, a small demonstration payload that allows the user to look at
 | 
						|
various things such as memory and the contents of the coreboot file
 | 
						|
system (CBFS) - the pieces that make up the coreboot rom.
 | 
						|
 | 
						|
Usually, the coreboot build system automatically builds the payload
 | 
						|
selected in the "Payload to add" menu and sets it as the default payload
 | 
						|
(also known as the "primary payload"). Such payloads are able to boot an
 | 
						|
operating system and may be able to load another payload. Although
 | 
						|
coreinfo can be found in the "Secondary Payloads" menu, in which case it
 | 
						|
would be handled automatically, it is not available as a primary payload
 | 
						|
since it cannot load an OS or another payload. Secondary payloads must
 | 
						|
be loaded from other primary or secondary payloads and will not be run
 | 
						|
when coreboot hands off execution after initializing hardware. Thus, to
 | 
						|
get coreinfo to run as if it were a primary payload, it must be manually
 | 
						|
built and explicitly set as the primary payload using the "ELF
 | 
						|
executable payload" option.
 | 
						|
 | 
						|
 | 
						|
### Step 5 summary - Configure the build
 | 
						|
 | 
						|
This step configures coreboot's build options using the menuconfig
 | 
						|
interface to Kconfig. Kconfig is the same configuration program used by
 | 
						|
the linux kernel. It allows you to enable, disable, and change various
 | 
						|
values to control the coreboot build process, including which
 | 
						|
mainboard(motherboard) to use, which toolchain to use, and how the
 | 
						|
runtime debug console should be presented and saved.  Anytime you change
 | 
						|
mainboards in Kconfig, you should always run `make distclean` before
 | 
						|
running `make menuconfig`. Due to the way that Kconfig works, values
 | 
						|
will be kept from the previous mainboard if you skip the clean step.
 | 
						|
This leads to a hybrid configuration which may or may not work as
 | 
						|
expected.
 | 
						|
 | 
						|
 | 
						|
### Step 6 summary - Build coreboot
 | 
						|
 | 
						|
You may notice that a number of other pieces are downloaded at the
 | 
						|
beginning of the build process. These are the git submodules used in
 | 
						|
various coreboot builds.  By default, the _blobs_ submodule is not
 | 
						|
downloaded. This git submodule may be required for other builds for
 | 
						|
microcode or other binaries. To enable downloading this submodule,
 | 
						|
select the option "Allow use of binary-only repository" in the "General
 | 
						|
Setup" menu of Kconfig This attempts to build the coreboot rom. The rom
 | 
						|
file itself ends up in the build directory as 'coreboot.rom'. At the end
 | 
						|
of the build process, the build displayed the contents of the rom file.
 | 
						|
 | 
						|
 | 
						|
### Step 7 summary - Install QEMU
 | 
						|
 | 
						|
QEMU is a processor emulator which we can use to show the coreboot boot
 | 
						|
process in a virtualised environment.
 | 
						|
 | 
						|
 | 
						|
### Step 8 summary - Run QEMU
 | 
						|
 | 
						|
Here's the command line instruction broken down:
 | 
						|
* `qemu-system-x86_64`
 | 
						|
This starts the QEMU emulator with the i440FX host PCI bridge and PIIX3
 | 
						|
PCI to ISA bridge.
 | 
						|
* `-bios build/coreboot.rom`
 | 
						|
Use the coreboot rom image that we just built. If this flag is left out,
 | 
						|
the standard SeaBIOS image that comes with QEMU is used.
 | 
						|
* `-serial stdio`
 | 
						|
Send the serial output to the console. This allows you to view the
 | 
						|
coreboot boot log.
 |