diff options
-rw-r--r-- | firmware/include/vboot_api.h | 17 | ||||
-rw-r--r-- | firmware/lib/vboot_api_kernel.c | 25 |
2 files changed, 35 insertions, 7 deletions
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h index 0ae6c76b..9e1668cf 100644 --- a/firmware/include/vboot_api.h +++ b/firmware/include/vboot_api.h @@ -804,9 +804,9 @@ VbError_t VbExProtectFlash(enum VbProtectFlash_t region); /** * Check if the firmware needs to shut down the system. * - * Returns 1 if a shutdown is being requested (for example, the user has - * pressed the power button or closed the lid), or 0 if a shutdown is not being - * requested. + * Returns a non-zero VB_SHUTDOWN_REQUEST mask indicating the reason(s) for + * shutdown if a shutdown is being requested (see VB_SHUTDOWN_REQUEST_*), or 0 + * if a shutdown is not being requested. * * NOTE: When we're displaying a screen, pressing the power button should shut * down the computer. We need a way to break out of our control loop so this @@ -814,6 +814,17 @@ VbError_t VbExProtectFlash(enum VbProtectFlash_t region); */ uint32_t VbExIsShutdownRequested(void); +/* + * Shutdown requested for a reason which is not defined among other + * VB_SHUTDOWN_REQUEST_* values. This must be defined as 1 for backward + * compatibility with old versions of the API. + */ +#define VB_SHUTDOWN_REQUEST_OTHER 0x00000001 +/* Shutdown requested due to a lid switch being closed. */ +#define VB_SHUTDOWN_REQUEST_LID_CLOSED 0x00000002 +/* Shutdown requested due to a power button being pressed. */ +#define VB_SHUTDOWN_REQUEST_POWER_BUTTON 0x00000004 + /** * Expose the BIOS' built-in decompression routine to the vboot wrapper. The * caller must know how large the uncompressed data will be and must manage diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c index 18d00ae7..55042804 100644 --- a/firmware/lib/vboot_api_kernel.c +++ b/firmware/lib/vboot_api_kernel.c @@ -42,6 +42,23 @@ static void VbSetRecoveryRequest(uint32_t recovery_request) } /** + * Checks GBB flags against VbExIsShutdownRequested() shutdown request to + * determine if a shutdown is required. + * + * Returns true if a shutdown is required and false if no shutdown is required. + */ +static int VbWantShutdown(uint32_t gbb_flags) +{ + uint32_t shutdown_request = VbExIsShutdownRequested(); + + /* If desired, ignore shutdown request due to lid closure. */ + if (gbb_flags & GBB_FLAG_DISABLE_LID_SHUTDOWN) + shutdown_request &= ~VB_SHUTDOWN_REQUEST_LID_CLOSED; + + return !!shutdown_request; +} + +/** * Attempt loading a kernel from the specified type(s) of disks. * * If successful, sets p->disk_handle to the disk for the kernel and returns @@ -138,7 +155,7 @@ int VbUserConfirms(VbCommonParams *cparams, int space_means_no) /* Await further instructions */ while (1) { - if (VbExIsShutdownRequested()) + if (VbWantShutdown(cparams->gbb->flags)) return -1; key = VbExKeyboardRead(); switch (key) { @@ -203,7 +220,7 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p) do { uint32_t key; - if (VbExIsShutdownRequested()) { + if (VbWantShutdown(gbb->flags)) { VBDEBUG(("VbBootDeveloper() - shutdown requested!\n")); VbAudioClose(audio); return VBERROR_SHUTDOWN_REQUESTED; @@ -457,7 +474,7 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p) for (i = 0; i < REC_DISK_DELAY; i += REC_KEY_DELAY) { VbCheckDisplayKey(cparams, VbExKeyboardRead(), &vnc); - if (VbExIsShutdownRequested()) + if (VbWantShutdown(cparams->gbb->flags)) return VBERROR_SHUTDOWN_REQUESTED; VbExSleepMs(REC_KEY_DELAY); } @@ -536,7 +553,7 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p) } else { VbCheckDisplayKey(cparams, key, &vnc); } - if (VbExIsShutdownRequested()) + if (VbWantShutdown(cparams->gbb->flags)) return VBERROR_SHUTDOWN_REQUESTED; VbExSleepMs(REC_KEY_DELAY); } |