X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fefivars.c;h=f1abee34c24468da2792c9e56befd2fac44138c5;hp=183d33c7726cdb95302c5c181656caf54565a904;hb=5dbe9f539849a9404a92858e5b70b36408812fbd;hpb=780040dc2a4b08a2c1fe5bd8db3a70e966c2acb3;ds=sidebyside diff --git a/src/shared/efivars.c b/src/shared/efivars.c index 183d33c77..f1abee34c 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;