diff --git a/irq_test_tool/example/irqs_AN519.json b/irq_test_tool/example/irqs_AN519.json
index 2ba98dc..4bf9a2c 100644
--- a/irq_test_tool/example/irqs_AN519.json
+++ b/irq_test_tool/example/irqs_AN519.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 3
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 3
+		}
+	}
+}
diff --git a/irq_test_tool/example/irqs_AN521.json b/irq_test_tool/example/irqs_AN521.json
index 2ba98dc..4bf9a2c 100644
--- a/irq_test_tool/example/irqs_AN521.json
+++ b/irq_test_tool/example/irqs_AN521.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 3
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 3
+		}
+	}
+}
diff --git a/irq_test_tool/example/irqs_AN524.json b/irq_test_tool/example/irqs_AN524.json
index 2ba98dc..4bf9a2c 100644
--- a/irq_test_tool/example/irqs_AN524.json
+++ b/irq_test_tool/example/irqs_AN524.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 3
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 3
+		}
+	}
+}
diff --git a/irq_test_tool/example/irqs_AN539.json b/irq_test_tool/example/irqs_AN539.json
index 2ba98dc..4bf9a2c 100644
--- a/irq_test_tool/example/irqs_AN539.json
+++ b/irq_test_tool/example/irqs_AN539.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 3
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 3
+		}
+	}
+}
diff --git a/irq_test_tool/example/irqs_LPC55S69.json b/irq_test_tool/example/irqs_LPC55S69.json
index 30fcad7..33db749 100644
--- a/irq_test_tool/example/irqs_LPC55S69.json
+++ b/irq_test_tool/example/irqs_LPC55S69.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 36
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 36
+		}
+	}
+}
diff --git a/irq_test_tool/example/irqs_Musca_A.json b/irq_test_tool/example/irqs_Musca_A.json
index 2ba98dc..4bf9a2c 100644
--- a/irq_test_tool/example/irqs_Musca_A.json
+++ b/irq_test_tool/example/irqs_Musca_A.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 3
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 3
+		}
+	}
+}
diff --git a/irq_test_tool/example/irqs_Musca_B1.json b/irq_test_tool/example/irqs_Musca_B1.json
index 2ba98dc..4bf9a2c 100644
--- a/irq_test_tool/example/irqs_Musca_B1.json
+++ b/irq_test_tool/example/irqs_Musca_B1.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 3
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 3
+		}
+	}
+}
diff --git a/irq_test_tool/example/irqs_Musca_S1.json b/irq_test_tool/example/irqs_Musca_S1.json
index 2ba98dc..4bf9a2c 100644
--- a/irq_test_tool/example/irqs_Musca_S1.json
+++ b/irq_test_tool/example/irqs_Musca_S1.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 3
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 3
+		}
+	}
+}
diff --git a/irq_test_tool/example/irqs_SSE-200_AWS.json b/irq_test_tool/example/irqs_SSE-200_AWS.json
index 2ba98dc..4bf9a2c 100644
--- a/irq_test_tool/example/irqs_SSE-200_AWS.json
+++ b/irq_test_tool/example/irqs_SSE-200_AWS.json
@@ -1,7 +1,7 @@
-{
-	"irqs": {
-		"timer_0_irq": {
-			"line_num" : 3
-		}
-	}
-}
+{
+	"irqs": {
+		"timer_0_irq": {
+			"line_num" : 3
+		}
+	}
+}
diff --git a/irq_test_tool/example/testcase.json b/irq_test_tool/example/testcase.json
index 91c8c13..28c93d8 100644
--- a/irq_test_tool/example/testcase.json
+++ b/irq_test_tool/example/testcase.json
@@ -1,15 +1,15 @@
-{
-	"description" : ["Trigger Secure interrupt during Secure Service execution"],
-	"steps": [
-		{
-			"wait_for" : "example_secure_service_start"
-		},
-		{
-			"expect" : "stop_secure_timer",
-			"trigger" : "timer_0_irq"
-		},
-		{
-			"wait_for" : "example_secure_service_end"
-		}
-	]
-}
+{
+	"description" : ["Trigger Secure interrupt during Secure Service execution"],
+	"steps": [
+		{
+			"wait_for" : "example_secure_service_start"
+		},
+		{
+			"expect" : "stop_secure_timer",
+			"trigger" : "timer_0_irq"
+		},
+		{
+			"wait_for" : "example_secure_service_end"
+		}
+	]
+}
diff --git a/irq_test_tool/irq_test.py b/irq_test_tool/irq_test.py
index b9b2fd3..16a7143 100644
--- a/irq_test_tool/irq_test.py
+++ b/irq_test_tool/irq_test.py
@@ -1,107 +1,107 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2020, Arm Limited. All rights reserved.
-#
-# SPDX-License-Identifier: BSD-3-Clause
-#
-#-------------------------------------------------------------------------------
-
-""" This module is the entry point of the IRQ testing tool.
-"""
-
-import argparse
-import json
-import logging
-import os
-import sys
-
-# Workaround for GDB: Add current directory to the module search path
-sys.path.insert(0, os.getcwd())
-from irq_test_abstract_debugger import Location
-from irq_test_dummy_debugger import DummyDebugger
-from irq_test_executor import TestExecutor
-
-def create_argparser():
-    """ Create an argument parser for the script
-
-    This parser enumerates the arguments that are necessary for all the
-    debuggers. Debugger implementations might add other arguments to this
-    parser.
-    """
-    parser = argparse.ArgumentParser()
-    parser.add_argument("-w", "--sw-break",
-                        help="use sw breakpoint (the default is HW breakpoint)",
-                        action="store_true")
-    parser.add_argument("-q", "--irqs",
-                        type=str,
-                        help="the name of the irqs json",
-                        required=True)
-    parser.add_argument("-b", "--breakpoints",
-                        type=str,
-                        help="the name of the breakpoints json",
-                        required=True)
-    parser.add_argument("-t", "--testcase",
-                        type=str,
-                        help="The testcase to execute",
-                        required=True)
-    return parser
-
-def main():
-    """ The main function of the script
-
-    Detects the debugger that it is started in, creates the debugger
-    implementation instance, and either executes the test, or registers a
-    command in the debugger. For details see the README.rst
-    """
-    try:
-        # TODO: evironment checking should be refactored to the debugger
-        # implementations
-        from arm_ds.debugger_v1 import Debugger
-        debugger_type = 'Arm-DS'
-    except ImportError:
-        logging.debug('Failed to import Arm-DS scripting env, try GDB')
-        try:
-            # TODO: evironment checking should be refactored to the debugger
-            # implementations
-            import gdb
-            debugger_type = 'GDB'
-        except ImportError:
-            logging.debug("Failed to import GDB scripting env, fall back do "
-                          "dummy")
-            debugger_type = 'dummy'
-
-    logging.info("The debugger type selected is: %s", debugger_type)
-
-    # create a debugger controller instance
-    if debugger_type == 'Arm-DS':
-        from irq_test_Arm_DS_debugger import ArmDSDebugger
-        logging.debug("initialising debugger object...")
-        arg_parser = create_argparser()
-        try:
-            args = arg_parser.parse_args()
-        except:
-            logging.error("Failed to parse command line parameters")
-            return
-        # TODO: Fail gracefully in case of an argparse error
-        debugger = ArmDSDebugger(args.sw_break)
-        executor = TestExecutor(debugger)
-        executor.execute(args.irqs, args.breakpoints, args.testcase)
-    elif debugger_type == 'GDB':
-        from irq_test_gdb_debugger import GDBDebugger
-        from irq_test_gdb_debugger import TestIRQsCommand
-        logging.debug("initialising debugger object...")
-        arg_parser = create_argparser()
-
-        # register the 'test_irqs' custom command
-        TestIRQsCommand(arg_parser)
-        logging.info("Command 'test_irqs' is successfully registered")
-    elif debugger_type == 'dummy':
-        arg_parser = create_argparser()
-        args = arg_parser.parse_args()
-        debugger = DummyDebugger(args.sw_break)
-        executor = TestExecutor(debugger)
-        executor.execute(args.irqs, args.breakpoints, args.testcase)
-
-if __name__ == "__main__":
-    logging.basicConfig(format='===== %(levelname)s: %(message)s',
-                        level=logging.DEBUG, stream=sys.stdout)
-    main()
+#-------------------------------------------------------------------------------
+# Copyright (c) 2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+""" This module is the entry point of the IRQ testing tool.
+"""
+
+import argparse
+import json
+import logging
+import os
+import sys
+
+# Workaround for GDB: Add current directory to the module search path
+sys.path.insert(0, os.getcwd())
+from irq_test_abstract_debugger import Location
+from irq_test_dummy_debugger import DummyDebugger
+from irq_test_executor import TestExecutor
+
+def create_argparser():
+    """ Create an argument parser for the script
+
+    This parser enumerates the arguments that are necessary for all the
+    debuggers. Debugger implementations might add other arguments to this
+    parser.
+    """
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-w", "--sw-break",
+                        help="use sw breakpoint (the default is HW breakpoint)",
+                        action="store_true")
+    parser.add_argument("-q", "--irqs",
+                        type=str,
+                        help="the name of the irqs json",
+                        required=True)
+    parser.add_argument("-b", "--breakpoints",
+                        type=str,
+                        help="the name of the breakpoints json",
+                        required=True)
+    parser.add_argument("-t", "--testcase",
+                        type=str,
+                        help="The testcase to execute",
+                        required=True)
+    return parser
+
+def main():
+    """ The main function of the script
+
+    Detects the debugger that it is started in, creates the debugger
+    implementation instance, and either executes the test, or registers a
+    command in the debugger. For details see the README.rst
+    """
+    try:
+        # TODO: evironment checking should be refactored to the debugger
+        # implementations
+        from arm_ds.debugger_v1 import Debugger
+        debugger_type = 'Arm-DS'
+    except ImportError:
+        logging.debug('Failed to import Arm-DS scripting env, try GDB')
+        try:
+            # TODO: evironment checking should be refactored to the debugger
+            # implementations
+            import gdb
+            debugger_type = 'GDB'
+        except ImportError:
+            logging.debug("Failed to import GDB scripting env, fall back do "
+                          "dummy")
+            debugger_type = 'dummy'
+
+    logging.info("The debugger type selected is: %s", debugger_type)
+
+    # create a debugger controller instance
+    if debugger_type == 'Arm-DS':
+        from irq_test_Arm_DS_debugger import ArmDSDebugger
+        logging.debug("initialising debugger object...")
+        arg_parser = create_argparser()
+        try:
+            args = arg_parser.parse_args()
+        except:
+            logging.error("Failed to parse command line parameters")
+            return
+        # TODO: Fail gracefully in case of an argparse error
+        debugger = ArmDSDebugger(args.sw_break)
+        executor = TestExecutor(debugger)
+        executor.execute(args.irqs, args.breakpoints, args.testcase)
+    elif debugger_type == 'GDB':
+        from irq_test_gdb_debugger import GDBDebugger
+        from irq_test_gdb_debugger import TestIRQsCommand
+        logging.debug("initialising debugger object...")
+        arg_parser = create_argparser()
+
+        # register the 'test_irqs' custom command
+        TestIRQsCommand(arg_parser)
+        logging.info("Command 'test_irqs' is successfully registered")
+    elif debugger_type == 'dummy':
+        arg_parser = create_argparser()
+        args = arg_parser.parse_args()
+        debugger = DummyDebugger(args.sw_break)
+        executor = TestExecutor(debugger)
+        executor.execute(args.irqs, args.breakpoints, args.testcase)
+
+if __name__ == "__main__":
+    logging.basicConfig(format='===== %(levelname)s: %(message)s',
+                        level=logging.DEBUG, stream=sys.stdout)
+    main()
diff --git a/irq_test_tool/irq_test_Arm_DS_debugger.py b/irq_test_tool/irq_test_Arm_DS_debugger.py
index 2bac20c..6078cdf 100644
--- a/irq_test_tool/irq_test_Arm_DS_debugger.py
+++ b/irq_test_tool/irq_test_Arm_DS_debugger.py
@@ -1,155 +1,155 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2020, Arm Limited. All rights reserved.
-#
-# SPDX-License-Identifier: BSD-3-Clause
-#
-#-------------------------------------------------------------------------------
-
-""" This module implements the debugger control interface for the Arm
-    Developement Studio
-"""
-
-import logging
-import re
-# pylint: disable=import-error
-from arm_ds.debugger_v1 import Debugger
-from arm_ds.debugger_v1 import DebugException
-# pylint: enable=import-error
-from irq_test_abstract_debugger import AbstractDebugger
-
-class ArmDSDebugger(AbstractDebugger):
-    """ This class is the implementation of the control interface for the Arm
-        Developement Studio
-    """
-
-    def __init__(self, use_sw_breakpoints):
-        super(ArmDSDebugger, self).__init__()
-        debugger = Debugger()
-        self.debugger = debugger
-        self.breakpoints = {} # map breakpoint IDs to names
-        self.use_sw_breakpoints = use_sw_breakpoints
-
-        if debugger.isRunning():
-            logging.info("debugger is running, stop it")
-            debugger.stop()
-            try:
-                timeout = 180*1000 # TODO: configureble timeout value?
-                debugger.waitForStop(timeout)
-            except DebugException as debug_exception:
-                logging.error("debugger wait timed out: %s", str(debug_exception))
-
-    def set_breakpoint(self, name, location):
-        logging.info("Add breakpoint for location %s:'%s'", name, str(location))
-
-        ec = self.debugger.getCurrentExecutionContext()
-        bps = ec.getBreakpointService()
-
-        try:
-            if location.symbol:
-                if location.offset != 0:
-                    spec = '(((unsigned char*)' + location.symbol + ') + ' + location.offset + ')'
-                    bps.setBreakpoint(spec, hw=(not self.use_sw_breakpoints))
-                else:
-                    bps.setBreakpoint(location.symbol, hw=(not self.use_sw_breakpoints))
-            else:
-                bps.setBreakpoint(location.filename, location.line, hw=(not self.use_sw_breakpoints))
-        except DebugException as ex:
-            logging.error("Failed to set breakpoint for %s", str(location))
-            logging.error(str(ex))
-            # TODO: Remove exit (from all over the script), and drop custom
-            # exception that is handled in main.
-            exit(2)
-
-        # Add the new breakpoint to the list.
-        # Assume that the last breakpoint is the newly added one
-        breakpoint = bps.getBreakpoint(bps.getBreakpointCount()-1)
-
-        self.breakpoints[breakpoint.getId()] = name
-
-    def __triger_interrupt_using_STIR_address(self, line):
-        logging.debug("writing to STIR address %s", hex(line))
-        ec = self.debugger.getCurrentExecutionContext()
-        memory_service = ec.getMemoryService()
-        mem_params = {'width': 8, 'verify': 0, 'use_image': 0}
-        memory_service.writeMemory32(hex(0xE000EF00), line, mem_params)
-
-    def __triger_interrupt_using_STIR_register(self, line):
-        logging.debug("writing to STIR register %s", hex(line))
-        register_name = "STIR"
-        ec = self.debugger.getCurrentExecutionContext()
-        ec.getRegisterService().setValue(register_name, line)
-
-    def __triger_interrupt_using_NVIC_ISPR_register(self, line):
-         # write ISPR register directly
-        register_id = line//32
-        register_offset = line%32
-        register_name = "NVIC_ISPR" + str(register_id)
-
-        ec = self.debugger.getCurrentExecutionContext()
-        value = ec.getRegisterService().getValue(register_name)
-        value |= 1 << register_offset
-
-        logging.debug("Writing to {:s} register 0x{:08x}".
-                      format(register_name, value))
-
-        ec.getRegisterService().setValue(register_name, hex(value))
-
-    def __triger_interrupt_using_NVIC_ISPR_address(self, line):
-        # write ISPR register directly
-        register_id = line//32
-        register_offset = line%32
-        # TODO: remove magic numbers
-        NVIC_ISPR_address = 0xE000E200
-        NVIC_ISPR_n_address = NVIC_ISPR_address + register_id * 4
-
-        ec = self.debugger.getCurrentExecutionContext()
-        memory_service = ec.getMemoryService()
-        mem_params = {'width': 8, 'verify': 0, 'use_image': 0}
-
-        value = 1 << register_offset # 0 bits are ignored on write
-
-        logging.debug("Writing to address 0x{:08x} register 0x{:08x}".
-                      format(NVIC_ISPR_n_address, value))
-
-        memory_service.writeMemory32(NVIC_ISPR_n_address, value, mem_params)
-
-    def trigger_interrupt(self, interrupt_line):
-        logging.info("triggering interrupt for line %s", str(interrupt_line))
-
-        line = int(interrupt_line)
-
-        if line >= 0:
-            #self.__triger_interrupt_using_STIR_address(line)
-            #self.__triger_interrupt_using_STIR_register(line)
-            #self.__triger_interrupt_using_NVIC_ISPR_register(line) # seems to have bugs?
-            self.__triger_interrupt_using_NVIC_ISPR_address(line)
-        else:
-            logging.error("Invalid  interrupt line value {:d}".format(line))
-            exit(0)
-
-    def continue_execution(self):
-        logging.info("Continuing execution ")
-        ec = self.debugger.getCurrentExecutionContext()
-        ec.executeDSCommand("info breakpoints")
-        self.debugger.run()
-
-        try:
-            timeout = 180*1000 # TODO: configureble timeout value?
-            self.debugger.waitForStop(timeout)
-        except DebugException as debug_exception:
-            logging.error("debugger wait timed out %s", str(debug_exception))
-            exit(0)
-
-
-    def clear_breakpoints(self):
-        logging.info("Remove all breakpoints")
-        self.debugger.removeAllBreakpoints()
-        self.breakpoints = {}
-
-    def get_triggered_breakpoint(self):
-        ec = self.debugger.getCurrentExecutionContext()
-        bps = ec.getBreakpointService()
-        breakpoint = bps.getHitBreakpoint()
-        id = breakpoint.getId()
-        logging.info("getting the triggered breakpoints, ID = {:d}".format(id))
-        return self.breakpoints[id]
+#-------------------------------------------------------------------------------
+# Copyright (c) 2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+""" This module implements the debugger control interface for the Arm
+    Developement Studio
+"""
+
+import logging
+import re
+# pylint: disable=import-error
+from arm_ds.debugger_v1 import Debugger
+from arm_ds.debugger_v1 import DebugException
+# pylint: enable=import-error
+from irq_test_abstract_debugger import AbstractDebugger
+
+class ArmDSDebugger(AbstractDebugger):
+    """ This class is the implementation of the control interface for the Arm
+        Developement Studio
+    """
+
+    def __init__(self, use_sw_breakpoints):
+        super(ArmDSDebugger, self).__init__()
+        debugger = Debugger()
+        self.debugger = debugger
+        self.breakpoints = {} # map breakpoint IDs to names
+        self.use_sw_breakpoints = use_sw_breakpoints
+
+        if debugger.isRunning():
+            logging.info("debugger is running, stop it")
+            debugger.stop()
+            try:
+                timeout = 180*1000 # TODO: configureble timeout value?
+                debugger.waitForStop(timeout)
+            except DebugException as debug_exception:
+                logging.error("debugger wait timed out: %s", str(debug_exception))
+
+    def set_breakpoint(self, name, location):
+        logging.info("Add breakpoint for location %s:'%s'", name, str(location))
+
+        ec = self.debugger.getCurrentExecutionContext()
+        bps = ec.getBreakpointService()
+
+        try:
+            if location.symbol:
+                if location.offset != 0:
+                    spec = '(((unsigned char*)' + location.symbol + ') + ' + location.offset + ')'
+                    bps.setBreakpoint(spec, hw=(not self.use_sw_breakpoints))
+                else:
+                    bps.setBreakpoint(location.symbol, hw=(not self.use_sw_breakpoints))
+            else:
+                bps.setBreakpoint(location.filename, location.line, hw=(not self.use_sw_breakpoints))
+        except DebugException as ex:
+            logging.error("Failed to set breakpoint for %s", str(location))
+            logging.error(str(ex))
+            # TODO: Remove exit (from all over the script), and drop custom
+            # exception that is handled in main.
+            exit(2)
+
+        # Add the new breakpoint to the list.
+        # Assume that the last breakpoint is the newly added one
+        breakpoint = bps.getBreakpoint(bps.getBreakpointCount()-1)
+
+        self.breakpoints[breakpoint.getId()] = name
+
+    def __triger_interrupt_using_STIR_address(self, line):
+        logging.debug("writing to STIR address %s", hex(line))
+        ec = self.debugger.getCurrentExecutionContext()
+        memory_service = ec.getMemoryService()
+        mem_params = {'width': 8, 'verify': 0, 'use_image': 0}
+        memory_service.writeMemory32(hex(0xE000EF00), line, mem_params)
+
+    def __triger_interrupt_using_STIR_register(self, line):
+        logging.debug("writing to STIR register %s", hex(line))
+        register_name = "STIR"
+        ec = self.debugger.getCurrentExecutionContext()
+        ec.getRegisterService().setValue(register_name, line)
+
+    def __triger_interrupt_using_NVIC_ISPR_register(self, line):
+         # write ISPR register directly
+        register_id = line//32
+        register_offset = line%32
+        register_name = "NVIC_ISPR" + str(register_id)
+
+        ec = self.debugger.getCurrentExecutionContext()
+        value = ec.getRegisterService().getValue(register_name)
+        value |= 1 << register_offset
+
+        logging.debug("Writing to {:s} register 0x{:08x}".
+                      format(register_name, value))
+
+        ec.getRegisterService().setValue(register_name, hex(value))
+
+    def __triger_interrupt_using_NVIC_ISPR_address(self, line):
+        # write ISPR register directly
+        register_id = line//32
+        register_offset = line%32
+        # TODO: remove magic numbers
+        NVIC_ISPR_address = 0xE000E200
+        NVIC_ISPR_n_address = NVIC_ISPR_address + register_id * 4
+
+        ec = self.debugger.getCurrentExecutionContext()
+        memory_service = ec.getMemoryService()
+        mem_params = {'width': 8, 'verify': 0, 'use_image': 0}
+
+        value = 1 << register_offset # 0 bits are ignored on write
+
+        logging.debug("Writing to address 0x{:08x} register 0x{:08x}".
+                      format(NVIC_ISPR_n_address, value))
+
+        memory_service.writeMemory32(NVIC_ISPR_n_address, value, mem_params)
+
+    def trigger_interrupt(self, interrupt_line):
+        logging.info("triggering interrupt for line %s", str(interrupt_line))
+
+        line = int(interrupt_line)
+
+        if line >= 0:
+            #self.__triger_interrupt_using_STIR_address(line)
+            #self.__triger_interrupt_using_STIR_register(line)
+            #self.__triger_interrupt_using_NVIC_ISPR_register(line) # seems to have bugs?
+            self.__triger_interrupt_using_NVIC_ISPR_address(line)
+        else:
+            logging.error("Invalid  interrupt line value {:d}".format(line))
+            exit(0)
+
+    def continue_execution(self):
+        logging.info("Continuing execution ")
+        ec = self.debugger.getCurrentExecutionContext()
+        ec.executeDSCommand("info breakpoints")
+        self.debugger.run()
+
+        try:
+            timeout = 180*1000 # TODO: configureble timeout value?
+            self.debugger.waitForStop(timeout)
+        except DebugException as debug_exception:
+            logging.error("debugger wait timed out %s", str(debug_exception))
+            exit(0)
+
+
+    def clear_breakpoints(self):
+        logging.info("Remove all breakpoints")
+        self.debugger.removeAllBreakpoints()
+        self.breakpoints = {}
+
+    def get_triggered_breakpoint(self):
+        ec = self.debugger.getCurrentExecutionContext()
+        bps = ec.getBreakpointService()
+        breakpoint = bps.getHitBreakpoint()
+        id = breakpoint.getId()
+        logging.info("getting the triggered breakpoints, ID = {:d}".format(id))
+        return self.breakpoints[id]
diff --git a/irq_test_tool/irq_test_abstract_debugger.py b/irq_test_tool/irq_test_abstract_debugger.py
index 38600ce..de27cb5 100644
--- a/irq_test_tool/irq_test_abstract_debugger.py
+++ b/irq_test_tool/irq_test_abstract_debugger.py
@@ -1,76 +1,76 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2020, Arm Limited. All rights reserved.
-#
-# SPDX-License-Identifier: BSD-3-Clause
-#
-#-------------------------------------------------------------------------------
-
-"""Defines the interface that a debugger control class have to implement
-"""
-
-class Location(object):
-    """A helper class to store the properties of a location where breakpoint
-       can be put
-    """
-    def __init__(self, symbol=None, offset=0, filename=None, line=None):
-        self.symbol = symbol
-        self.offset = offset
-        self.filename = filename
-        self.line = line
-
-    def __str__(self):
-        ret = ""
-        if self.symbol:
-            ret += str(self.symbol)
-
-        if self.offset:
-            ret += "+" + str(self.offset)
-
-        if self.filename:
-            if self.symbol:
-                ret += " @ "
-            ret += str(self.filename) + ":" + str(self.line)
-
-        return ret
-
-    def __unicode__(self):
-        return str(self), "utf-8"
-
-class AbstractDebugger(object):
-    """The interface that a debugger control class have to implement
-    """
-    def __init__(self):
-        pass
-
-    def set_breakpoint(self, name, location):
-        """Put a breakpoint at a location
-
-        Args:
-            name: The name of the location. This name is returned by
-                  get_triggered_breakpoint
-            location: An instance of a Location class
-        """
-        raise NotImplementedError('subclasses must override set_breakpoint()!')
-
-    def trigger_interrupt(self, interrupt_line):
-        """trigger an interrupt on the interrupt line specified in the parameter
-
-        Args:
-            interrupt_line: The number of the interrupt line
-        """
-        raise NotImplementedError('subclasses must override trigger_interrupt()!')
-
-    def continue_execution(self):
-        """Continue the execution
-        """
-        raise NotImplementedError('subclasses must override continue_execution()!')
-
-    def clear_breakpoints(self):
-        """Clear all breakpoints
-        """
-        raise NotImplementedError('subclasses must override clear_breakpoints()!')
-
-    def get_triggered_breakpoint(self):
-        """Get the name of the last triggered breakpoint
-        """
-        raise NotImplementedError('subclasses must override get_triggered_breakpoint()!')
+#-------------------------------------------------------------------------------
+# Copyright (c) 2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+"""Defines the interface that a debugger control class have to implement
+"""
+
+class Location(object):
+    """A helper class to store the properties of a location where breakpoint
+       can be put
+    """
+    def __init__(self, symbol=None, offset=0, filename=None, line=None):
+        self.symbol = symbol
+        self.offset = offset
+        self.filename = filename
+        self.line = line
+
+    def __str__(self):
+        ret = ""
+        if self.symbol:
+            ret += str(self.symbol)
+
+        if self.offset:
+            ret += "+" + str(self.offset)
+
+        if self.filename:
+            if self.symbol:
+                ret += " @ "
+            ret += str(self.filename) + ":" + str(self.line)
+
+        return ret
+
+    def __unicode__(self):
+        return str(self), "utf-8"
+
+class AbstractDebugger(object):
+    """The interface that a debugger control class have to implement
+    """
+    def __init__(self):
+        pass
+
+    def set_breakpoint(self, name, location):
+        """Put a breakpoint at a location
+
+        Args:
+            name: The name of the location. This name is returned by
+                  get_triggered_breakpoint
+            location: An instance of a Location class
+        """
+        raise NotImplementedError('subclasses must override set_breakpoint()!')
+
+    def trigger_interrupt(self, interrupt_line):
+        """trigger an interrupt on the interrupt line specified in the parameter
+
+        Args:
+            interrupt_line: The number of the interrupt line
+        """
+        raise NotImplementedError('subclasses must override trigger_interrupt()!')
+
+    def continue_execution(self):
+        """Continue the execution
+        """
+        raise NotImplementedError('subclasses must override continue_execution()!')
+
+    def clear_breakpoints(self):
+        """Clear all breakpoints
+        """
+        raise NotImplementedError('subclasses must override clear_breakpoints()!')
+
+    def get_triggered_breakpoint(self):
+        """Get the name of the last triggered breakpoint
+        """
+        raise NotImplementedError('subclasses must override get_triggered_breakpoint()!')
diff --git a/irq_test_tool/irq_test_dummy_debugger.py b/irq_test_tool/irq_test_dummy_debugger.py
index c03077c..d31550a 100644
--- a/irq_test_tool/irq_test_dummy_debugger.py
+++ b/irq_test_tool/irq_test_dummy_debugger.py
@@ -1,50 +1,50 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2020, Arm Limited. All rights reserved.
-#
-# SPDX-License-Identifier: BSD-3-Clause
-#
-#-------------------------------------------------------------------------------
-
-""" This module contains a dummy implementation of the debugger control interface
-"""
-
-import logging
-from irq_test_abstract_debugger import AbstractDebugger
-
-class DummyDebugger(AbstractDebugger):
-    """A dummy implementation of the debugger control interface
-
-    This class can be used for rapidly testing the testcase execution algorithm.
-
-    Breakpoint names are put in a list to keep track of them. Interrupts are not
-    emulated in any way, the 'trigger_interrupt' function returns without doing
-    anything. 'continue_execution' returns immediately as well, and
-    'get_triggered_breakpoint' returns the breakpoint added the earliest.
-    """
-    def __init__(self, use_sw_breakpoints):
-        super(DummyDebugger, self).__init__()
-        self.breakpoints = []
-        self.use_sw_breakpoints = use_sw_breakpoints
-
-    def set_breakpoint(self, name, location):
-        if (self.use_sw_breakpoints):
-            breakpoint_type = "sw"
-        else:
-            breakpoint_type = "hw"
-        logging.info("debugger: set %s breakpoint %s", breakpoint_type, name)
-        self.breakpoints.append(name)
-
-    def trigger_interrupt(self, interrupt_line):
-        logging.info("debugger: triggering interrupt line for %s", str(interrupt_line))
-
-    def continue_execution(self):
-        logging.info("debugger: continue")
-
-    def clear_breakpoints(self):
-        logging.info("debugger: clearing breakpoints")
-        self.breakpoints = []
-
-    def get_triggered_breakpoint(self):
-        if self.breakpoints:
-            return self.breakpoints[0]
-        return None
+#-------------------------------------------------------------------------------
+# Copyright (c) 2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+""" This module contains a dummy implementation of the debugger control interface
+"""
+
+import logging
+from irq_test_abstract_debugger import AbstractDebugger
+
+class DummyDebugger(AbstractDebugger):
+    """A dummy implementation of the debugger control interface
+
+    This class can be used for rapidly testing the testcase execution algorithm.
+
+    Breakpoint names are put in a list to keep track of them. Interrupts are not
+    emulated in any way, the 'trigger_interrupt' function returns without doing
+    anything. 'continue_execution' returns immediately as well, and
+    'get_triggered_breakpoint' returns the breakpoint added the earliest.
+    """
+    def __init__(self, use_sw_breakpoints):
+        super(DummyDebugger, self).__init__()
+        self.breakpoints = []
+        self.use_sw_breakpoints = use_sw_breakpoints
+
+    def set_breakpoint(self, name, location):
+        if (self.use_sw_breakpoints):
+            breakpoint_type = "sw"
+        else:
+            breakpoint_type = "hw"
+        logging.info("debugger: set %s breakpoint %s", breakpoint_type, name)
+        self.breakpoints.append(name)
+
+    def trigger_interrupt(self, interrupt_line):
+        logging.info("debugger: triggering interrupt line for %s", str(interrupt_line))
+
+    def continue_execution(self):
+        logging.info("debugger: continue")
+
+    def clear_breakpoints(self):
+        logging.info("debugger: clearing breakpoints")
+        self.breakpoints = []
+
+    def get_triggered_breakpoint(self):
+        if self.breakpoints:
+            return self.breakpoints[0]
+        return None
diff --git a/irq_test_tool/irq_test_executor.py b/irq_test_tool/irq_test_executor.py
index d98096f..86ddf8f 100644
--- a/irq_test_tool/irq_test_executor.py
+++ b/irq_test_tool/irq_test_executor.py
@@ -1,180 +1,180 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2020, Arm Limited. All rights reserved.
-#
-# SPDX-License-Identifier: BSD-3-Clause
-#
-#-------------------------------------------------------------------------------
-
-from irq_test_abstract_debugger import Location
-import logging
-import json
-
-def create_locations_from_file(breakpoints_file_name):
-    """Internal function to create Location objects of a breakpoints data file
-    """
-    # Read in the points to break at
-    logging.info("Reading breakpoints file '%s'", breakpoints_file_name)
-    breakpoints_file = open(breakpoints_file_name)
-    breakpoints = json.load(breakpoints_file)
-    logging.debug("breakpoints: %s", str(breakpoints))
-
-    #TODO: go over the breakpoints and try to set them as a sanity check
-
-    locations = {}
-
-    for loc_name in breakpoints['breakpoints']:
-        bkpt = breakpoints['breakpoints'][loc_name]
-        offset = 0
-
-        if 'file' in bkpt:
-            filename = bkpt['file']
-        else:
-            filename = None
-
-        if 'symbol' in bkpt:
-            symbol = bkpt['symbol']
-            if 'offset' in bkpt:
-                offset = bkpt['offset']
-            else:
-                offset = 0
-        else:
-            if 'offset' in bkpt:
-                logging.error("In location %s offset is included without a"
-                              " symbol")
-                exit(2)
-            symbol = None
-
-        if 'line' in bkpt:
-            line = bkpt['line']
-            try:
-                int(line)
-            except ValueError:
-                logging.error("In location %s line is not a valid int",
-                              loc_name)
-                exit(2)
-        else:
-            line = None
-
-        if symbol:
-            if line or filename:
-                logging.error("In location %s nor filename nor line should"
-                              "be present when symbol is present", loc_name)
-                exit(2)
-
-        if (not line and filename) or (line and not filename):
-            logging.error("In location %s line and filename have to be "
-                          "present the same time", loc_name)
-            exit(2)
-
-        if (not symbol) and (not filename):
-            logging.error("In location %s no symbol nor code location is "
-                          "specified at all", loc_name)
-            exit(2)
-
-        loc = Location(symbol=symbol, offset=offset, filename=filename, line=line)
-
-        locations[loc_name] = loc
-
-    return locations
-
-class TestExecutor(object):
-    """ This class implements the test logic.
-
-    It reads the input files, and executes the steps of the testcase. It receives an
-    AbstractDebugger instance on creation. The test execution is implemented in the
-    execute function.
-    """
-
-    def __init__(self, debugger):
-        self.debugger = debugger
-
-    def execute(self, irqs_filename, breakpoints_filename, testcase_filename):
-        """ Execute a testcase
-
-        Execute the testcase defined in 'testcase_filename', using the IRQs and
-        breakpoints defined in irqs_filename and breakpoints_filename.
-        """
-        # Read in the list of IRQs
-        logging.info("Reading irqs file '%s'", irqs_filename)
-        irqs_file = open(irqs_filename)
-        irqs = json.load(irqs_file)
-        logging.debug("irqs: %s", str(irqs))
-
-        # read in the test sequence
-        logging.info("Reading test sequence file '%s'", testcase_filename)
-        test_file = open(testcase_filename)
-        test = json.load(test_file)
-        logging.debug("testcase: %s", str(test))
-
-        # TODO: crosscheck the tests file against the breakpoints and the irq's
-        #       available
-
-        locations = create_locations_from_file(breakpoints_filename)
-
-        self.debugger.clear_breakpoints()
-
-        # execute the test
-        steps = test['steps']
-        for i, step in enumerate(steps):
-
-            logging.info("---- Step %d ----", i)
-
-            continue_execution = False
-
-            if 'wait_for' in step:
-                bp_name = step['wait_for']
-                self.debugger.set_breakpoint(bp_name, locations[bp_name])
-                next_to_break_at = bp_name
-                continue_execution = True
-            elif 'expect' in step:
-                bp_name = step['expect']
-                self.debugger.set_breakpoint(bp_name, locations[bp_name])
-                next_to_break_at = bp_name
-
-                # Find the next wait_for in the test sequence, and set a
-                # breakpoint for that as well. So that it can be detected if an
-                # expected breakpoint is missed.
-
-                wait_for_found = False
-                ii = i+1
-
-                while ii < len(steps) and not wait_for_found:
-                    next_step = steps[ii]
-                    if 'wait_for' in next_step:
-                        next_bp_name = next_step['wait_for']
-                        self.debugger.set_breakpoint(next_bp_name,
-                                                     locations[next_bp_name])
-                        wait_for_found = True
-                    ii += 1
-
-                continue_execution = True
-
-
-            if 'trigger' in step:
-                irqs_dict = irqs['irqs']
-                irq = irqs_dict[step['trigger']]
-                line_nu = irq['line_num']
-                self.debugger.trigger_interrupt(line_nu)
-
-
-            if continue_execution:
-                self.debugger.continue_execution()
-
-                triggered_breakpoint = self.debugger.get_triggered_breakpoint()
-
-                if triggered_breakpoint is None:
-                    logging.error("No breakpoint was hit?????")
-                    exit(0)
-
-                if triggered_breakpoint != next_to_break_at:
-                    logging.error("execution stopped at '%s' instead of '%s'",
-                                triggered_breakpoint, next_to_break_at)
-                    exit(0)
-            else:
-                logging.error("execution stopped as no breakpoint is set")
-                exit(1)
-
-            self.debugger.clear_breakpoints()
-
-        logging.info("All the steps in the test file are executed successfully"
-                     " with the expected result.")
+#-------------------------------------------------------------------------------
+# Copyright (c) 2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+from irq_test_abstract_debugger import Location
+import logging
+import json
+
+def create_locations_from_file(breakpoints_file_name):
+    """Internal function to create Location objects of a breakpoints data file
+    """
+    # Read in the points to break at
+    logging.info("Reading breakpoints file '%s'", breakpoints_file_name)
+    breakpoints_file = open(breakpoints_file_name)
+    breakpoints = json.load(breakpoints_file)
+    logging.debug("breakpoints: %s", str(breakpoints))
+
+    #TODO: go over the breakpoints and try to set them as a sanity check
+
+    locations = {}
+
+    for loc_name in breakpoints['breakpoints']:
+        bkpt = breakpoints['breakpoints'][loc_name]
+        offset = 0
+
+        if 'file' in bkpt:
+            filename = bkpt['file']
+        else:
+            filename = None
+
+        if 'symbol' in bkpt:
+            symbol = bkpt['symbol']
+            if 'offset' in bkpt:
+                offset = bkpt['offset']
+            else:
+                offset = 0
+        else:
+            if 'offset' in bkpt:
+                logging.error("In location %s offset is included without a"
+                              " symbol")
+                exit(2)
+            symbol = None
+
+        if 'line' in bkpt:
+            line = bkpt['line']
+            try:
+                int(line)
+            except ValueError:
+                logging.error("In location %s line is not a valid int",
+                              loc_name)
+                exit(2)
+        else:
+            line = None
+
+        if symbol:
+            if line or filename:
+                logging.error("In location %s nor filename nor line should"
+                              "be present when symbol is present", loc_name)
+                exit(2)
+
+        if (not line and filename) or (line and not filename):
+            logging.error("In location %s line and filename have to be "
+                          "present the same time", loc_name)
+            exit(2)
+
+        if (not symbol) and (not filename):
+            logging.error("In location %s no symbol nor code location is "
+                          "specified at all", loc_name)
+            exit(2)
+
+        loc = Location(symbol=symbol, offset=offset, filename=filename, line=line)
+
+        locations[loc_name] = loc
+
+    return locations
+
+class TestExecutor(object):
+    """ This class implements the test logic.
+
+    It reads the input files, and executes the steps of the testcase. It receives an
+    AbstractDebugger instance on creation. The test execution is implemented in the
+    execute function.
+    """
+
+    def __init__(self, debugger):
+        self.debugger = debugger
+
+    def execute(self, irqs_filename, breakpoints_filename, testcase_filename):
+        """ Execute a testcase
+
+        Execute the testcase defined in 'testcase_filename', using the IRQs and
+        breakpoints defined in irqs_filename and breakpoints_filename.
+        """
+        # Read in the list of IRQs
+        logging.info("Reading irqs file '%s'", irqs_filename)
+        irqs_file = open(irqs_filename)
+        irqs = json.load(irqs_file)
+        logging.debug("irqs: %s", str(irqs))
+
+        # read in the test sequence
+        logging.info("Reading test sequence file '%s'", testcase_filename)
+        test_file = open(testcase_filename)
+        test = json.load(test_file)
+        logging.debug("testcase: %s", str(test))
+
+        # TODO: crosscheck the tests file against the breakpoints and the irq's
+        #       available
+
+        locations = create_locations_from_file(breakpoints_filename)
+
+        self.debugger.clear_breakpoints()
+
+        # execute the test
+        steps = test['steps']
+        for i, step in enumerate(steps):
+
+            logging.info("---- Step %d ----", i)
+
+            continue_execution = False
+
+            if 'wait_for' in step:
+                bp_name = step['wait_for']
+                self.debugger.set_breakpoint(bp_name, locations[bp_name])
+                next_to_break_at = bp_name
+                continue_execution = True
+            elif 'expect' in step:
+                bp_name = step['expect']
+                self.debugger.set_breakpoint(bp_name, locations[bp_name])
+                next_to_break_at = bp_name
+
+                # Find the next wait_for in the test sequence, and set a
+                # breakpoint for that as well. So that it can be detected if an
+                # expected breakpoint is missed.
+
+                wait_for_found = False
+                ii = i+1
+
+                while ii < len(steps) and not wait_for_found:
+                    next_step = steps[ii]
+                    if 'wait_for' in next_step:
+                        next_bp_name = next_step['wait_for']
+                        self.debugger.set_breakpoint(next_bp_name,
+                                                     locations[next_bp_name])
+                        wait_for_found = True
+                    ii += 1
+
+                continue_execution = True
+
+
+            if 'trigger' in step:
+                irqs_dict = irqs['irqs']
+                irq = irqs_dict[step['trigger']]
+                line_nu = irq['line_num']
+                self.debugger.trigger_interrupt(line_nu)
+
+
+            if continue_execution:
+                self.debugger.continue_execution()
+
+                triggered_breakpoint = self.debugger.get_triggered_breakpoint()
+
+                if triggered_breakpoint is None:
+                    logging.error("No breakpoint was hit?????")
+                    exit(0)
+
+                if triggered_breakpoint != next_to_break_at:
+                    logging.error("execution stopped at '%s' instead of '%s'",
+                                triggered_breakpoint, next_to_break_at)
+                    exit(0)
+            else:
+                logging.error("execution stopped as no breakpoint is set")
+                exit(1)
+
+            self.debugger.clear_breakpoints()
+
+        logging.info("All the steps in the test file are executed successfully"
+                     " with the expected result.")
