[PATCH] Aarch64: Fix register load order in `ldp` in commit f4ba145
Jeremy Drake
cygwin@jdrake.com
Wed Jun 25 18:37:35 GMT 2025
On Wed, 25 Jun 2025, Thirumalai Nagalingam wrote:
> - ldp x0, x10, [x19, #16] // x0 = stackaddr, x10 = stackbase \n\
> + ldp x10, x0, [x19, #24] // x0 = stackaddr, x10 = stackbase \n\
I am very confused about this.
The struct layout:
struct pthread_wrapper_arg
{
LPTHREAD_START_ROUTINE func; // +0
PVOID arg; // +8
PBYTE stackaddr; // +16
PBYTE stackbase; // +24
PBYTE stacklimit; // +32
ULONG guardsize; // +40
};
below, you have
ldp x19, x0, [x19] // x19 = func, x0 = arg \n\
blr x19 // call thread function \n"
If this works (and it'd be really very obvious if it didn't), ldp loads
64-bits at the address given and puts it in the first register, and loads
64-bits at address+8 and puts it in the second register. So wouldn't this
really be
+ ldp x10, x0, [x19, #24] // x10 = stackbase, x0 = stacklimit \n\
?
so now you're freeing stacklimit instead of stackbase? I don't think
that's right.
More information about the Cygwin-patches
mailing list