summaryrefslogtreecommitdiff
path: root/src/shared/efivars.c
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2013-01-23 02:16:11 +0100
committerKay Sievers <kay@vrfy.org>2013-01-23 02:16:11 +0100
commit5dbe9f539849a9404a92858e5b70b36408812fbd (patch)
tree95b97c9013f94bf3454654bcadfcea6628c44c7c /src/shared/efivars.c
parent780040dc2a4b08a2c1fe5bd8db3a70e966c2acb3 (diff)
efi: read microseconds from boot loader info instead of "ticks" magic
Diffstat (limited to 'src/shared/efivars.c')
-rw-r--r--src/shared/efivars.c62
1 files changed, 4 insertions, 58 deletions
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index 183d33c772..f1abee34c2 100644
--- a/src/shared/efivars.c
+++ b/src/shared/efivars.c
@@ -93,45 +93,7 @@ int efi_get_variable(sd_id128_t vendor, const char *name, uint32_t *attribute, v
return 0;
}
-static int read_bogomips(unsigned long *u) {
- _cleanup_fclose_ FILE *f = NULL;
-
- f = fopen("/proc/cpuinfo", "re");
- if (!f)
- return -errno;
-
- while (!feof(f)) {
- char line[LINE_MAX];
- char *x;
- unsigned long a, b;
-
- if (!fgets(line, sizeof(line), f))
- return -EIO;
-
- char_array_0(line);
- truncate_nl(line);
-
- if (!startswith(line, "bogomips"))
- continue;
-
- x = line + 8;
- x += strspn(x, WHITESPACE);
- if (*x != ':')
- continue;
- x++;
- x += strspn(x, WHITESPACE);
-
- if (sscanf(x, "%lu.%lu", &a, &b) != 2)
- continue;
-
- *u = a * 1000000L + b * 10000L;
- return 0;
- }
-
- return -EIO;
-}
-
-static int read_ticks(sd_id128_t vendor, const char *name, unsigned long speed, usec_t *u) {
+static int read_usec(sd_id128_t vendor, const char *name, usec_t *u) {
_cleanup_free_ void *i = NULL;
_cleanup_free_ char *j = NULL;
size_t is;
@@ -153,38 +115,22 @@ static int read_ticks(sd_id128_t vendor, const char *name, unsigned long speed,
if (r < 0)
return r;
- *u = USEC_PER_SEC * x / speed;
+ *u = x;
return 0;
}
static int get_boot_usec(usec_t *firmware, usec_t *loader) {
uint64_t x, y;
int r;
- unsigned long bogomips;
assert(firmware);
assert(loader);
- /* Returns the usec after the CPU was turned on. The two
- * timestamps are: the firmware finished, and the boot loader
- * finished. */
-
- /* We assume that the kernel's bogomips value is calibrated to
- * twice the CPU frequency, and use this to convert the TSC
- * ticks into usec. Of course, bogomips are only vaguely
- * defined. If this breaks one day we can come up with
- * something better. However, for now this saves us from doing
- * a local calibration loop. */
-
- r = read_bogomips(&bogomips);
- if (r < 0)
- return r;
-
- r = read_ticks(EFI_VENDOR_LOADER, "LoaderTicksInit", bogomips / 2, &x);
+ r = read_usec(EFI_VENDOR_LOADER, "LoaderTimeInitUsec", &x);
if (r < 0)
return r;
- r = read_ticks(EFI_VENDOR_LOADER, "LoaderTicksExec", bogomips / 2, &y);
+ r = read_usec(EFI_VENDOR_LOADER, "LoaderTimeExecUsec", &y);
if (r < 0)
return r;