From 961c0bd1dd5512b1c2feb2ed4391bf507900eb7a Mon Sep 17 00:00:00 2001 From: David Hendricks Date: Tue, 13 May 2014 20:28:49 -0700 Subject: [PATCH] elog: Add function to log boot reason in ChromeOS case This adds a generic helper function for adding boot reason in the ChromeOS case. If vboot is enabled, it will use information passed in via the vboot handoff table in cbmem to determine mode and reason in the case of recovery. BUG=chromium:373467 BRANCH=nyan TEST=built along with follow-up CL and booted on Big under various modes, verified entry was added to eventlog with "mosys eventlog list" Signed-off-by: David Hendricks Change-Id: I50a7aa6d55eb46413fe9929e732d6eb18c758d4b Reviewed-on: https://chromium-review.googlesource.com/199690 Reviewed-by: Duncan Laurie Commit-Queue: David Hendricks Tested-by: David Hendricks --- src/vendorcode/google/chromeos/Makefile.inc | 1 + src/vendorcode/google/chromeos/chromeos.h | 4 ++ src/vendorcode/google/chromeos/elog.c | 55 +++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 src/vendorcode/google/chromeos/elog.c diff --git a/src/vendorcode/google/chromeos/Makefile.inc b/src/vendorcode/google/chromeos/Makefile.inc index 7cc24a8bd2..5902dc1ed2 100644 --- a/src/vendorcode/google/chromeos/Makefile.inc +++ b/src/vendorcode/google/chromeos/Makefile.inc @@ -24,6 +24,7 @@ ramstage-$(CONFIG_ARCH_RAMSTAGE_X86_32) += vbnv_cmos.c romstage-$(CONFIG_ARCH_ROMSTAGE_ARM) += vbnv_ec.c ramstage-$(CONFIG_ARCH_RAMSTAGE_ARM) += vbnv_ec.c romstage-$(CONFIG_ARCH_ROMSTAGE_X86_32) += vboot.c +ramstage-$(CONFIG_ELOG) += elog.c ramstage-y += gnvs.c romstage-y += fmap.c ramstage-y += fmap.c diff --git a/src/vendorcode/google/chromeos/chromeos.h b/src/vendorcode/google/chromeos/chromeos.h index 4b9084fda4..8659aa1a70 100644 --- a/src/vendorcode/google/chromeos/chromeos.h +++ b/src/vendorcode/google/chromeos/chromeos.h @@ -48,11 +48,15 @@ int vboot_skip_display_init(void); /* functions implemented in vboot.c */ void init_chromeos(int bootmode); + +/* functions implemented in elog.c */ +void elog_add_boot_reason(void); #else static inline int developer_mode_enabled(void) { return 0; } static inline int recovery_mode_enabled(void) { return 0; } static inline int vboot_skip_display_init(void) { return 0; } static inline void init_chromeos(int bootmode) { } +static inline void elog_add_boot_reason(void) { return; } #endif /* CONFIG_CHROMEOS */ struct romstage_handoff; diff --git a/src/vendorcode/google/chromeos/elog.c b/src/vendorcode/google/chromeos/elog.c new file mode 100644 index 0000000000..8bf9efc1ba --- /dev/null +++ b/src/vendorcode/google/chromeos/elog.c @@ -0,0 +1,55 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2014 The ChromiumOS Authors. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA + */ + +#include +#include +#include +#include +#if CONFIG_VBOOT_VERIFY_FIRMWARE +#include "vboot_handoff.h" +#include +#endif + +void elog_add_boot_reason(void) +{ + if (developer_mode_enabled()) { + elog_add_event(ELOG_TYPE_CROS_DEVELOPER_MODE); + printk(BIOS_DEBUG, "%s: Logged dev mode boot\n", __func__); + } else if (recovery_mode_enabled()) { + u8 reason = 0; +#if CONFIG_VBOOT_VERIFY_FIRMWARE + struct vboot_handoff *vbho = cbmem_find(CBMEM_ID_VBOOT_HANDOFF); + + reason = get_recovery_mode_from_vbnv(); + if (vbho && !reason) { + VbSharedDataHeader *sd = (VbSharedDataHeader *) + vbho->shared_data; + reason = sd->recovery_reason; + } +#endif + + elog_add_event_byte(ELOG_TYPE_CROS_RECOVERY_MODE, + reason ? reason : ELOG_CROS_RECOVERY_MODE_BUTTON); + printk(BIOS_DEBUG, "%s: Logged recovery mode boot, " + "reason: 0x%02x\n", __func__, reason); + } else { + printk(BIOS_DEBUG, "%s: Normal mode boot, nothing " + "interesting to log\n", __func__); + } +}