//
// r12 = UMEntryThunk*
//
- NESTED_ENTRY UMThunkStub,_TEXT,NoHandler
+ NESTED_ENTRY UMThunkStub,_TEXT,UnhandledExceptionHandlerUnix
PROLOG_PUSH "{r4,r5,r7,r11,lr}"
- push {r0-r3,r12}
- PROLOG_STACK_SAVE_OFFSET r7, #28
+ PROLOG_STACK_SAVE_OFFSET r7, #8
+
+ alloc_stack 4 * 5
+ stm sp, {r0-r3,r12}
//GBLA UMThunkStub_HiddenArgOffest // offset of saved UMEntryThunk *
//GBLA UMThunkStub_StackArgsOffest // offset of original stack args
mov r4, 0
str r4, [r5, #Thread__m_fPreemptiveGCDisabled]
- EPILOG_STACK_RESTORE_OFFSET r7, #28
- free_stack 4 * 5
+ EPILOG_STACK_RESTORE_OFFSET r7, #8
EPILOG_POP "{r4,r5,r7,r11,pc}"
LOCAL_LABEL(UMThunkStub_DoThreadSetup):
.endm
+ //
+ // EXTERN_C void ProfileEnterNaked(FunctionIDOrClientID functionIDOrClientID);
+ //
+ NESTED_ENTRY ProfileEnterNaked, _TEXT, NoHandler
+ PROLOG_PUSH "{r4, r5, r7, r11, lr}"
+ PROLOG_STACK_SAVE_OFFSET r7, #8
+
+ // fields of PLATFORM_SPECIFIC_DATA, in reverse order
+
+ // UINT32 r0; // Keep r0 & r1 contiguous to make returning 64-bit results easier
+ // UINT32 r1;
+ // void *R11;
+ // void *Pc;
+ // union // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7)
+ // {
+ // UINT32 s[16];
+ // UINT64 d[8];
+ // };
+ // FunctionID functionId;
+ // void *probeSp; // stack pointer of managed function
+ // void *profiledSp; // location of arguments on stack
+ // LPVOID hiddenArg;
+ // UINT32 flags;
+ movw r4, #1
+ push { /* flags */ r4 }
+ movw r4, #0
+ push { /* hiddenArg */ r4 }
+ add r5, r11, #8
+ push { /* profiledSp */ r5 }
+ add r5, sp, #32
+ push { /* probeSp */ r5 }
+ push { /* functionId */ r0 }
+ vpush.64 { d0 - d7 }
+ push { lr }
+ push { r11 }
+ push { /* return value, r4 is NULL */ r4 }
+ push { /* return value, r4 is NULL */ r4 }
+ mov r1, sp
+ bl C_FUNC(ProfileEnter)
+ EPILOG_STACK_RESTORE_OFFSET r7, #8
+ EPILOG_POP "{r4, r5, r7, r11, pc}"
+ NESTED_END ProfileEnterNaked, _TEXT
+
+ //
+ // EXTERN_C void ProfileLeaveNaked(FunctionIDOrClientID functionIDOrClientID);
+ //
+ NESTED_ENTRY ProfileLeaveNaked, _TEXT, NoHandler
+ PROLOG_PUSH "{r1, r2, r4, r5, r7, r11, lr}"
+ PROLOG_STACK_SAVE_OFFSET r7, #16
+
+ // fields of PLATFORM_SPECIFIC_DATA, in reverse order
+
+ // UINT32 r0; // Keep r0 & r1 contiguous to make returning 64-bit results easier
+ // UINT32 r1;
+ // void *R11;
+ // void *Pc;
+ // union // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7)
+ // {
+ // UINT32 s[16];
+ // UINT64 d[8];
+ // };
+ // FunctionID functionId;
+ // void *probeSp; // stack pointer of managed function
+ // void *profiledSp; // location of arguments on stack
+ // LPVOID hiddenArg;
+ // UINT32 flags;
+ movw r4, #2
+ push { /* flags */ r4 }
+ movw r4, #0
+ push { /* hiddenArg */ r4 }
+ add r5, r11, #8
+ push { /* profiledSp */ r5 }
+ add r5, sp, #40
+ push { /* probeSp */ r5 }
+ push { /* functionId */ r0 }
+ vpush.64 { d0 - d7 }
+ push { lr }
+ push { r11 }
+ push { r1 }
+ push { r2 }
+ mov r1, sp
+ bl C_FUNC(ProfileLeave)
+ EPILOG_STACK_RESTORE_OFFSET r7, #16
+ EPILOG_POP "{r1, r2, r4, r5, r7, r11, pc}"
+ NESTED_END ProfileLeaveNaked, _TEXT
+
// EXTERN_C int __fastcall HelperMethodFrameRestoreState(
// INDEBUG_COMMA(HelperMethodFrame *pFrame)
// MachState *pState