https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=9653999c2f4429ab8e8867f3b33c8acc8fea787c

commit 9653999c2f4429ab8e8867f3b33c8acc8fea787c
Author:     Evgeny Karpov <evgeny.kar...@microsoft.com>
AuthorDate: Fri Jul 4 20:20:37 2025 +0200
Commit:     Corinna Vinschen <cori...@vinschen.de>
CommitDate: Mon Jul 14 15:13:25 2025 +0200

    Cygwin: malloc_wrapper: port to AArch64
    
    Implements import_address function by decoding adr AArch64 instructions to 
get target address.
    
    Signed-off-by: Radek BartoĊˆ <radek.bar...@microsoft.com>

Diff:
---
 winsup/cygwin/mm/malloc_wrapper.cc | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/winsup/cygwin/mm/malloc_wrapper.cc 
b/winsup/cygwin/mm/malloc_wrapper.cc
index de3cf7ddc19e..863d3089cfff 100644
--- a/winsup/cygwin/mm/malloc_wrapper.cc
+++ b/winsup/cygwin/mm/malloc_wrapper.cc
@@ -50,6 +50,19 @@ import_address (void *imp)
 {
   __try
     {
+#if defined(__aarch64__)
+      // If opcode is an adr instruction.
+      uint32_t opcode = *(uint32_t *) imp;
+      if ((opcode & 0x9f000000) == 0x10000000)
+       {
+         uint32_t immhi = (opcode >> 5) & 0x7ffff;
+         uint32_t immlo = (opcode >> 29) & 0x3;
+         int64_t sign_extend = (0l - (immhi >> 18)) << 21;
+         int64_t imm = sign_extend | (immhi << 2) | immlo;
+         uintptr_t jmpto = *(uintptr_t *) ((uint8_t *) imp + imm);
+         return (void *) jmpto;
+       }
+#else
       if (*((uint16_t *) imp) == 0x25ff)
        {
          const char *ptr = (const char *) imp;
@@ -57,6 +70,7 @@ import_address (void *imp)
                                   (ptr + 6 + *(int32_t *)(ptr + 2));
          return (void *) *jmpto;
        }
+#endif
     }
   __except (NO_ERROR) {}
   __endtry

Reply via email to