diff mbox series

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

Message ID 20220801200928.73741-2-jiaxun.yang@flygoat.com (mailing list archive)
State New, archived
Headers show
Series linux-user: AT_BASE_PLATFORM for MIPS | expand

Commit Message

Jiaxun Yang Aug. 1, 2022, 8:09 p.m. UTC
AT_BASE_PLATFORM is a elf auxiliary vector pointing to a string
to pass some architecture information.

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

Comments

Philippe Mathieu-Daudé Aug. 2, 2022, 6:07 a.m. UTC | #1
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);
>       }
diff mbox series

Patch

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);
     }