def smi_latency(): MSR_SMI_COUNT = 0x34 print "Warning: touching the keyboard can affect the results of this test." tsc_per_sec = bits.tsc_per_sec() tsc_per_usec = tsc_per_sec / (1000 * 1000) bins = [long(tsc_per_usec * 10**i) for i in range(9)] bin_descs = [ "0 < t <= 1us", "1us < t <= 10us", "10us < t <= 100us", "100us < t <= 1ms", "1ms < t <= 10ms", "10ms < t <= 100ms", "100ms < t <= 1s ", "1s < t <= 10s ", "10s < t <= 100s ", "100s < t ", ] print "Starting test. Wait here, I will be back in 15 seconds." (max_latency, smi_count_delta, bins) = bits.smi_latency(long(15 * tsc_per_sec), bins) BinType = namedtuple('BinType', ("max", "total", "count", "times")) bins = [BinType(*b) for b in bins] testsuite.test("SMI latency < 150us to minimize risk of OS timeouts", max_latency / tsc_per_usec <= 150) if not testsuite.show_detail(): return for bin, desc in zip(bins, bin_descs): if bin.count == 0: continue testsuite.print_detail("{}; average = {}; count = {}".format( desc, bits.format_tsc(bin.total / bin.count), bin.count)) deltas = (bits.format_tsc(t2 - t1) for t1, t2 in zip(bin.times, bin.times[1:])) testsuite.print_detail( " Times between first few observations: {}".format(" ".join( "{:>6}".format(delta) for delta in deltas))) if smi_count_delta is not None: testsuite.print_detail( "{} SMI detected using MSR_SMI_COUNT (MSR {:#x})".format( smi_count_delta, MSR_SMI_COUNT)) testsuite.print_detail( "Summary of impact: observed maximum latency = {}".format( bits.format_tsc(max_latency)))
def time_io_smi(port=0xb2, value=0, count=1000): count_for_estimate = 10 start = time.time() average_io_smi(port, value, count_for_estimate) avg10 = time.time() - start estimate = avg10 * count / count_for_estimate if estimate > 1: print "Running test, estimated time: {}s".format(int(estimate)) average = average_io_smi(port, value, count) print "Average of {} SMIs (via outb, port={:#x}, value={:#x}): {}".format( count, port, value, bits.format_tsc(average))
def smi_latency(): MSR_SMI_COUNT = 0x34 print "Warning: touching the keyboard can affect the results of this test." tsc_per_sec = bits.tsc_per_sec() tsc_per_usec = tsc_per_sec / (1000 * 1000) bins = [long(tsc_per_usec * 10**i) for i in range(9)] bin_descs = [ "0 < t <= 1us", "1us < t <= 10us", "10us < t <= 100us", "100us < t <= 1ms", "1ms < t <= 10ms", "10ms < t <= 100ms", "100ms < t <= 1s ", "1s < t <= 10s ", "10s < t <= 100s ", "100s < t ", ] print "Starting test. Wait here, I will be back in 15 seconds." (max_latency, smi_count_delta, bins) = bits.smi_latency(long(15 * tsc_per_sec), bins) BinType = namedtuple('BinType', ("max", "total", "count", "times")) bins = [BinType(*b) for b in bins] testsuite.test("SMI latency < 150us to minimize risk of OS timeouts", max_latency / tsc_per_usec <= 150) if not testsuite.show_detail(): return for bin, desc in zip(bins, bin_descs): if bin.count == 0: continue testsuite.print_detail("{}; average = {}; count = {}".format(desc, bits.format_tsc(bin.total/bin.count), bin.count)) deltas = (bits.format_tsc(t2 - t1) for t1,t2 in zip(bin.times, bin.times[1:])) testsuite.print_detail(" Times between first few observations: {}".format(" ".join("{:>6}".format(delta) for delta in deltas))) if smi_count_delta is not None: testsuite.print_detail("{} SMI detected using MSR_SMI_COUNT (MSR {:#x})".format(smi_count_delta, MSR_SMI_COUNT)) testsuite.print_detail("Summary of impact: observed maximum latency = {}".format(bits.format_tsc(max_latency)))
def time_io_smi(port=0xb2, value=0, count=1000): count_for_estimate = 10 start = time.time() average_io_smi(port, value, count_for_estimate) avg10 = time.time() - start estimate = avg10 * count/count_for_estimate if estimate > 1: print "Running test, estimated time: {}s".format(int(estimate)) average = average_io_smi(port, value, count) print "Average of {} SMIs (via outb, port={:#x}, value={:#x}): {}".format(count, port, value, bits.format_tsc(average))