summaryrefslogtreecommitdiff
path: root/src/vm/i386/ehhelpers.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/i386/ehhelpers.S')
-rw-r--r--src/vm/i386/ehhelpers.S103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/vm/i386/ehhelpers.S b/src/vm/i386/ehhelpers.S
new file mode 100644
index 0000000000..43ef37fa24
--- /dev/null
+++ b/src/vm/i386/ehhelpers.S
@@ -0,0 +1,103 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+.intel_syntax noprefix
+#include "unixasmmacros.inc"
+#include "asmconstants.h"
+
+// DWORD_PTR STDCALL CallEHFunclet(Object *pThrowable, UINT_PTR pFuncletToInvoke, UINT_PTR *pFirstNonVolReg, UINT_PTR *pFuncletCallerSP);
+// ESP based frame
+NESTED_ENTRY CallEHFunclet, _TEXT, NoHandler
+
+ ESP_PROLOG_BEG
+ ESP_PROLOG_PUSH ebp
+ ESP_PROLOG_PUSH ebx
+ ESP_PROLOG_PUSH esi
+ ESP_PROLOG_PUSH edi
+ ESP_PROLOG_ALLOC 12
+ ESP_PROLOG_END
+
+ lea ebp, [esp + 3*4 + 12]
+
+ // On entry:
+ //
+ // [ebp+ 8] = throwable
+ // [ebp+12] = PC to invoke
+ // [ebp+16] = address of EDI register in CONTEXT record // used to restore the non-volatile registers of CrawlFrame
+ // [ebp+20] = address of the location where the SP of funclet's caller (i.e. this helper) should be saved.
+ //
+
+ // Save the SP of this function
+ mov eax, [ebp + 20]
+ mov [eax], esp
+ // Save the funclet PC for later call
+ mov edx, [ebp + 12]
+ // Pass throwable object to funclet
+ mov eax, [ebp + 8]
+ // Restore non-volatiles registers
+ mov ecx, [ebp + 16]
+ mov edi, [ecx]
+ mov esi, [ecx + 4]
+ mov ebx, [ecx + 8]
+ mov ebp, [ecx + 24]
+ // Invoke the funclet
+ call edx
+
+ ESP_EPILOG_BEG
+ ESP_EPILOG_FREE 12
+ ESP_EPILOG_POP edi
+ ESP_EPILOG_POP esi
+ ESP_EPILOG_POP ebx
+ ESP_EPILOG_POP ebp
+ ESP_EPILOG_END
+
+ ret 16
+
+NESTED_END CallEHFunclet, _TEXT
+
+// DWORD_PTR STDCALL CallEHFilterFunclet(Object *pThrowable, TADDR CallerSP, UINT_PTR pFuncletToInvoke, UINT_PTR *pFuncletCallerSP);
+// ESP based frame
+NESTED_ENTRY CallEHFilterFunclet, _TEXT, NoHandler
+
+ ESP_PROLOG_BEG
+ ESP_PROLOG_PUSH ebp
+ ESP_PROLOG_PUSH ebx
+ ESP_PROLOG_PUSH esi
+ ESP_PROLOG_PUSH edi
+ ESP_PROLOG_ALLOC 12
+ ESP_PROLOG_END
+
+ lea ebp, [esp + 3*4 + 12]
+
+ // On entry:
+ //
+ // [ebp+ 8] = throwable
+ // [ebp+12] = FP to restore
+ // [ebp+16] = PC to invoke
+ // [ebp+20] = address of the location where the SP of funclet's caller (i.e. this helper) should be saved.
+ //
+
+ // Save the SP of this function
+ mov eax, [ebp + 20]
+ mov [eax], esp
+ // Save the funclet PC for later call
+ mov edx, [ebp + 16]
+ // Pass throwable object to funclet
+ mov eax, [ebp + 8]
+ // Restore FP
+ mov ebp, [ebp + 12]
+ // Invoke the funclet
+ call edx
+
+ ESP_EPILOG_BEG
+ ESP_EPILOG_FREE 12
+ ESP_EPILOG_POP edi
+ ESP_EPILOG_POP esi
+ ESP_EPILOG_POP ebx
+ ESP_EPILOG_POP ebp
+ ESP_EPILOG_END
+
+ ret 16
+
+NESTED_END CallEHFunclet, _TEXT