Add FIH testing tool

Signed-off-by: Raef Coles <raef.coles@arm.com>
Change-Id: Ia05829e1b413206d83794209642080d1a937d092
diff --git a/fih_test_tool/gdb-tool/faults/__init__.py b/fih_test_tool/gdb-tool/faults/__init__.py
new file mode 100644
index 0000000..eeac3c3
--- /dev/null
+++ b/fih_test_tool/gdb-tool/faults/__init__.py
@@ -0,0 +1,15 @@
+# Copyright (c) 2021, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+from .skip import skip_fault
+from .register import register_fault
+
+fault_types = [
+            [register_fault(reg="r" + str(x)) for x in range(16)],
+            [register_fault(reg="r" + str(x), val=0) for x in range(16)],
+            [skip_fault(size=x * 2) for x in range(8)],
+        ]
+
+# Flatten the list
+fault_types = sum(fault_types, [])
diff --git a/fih_test_tool/gdb-tool/faults/register.py b/fih_test_tool/gdb-tool/faults/register.py
new file mode 100644
index 0000000..b3d0ab0
--- /dev/null
+++ b/fih_test_tool/gdb-tool/faults/register.py
@@ -0,0 +1,32 @@
+# Copyright (c) 2021, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+import gdb
+import random
+
+class register_fault():
+    def __init__(self, reg=None,
+                       val=None):
+        if reg is None:
+            self.reg = "r" + str(random.randint(0, 16))
+        else:
+            self.reg = reg
+
+        if val is None:
+            self.val = random.randint(0, 0xFFFFFFFF - 1)
+        else:
+            self.val = val
+
+    def execute(self):
+        gdb.execute('set ${} = {}'.format(self.reg, self.val))
+
+    def __repr__(self):
+        return "Register Fault: set {} to {}".format(self.reg, hex(self.val))
+
+    def as_json(self):
+        return {
+                'type': 'register',
+                'reg': self.reg,
+                'val': hex(self.val),
+                }
diff --git a/fih_test_tool/gdb-tool/faults/skip.py b/fih_test_tool/gdb-tool/faults/skip.py
new file mode 100644
index 0000000..c594a5e
--- /dev/null
+++ b/fih_test_tool/gdb-tool/faults/skip.py
@@ -0,0 +1,25 @@
+# Copyright (c) 2021, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+import gdb
+import random
+
+class skip_fault():
+    def __init__(self, size=None):
+        if size is None:
+            self.size = random.randint(1, 6) * 2
+        else:
+            self.size = size
+
+    def execute(self):
+        gdb.execute('set $pc += {}'.format(self.size))
+
+    def __repr__(self):
+        return "Skip Fault: pc += {}".format(self.size)
+
+    def as_json(self):
+        return {
+                'type': 'skip',
+                'size': self.size,
+                }