mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
target-ppc: Support little-endian PPC64 in user mode.
Look at ELF header to determine ABI version on PPC64. This is required for executing the first instruction correctly. Also print correct machine name in uname() system call. Signed-off-by: Doug Kwan <dougkwan@google.com> Signed-off-by: Tom Musta <tommusta@gmail.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
a721d390b3
commit
d90b94cd78
3 changed files with 24 additions and 2 deletions
|
@ -784,12 +784,18 @@ static uint32_t get_elf_hwcap(void)
|
|||
NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
|
||||
} while (0)
|
||||
|
||||
static inline uint32_t get_ppc64_abi(struct image_info *infop);
|
||||
|
||||
static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
|
||||
{
|
||||
_regs->gpr[1] = infop->start_stack;
|
||||
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
|
||||
_regs->gpr[2] = ldq_raw(infop->entry + 8) + infop->load_bias;
|
||||
infop->entry = ldq_raw(infop->entry) + infop->load_bias;
|
||||
if (get_ppc64_abi(infop) < 2) {
|
||||
_regs->gpr[2] = ldq_raw(infop->entry + 8) + infop->load_bias;
|
||||
infop->entry = ldq_raw(infop->entry) + infop->load_bias;
|
||||
} else {
|
||||
_regs->gpr[12] = infop->entry; /* r12 set to global entry address */
|
||||
}
|
||||
#endif
|
||||
_regs->nip = infop->entry;
|
||||
}
|
||||
|
@ -1159,6 +1165,13 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i
|
|||
|
||||
#include "elf.h"
|
||||
|
||||
#ifdef TARGET_PPC
|
||||
static inline uint32_t get_ppc64_abi(struct image_info *infop)
|
||||
{
|
||||
return infop->elf_flags & EF_PPC64_ABI;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct exec
|
||||
{
|
||||
unsigned int a_info; /* Use macros N_MAGIC, etc for access */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue