Skip to content

Commit 193b826

Browse files
authored
[mono] Fix SwiftError variable offset calculation (#103043)
* Avoid var allocation when SwiftError is passed via the stack * Refactor Security.Cryptography tests to pass SwiftError at the end of the signature
1 parent d85716e commit 193b826

File tree

3 files changed

+41
-42
lines changed

3 files changed

+41
-42
lines changed

src/libraries/Common/src/Interop/OSX/System.Security.Cryptography.Native.Apple/Interop.Aead.cs

+16-16
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ internal static unsafe void ChaCha20Poly1305Encrypt(
4343
fixed (byte* aadPtr = &GetSwiftRef(aad))
4444
{
4545
AppleCryptoNative_ChaCha20Poly1305Encrypt(
46-
out SwiftError error,
4746
new UnsafeBufferPointer<byte>(keyPtr, key.Length),
4847
new UnsafeBufferPointer<byte>(noncePtr, nonce.Length),
4948
new UnsafeBufferPointer<byte>(plaintextPtr, plaintext.Length),
5049
new UnsafeMutableBufferPointer<byte>(ciphertextPtr, ciphertext.Length),
5150
new UnsafeMutableBufferPointer<byte>(tagPtr, tag.Length),
52-
new UnsafeBufferPointer<byte>(aadPtr, aad.Length));
51+
new UnsafeBufferPointer<byte>(aadPtr, aad.Length),
52+
out SwiftError error);
5353

5454
if (error.Value != null)
5555
{
@@ -76,13 +76,13 @@ internal static unsafe void ChaCha20Poly1305Decrypt(
7676
fixed (byte* aadPtr = &GetSwiftRef(aad))
7777
{
7878
AppleCryptoNative_ChaCha20Poly1305Decrypt(
79-
out SwiftError error,
8079
new UnsafeBufferPointer<byte>(keyPtr, key.Length),
8180
new UnsafeBufferPointer<byte>(noncePtr, nonce.Length),
8281
new UnsafeBufferPointer<byte>(ciphertextPtr, ciphertext.Length),
8382
new UnsafeBufferPointer<byte>(tagPtr, tag.Length),
8483
new UnsafeMutableBufferPointer<byte>(plaintextPtr, plaintext.Length),
85-
new UnsafeBufferPointer<byte>(aadPtr, aad.Length));
84+
new UnsafeBufferPointer<byte>(aadPtr, aad.Length),
85+
out SwiftError error);
8686

8787
if (error.Value != null)
8888
{
@@ -116,13 +116,13 @@ internal static unsafe void AesGcmEncrypt(
116116
fixed (byte* aadPtr = &GetSwiftRef(aad))
117117
{
118118
AppleCryptoNative_AesGcmEncrypt(
119-
out SwiftError error,
120119
new UnsafeBufferPointer<byte>(keyPtr, key.Length),
121120
new UnsafeBufferPointer<byte>(noncePtr, nonce.Length),
122121
new UnsafeBufferPointer<byte>(plaintextPtr, plaintext.Length),
123122
new UnsafeMutableBufferPointer<byte>(ciphertextPtr, ciphertext.Length),
124123
new UnsafeMutableBufferPointer<byte>(tagPtr, tag.Length),
125-
new UnsafeBufferPointer<byte>(aadPtr, aad.Length));
124+
new UnsafeBufferPointer<byte>(aadPtr, aad.Length),
125+
out SwiftError error);
126126

127127
if (error.Value != null)
128128
{
@@ -149,13 +149,13 @@ internal static unsafe void AesGcmDecrypt(
149149
fixed (byte* aadPtr = &GetSwiftRef(aad))
150150
{
151151
AppleCryptoNative_AesGcmDecrypt(
152-
out SwiftError error,
153152
new UnsafeBufferPointer<byte>(keyPtr, key.Length),
154153
new UnsafeBufferPointer<byte>(noncePtr, nonce.Length),
155154
new UnsafeBufferPointer<byte>(ciphertextPtr, ciphertext.Length),
156155
new UnsafeBufferPointer<byte>(tagPtr, tag.Length),
157156
new UnsafeMutableBufferPointer<byte>(plaintextPtr, plaintext.Length),
158-
new UnsafeBufferPointer<byte>(aadPtr, aad.Length));
157+
new UnsafeBufferPointer<byte>(aadPtr, aad.Length),
158+
out SwiftError error);
159159

160160
if (error.Value != null)
161161
{
@@ -176,46 +176,46 @@ internal static unsafe void AesGcmDecrypt(
176176
[LibraryImport(Libraries.AppleCryptoNative)]
177177
[UnmanagedCallConv(CallConvs = [ typeof(CallConvSwift) ])]
178178
private static unsafe partial void AppleCryptoNative_ChaCha20Poly1305Encrypt(
179-
out SwiftError error,
180179
UnsafeBufferPointer<byte> key,
181180
UnsafeBufferPointer<byte> nonce,
182181
UnsafeBufferPointer<byte> plaintext,
183182
UnsafeMutableBufferPointer<byte> ciphertext,
184183
UnsafeMutableBufferPointer<byte> tag,
185-
UnsafeBufferPointer<byte> aad);
184+
UnsafeBufferPointer<byte> aad,
185+
out SwiftError error);
186186

187187
[LibraryImport(Libraries.AppleCryptoNative)]
188188
[UnmanagedCallConv(CallConvs = [ typeof(CallConvSwift) ])]
189189
private static unsafe partial void AppleCryptoNative_ChaCha20Poly1305Decrypt(
190-
out SwiftError error,
191190
UnsafeBufferPointer<byte> key,
192191
UnsafeBufferPointer<byte> nonce,
193192
UnsafeBufferPointer<byte> ciphertext,
194193
UnsafeBufferPointer<byte> tag,
195194
UnsafeMutableBufferPointer<byte> plaintext,
196-
UnsafeBufferPointer<byte> aad);
195+
UnsafeBufferPointer<byte> aad,
196+
out SwiftError error);
197197

198198
[LibraryImport(Libraries.AppleCryptoNative)]
199199
[UnmanagedCallConv(CallConvs = [ typeof(CallConvSwift) ])]
200200
private static unsafe partial void AppleCryptoNative_AesGcmEncrypt(
201-
out SwiftError error,
202201
UnsafeBufferPointer<byte> key,
203202
UnsafeBufferPointer<byte> nonce,
204203
UnsafeBufferPointer<byte> plaintext,
205204
UnsafeMutableBufferPointer<byte> ciphertext,
206205
UnsafeMutableBufferPointer<byte> tag,
207-
UnsafeBufferPointer<byte> aad);
206+
UnsafeBufferPointer<byte> aad,
207+
out SwiftError error);
208208

209209
[LibraryImport(Libraries.AppleCryptoNative)]
210210
[UnmanagedCallConv(CallConvs = [ typeof(CallConvSwift) ])]
211211
private static unsafe partial void AppleCryptoNative_AesGcmDecrypt(
212-
out SwiftError error,
213212
UnsafeBufferPointer<byte> key,
214213
UnsafeBufferPointer<byte> nonce,
215214
UnsafeBufferPointer<byte> ciphertext,
216215
UnsafeBufferPointer<byte> tag,
217216
UnsafeMutableBufferPointer<byte> plaintext,
218-
UnsafeBufferPointer<byte> aad);
217+
UnsafeBufferPointer<byte> aad,
218+
out SwiftError error);
219219

220220
[LibraryImport(Libraries.AppleCryptoNative)]
221221
[UnmanagedCallConv(CallConvs = new[] { typeof(CallConvSwift) })]

src/mono/mono/mini/mini-amd64.c

+16-15
Original file line numberDiff line numberDiff line change
@@ -1989,26 +1989,30 @@ mono_arch_allocate_vars (MonoCompile *cfg)
19891989
break;
19901990
}
19911991
case ArgSwiftError: {
1992+
inreg = FALSE;
1993+
if (ainfo->offset)
1994+
{
19921995
ins->opcode = OP_REGOFFSET;
1993-
offset = ALIGN_TO (offset, sizeof (target_mgreg_t));
19941996
ins->inst_basereg = cfg->frame_reg;
1995-
ins->inst_offset = offset;
1996-
offset += sizeof (target_mgreg_t);
1997+
ins->inst_offset = ainfo->offset + ARGS_OFFSET;
1998+
inreg = TRUE;
1999+
}
19972000

1998-
cfg->arch.swift_error_var = ins;
2001+
cfg->arch.swift_error_var = ins;
2002+
2003+
/* In the n2m case, the error register functions as an extra return register
2004+
* and is thus is not treated as callee-saved.
2005+
*/
2006+
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE)
2007+
cfg->used_int_regs |= (size_t)(1 << AMD64_R12);
19992008

2000-
/* In the n2m case, the error register functions as an extra return register
2001-
* and is thus is not treated as callee-saved.
2002-
*/
2003-
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE)
2004-
cfg->used_int_regs |= (size_t)(1 << AMD64_R12);
2005-
}
20062009
break;
2010+
}
20072011
default:
20082012
NOT_IMPLEMENTED;
20092013
}
20102014

2011-
if (!inreg && (ainfo->storage != ArgOnStack) && (ainfo->storage != ArgValuetypeAddrInIReg) && (ainfo->storage != ArgValuetypeAddrOnStack) && (ainfo->storage != ArgGSharedVtOnStack) && (ainfo->storage != ArgSwiftError)) {
2015+
if (!inreg && (ainfo->storage != ArgOnStack) && (ainfo->storage != ArgValuetypeAddrInIReg) && (ainfo->storage != ArgValuetypeAddrOnStack) && (ainfo->storage != ArgGSharedVtOnStack)) {
20122016
ins->opcode = OP_REGOFFSET;
20132017
ins->inst_basereg = cfg->frame_reg;
20142018
/* These arguments are saved to the stack in the prolog */
@@ -8259,10 +8263,7 @@ MONO_RESTORE_WARNING
82598263
break;
82608264
case ArgSwiftError:
82618265
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
8262-
if (ainfo->offset) {
8263-
amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, ARGS_OFFSET + ainfo->offset, 8);
8264-
amd64_mov_membase_reg (code, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, AMD64_R11, sizeof (target_mgreg_t));
8265-
} else {
8266+
if (ainfo->offset == 0) {
82668267
amd64_mov_membase_reg (code, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, ainfo->reg, sizeof (target_mgreg_t));
82678268
}
82688269
} else if (cfg->method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) {

src/mono/mono/mini/mini-arm64.c

+9-11
Original file line numberDiff line numberDiff line change
@@ -2877,14 +2877,15 @@ mono_arch_allocate_vars (MonoCompile *cfg)
28772877
}
28782878
case ArgSwiftError: {
28792879
ins->flags |= MONO_INST_VOLATILE;
2880-
size = 8;
2881-
align = 8;
2882-
offset += align - 1;
2883-
offset &= ~(align - 1);
28842880
ins->opcode = OP_REGOFFSET;
2885-
ins->inst_basereg = cfg->frame_reg;
2886-
ins->inst_offset = offset;
2887-
offset += size;
2881+
if (ainfo->offset) {
2882+
g_assert (cfg->arch.args_reg);
2883+
ins->inst_basereg = cfg->arch.args_reg;
2884+
ins->inst_offset = ainfo->offset;
2885+
} else {
2886+
ins->inst_offset = offset;
2887+
offset += 8;
2888+
}
28882889

28892890
cfg->arch.swift_error_var = ins;
28902891

@@ -5955,10 +5956,7 @@ emit_move_args (MonoCompile *cfg, guint8 *code)
59555956
break;
59565957
case ArgSwiftError:
59575958
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
5958-
if (ainfo->offset) {
5959-
code = emit_ldrx (code, ARMREG_IP0, cfg->arch.args_reg, ainfo->offset);
5960-
code = emit_strx (code, ARMREG_IP0, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
5961-
} else {
5959+
if (ainfo->offset == 0) {
59625960
code = emit_strx (code, ainfo->reg, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
59635961
}
59645962
} else if (cfg->method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) {

0 commit comments

Comments
 (0)