caller.py: implement exit_group syscall
authorJacob Lifshay <programmerjake@gmail.com>
Fri, 1 Dec 2023 07:27:48 +0000 (23:27 -0800)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 22 Dec 2023 19:26:21 +0000 (19:26 +0000)
src/openpower/decoder/isa/caller.py
src/openpower/test/runner.py

index c0b08b86ea39259b5702e85e92d27d45ba979177..ae6ade0195b22d85e5a00eb8305e2a87606135f3 100644 (file)
@@ -1144,6 +1144,10 @@ class StepLoop:
         log("    new dststep", dststep)
 
 
+class ExitSyscallCalled(Exception):
+    pass
+
+
 class SyscallEmulator(openpower.syscalls.Dispatcher):
     def __init__(self, isacaller):
         self.__isacaller = isacaller
@@ -1158,6 +1162,10 @@ class SyscallEmulator(openpower.syscalls.Dispatcher):
         (identifier, *arguments) = map(int, (identifier, *arguments))
         return super().__call__(identifier, *arguments)
 
+    def sys_exit_group(self, status, *rest):
+        self.__isacaller.halted = True
+        raise ExitSyscallCalled(status)
+
 
 class ISACaller(ISACallerHelper, ISAFPHelpers, StepLoop):
     # decoder2 - an instance of power_decoder2
index ea6edb6f114ee7e9d1246095af4458701736ee43..47010a4468b7bf0ecd831df21186fe409dcec9bc 100644 (file)
@@ -28,6 +28,7 @@ from nmutil.sim_tmp_alternative import Simulator, Settle
 from nmutil.formaltest import FHDLTestCase
 from nmutil.gtkw import write_gtkw
 from openpower.decoder.isa.all import ISA
+from openpower.decoder.isa.caller import ExitSyscallCalled
 from openpower.endian import bigendian
 
 from openpower.decoder.power_decoder2 import PowerDecode2
@@ -107,7 +108,10 @@ class SimRunner(StateRunner):
 
             # call simulated operation
             log("sim", code)
-            yield from sim.execute_one()
+            try:
+                yield from sim.execute_one()
+            except ExitSyscallCalled:
+                break
             yield Settle()
             index = sim.pc.CIA.value//4
 
@@ -274,7 +278,10 @@ class TestRunnerBase(FHDLTestCase):
                     log("sprs", test.sprs, kind=LogType.InstrInOuts)
                     log("cr", test.cr, kind=LogType.InstrInOuts)
                     log("mem", test.mem)
-                    log("msr", test.msr, kind=LogType.InstrInOuts)
+                    if test.msr is None:
+                        log("msr", "None", kind=LogType.InstrInOuts)
+                    else:
+                        log("msr", hex(test.msr), kind=LogType.InstrInOuts)
 
                     def format_assembly(assembly):
                         # type: (str) -> str