From 497199bb50af98a73e0862107f408757a6e8da31 Mon Sep 17 00:00:00 2001
From: merry <git@mary.rs>
Date: Fri, 4 Mar 2022 22:16:58 +0000
Subject: Decoder: Exit on trapping instructions, and resume execution at
 trapping instruction (#3153)

* Decoder: Exit on trapping instructions, and resume execution at trapping instruction

* Resume at trapping address

* remove mustExit
---
 ARMeilleure/Instructions/InstEmitException.cs   | 21 +++++++++++++++------
 ARMeilleure/Instructions/InstEmitException32.cs | 21 ++++++++++++++-------
 2 files changed, 29 insertions(+), 13 deletions(-)

(limited to 'ARMeilleure/Instructions')

diff --git a/ARMeilleure/Instructions/InstEmitException.cs b/ARMeilleure/Instructions/InstEmitException.cs
index 8819824b..0baaa87d 100644
--- a/ARMeilleure/Instructions/InstEmitException.cs
+++ b/ARMeilleure/Instructions/InstEmitException.cs
@@ -9,18 +9,25 @@ namespace ARMeilleure.Instructions
     {
         public static void Brk(ArmEmitterContext context)
         {
-            EmitExceptionCall(context, nameof(NativeInterface.Break));
-        }
+            OpCodeException op = (OpCodeException)context.CurrOp;
 
-        public static void Svc(ArmEmitterContext context)
-        {
-            EmitExceptionCall(context, nameof(NativeInterface.SupervisorCall));
+            string name = nameof(NativeInterface.Break);
+
+            context.StoreToContext();
+
+            context.Call(typeof(NativeInterface).GetMethod(name), Const(op.Address), Const(op.Id));
+
+            context.LoadFromContext();
+
+            context.Return(Const(op.Address));
         }
 
-        private static void EmitExceptionCall(ArmEmitterContext context, string name)
+        public static void Svc(ArmEmitterContext context)
         {
             OpCodeException op = (OpCodeException)context.CurrOp;
 
+            string name = nameof(NativeInterface.SupervisorCall);
+
             context.StoreToContext();
 
             context.Call(typeof(NativeInterface).GetMethod(name), Const(op.Address), Const(op.Id));
@@ -41,6 +48,8 @@ namespace ARMeilleure.Instructions
             context.Call(typeof(NativeInterface).GetMethod(name), Const(op.Address), Const(op.RawOpCode));
 
             context.LoadFromContext();
+
+            context.Return(Const(op.Address));
         }
     }
 }
\ No newline at end of file
diff --git a/ARMeilleure/Instructions/InstEmitException32.cs b/ARMeilleure/Instructions/InstEmitException32.cs
index 0b3d28d9..a2a3869f 100644
--- a/ARMeilleure/Instructions/InstEmitException32.cs
+++ b/ARMeilleure/Instructions/InstEmitException32.cs
@@ -10,25 +10,32 @@ namespace ARMeilleure.Instructions
     {
         public static void Svc(ArmEmitterContext context)
         {
-            EmitExceptionCall(context, nameof(NativeInterface.SupervisorCall));
-        }
+            IOpCode32Exception op = (IOpCode32Exception)context.CurrOp;
 
-        public static void Trap(ArmEmitterContext context)
-        {
-            EmitExceptionCall(context, nameof(NativeInterface.Break));
+            string name = nameof(NativeInterface.SupervisorCall);
+
+            context.StoreToContext();
+
+            context.Call(typeof(NativeInterface).GetMethod(name), Const(((IOpCode)op).Address), Const(op.Id));
+
+            context.LoadFromContext();
+
+            Translator.EmitSynchronization(context);
         }
 
-        private static void EmitExceptionCall(ArmEmitterContext context, string name)
+        public static void Trap(ArmEmitterContext context)
         {
             IOpCode32Exception op = (IOpCode32Exception)context.CurrOp;
 
+            string name = nameof(NativeInterface.Break);
+
             context.StoreToContext();
 
             context.Call(typeof(NativeInterface).GetMethod(name), Const(((IOpCode)op).Address), Const(op.Id));
 
             context.LoadFromContext();
 
-            Translator.EmitSynchronization(context);
+            context.Return(Const(context.CurrOp.Address));
         }
     }
 }
-- 
cgit v1.2.3-70-g09d2