diff --git a/firmware/include/gbb_header.h b/firmware/include/gbb_header.h index 6a0b65fb54..7f9b0005c5 100644 --- a/firmware/include/gbb_header.h +++ b/firmware/include/gbb_header.h @@ -38,9 +38,11 @@ /* BIOS should load option ROMs from arbitrary PCI devices. We'll never enable * this ourselves because it executes non-verified code, but if a customer wants * to void their warranty and set this flag in the read-only flash, they should - * be able to do so. - */ + * be able to do so. */ #define GBB_FLAG_LOAD_OPTION_ROMS 0x00000002 +/* The factory flow may need the BIOS to boot a non-ChromeOS kernel if the + * dev-switch is on. This flag allows that. */ +#define GBB_FLAG_ENABLE_ALTERNATE_OS 0x00000004 #ifdef __cplusplus extern "C" { diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h index ffc0c41238..b9f9f4a620 100644 --- a/firmware/include/vboot_api.h +++ b/firmware/include/vboot_api.h @@ -186,6 +186,8 @@ typedef struct VbCommonParams { #define VB_INIT_OUT_S3_DEBUG_BOOT 0x00000010 /* BIOS should load any PCI option ROMs it finds, not just internal video */ #define VB_INIT_OUT_ENABLE_OPROM 0x00000020 +/* BIOS may be asked to boot something other than ChromeOS */ +#define VB_INIT_OUT_ENABLE_ALTERNATE_OS 0x00000040 /* Data only used by VbInit() */ diff --git a/firmware/lib/vboot_api_init.c b/firmware/lib/vboot_api_init.c index 7fa488ae32..f8c7490936 100644 --- a/firmware/lib/vboot_api_init.c +++ b/firmware/lib/vboot_api_init.c @@ -22,6 +22,7 @@ VbError_t VbInit(VbCommonParams* cparams, VbInitParams* iparams) { uint32_t recovery = VBNV_RECOVERY_NOT_REQUESTED; int is_s3_resume = 0; uint32_t s3_debug_boot = 0; + uint32_t user_enabled_custom_os = 0; VBDEBUG(("VbInit() input flags 0x%x\n", iparams->flags)); @@ -105,12 +106,27 @@ VbError_t VbInit(VbCommonParams* cparams, VbInitParams* iparams) { iparams->out_flags |= (VB_INIT_OUT_CLEAR_RAM | VB_INIT_OUT_ENABLE_DISPLAY | VB_INIT_OUT_ENABLE_USB_STORAGE); + /* ... which could include custom OSes */ + VbNvGet(&vnc, VBNV_DEV_BOOT_CUSTOM, &user_enabled_custom_os); + if (user_enabled_custom_os) + iparams->out_flags |= VB_INIT_OUT_ENABLE_ALTERNATE_OS; + } else { + /* Normal mode, so disable dev_boot_* flags. This ensures they will be + * initially disabled if the user later transitions back into developer + * mode. */ + VbNvSet(&vnc, VBNV_DEV_BOOT_USB, 0); + VbNvSet(&vnc, VBNV_DEV_BOOT_CUSTOM, 0); } /* Allow BIOS to load arbitrary option ROMs? */ if (gbb->flags & GBB_FLAG_LOAD_OPTION_ROMS) iparams->out_flags |= VB_INIT_OUT_ENABLE_OPROM; + /* The factory may need to boot custom OSes whenever the dev-switch is on */ + if ((gbb->flags & GBB_FLAG_ENABLE_ALTERNATE_OS) && + (iparams->flags & VB_INIT_FLAG_DEV_SWITCH_ON)) + iparams->out_flags |= VB_INIT_OUT_ENABLE_ALTERNATE_OS; + /* copy current recovery reason to shared data */ shared->recovery_reason = (uint8_t)recovery; diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c index fda5715af1..a013c8f23a 100644 --- a/firmware/lib/vboot_api_kernel.c +++ b/firmware/lib/vboot_api_kernel.c @@ -105,13 +105,6 @@ uint32_t VbTryLoadKernel(VbCommonParams* cparams, LoadKernelParams* p, /* Handle a normal boot. */ VbError_t VbBootNormal(VbCommonParams* cparams, LoadKernelParams* p) { - - /* Force dev_boot_* flags disabled. This ensures they will be - * initially disabled if the user later transitions back into - * developer mode. */ - VbNvSet(&vnc, VBNV_DEV_BOOT_USB, 0); - VbNvSet(&vnc, VBNV_DEV_BOOT_CUSTOM, 0); - /* Boot from fixed disk only */ return VbTryLoadKernel(cparams, p, VB_DISK_FLAG_FIXED); }