Commit 30d6aa6a by Enrico Pozzobon

Merge branch 'measure-ram'

parents 37b488e1 b11a94d8
if SWD
speed 4000
device STM32F746ZG
loadbin build/f7.bin 0x8000000
r
g
exit
...@@ -8,17 +8,52 @@ import serial ...@@ -8,17 +8,52 @@ import serial
import subprocess import subprocess
RAM_SIZE = 0x50000
def eprint(*args, **kargs): def eprint(*args, **kargs):
print(*args, file=sys.stderr, **kargs) print(*args, file=sys.stderr, **kargs)
def flash(): def popen_jlink():
pipe = subprocess.PIPE pipe = subprocess.PIPE
cmd = ['JLinkExe', 'flash.jlink'] cmd = ['JLinkExe']
p = subprocess.Popen(cmd, cmd.extend(['-autoconnect', '1'])
stdout=sys.stderr, stdin=pipe) cmd.extend(['-device', 'STM32F746ZG'])
stdout, stderr = p.communicate("") cmd.extend(['-if', 'swd'])
cmd.extend(['-speed', '4000'])
return subprocess.Popen(cmd, stdout=sys.stderr, stdin=pipe)
def flash():
p = popen_jlink()
return p.communicate(("""
loadbin build/f7.bin 0x8000000
r
g
exit
""").encode('ascii'))
def fill_ram():
p = popen_jlink()
return p.communicate(("""
h
loadbin ram_pattern.bin 0x20000000
savebin ram_copy.bin 0x20000000 0x%x
r
g
exit
""" % RAM_SIZE).encode('ascii'))
def dump_ram():
p = popen_jlink()
return p.communicate(("""
h
savebin ram_dump.bin 0x20000000 0x%x
exit
""" % RAM_SIZE).encode('ascii'))
def get_serial(): def get_serial():
import serial.tools.list_ports import serial.tools.list_ports
...@@ -113,16 +148,10 @@ def main(argv): ...@@ -113,16 +148,10 @@ def main(argv):
uartp = UARTP(ser) uartp = UARTP(ser)
flash() flash()
fill_ram()
eprint("Flashed") eprint("Flashed")
time.sleep(0.1) time.sleep(0.1)
ser.setDTR(False) # IO0=HIGH
ser.setRTS(True) # EN=LOW, chip in reset
time.sleep(0.1)
ser.setDTR(False) # IO0=HIGH
ser.setRTS(False) # EN=HIGH, chip out of reset
time.sleep(1)
def stdin_read(n): def stdin_read(n):
b = sys.stdin.buffer.read(n) b = sys.stdin.buffer.read(n)
if len(b) != n: if len(b) != n:
...@@ -176,6 +205,37 @@ def main(argv): ...@@ -176,6 +205,37 @@ def main(argv):
raise Exception("Unacknowledged variable transfer") raise Exception("Unacknowledged variable transfer")
eprint("Operation %c completed successfully" % action) eprint("Operation %c completed successfully" % action)
elif action in b"u":
dump_ram()
with open("ram_copy.bin", 'rb') as dump:
dump_a = dump.read()
with open("ram_dump.bin", 'rb') as dump:
dump_b = dump.read()
if len(dump_a) != RAM_SIZE or len(dump_b) != RAM_SIZE:
raise Exception("Wrong dump sizes: 0x%x, 0x%x" % (len(dump_a), len(dump_b)))
streaks = []
streak_beg = 0
streak_end = 0
for i in range(len(dump_a)):
if dump_a[i] == dump_b[i]:
streak_end = i
else:
if streak_end != streak_beg:
streaks.append((streak_beg, streak_end))
streak_beg = i
streak_end = i
for b, e in streaks:
eprint("equal bytes from 0x%x to 0x%x (length: %d)" % (b, e, e-b))
b, e = max(streaks, key=lambda a: a[1]-a[0])
eprint("longest equal bytes streak from 0x%x to 0x%x (length: %d)" % (b, e, e-b))
v = struct.pack("<II", 4, e-b)
sys.stdout.buffer.write(v)
sys.stdout.flush()
else: else:
raise Exception("Unknown action %c" % action) raise Exception("Unknown action %c" % action)
......
...@@ -6,6 +6,8 @@ import sys ...@@ -6,6 +6,8 @@ import sys
import struct import struct
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
MEASURE_TIME = True
MEASURE_RAM = False
def main(argv): def main(argv):
if len(argv) < 3: if len(argv) < 3:
...@@ -16,10 +18,12 @@ def main(argv): ...@@ -16,10 +18,12 @@ def main(argv):
for attempt in range(3): for attempt in range(3):
print("beginning test %d of '%s' using test vectors '%s'" % (attempt, ' '.join(cmd), argv[1])) print("beginning test %d of '%s' using test vectors '%s'" % (attempt, ' '.join(cmd), argv[1]))
try: try:
if MEASURE_TIME:
measurements = begin_measurement() measurements = begin_measurement()
try: try:
test(argv[1], cmd) test(argv[1], cmd)
finally: finally:
if MEASURE_TIME:
end_measurement(measurements) end_measurement(measurements)
print("TEST SUCCESSFUL") print("TEST SUCCESSFUL")
return 0 return 0
...@@ -115,6 +119,12 @@ def test(test_file, cmd): ...@@ -115,6 +119,12 @@ def test(test_file, cmd):
if m != output: if m != output:
raise Exception("output of encryption is different from expected ciphertext") raise Exception("output of encryption is different from expected ciphertext")
if MEASURE_RAM:
write(b'u')
output = obtain()
print(" untouched memory = %d" % struct.unpack("<I", output))
break
elif res is not None: elif res is not None:
if res[1].lower() == 'count': if res[1].lower() == 'count':
i = int(res[2], 10) i = int(res[2], 10)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment