aboutsummaryrefslogtreecommitdiff
path: root/script/performance_analysis.py
diff options
context:
space:
mode:
Diffstat (limited to 'script/performance_analysis.py')
-rw-r--r--script/performance_analysis.py290
1 files changed, 290 insertions, 0 deletions
diff --git a/script/performance_analysis.py b/script/performance_analysis.py
new file mode 100644
index 0000000..c17b44d
--- /dev/null
+++ b/script/performance_analysis.py
@@ -0,0 +1,290 @@
+import re
+import sys
+
+
+class OperationCounterInfo:
+ def __init__(self, name):
+ self.name = name
+ self.client_start_cmd = 0L
+ self.client_return_cmd = 0L
+ self.driver_start_smc = 0L
+ self.driver_finish_smc = 0L
+ self.tee_os_receive_smc = 0L
+ self.tee_os_finish_smc = 0L
+ self.ta_enter_cmd = 0L
+
+ def __repr__(self):
+ tmp_str = self.name + "\n"
+ tmp_str += "\tClient Start Command =%d\n" % self.client_start_cmd
+ tmp_str += "\tDriver Start SMC Call =%d\n" % self.driver_start_smc
+ tmp_str += "\tTEE OS Receive SMC Call =%d\n" % self.tee_os_receive_smc
+ tmp_str += "\tTA Enter Command =%d\n" % self.ta_enter_cmd
+ tmp_str += "\tTEE OS Finish SMC Call =%d\n" % self.tee_os_finish_smc
+ tmp_str += "\tDriver Finish SMC Call =%d\n" % self.driver_finish_smc
+ tmp_str += "\tClient Return From Command =%d\n" % self.client_return_cmd
+ return tmp_str
+
+ def do_analysis(self, resolution_in_ns):
+ tmp_str = "================================================================\n"
+ tmp_str += self.name + "\n"
+ tmp_str += "================================================================\n"
+ tmp_str += "When Counter Value Interval(ns)\n"
+ tmp_str += "----------------------------------------------------------------\n"
+ tmp_str += "Client Start Command %16d%16d\n" % (self.client_start_cmd, 0)
+ tmp_str += "Driver Start SMC Call %16d%16d\n" % (self.driver_start_smc , resolution_in_ns * (self.driver_start_smc - self.client_start_cmd ))
+ tmp_str += "TEE OS Receive SMC Call %16d%16d\n" % (self.tee_os_receive_smc, resolution_in_ns * (self.tee_os_receive_smc - self.driver_start_smc ))
+ tmp_str += "TA Enter Command %16d%16d\n" % (self.ta_enter_cmd , resolution_in_ns * (self.ta_enter_cmd - self.tee_os_receive_smc))
+ tmp_str += "TEE OS Finish SMC Call %16d%16d\n" % (self.tee_os_finish_smc , resolution_in_ns * (self.tee_os_finish_smc - self.ta_enter_cmd ))
+ tmp_str += "Driver Finish SMC Call %16d%16d\n" % (self.driver_finish_smc , resolution_in_ns * (self.driver_finish_smc - self.tee_os_finish_smc ))
+ tmp_str += "Client Return From Command %16d%16d\n" % (self.client_return_cmd , resolution_in_ns * (self.client_return_cmd - self.driver_finish_smc ))
+ tmp_str += "\n"
+ tmp_str += "----------------------------------------------------------------\n"
+ tmp_str += "Summary\n"
+ tmp_str += "----------------------------------------------------------------\n"
+ tmp_str += "Client -> TA (one way trip) = %10d (ns)\n" % (resolution_in_ns * (self.ta_enter_cmd - self.client_start_cmd))
+ tmp_str += "Client -> Client (round trip) = %10d (ns)\n" % (resolution_in_ns * (self.client_return_cmd - self.client_start_cmd))
+ tmp_str += "SMC Call Send To Secure OS = %10d (ns)\n" % (resolution_in_ns * (self.tee_os_receive_smc - self.driver_start_smc))
+ tmp_str += "SMC Call Return From Secure OS = %10d (ns)\n" % (resolution_in_ns * (self.driver_finish_smc - self.tee_os_finish_smc))
+ tmp_str += "\n"
+ return tmp_str
+
+
+class SysCallCounterInfo:
+ def __init__(self, name):
+ self.name = name
+ self.start = 0L
+ self.enter = 0L
+ self.finish = 0L
+
+ def __repr__(self):
+ tmp_str = self.name + "\n"
+ tmp_str += "\tTA Invoke System Call =%d\n" % self.start
+ tmp_str += "\tTEE OS Receive System Call =%d\n" % self.enter
+ tmp_str += "\tTA Return From System Call =%d\n" % self.finish
+ return tmp_str
+
+ def do_analysis(self, resolution_in_ns):
+ tmp_str = "================================================================\n"
+ tmp_str += self.name + "\n"
+ tmp_str += "================================================================\n"
+ tmp_str += "When Counter Value Interval(ns)\n"
+ tmp_str += "----------------------------------------------------------------\n"
+ tmp_str += "TA Invoke System Call %16d%16d\n" % (self.start, 0)
+ tmp_str += "Secure OS Receive System Call %16d%16d\n" % (self.enter, resolution_in_ns * (self.enter - self.start))
+ tmp_str += "TA Return From System Call %16d%16d\n" % (self.finish, resolution_in_ns * (self.finish - self.enter))
+ tmp_str += "\n"
+ tmp_str += "----------------------------------------------------------------\n"
+ tmp_str += "Summary\n"
+ tmp_str += "----------------------------------------------------------------\n"
+ tmp_str += "TA -> OS = %10d (ns)\n" % (resolution_in_ns * (self.enter - self.start))
+ tmp_str += "OS -> TA = %10d (ns)\n" % (resolution_in_ns * (self.finish - self.enter))
+ tmp_str += "TA -> TA = %10d (ns)\n" % (resolution_in_ns * (self.finish - self.start))
+ tmp_str += "\n"
+ return tmp_str
+
+
+class CounterInfo:
+ def __init__(self):
+ self.freq = 0L
+ self.open_session = OperationCounterInfo("Open Session")
+ self.invoke_command = OperationCounterInfo("Invoke Command")
+ self.secure_sys_call = SysCallCounterInfo("Secure System Call (TEE_GetPropertyAsBinaryBlock)")
+
+ def __repr__(self):
+ tmp_str = "Counter-Timer Frequency = %d (Hz)\n" % self.freq
+ tmp_str += "\n"
+ tmp_str += self.open_session.__repr__()
+ tmp_str += "\n"
+ tmp_str += self.invoke_command.__repr__()
+ tmp_str += "\n"
+ tmp_str += self.secure_sys_call.__repr__()
+ return tmp_str
+
+ def do_analysis(self):
+ counter_resolution_in_ns = pow(10, 9) / counter_info.freq
+ tmp_str = "Counter resolution (ns) = %d\n" % counter_resolution_in_ns
+ tmp_str += "\n"
+ tmp_str += self.open_session.do_analysis(counter_resolution_in_ns)
+ tmp_str += "\n"
+ tmp_str += self.invoke_command.do_analysis(counter_resolution_in_ns)
+ tmp_str += "\n"
+ tmp_str += self.secure_sys_call.do_analysis(counter_resolution_in_ns)
+ tmp_str += "\n"
+ return tmp_str
+
+counter_info = CounterInfo()
+
+
+def show_help():
+ print "Usage: " + sys.argv[0] + " <filename>"
+
+
+def is_counter_freq(line):
+ result = re.search(r'CounterTimerFrequency:\s0x([0-9a-f]+)', line)
+ if result:
+ counter_info.freq = long(result.group(1), 16)
+ return True
+ else:
+ return False
+
+
+def is_client_open_session(line):
+ result = re.search(r'ClientOpenSession:\sstart=0x([0-9a-f]+),\senter_ta=0x([0-9a-f]+),\sreturn=0x([0-9a-f]+)', line)
+ if result:
+ counter_info.open_session.client_start_cmd = long(result.group(1), 16)
+ counter_info.open_session.ta_enter_cmd = long(result.group(2), 16)
+ counter_info.open_session.client_return_cmd = long(result.group(3), 16)
+ return True
+ else:
+ return False
+
+
+def is_client_invoke_command(line):
+ result = re.search(r'ClientInvokeCommand:\sstart=0x([0-9a-f]+),\senter_ta=0x([0-9a-f]+),\sreturn=0x([0-9a-f]+)',
+ line)
+ if result:
+ counter_info.invoke_command.client_start_cmd = long(result.group(1), 16)
+ counter_info.invoke_command.ta_enter_cmd = long(result.group(2), 16)
+ counter_info.invoke_command.client_return_cmd = long(result.group(3), 16)
+ return True
+ else:
+ return False
+
+
+def is_secure_sys_call(line):
+ result = re.search(r'SecureSysCall:\sstart=0x([0-9a-f]+),\senter_svc=0x([0-9a-f]+),\sreturn=0x([0-9a-f]+)', line)
+ if result:
+ counter_info.secure_sys_call.start = long(result.group(1), 16)
+ counter_info.secure_sys_call.enter = long(result.group(2), 16)
+ counter_info.secure_sys_call.finish = long(result.group(3), 16)
+ return True
+ else:
+ return False
+
+
+def is_tee_driver_do_smc_call(line):
+ result = re.search(r'TEEDriver:\sdo\ssmc\scall,\scmd=([0-9]),\scntvct=0x([0-9a-f]+)', line)
+ if result:
+ cmd = int(result.group(1))
+ if cmd == 0: # Open Session
+ if counter_info.open_session.driver_start_smc == 0L: # uninitialized
+ counter_info.open_session.driver_start_smc = long(result.group(2), 16)
+ elif cmd == 1: # Invoke Command
+ if counter_info.invoke_command.driver_start_smc == 0L: # uninitialized
+ counter_info.invoke_command.driver_start_smc = long(result.group(2), 16)
+ elif cmd == 2: # Close Session
+ pass
+ else:
+ print "Unknown SMC call command = %d" % cmd
+
+ return True
+ else:
+ return False
+
+
+def is_tee_driver_finish_smc_call(line):
+ result = re.search(r'TEEDriver:\sfinish\ssmc\scall,\scmd=([0-9]),\scntvct=0x([0-9a-f]+)', line)
+ if result:
+ cmd = int(result.group(1))
+ if cmd == 0: # Open Session
+ if counter_info.open_session.driver_finish_smc == 0L: # uninitialized
+ counter_info.open_session.driver_finish_smc = long(result.group(2), 16)
+ elif cmd == 1: # Invoke Command
+ if counter_info.invoke_command.driver_finish_smc == 0L: # uninitialized
+ counter_info.invoke_command.driver_finish_smc = long(result.group(2), 16)
+ elif cmd == 2: # Close Session
+ pass
+ else:
+ print "Unknown SMC call command = %d" % cmd
+
+ return True
+ else:
+ return False
+
+
+def is_tee_core_receive_smc_call(line):
+ result = re.search(r'TEECore:\sreceiving\ssmc\scall,\scmd=([0-9]),\scntvct=0x([0-9a-f]+)', line)
+ if result:
+ cmd = int(result.group(1))
+ if cmd == 0: # Open Session
+ if counter_info.open_session.tee_os_receive_smc == 0L: # uninitialized
+ counter_info.open_session.tee_os_receive_smc = long(result.group(2), 16)
+ elif cmd == 1: # Invoke Command
+ if counter_info.invoke_command.tee_os_receive_smc == 0L: # uninitialized
+ counter_info.invoke_command.tee_os_receive_smc = long(result.group(2), 16)
+ elif cmd == 2: # Close Session
+ pass
+ else:
+ print "Unknown SMC call command = %d" % cmd
+
+ return True
+ else:
+ return False
+
+
+def is_tee_core_finish_smc_call(line):
+ result = re.search(r'TEECore:\sfinish\ssmc\scall,\scmd=([0-9]),\scntvct=0x([0-9a-f]+)', line)
+ if result:
+ cmd = int(result.group(1))
+ if cmd == 0: # Open Session
+ if counter_info.open_session.tee_os_finish_smc == 0L: # uninitialized
+ counter_info.open_session.tee_os_finish_smc = long(result.group(2), 16)
+ elif cmd == 1: # Invoke Command
+ if counter_info.invoke_command.tee_os_finish_smc == 0L: # uninitialized
+ counter_info.invoke_command.tee_os_finish_smc = long(result.group(2), 16)
+ elif cmd == 2: # Close Session
+ pass
+ else:
+ print "Unknown SMC call command = %d" % cmd
+
+ return True
+ else:
+ return False
+
+
+def get_counter_data(line):
+ if is_counter_freq(line):
+ pass
+ elif is_client_open_session(line):
+ pass
+ elif is_client_invoke_command(line):
+ pass
+ elif is_secure_sys_call(line):
+ pass
+ elif is_tee_driver_do_smc_call(line):
+ pass
+ elif is_tee_driver_finish_smc_call(line):
+ pass
+ elif is_tee_core_receive_smc_call(line):
+ pass
+ elif is_tee_core_finish_smc_call(line):
+ pass
+ else:
+ pass
+
+
+def do_parse(f_object):
+ try:
+ while True:
+ line = f_object.next()
+ get_counter_data(line)
+ except StopIteration:
+ pass
+
+
+# Main #
+if len(sys.argv) < 2:
+ show_help()
+ exit()
+
+try:
+ filename = sys.argv[1]
+ f = open(filename, 'r')
+ do_parse(f)
+ f.close()
+except IOError:
+ print "can not open file"
+
+#print counter_info
+print counter_info.do_analysis()
+