Change-Id: I41571c45719dfade49a021b6bafe80afdcb7b581 Signed-off-by: Paul Menzel <pmenzel@molgen.mpg.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/41223 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# coreboot architecture
 | 
						|
 | 
						|
## Overview
 | 
						|
![][architecture]
 | 
						|
 | 
						|
[architecture]: comparision_coreboot_uefi.svg
 | 
						|
 | 
						|
## Stages
 | 
						|
coreboot consists of multiple stages that are compiled as separate binaries and
 | 
						|
are inserted into the CBFS with custom compression. The bootblock usually doesn't
 | 
						|
have compression while the ramstage and payload are compressed with LZMA.
 | 
						|
 | 
						|
Each stage loads the next stage at given address (possibly decompressing it).
 | 
						|
 | 
						|
Some stages are relocatable and can be placed anywhere in DRAM. Those stages are
 | 
						|
usually cached in CBMEM for faster loading times on ACPI S3 resume.
 | 
						|
 | 
						|
Supported stage compressions:
 | 
						|
* none
 | 
						|
* LZ4
 | 
						|
* LZMA
 | 
						|
 | 
						|
## bootblock
 | 
						|
The bootblock is the first stage executed after CPU reset. It is written in
 | 
						|
assembly language and its main task is to set up everything for a C-environment:
 | 
						|
 | 
						|
Common tasks:
 | 
						|
 | 
						|
* Cache-As-RAM for heap and stack
 | 
						|
* Set stack pointer
 | 
						|
* Clear memory for BSS
 | 
						|
* Decompress and load the next stage
 | 
						|
 | 
						|
On x86 platforms that includes:
 | 
						|
 | 
						|
* Microcode updates
 | 
						|
* Timer init
 | 
						|
* Switching from 16-bit real-mode to 32-bit protected mode
 | 
						|
 | 
						|
The bootblock loads the romstage or the verstage if verified boot is enabled.
 | 
						|
 | 
						|
### Cache-As-Ram
 | 
						|
The *Cache-As-Ram*, also called Non-Eviction mode, or *CAR* allows to use the
 | 
						|
CPU cache like regular SRAM. This is particullary usefull for high level
 | 
						|
languages like `C`, which need RAM for heap and stack.
 | 
						|
 | 
						|
The CAR needs to be activated using vendor specific CPU instructions.
 | 
						|
 | 
						|
The following stages run when Cache-As-Ram is active:
 | 
						|
* bootblock
 | 
						|
* romstage
 | 
						|
* verstage
 | 
						|
* postcar
 | 
						|
 | 
						|
## verstage
 | 
						|
The verstage is where the root-of-trust starts. It's assumed that
 | 
						|
it cannot be overwritten in-field (together with the public key) and
 | 
						|
it starts at the very beginning of the boot process.
 | 
						|
The verstage installs a hook to verify a file before it's loaded from
 | 
						|
CBFS or a partition before it's accessed.
 | 
						|
 | 
						|
The verified boot mechanism allows trusted in-field firmware updates
 | 
						|
combined with a fail-safe recovery mode.
 | 
						|
 | 
						|
## romstage
 | 
						|
The romstage initializes the DRAM and prepares everything for device init.
 | 
						|
 | 
						|
Common tasks:
 | 
						|
 | 
						|
* Early device init
 | 
						|
* DRAM init
 | 
						|
 | 
						|
## postcar
 | 
						|
To leave the CAR setup and run code from regular DRAM the postcar-stage tears
 | 
						|
down CAR and loads the ramstage. Compared to other stages it's minimal in size.
 | 
						|
 | 
						|
## ramstage
 | 
						|
 | 
						|
The ramstage does the main device init:
 | 
						|
 | 
						|
* PCI device init
 | 
						|
* On-chip device init
 | 
						|
* TPM init (if not done by verstage)
 | 
						|
* Graphics init (optional)
 | 
						|
* CPU init (like set up SMM)
 | 
						|
 | 
						|
After initialization tables are written to inform the payload or operating system
 | 
						|
about the current hardware existance and state. That includes:
 | 
						|
 | 
						|
* ACPI tables (x86 specific)
 | 
						|
* SMBIOS tables (x86 specific)
 | 
						|
* coreboot tables
 | 
						|
* devicetree updates (ARM specific)
 | 
						|
 | 
						|
It also does hardware and firmware lockdown:
 | 
						|
* Write-protection of boot media
 | 
						|
* Lock security related registers
 | 
						|
* Lock SMM mode (x86 specific)
 | 
						|
 | 
						|
## payload
 | 
						|
The payload is the software that is run after coreboot is done. It resides in
 | 
						|
the CBFS and there's no possibility to choose it at runtime.
 | 
						|
 | 
						|
For more details have a look at [payloads](../payloads.md).
 | 
						|
 |