Commit d90b94cd authored by Doug Kwan's avatar Doug Kwan Committed by Alexander Graf
Browse files

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: default avatarDoug Kwan <dougkwan@google.com>
Signed-off-by: default avatarTom Musta <tommusta@gmail.com>
Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
parent a721d390
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -561,6 +561,11 @@ typedef struct {
#define SHF_ALPHA_GPREL		0x10000000


/* PowerPC specific definitions.  */

/* Processor specific flags for the ELF header e_flags field.  */
#define EF_PPC64_ABI           0x3

/* PowerPC relocations defined by the ABIs */
#define R_PPC_NONE		0
#define R_PPC_ADDR32		1	/* 32bit absolute address */
+15 −2
Original line number Diff line number Diff line
@@ -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)
    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 */
+4 −0
Original line number Diff line number Diff line
@@ -58,8 +58,12 @@ struct target_revectored_struct {
 */

#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
#ifdef TARGET_WORDS_BIGENDIAN
#define UNAME_MACHINE "ppc64"
#else
#define UNAME_MACHINE "ppc64le"
#endif
#else
#define UNAME_MACHINE "ppc"
#endif
#define UNAME_MINIMUM_RELEASE "2.6.32"