Skip to content

Commit bf17d45

Browse files
janvorliCopilotAaronRobinsonMSFT
authored
Fix interpreter Unix x64 call stub generator (#121942)
The call stub generator is missing support for return buffer passing in RSI, only RDI was supported by mistake. This change fixes it. Fixes #121631 --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Aaron R Robinson <arobins@microsoft.com>
1 parent a56f65e commit bf17d45

File tree

3 files changed

+69
-16
lines changed

3 files changed

+69
-16
lines changed

src/coreclr/vm/amd64/asmhelpers.S

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ END_PROLOGUE
574574
ret
575575
NESTED_END InterpreterStubRetDoubleI8, _TEXT
576576

577-
NESTED_ENTRY InterpreterStubRetBuff, _TEXT, NoHandler
577+
NESTED_ENTRY InterpreterStubRetBuffRDI, _TEXT, NoHandler
578578
push_register rax // stack alignment
579579
END_PROLOGUE
580580
mov rdi, rax // pTransitionBlock*
@@ -586,7 +586,21 @@ END_PROLOGUE
586586
mov rax, qword ptr [rsp + 8 + 8 + __InterpreterStubArgumentRegistersOffset]
587587
pop_register rcx
588588
ret
589-
NESTED_END InterpreterStubRetBuff, _TEXT
589+
NESTED_END InterpreterStubRetBuffRDI, _TEXT
590+
591+
NESTED_ENTRY InterpreterStubRetBuffRSI, _TEXT, NoHandler
592+
push_register rax // stack alignment
593+
END_PROLOGUE
594+
mov rdi, rax // pTransitionBlock*
595+
mov rsi, rbx // the IR bytecode pointer
596+
// Load the return buffer address
597+
// The 8 + 8 is for the push and the return address slot
598+
mov rdx, qword ptr [rsp + 8 + 8 + __InterpreterStubArgumentRegistersOffset + 8]
599+
call C_FUNC(ExecuteInterpretedMethod)
600+
mov rax, qword ptr [rsp + 8 + 8 + __InterpreterStubArgumentRegistersOffset + 8]
601+
pop_register rcx
602+
ret
603+
NESTED_END InterpreterStubRetBuffRSI, _TEXT
590604

591605
// Routines for passing value type arguments by reference in general purpose registers RDI, RSI, RDX, RCX, R8, R9
592606
// from native code to the interpreter
@@ -1732,7 +1746,7 @@ END_PROLOGUE
17321746
ret
17331747
NESTED_END CallJittedMethodRetVoid, _TEXT
17341748

1735-
NESTED_ENTRY CallJittedMethodRetBuff, _TEXT, NoHandler
1749+
NESTED_ENTRY CallJittedMethodRetBuffRDI, _TEXT, NoHandler
17361750
push_nonvol_reg rbp
17371751
mov rbp, rsp
17381752
alloc_stack 0x10
@@ -1747,7 +1761,24 @@ END_PROLOGUE
17471761
mov rsp, rbp
17481762
pop rbp
17491763
ret
1750-
NESTED_END CallJittedMethodRetBuff, _TEXT
1764+
NESTED_END CallJittedMethodRetBuffRDI, _TEXT
1765+
1766+
NESTED_ENTRY CallJittedMethodRetBuffRSI, _TEXT, NoHandler
1767+
push_nonvol_reg rbp
1768+
mov rbp, rsp
1769+
alloc_stack 0x10
1770+
save_reg_postrsp r10, 0
1771+
END_PROLOGUE
1772+
sub rsp, rcx // total stack space
1773+
mov r11, rdi // The routines list
1774+
mov r10, rsi // interpreter stack args
1775+
mov rsi, rdx // return buffer
1776+
call qword ptr [r11]
1777+
mov r10, [rsp]
1778+
mov rsp, rbp
1779+
pop rbp
1780+
ret
1781+
NESTED_END CallJittedMethodRetBuffRSI, _TEXT
17511782

17521783
NESTED_ENTRY CallJittedMethodRetDouble, _TEXT, NoHandler
17531784
push_nonvol_reg rbp

src/coreclr/vm/callstubgenerator.cpp

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,15 +1975,22 @@ extern "C" void InterpreterStubRetVoid();
19751975
extern "C" void InterpreterStubRetDouble();
19761976
extern "C" void InterpreterStubRetI8();
19771977

1978-
#if defined(TARGET_WINDOWS) && defined(TARGET_AMD64)
1978+
#ifdef TARGET_AMD64
1979+
#ifdef TARGET_WINDOWS
19791980
extern "C" void CallJittedMethodRetBuffRCX(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize);
19801981
extern "C" void CallJittedMethodRetBuffRDX(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize);
19811982
extern "C" void InterpreterStubRetBuffRCX();
19821983
extern "C" void InterpreterStubRetBuffRDX();
1983-
#else // TARGET_WINDOWS && TARGET_AMD64
1984+
#else // TARGET_WINDOWS
1985+
extern "C" void CallJittedMethodRetBuffRDI(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize);
1986+
extern "C" void CallJittedMethodRetBuffRSI(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize);
1987+
extern "C" void InterpreterStubRetBuffRDI();
1988+
extern "C" void InterpreterStubRetBuffRSI();
1989+
#endif // TARGET_WINDOWS
1990+
#else // TARGET_AMD64
19841991
extern "C" void CallJittedMethodRetBuff(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize);
19851992
extern "C" void InterpreterStubRetBuff();
1986-
#endif // TARGET_WINDOWS && TARGET_AMD64
1993+
#endif // TARGET_AMD64
19871994

19881995
#ifdef UNIX_AMD64_ABI
19891996
extern "C" void CallJittedMethodRetI8I8(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize);
@@ -2060,15 +2067,22 @@ CallStubHeader::InvokeFunctionPtr CallStubGenerator::GetInvokeFunctionPtr(CallSt
20602067
INVOKE_FUNCTION_PTR(CallJittedMethodRetDouble);
20612068
case ReturnTypeI8:
20622069
INVOKE_FUNCTION_PTR(CallJittedMethodRetI8);
2063-
#if defined(TARGET_WINDOWS) && defined(TARGET_AMD64)
2070+
#ifdef TARGET_AMD64
2071+
#ifdef TARGET_WINDOWS
20642072
case ReturnTypeBuffArg1:
20652073
INVOKE_FUNCTION_PTR(CallJittedMethodRetBuffRCX);
20662074
case ReturnTypeBuffArg2:
20672075
INVOKE_FUNCTION_PTR(CallJittedMethodRetBuffRDX);
2068-
#else // TARGET_WINDOWS && TARGET_AMD64
2076+
#else // TARGET_WINDOWS
2077+
case ReturnTypeBuffArg1:
2078+
INVOKE_FUNCTION_PTR(CallJittedMethodRetBuffRDI);
2079+
case ReturnTypeBuffArg2:
2080+
INVOKE_FUNCTION_PTR(CallJittedMethodRetBuffRSI);
2081+
#endif // TARGET_WINDOWS
2082+
#else // TARGET_AMD64
20692083
case ReturnTypeBuff:
20702084
INVOKE_FUNCTION_PTR(CallJittedMethodRetBuff);
2071-
#endif // TARGET_WINDOWS && TARGET_AMD64
2085+
#endif // TARGET_AMD64
20722086
#ifdef UNIX_AMD64_ABI
20732087
case ReturnTypeI8I8:
20742088
INVOKE_FUNCTION_PTR(CallJittedMethodRetI8I8);
@@ -2147,15 +2161,23 @@ PCODE CallStubGenerator::GetInterpreterReturnTypeHandler(CallStubGenerator::Retu
21472161
RETURN_TYPE_HANDLER(InterpreterStubRetDouble);
21482162
case ReturnTypeI8:
21492163
RETURN_TYPE_HANDLER(InterpreterStubRetI8);
2150-
#if defined(TARGET_WINDOWS) && defined(TARGET_AMD64)
2164+
#ifdef TARGET_AMD64
21512165
case ReturnTypeBuffArg1:
2166+
#ifdef TARGET_WINDOWS
21522167
RETURN_TYPE_HANDLER(InterpreterStubRetBuffRCX);
2168+
#else
2169+
RETURN_TYPE_HANDLER(InterpreterStubRetBuffRDI);
2170+
#endif
21532171
case ReturnTypeBuffArg2:
2172+
#ifdef TARGET_WINDOWS
21542173
RETURN_TYPE_HANDLER(InterpreterStubRetBuffRDX);
2155-
#else // TARGET_WINDOWS && TARGET_AMD64
2174+
#else
2175+
RETURN_TYPE_HANDLER(InterpreterStubRetBuffRSI);
2176+
#endif
2177+
#else // TARGET_AMD64
21562178
case ReturnTypeBuff:
21572179
RETURN_TYPE_HANDLER(InterpreterStubRetBuff);
2158-
#endif // TARGET_WINDOWS && TARGET_AMD64
2180+
#endif // TARGET_AMD64
21592181
#ifdef UNIX_AMD64_ABI
21602182
case ReturnTypeI8I8:
21612183
RETURN_TYPE_HANDLER(InterpreterStubRetI8I8);
@@ -2799,7 +2821,7 @@ CallStubGenerator::ReturnType CallStubGenerator::GetReturnType(ArgIterator *pArg
27992821
{
28002822
if (pArgIt->HasRetBuffArg())
28012823
{
2802-
#if defined(TARGET_WINDOWS) && defined(TARGET_AMD64)
2824+
#ifdef TARGET_AMD64
28032825
if (pArgIt->HasThis())
28042826
{
28052827
return ReturnTypeBuffArg2;
@@ -2810,7 +2832,7 @@ CallStubGenerator::ReturnType CallStubGenerator::GetReturnType(ArgIterator *pArg
28102832
}
28112833
#else
28122834
return ReturnTypeBuff;
2813-
#endif
2835+
#endif // TARGET_AMD64
28142836
}
28152837
else
28162838
{

src/coreclr/vm/callstubgenerator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class CallStubGenerator
7070
ReturnTypeVoid,
7171
ReturnTypeI8,
7272
ReturnTypeDouble,
73-
#if defined(TARGET_WINDOWS) && defined(TARGET_AMD64)
73+
#ifdef TARGET_AMD64
7474
ReturnTypeBuffArg1,
7575
ReturnTypeBuffArg2,
7676
#else

0 commit comments

Comments
 (0)