summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in1
-rwxr-xr-xconfig/config.guess5
-rw-r--r--configure.ac6
-rw-r--r--kexec/arch/ppc64/kexec-elf-ppc64.c6
-rw-r--r--kexec/arch/ppc64/kexec-elf-rel-ppc64.c3
-rw-r--r--kexec/arch/ppc64/kexec-ppc64.c3
-rw-r--r--purgatory/arch/ppc64/Makefile8
-rw-r--r--purgatory/arch/ppc64/v2wrap.S1
8 files changed, 25 insertions, 8 deletions
diff --git a/Makefile.in b/Makefile.in
index c1859d1..54c206f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -22,6 +22,7 @@ includedir = @includedir@
# The target architecture
ARCH = @ARCH@
+SUBARCH = @SUBARCH@
OBJDIR = @OBJDIR@
target = @target@
host = @host@
diff --git a/config/config.guess b/config/config.guess
index d622a44..c954d5e 100755
--- a/config/config.guess
+++ b/config/config.guess
@@ -4,7 +4,7 @@
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
# 2011, 2012 Free Software Foundation, Inc.
-timestamp='2012-02-10'
+timestamp='2013-10-21'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -972,6 +972,9 @@ EOF
ppc64:Linux:*:*)
echo powerpc64-unknown-linux-gnu
exit ;;
+ ppc64le:Linux:*:*)
+ echo powerpc64le-unknown-linux-gnu
+ exit ;;
ppc:Linux:*:*)
echo powerpc-unknown-linux-gnu
exit ;;
diff --git a/configure.ac b/configure.ac
index 7b61dbf..76126cc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -29,6 +29,11 @@ case $target_cpu in
;;
powerpc64 )
ARCH="ppc64"
+ SUBARCH="BE"
+ ;;
+ powerpc64le )
+ ARCH="ppc64"
+ SUBARCH="LE"
;;
arm* )
ARCH="arm"
@@ -197,6 +202,7 @@ AC_SUBST([TARGET_CFLAGS])
AC_SUBST([ASFLAGS])
AC_SUBST([ARCH])
+AC_SUBST([SUBARCH])
AC_SUBST([OBJDIR])
AC_SUBST([INSTALL])
diff --git a/kexec/arch/ppc64/kexec-elf-ppc64.c b/kexec/arch/ppc64/kexec-elf-ppc64.c
index 3550fc1..7d49d8a 100644
--- a/kexec/arch/ppc64/kexec-elf-ppc64.c
+++ b/kexec/arch/ppc64/kexec-elf-ppc64.c
@@ -237,13 +237,13 @@ int elf_ppc64_load(int argc, char **argv, const char *buf, off_t len,
* entry is before this one
*/
bb_ptr = (struct bootblock *)(seg_buf);
- rsvmap_ptr = (uint64_t *)(seg_buf + bb_ptr->off_mem_rsvmap);
+ rsvmap_ptr = (uint64_t *)(seg_buf + be32_to_cpu(bb_ptr->off_mem_rsvmap));
while (*rsvmap_ptr || *(rsvmap_ptr+1))
rsvmap_ptr += 2;
rsvmap_ptr -= 2;
- *rsvmap_ptr = my_dt_offset;
+ *rsvmap_ptr = cpu_to_be64(my_dt_offset);
rsvmap_ptr++;
- *rsvmap_ptr = bb_ptr->totalsize;
+ *rsvmap_ptr = cpu_to_be64((uint64_t)be32_to_cpu(bb_ptr->totalsize));
#endif
/* Set kernel */
diff --git a/kexec/arch/ppc64/kexec-elf-rel-ppc64.c b/kexec/arch/ppc64/kexec-elf-rel-ppc64.c
index 54d506a..5fc2f87 100644
--- a/kexec/arch/ppc64/kexec-elf-rel-ppc64.c
+++ b/kexec/arch/ppc64/kexec-elf-rel-ppc64.c
@@ -7,9 +7,6 @@
int machine_verify_elf_rel(struct mem_ehdr *ehdr)
{
- if (ehdr->ei_data != ELFDATA2MSB) {
- return 0;
- }
if (ehdr->ei_class != ELFCLASS64) {
return 0;
}
diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c
index 21bd0a8..af9112b 100644
--- a/kexec/arch/ppc64/kexec-ppc64.c
+++ b/kexec/arch/ppc64/kexec-ppc64.c
@@ -532,6 +532,7 @@ static int get_devtree_details(unsigned long kexec_flags)
perror(fname);
goto error_openfile;
}
+ rtas_base = be32_to_cpu(rtas_base);
memset(fname, 0, sizeof(fname));
strcpy(fname, device_tree);
strcat(fname, dentry->d_name);
@@ -545,6 +546,7 @@ static int get_devtree_details(unsigned long kexec_flags)
goto error_openfile;
}
closedir(cdir);
+ rtas_size = be32_to_cpu(rtas_size);
/* Add rtas to exclude_range */
exclude_range[i].start = rtas_base;
exclude_range[i].end = rtas_base + rtas_size;
@@ -798,6 +800,7 @@ const struct arch_map_entry arches[] = {
* So pass KEXEC_ARCH_PPC64 here
*/
{ "ppc64", KEXEC_ARCH_PPC64 },
+ { "ppc64le", KEXEC_ARCH_PPC64 },
{ NULL, 0 },
};
diff --git a/purgatory/arch/ppc64/Makefile b/purgatory/arch/ppc64/Makefile
index 67f41ae..6f6716e 100644
--- a/purgatory/arch/ppc64/Makefile
+++ b/purgatory/arch/ppc64/Makefile
@@ -11,7 +11,13 @@ ppc64_PURGATORY_SRCS += purgatory/arch/ppc64/misc.S
ppc64_PURGATORY_EXTRA_CFLAGS += -m64 -mcall-aixdesc -msoft-float
ppc64_PURGATORY_EXTRA_ASFLAGS += -m64 -mcall-aixdesc
-ppc64_PURGATORY_EXTRA_LDFLAGS += -melf64ppc
+ifeq ($(SUBARCH),BE)
+ ppc64_PURGATORY_EXTRA_LDFLAGS += -melf64ppc
+else
+ ppc64_PURGATORY_EXTRA_LDFLAGS += -melf64lppc
+ ppc64_PURGATORY_EXTRA_CFLAGS += -mlittle-endian
+ ppc64_PURGATORY_EXTRA_ASFLAGS += -mlittle-endian
+endif
dist += purgatory/arch/ppc64/Makefile $(ppc64_PURGATORY_SRCS) \
purgatory/arch/ppc64/hvCall.h \
diff --git a/purgatory/arch/ppc64/v2wrap.S b/purgatory/arch/ppc64/v2wrap.S
index 3f78620..16fb63d 100644
--- a/purgatory/arch/ppc64/v2wrap.S
+++ b/purgatory/arch/ppc64/v2wrap.S
@@ -46,6 +46,7 @@
ori rn,rn,name##@l
.machine ppc64
+ .align 8
.globl purgatory_start
purgatory_start: b master
.org purgatory_start + 0x5c # ABI: possible run_at_load flag at 0x5c