X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/316670eb35587141e969394ae8537d66b9211e80..15129b1c8dbb3650c63b70adb1cad9af601c6c17:/osfmk/i386/tsc.c diff --git a/osfmk/i386/tsc.c b/osfmk/i386/tsc.c index 02b41779c..f79a8fcb2 100644 --- a/osfmk/i386/tsc.c +++ b/osfmk/i386/tsc.c @@ -76,6 +76,7 @@ uint32_t flex_ratio = 0; uint32_t flex_ratio_min = 0; uint32_t flex_ratio_max = 0; +uint64_t tsc_at_boot = 0; #define bit(n) (1ULL << (n)) #define bitmask(h,l) ((bit(h)|(bit(h)-1)) & ~(bit(l)-1)) @@ -91,8 +92,10 @@ uint32_t flex_ratio_max = 0; #define CPU_FAMILY_PENTIUM_M (0x6) static const char FSB_Frequency_prop[] = "FSBFrequency"; +static const char TSC_at_boot_prop[] = "InitialTSC"; /* * This routine extracts the bus frequency in Hz from the device tree. + * Also reads any initial TSC value at boot from the device tree. */ static uint64_t EFI_FSB_frequency(void) @@ -122,6 +125,18 @@ EFI_FSB_frequency(void) } else { kprintf("EFI_FSB_frequency: unexpected size %d\n", size); } + + /* + * While we're here, see if EFI published an initial TSC value. + */ + if (DTGetProperty(entry,TSC_at_boot_prop,&value,&size) == kSuccess) { + if (size == sizeof(uint64_t)) { + tsc_at_boot = *(uint64_t *) value; + kprintf("EFI_FSB_frequency: read %s value: %llu\n", + TSC_at_boot_prop, tsc_at_boot); + } + } + return frequency; } @@ -165,6 +180,7 @@ tsc_init(void) busFreq = EFI_FSB_frequency(); switch (cpuid_cpufamily()) { + case CPUFAMILY_INTEL_HASWELL: case CPUFAMILY_INTEL_IVYBRIDGE: case CPUFAMILY_INTEL_SANDYBRIDGE: case CPUFAMILY_INTEL_WESTMERE: @@ -211,7 +227,7 @@ tsc_init(void) } kprintf(" BUS: Frequency = %6d.%06dMHz, " - "cvtt2n = %08Xx.%08Xx, cvtn2t = %08Xx.%08Xx\n", + "cvtt2n = %08X.%08X, cvtn2t = %08X.%08X\n", (uint32_t)(busFreq / Mega), (uint32_t)(busFreq % Mega), (uint32_t)(busFCvtt2n >> 32), (uint32_t)busFCvtt2n, @@ -238,7 +254,7 @@ tsc_init(void) tscFCvtn2t = 0xFFFFFFFFFFFFFFFFULL / tscFCvtt2n; kprintf(" TSC: Frequency = %6d.%06dMHz, " - "cvtt2n = %08Xx.%08Xx, cvtn2t = %08Xx.%08Xx, gran = %lld%s\n", + "cvtt2n = %08X.%08X, cvtn2t = %08X.%08X, gran = %lld%s\n", (uint32_t)(tscFreq / Mega), (uint32_t)(tscFreq % Mega), (uint32_t)(tscFCvtt2n >> 32), (uint32_t)tscFCvtt2n,