qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] linux-user: Introduce stubs for ELF AT_BASE_PLATFORM


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH 1/2] linux-user: Introduce stubs for ELF AT_BASE_PLATFORM
Date: Tue, 2 Aug 2022 08:07:13 +0200
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.11.0

On 1/8/22 22:09, Jiaxun Yang wrote:
AT_BASE_PLATFORM is a elf auxiliary vector pointing to a string
to pass some architecture information.

We can be more specific.

"See getauxval(3) man-page."

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
  linux-user/elfload.c | 29 +++++++++++++++++++++++++++--
  1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index ce902dbd56..e7666c5c60 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1718,6 +1718,10 @@ static inline void init_thread(struct target_pt_regs 
*regs,
#endif /* TARGET_HEXAGON */ +#ifndef ELF_BASE_PLATFORM
+#define ELF_BASE_PLATFORM (NULL)
+#endif
+
  #ifndef ELF_PLATFORM
  #define ELF_PLATFORM (NULL)
  #endif
@@ -2148,8 +2152,8 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, 
int envc,
      int i;
      abi_ulong u_rand_bytes;
      uint8_t k_rand_bytes[16];
-    abi_ulong u_platform;
-    const char *k_platform;
+    abi_ulong u_platform, u_base_platform;
+    const char *k_platform, *k_base_platform;
      const int n = sizeof(elf_addr_t);
sp = p;
@@ -2171,6 +2175,22 @@ static abi_ulong create_elf_tables(abi_ulong p, int 
argc, int envc,
          }
      }
+ u_base_platform = 0;
+    k_base_platform = ELF_BASE_PLATFORM;
+    if (k_base_platform) {
+        size_t len = strlen(k_base_platform) + 1;
+        if (STACK_GROWS_DOWN) {
+            sp -= (len + n - 1) & ~(n - 1);
+            u_base_platform = sp;
+            /* FIXME - check return value of memcpy_to_target() for failure */
+            memcpy_to_target(sp, k_base_platform, len);
+        } else {
+            memcpy_to_target(sp, k_base_platform, len);
+            u_base_platform = sp;
+            sp += len + 1;
+        }
+    }
+
      u_platform = 0;
      k_platform = ELF_PLATFORM;
      if (k_platform) {
@@ -2212,6 +2232,8 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, 
int envc,
      }
size = (DLINFO_ITEMS + 1) * 2;
+    if (k_base_platform)
+        size += 2;
      if (k_platform)
          size += 2;
  #ifdef DLINFO_ARCH_ITEMS
@@ -2289,6 +2311,9 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, 
int envc,
      NEW_AUX_ENT(AT_HWCAP2, (abi_ulong) ELF_HWCAP2);
  #endif
+ if (u_base_platform) {
+        NEW_AUX_ENT(AT_BASE_PLATFORM, u_base_platform);
+    }
      if (u_platform) {
          NEW_AUX_ENT(AT_PLATFORM, u_platform);
      }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]