Allow to build romstage sources inside the bootblock
Having a separate romstage is only desirable: - with advanced setups like vboot or normal/fallback - boot medium is slow at startup (some ARM SOCs) - bootblock is limited in size (Intel APL 32K) When this is not the case there is no need for the extra complexity that romstage brings. Including the romstage sources inside the bootblock substantially reduces the total code footprint. Often the resulting code is 10-20k smaller. This is controlled via a Kconfig option. TESTED: works on qemu x86, arm and aarch64 with and without VBOOT. Change-Id: Id68390edc1ba228b121cca89b80c64a92553e284 Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-on: https://review.coreboot.org/c/coreboot/+/55068 Reviewed-by: Julius Werner <jwerner@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
This commit is contained in:
		
				
					committed by
					
						 Felix Held
						Felix Held
					
				
			
			
				
	
			
			
			
						parent
						
							4ce52f622e
						
					
				
				
					commit
					a2bc2540c2
				
			| @@ -11,6 +11,7 @@ | ||||
| __weak void platform_romstage_main(void) { /* no-op, for bring-up */ } | ||||
| __weak void platform_romstage_postram(void) { /* no-op */ } | ||||
|  | ||||
| #if CONFIG(SEPARATE_ROMSTAGE) | ||||
| void main(void) | ||||
| { | ||||
| 	timestamp_add_now(TS_ROMSTAGE_START); | ||||
| @@ -20,6 +21,7 @@ void main(void) | ||||
| 	exception_init(); | ||||
| 	romstage_main(); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void __noreturn romstage_main(void) | ||||
| { | ||||
|   | ||||
| @@ -161,12 +161,12 @@ endif # CONFIG_ARCH_VERSTAGE_X86_32 / CONFIG_ARCH_VERSTAGE_X86_64 | ||||
|  | ||||
| ifeq ($(CONFIG_ARCH_ROMSTAGE_X86_32)$(CONFIG_ARCH_ROMSTAGE_X86_64),y) | ||||
|  | ||||
| romstage-y += assembly_entry.S | ||||
| romstage-y += romstage.c | ||||
| romstage-$(CONFIG_SEPARATE_ROMSTAGE) += assembly_entry.S | ||||
| romstage-$(CONFIG_SEPARATE_ROMSTAGE) += romstage.c | ||||
| romstage-y += boot.c | ||||
| romstage-$(CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES) += breakpoint.c | ||||
| romstage-y += post.c | ||||
| romstage-y += gdt_init.S | ||||
| romstage-$(CONFIG_SEPARATE_ROMSTAGE) += gdt_init.S | ||||
| romstage-y += cpu_common.c | ||||
| romstage-$(CONFIG_IDT_IN_EVERY_STAGE) += exception.c | ||||
| romstage-$(CONFIG_IDT_IN_EVERY_STAGE) += idt.S | ||||
|   | ||||
| @@ -53,7 +53,7 @@ _start: | ||||
| #endif | ||||
|  | ||||
| #if ((ENV_SEPARATE_VERSTAGE && CONFIG(VERSTAGE_DEBUG_SPINLOOP)) \ | ||||
| 	|| (ENV_ROMSTAGE && CONFIG(ROMSTAGE_DEBUG_SPINLOOP))) | ||||
| 	|| (ENV_SEPARATE_ROMSTAGE && CONFIG(ROMSTAGE_DEBUG_SPINLOOP))) | ||||
|  | ||||
| 	/* Wait for a JTAG debugger to break in and set EBX non-zero */ | ||||
| 	xor	%ebx, %ebx | ||||
|   | ||||
| @@ -75,7 +75,7 @@ | ||||
| 	RECORD_SIZE(bss) | ||||
| #endif | ||||
|  | ||||
| #if ENV_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE) | ||||
| #if ENV_SEPARATE_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE) | ||||
| 	_shadow_size = (_ebss - _car_region_start) >> 3; | ||||
| 	REGION(asan_shadow, ., _shadow_size, ARCH_POINTER_ALIGN_SIZE) | ||||
| #endif | ||||
| @@ -144,7 +144,7 @@ _bogus = ASSERT((CONFIG_DCACHE_RAM_SIZE == 0) || (SIZEOF(.car.data) <= CONFIG_DC | ||||
| _bogus2 = ASSERT(_pagetables == ALIGN(_pagetables, 4096), "_pagetables aren't 4KiB aligned"); | ||||
| #endif | ||||
| _bogus3 = ASSERT(CONFIG_DCACHE_BSP_STACK_SIZE > 0x0, "BSP stack size not configured"); | ||||
| #if CONFIG(NO_XIP_EARLY_STAGES) && (ENV_ROMSTAGE || ENV_SEPARATE_VERSTAGE) | ||||
| #if CONFIG(NO_XIP_EARLY_STAGES) && (ENV_SEPARATE_ROMSTAGE || ENV_SEPARATE_VERSTAGE) | ||||
| _bogus4 = ASSERT(_eprogram <= _car_region_end, "Stage end too high !"); | ||||
| _bogus5 = ASSERT(_program >= _car_unallocated_start, "Stage start too low!"); | ||||
| #endif | ||||
|   | ||||
| @@ -8,7 +8,7 @@ void *memcpy(void *dest, const void *src, size_t n) | ||||
| { | ||||
| 	unsigned long d0, d1, d2; | ||||
|  | ||||
| #if (ENV_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \ | ||||
| #if (ENV_SEPARATE_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \ | ||||
| 		(ENV_RAMSTAGE && CONFIG(ASAN_IN_RAMSTAGE)) | ||||
| 	check_memory_region((unsigned long)src, n, false, _RET_IP_); | ||||
| 	check_memory_region((unsigned long)dest, n, true, _RET_IP_); | ||||
|   | ||||
| @@ -26,7 +26,7 @@ SECTIONS | ||||
| 	/* Relocated at runtime in cbmem so the address does not matter. */ | ||||
| 	RAMSTAGE(64M, 8M) | ||||
|  | ||||
| #elif ENV_ROMSTAGE | ||||
| #elif ENV_SEPARATE_ROMSTAGE | ||||
| 	/* The 1M size is not allocated. It's just for basic size checking. | ||||
| 	 * Link at 32MiB address and rely on cbfstool to relocate to XIP. */ | ||||
| 	ROMSTAGE(CONFIG_ROMSTAGE_ADDR, 1M) | ||||
|   | ||||
| @@ -12,7 +12,7 @@ void *memmove(void *dest, const void *src, size_t n) | ||||
| 	int d0, d1, d2, d3, d4, d5; | ||||
| 	char *ret = dest; | ||||
|  | ||||
| #if (ENV_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \ | ||||
| #if (ENV_SEPARATE_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \ | ||||
| 		(ENV_RAMSTAGE && CONFIG(ASAN_IN_RAMSTAGE)) | ||||
| 	check_memory_region((unsigned long)src, n, false, _RET_IP_); | ||||
| 	check_memory_region((unsigned long)dest, n, true, _RET_IP_); | ||||
|   | ||||
| @@ -14,7 +14,7 @@ void *memset(void *dstpp, int c, size_t len) | ||||
| 	int d0; | ||||
| 	unsigned long int dstp = (unsigned long int)dstpp; | ||||
|  | ||||
| #if (ENV_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \ | ||||
| #if (ENV_SEPARATE_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \ | ||||
| 		(ENV_RAMSTAGE && CONFIG(ASAN_IN_RAMSTAGE)) | ||||
| 	check_memory_region((unsigned long)dstpp, len, true, _RET_IP_); | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user