1 /* SPDX-License-Identifier: LGPL-2.1-or-later */ 2 3 #include "acpi-fpdt.h" 4 #include "boot-timestamps.h" 5 #include "efi-loader.h" 6 #include "macro.h" 7 #include "time-util.h" 8 boot_timestamps(const dual_timestamp * n,dual_timestamp * firmware,dual_timestamp * loader)9int boot_timestamps(const dual_timestamp *n, dual_timestamp *firmware, dual_timestamp *loader) { 10 usec_t x = 0, y = 0, a; 11 int r; 12 dual_timestamp _n; 13 14 assert(firmware); 15 assert(loader); 16 17 if (!n) { 18 dual_timestamp_get(&_n); 19 n = &_n; 20 } 21 22 r = acpi_get_boot_usec(&x, &y); 23 if (r < 0) { 24 r = efi_loader_get_boot_usec(&x, &y); 25 if (r < 0) 26 return r; 27 } 28 29 /* Let's convert this to timestamps where the firmware 30 * began/loader began working. To make this more confusing: 31 * since usec_t is unsigned and the kernel's monotonic clock 32 * begins at kernel initialization we'll actually initialize 33 * the monotonic timestamps here as negative of the actual 34 * value. */ 35 36 firmware->monotonic = y; 37 loader->monotonic = y - x; 38 39 a = n->monotonic + firmware->monotonic; 40 firmware->realtime = n->realtime > a ? n->realtime - a : 0; 41 42 a = n->monotonic + loader->monotonic; 43 loader->realtime = n->realtime > a ? n->realtime - a : 0; 44 45 return 0; 46 } 47