diff options
author | merry <git@mary.rs> | 2022-03-04 22:16:58 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-04 23:16:58 +0100 |
commit | 497199bb50af98a73e0862107f408757a6e8da31 (patch) | |
tree | 21d2c51defa75253f2ff4e56d1027c8cdf56cf14 /ARMeilleure/Instructions | |
parent | bd9ac0fdaadd233e778a872c48f7f628b5a68c93 (diff) |
Decoder: Exit on trapping instructions, and resume execution at trapping instruction (#3153)1.1.58
* Decoder: Exit on trapping instructions, and resume execution at trapping instruction
* Resume at trapping address
* remove mustExit
Diffstat (limited to 'ARMeilleure/Instructions')
-rw-r--r-- | ARMeilleure/Instructions/InstEmitException.cs | 21 | ||||
-rw-r--r-- | ARMeilleure/Instructions/InstEmitException32.cs | 21 |
2 files changed, 29 insertions, 13 deletions
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)); } } } |