Advertisement
Guest User

Untitled

a guest
Sep 16th, 2022
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.85 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # Copyright (C) 2017, 2018 Vasily Galkin (galkinvv.github.io)
  3. # This file may be used and  redistributed accorindg to GPLv3 licance.
  4. import sys, os, mmap, random, datetime, time
  5. random.seed(12111)
  6. passed = []
  7. def run_test():
  8.     if len(sys.argv) < 2: raise Exception("Usage: " + sys.argv[0] + " C8000000 [mb_to_test]")
  9.     offset = int(sys.argv[1], 16)
  10.     if len(sys.argv) >= 3:
  11.         bytes_to_test = int(1024 * 1024 * float(sys.argv[2]))
  12.     else:
  13.         bytes_to_test = 1024 * 1024 * 32 // 8
  14.     physmem = os.open("/dev/" + os.environ.get("MEM","mem"), os.O_RDWR)
  15.     #physmem = os.open("/dev/fb0", os.O_RDWR)
  16.     phys_arr = mmap.mmap(physmem, bytes_to_test, offset=offset)
  17.     #with open("/tmp/in", "rb") as binin: phys_arr[:]=binin.read() and sys.exit(0)
  18.     #with open("/tmp/out", "wb") as binout: binout.write(phys_arr) and sys.exit(0)
  19.     def bin8(byte):
  20.         return "0b{:08b}".format(byte)
  21.     def verify_no_errors_with_data(data, test_name):
  22.         if len(phys_arr) > len(data):
  23.             data += b'\x00' * (len(phys_arr) - len(data))
  24.         #print("Starting test " + test_name)
  25.         phys_arr[:]=data
  26.         data_possibly_modified = phys_arr[:]
  27.         time.sleep(0.5)
  28.         #os.system("setfont")
  29.         bad_addresses = {}
  30.         all_errors = []
  31.         bad_bits = [0]*8
  32.         for i in range(len(data)):
  33.             xored_error = data[i] ^ data_possibly_modified[i]
  34.             if xored_error: #and xored_error == 0b01000000:
  35.                 if not bad_addresses:
  36.                     print("first error detected at " + hex(i))
  37.                 #addr_file.write("{:08x}".format(i)+"\n")
  38.                 if xored_error not in bad_addresses:
  39.                     bad_addresses[xored_error] = [0, []]
  40.                 bad_addresses[xored_error][0] += 1
  41.                 all_addresses = bad_addresses[xored_error][1]
  42.                 if 1:
  43.                     for b in range(8):
  44.                         if xored_error & (1<<b): bad_bits[b] += 1
  45.                 if 1:    
  46.                     if len(all_addresses) < 0x4000:
  47.                         all_addresses.append(i)
  48.                     if len(all_errors) < 0x4000:
  49.                         all_errors.append(i)
  50.         if not bad_addresses:
  51.             passed.append(test_name)
  52.             return
  53.         def totals():
  54.             print("Total bytes tested: 4*" + str(len(data)//4))
  55.             total_errors =  sum((v[0] for k, v in bad_addresses.items()))
  56.             print(test_name + " total errors count: ", total_errors, " - every ", len(data)/total_errors, " OK: ", len(data) - total_errors)
  57.             max_bit = max(bad_bits)
  58.             others_avg_bit = (sum(bad_bits) - max_bit)/(len(bad_bits)-1)
  59.             print("Bit error numbers:", ", ".join(map(str,bad_bits)), " max-avg=", max_bit - others_avg_bit)
  60.             print("different errors patterns count: ", len(bad_addresses))
  61.         totals()
  62.         print("patterns sorted by error count:")
  63.         columns = 0
  64.         patterns_by_count = sorted(bad_addresses.items(), key=lambda v:-v[1][0])
  65.         for k, v in patterns_by_count:
  66.             print(bin8(k), v[0], end = "\t")
  67.             if columns % 4 == 0:
  68.                 print("")
  69.             columns += 1
  70.         columns = 0
  71.         k, v = patterns_by_count[0]
  72.         k1, v1 = patterns_by_count[min(2, len(patterns_by_count))-1]
  73.         print("")
  74.         pat_to_print = {"total":all_errors, bin8(k):v[1], bin8(k1):v1[1]}
  75.         for pk,pv in pat_to_print.items():
  76.             if not pv: break
  77.             prev = pv[0]
  78.             print("First address for "+pk+":", hex(prev))
  79.             continue
  80.             print("Address diffs:")
  81.             for a in pv[1:]:
  82.                 print(hex(a - prev), end = "\t")
  83.                 prev = a
  84.                 if columns % 8 == 7:
  85.                     print("")
  86.                 columns += 1
  87.         totals()
  88.         raise Exception("ERRORS found in test " + test_name)
  89.     #verify_no_errors_with_data(b'\xFF'*len(phys_arr), "ONEs")
  90.     #verify_no_errors_with_data(b'\x00'*len(phys_arr), "ZERO")
  91.     #verify_no_errors_with_data(b'\x00'*len(phys_arr), "ZERO")
  92.     #verify_no_errors_with_data(b'\xCC'*len(phys_arr), "xCC")
  93.     #verify_no_errors_with_data(b'\x55'*len(phys_arr), "x55")
  94.     #verify_no_errors_with_data(b'\xaa'*len(phys_arr), "xaa")
  95.     #verify_no_errors_with_data(b'\x12\x34\x56\x78\x9A\xBC\xDE\xF0\x46\xa3\xe5\x13\xad'*(len(phys_arr)//13), "special")
  96.     #verify_no_errors_with_data(b'\x55\xaa\x55'*(len(phys_arr)//3), "aa55")
  97.     verify_no_errors_with_data(bytes(random.getrandbits(8) for i in range(len(phys_arr))), "rand")
  98.     #verify_no_errors_with_data(bytes(random.getrandbits(8) for i in range(len(phys_arr))), "rand")
  99. try:
  100.     for i in range(1):
  101.         run_test()
  102. finally:
  103.     os.system("setfont")
  104.     print("Before errors, foolowing passed:", passed)
  105.     os.system("setfont")
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement