1
0
Fork 0
mirror of https://gitlab.com/bztsrc/bootboot.git synced 2023-02-13 20:54:32 -05:00
bztsrc--bootboot/x86_64-cb/README.md
2020-09-29 15:06:37 +02:00

107 lines
3.8 KiB
Markdown

BOOTBOOT Coreboot x86_64 Implementation
=======================================
See [BOOTBOOT Protocol](https://gitlab.com/bztsrc/bootboot) for common details.
Implements the BOOTBOOT Protocol as a [coreboot](https://coreboot.org) payload.
Must be compiled using the coreboot build environment.
Compilation
-----------
### Step 1 - Install dependencies
First, install the [coreboot dependencies](https://doc.coreboot.org/tutorial/part1.html): bison, build-essentials, curl,
flex, git, gnat, libncurses5-dev, m4, zlib. Please refer to the linked doc for up-to-date list of dependencies.
### Step 2 - Get coreboot
Download coreboot and its submodules
```sh
$ git clone https://review.coreboot.org/coreboot
$ cd coreboot
$ git submodule update --init
```
It is very important to initialize submodules, otherwise you won't be able to compile coreboot.
### Step 3 - Create toolchain
This step could take a while. Replace *$(nproc)* with the number of CPU cores you have.
```sh
$ make crossgcc-i386 CPUS=$(nproc)
```
### Step 4 - Configure
Now configure coreboot for your motherboard (or qemu) and BOOTBOOT.
```sh
$ make menuconfig
select 'Mainboard' menu
Beside 'Mainboard vendor' should be '(Emulation)'
Beside 'Mainboard model' should be 'QEMU x86 i440fx/piix4'
select 'Exit'
select 'Devices' menu
select 'Display' menu
Beside 'Framebuffer mode' should be 'Linear "high-resolution" framebuffer'
select 'Exit'
select 'Exit'
select 'Payload' menu
select 'Add a Payload'
choose 'BOOTBOOT'
select 'Exit'
select 'Exit'
select 'Yes'
```
It is important to set the display to "linear framebuffer", because BOOTBOOT does not handle the legacy, non-portable VGA
text mode. Sadly there's no way of configuring this in run-time with libpayload.
### Step 5 - Build coreboot
```sh
$ make
```
### Step 6 - Test the newly compiled ROM in QEMU
For more information, read the [coreboot docs](https://doc.coreboot.org/mainboard/emulation/qemu-i440fx.html). In the
[images](https://gitlab.com/bztsrc/bootboot/tree/binaries/images) directory you can find a precompiled coreboot-x86.rom binary.
```sh
$ qemu-system-x86_64 -bios build/coreboot.rom -drive file=$(BOOTBOOT)/images/disk-x86.img,format=raw -serial stdio
```
Adding Initrd to ROM
--------------------
To add an initrd into ROM, first you have to generate one. It can be an (optionally gzipped) tar, cpio, etc. archive. You can
also create it using the [mkbootimg](https://gitlab.com/bztsrc/bootboot/tree/master/mkbootimg) utility:
```sh
$ ./mkbootimg myos.json initrd.bin
```
Then use the `cbfstool` utility in the coreboot repository to add the initrd image into the ROM image:
```sh
$ ./build/cbfstool build/coreboot.rom add -t raw -f $(BOOTBOOT)/initrd.bin -n bootboot/initrd
```
You can add a fallback environment configuration similarily (only used if environment cannot be loaded from the usual places):
```sh
$ ./build/cbfstool build/coreboot.rom add -t raw -f $(BOOTBOOT)/environment.txt -n bootboot/config
```
Obviously this can only work if libpayload was compiled with `CONFIG_LP_CBFS=y`. Without you can still place the initrd on
a Flashmap partition named "INITRD" (however using the fmaptool and dealing with the fmd format is a rocket science).
Machine state
-------------
IRQs masked. GDT unspecified, but valid, IDT unset. SSE, SMP enabled. Code is running in supervisor mode in ring 0 on all cores.
Installation
------------
Once you have compiled a coreboot ROM with the BOOTBOOT payload, you can
[flash the build/coreboot.rom](https://doc.coreboot.org/flash_tutorial/index.html) file to your mainboard.
Limitations
-----------
- The CMOS nvram does not store timezone, so always GMT+0 returned in bootboot.timezone.
- Coreboot does not provide a way to set screen resolution, so "screen=" config option is not used.
- Only supports SHA-XOR-CBC, no AES