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