From c51d84dc09476d9c06b8aac726220bf3c7d62e8d Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Mon, 23 Sep 2013 17:23:35 -0500 Subject: support acpi firmware performance data (FPDT) Prefer firmware-provided performance data over loader-exported ones; if ACPI data is available, always use it, otherwise try to read the loader data. The firmware-provided variables start at the time the first EFI image is executed and end when the operating system exits the boot services; the (loader) time calculated in systemd-analyze increases. --- src/test/test-boot-timestamps.c | 98 +++++++++++++++++++++++++++++++++++++++++ src/test/test-efivars.c | 47 -------------------- 2 files changed, 98 insertions(+), 47 deletions(-) create mode 100644 src/test/test-boot-timestamps.c delete mode 100644 src/test/test-efivars.c (limited to 'src/test') diff --git a/src/test/test-boot-timestamps.c b/src/test/test-boot-timestamps.c new file mode 100644 index 0000000000..4ede318e38 --- /dev/null +++ b/src/test/test-boot-timestamps.c @@ -0,0 +1,98 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2013 Lennart Poettering + Copyright 2013 Kay Sievers + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include "util.h" +#include "log.h" +#include "boot-timestamps.h" +#include "efivars.h" +#include "acpi-fpdt.h" + +static int test_acpi_fpdt(void) { + usec_t loader_start; + usec_t loader_exit; + char ts_start[FORMAT_TIMESPAN_MAX]; + char ts_exit[FORMAT_TIMESPAN_MAX]; + char ts_span[FORMAT_TIMESPAN_MAX]; + int r; + + r = acpi_get_boot_usec(&loader_start, &loader_exit); + if (r < 0) { + if (r != -ENOENT) + log_error("Failed to read ACPI FPDT: %s", strerror(-r)); + return r; + } + + log_info("ACPI FPDT: loader start=%s exit=%s duration=%s", + format_timespan(ts_start, sizeof(ts_start), loader_start, USEC_PER_MSEC), + format_timespan(ts_exit, sizeof(ts_exit), loader_exit, USEC_PER_MSEC), + format_timespan(ts_span, sizeof(ts_span), loader_exit - loader_start, USEC_PER_MSEC)); + + return 0; +} + +static int test_efi_loader(void) { + usec_t loader_start; + usec_t loader_exit; + char ts_start[FORMAT_TIMESPAN_MAX]; + char ts_exit[FORMAT_TIMESPAN_MAX]; + char ts_span[FORMAT_TIMESPAN_MAX]; + int r; + + r = efi_loader_get_boot_usec(&loader_start, &loader_exit); + if (r < 0) { + if (r != -ENOENT) + log_error("Failed to read EFI loader data: %s", strerror(-r)); + return r; + } + + log_info("EFI Loader: start=%s exit=%s duration=%s", + format_timespan(ts_start, sizeof(ts_start), loader_start, USEC_PER_MSEC), + format_timespan(ts_exit, sizeof(ts_exit), loader_exit, USEC_PER_MSEC), + format_timespan(ts_span, sizeof(ts_span), loader_exit - loader_start, USEC_PER_MSEC)); + + return 0; +} + +int main(int argc, char* argv[]) { + char s[MAX(FORMAT_TIMESPAN_MAX, FORMAT_TIMESTAMP_MAX)]; + int r; + dual_timestamp fw, l, k; + + test_acpi_fpdt(); + test_efi_loader(); + + dual_timestamp_from_monotonic(&k, 0); + + r = boot_timestamps(NULL, &fw, &l); + if (r < 0) { + log_error("Failed to read variables: %s", strerror(-r)); + return 1; + } + + log_info("Firmware began %s before kernel.", format_timespan(s, sizeof(s), fw.monotonic, 0)); + log_info("Loader began %s before kernel.", format_timespan(s, sizeof(s), l.monotonic, 0)); + log_info("Firmware began %s.", format_timestamp(s, sizeof(s), fw.realtime)); + log_info("Loader began %s.", format_timestamp(s, sizeof(s), l.realtime)); + log_info("Kernel began %s.", format_timestamp(s, sizeof(s), k.realtime)); + + return 0; +} diff --git a/src/test/test-efivars.c b/src/test/test-efivars.c deleted file mode 100644 index 43ea5917b6..0000000000 --- a/src/test/test-efivars.c +++ /dev/null @@ -1,47 +0,0 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - -/*** - This file is part of systemd. - - Copyright 2013 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see . -***/ - -#include "util.h" -#include "log.h" -#include "efivars.h" - -int main(int argc, char* argv[]) { - char s[MAX(FORMAT_TIMESPAN_MAX, FORMAT_TIMESTAMP_MAX)]; - int r; - dual_timestamp fw, l, k; - - dual_timestamp_from_monotonic(&k, 0); - - r = efi_get_boot_timestamps(NULL, &fw, &l); - if (r < 0) { - log_error("Failed to read variables: %s", strerror(-r)); - return 1; - } - - log_info("Firmware began %s before kernel.", format_timespan(s, sizeof(s), fw.monotonic, 0)); - log_info("Loader began %s before kernel.", format_timespan(s, sizeof(s), l.monotonic, 0)); - - log_info("Firmware began %s.", format_timestamp(s, sizeof(s), fw.realtime)); - log_info("Loader began %s.", format_timestamp(s, sizeof(s), l.realtime)); - log_info("Kernel began %s.", format_timestamp(s, sizeof(s), k.realtime)); - - return 0; -} -- cgit v1.2.3-54-g00ecf