Mostly a copy of ppc64 with renaming to _ppc variants.

Signed-off-by: Suzuki K. Poulose <[email protected]>
---

 Makefile       |   11 ++++--
 arch/ppc.c     |  101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 makedumpfile.c |    4 +-
 makedumpfile.h |   24 ++++++++++++-
 4 files changed, 133 insertions(+), 7 deletions(-)
 create mode 100644 arch/ppc.c

diff --git a/Makefile b/Makefile
index 04e267f..677cc8c 100644
--- a/Makefile
+++ b/Makefile
@@ -24,7 +24,7 @@ endif
 ARCH := $(shell echo ${TARGET}  | sed -e s/i.86/x86/ -e s/sun4u/sparc64/ \
                               -e s/arm.*/arm/ -e s/sa110/arm/ \
                               -e s/s390x/s390/ -e s/parisc64/parisc/ \
-                              -e s/ppc64/powerpc64/ )
+                              -e s/ppc64/powerpc64/ -e s/ppc/powerpc32/)
 
 CFLAGS += -D__$(ARCH)__
 CFLAGS_ARCH += -D__$(ARCH)__
@@ -34,11 +34,16 @@ CFLAGS += -m64
 CFLAGS_ARCH += -m64
 endif
 
+ifeq ($(ARCH), powerpc32)
+CFLAGS += -m32
+CFLAGS_ARCH += -m32
+endif
+
 SRC    = makedumpfile.c makedumpfile.h diskdump_mod.h sadump_mod.h 
sadump_info.h
 SRC_PART = print_info.c dwarf_info.c elf_info.c erase_info.c sadump_info.c
 OBJ_PART = print_info.o dwarf_info.o elf_info.o erase_info.o sadump_info.o
-SRC_ARCH = arch/arm.c arch/x86.c arch/x86_64.c arch/ia64.c arch/ppc64.c 
arch/s390x.c
-OBJ_ARCH = arch/arm.o arch/x86.o arch/x86_64.o arch/ia64.o arch/ppc64.o 
arch/s390x.o
+SRC_ARCH = arch/arm.c arch/x86.c arch/x86_64.c arch/ia64.c arch/ppc64.c 
arch/s390x.c arch/ppc.c
+OBJ_ARCH = arch/arm.o arch/x86.o arch/x86_64.o arch/ia64.o arch/ppc64.o 
arch/s390x.o arch/ppc.o
 
 all: makedumpfile
 
diff --git a/arch/ppc.c b/arch/ppc.c
new file mode 100644
index 0000000..2bc8d5f
--- /dev/null
+++ b/arch/ppc.c
@@ -0,0 +1,101 @@
+/*
+ * ppc.c
+ *
+ * Created by: Suzuki K. Poulose <[email protected]>
+ *  - Based on ppc64 implementation
+ * Copyright (C) IBM Corporation, 2012. All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation (version 2 of the License).
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef __powerpc32__
+
+#include "../print_info.h"
+#include "../elf_info.h"
+#include "../makedumpfile.h"
+
+int
+get_machdep_info_ppc(void)
+{
+       unsigned long vmlist, vmalloc_start;
+
+       info->section_size_bits = _SECTION_SIZE_BITS;
+       info->max_physmem_bits  = _MAX_PHYSMEM_BITS;
+       info->page_offset = __PAGE_OFFSET;
+
+       if (SYMBOL(_stext) != NOT_FOUND_SYMBOL)
+               info->kernel_start = SYMBOL(_stext);
+       else {
+               ERRMSG("Can't get the symbol of _stext.\n");
+               return FALSE;
+       }
+               
+       DEBUG_MSG("kernel_start : %lx\n", info->kernel_start);
+
+       /*
+        * For the compatibility, makedumpfile should run without the symbol
+        * vmlist and the offset of vm_struct.addr if they are not necessary.
+        */
+       if ((SYMBOL(vmlist) == NOT_FOUND_SYMBOL)
+           || (OFFSET(vm_struct.addr) == NOT_FOUND_STRUCTURE)) {
+               return TRUE;
+       }
+       if (!readmem(VADDR, SYMBOL(vmlist), &vmlist, sizeof(vmlist))) {
+               ERRMSG("Can't get vmlist.\n");
+               return FALSE;
+       }
+       if (!readmem(VADDR, vmlist + OFFSET(vm_struct.addr), &vmalloc_start,
+           sizeof(vmalloc_start))) {
+               ERRMSG("Can't get vmalloc_start.\n");
+               return FALSE;
+       }
+       info->vmalloc_start = vmalloc_start;
+       DEBUG_MSG("vmalloc_start: %lx\n", vmalloc_start);
+
+       return TRUE;
+}
+
+int
+is_vmalloc_addr_ppc(unsigned long vaddr)
+{
+       return (info->vmalloc_start && vaddr >= info->vmalloc_start);
+}
+
+unsigned long long
+vaddr_to_paddr_ppc(unsigned long vaddr)
+{
+       unsigned long *pgd, *pmd;
+       unsigned long long pte;
+       unsigned long long paddr;
+
+       paddr = vaddr_to_paddr_general(vaddr);
+       if (paddr != NOT_PADDR)
+               return paddr;
+
+       if ((SYMBOL(vmlist) == NOT_FOUND_SYMBOL)
+           || (OFFSET(vm_struct.addr) == NOT_FOUND_STRUCTURE)) {
+               ERRMSG("Can't get necessary information for vmalloc 
translation.\n");
+               return NOT_PADDR;
+       }
+       if (!is_vmalloc_addr_ppc(vaddr))
+               return (vaddr - info->kernel_start);
+
+       /*
+        * TODO: Support vmalloc translation.
+        */
+       ERRMSG("This makedumpfile does not support vmalloc translation.\n");
+       return NOT_PADDR;
+}
+
+#endif /* powerpc32 */
diff --git a/makedumpfile.c b/makedumpfile.c
index 101f8b5..cefb7cf 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -5691,9 +5691,9 @@ initial_xen(void)
        off_t offset;
        unsigned long size;
 
-#ifdef __powerpc64__
+#if defined(__powerpc64__) || defined(__powerpc32__)
        MSG("\n");
-       MSG("ppc64 xen is not supported.\n");
+       MSG("xen is not supported on powerpc.\n");
        return FALSE;
 #else
        if(!info->flag_elf_dumpfile) {
diff --git a/makedumpfile.h b/makedumpfile.h
index efa325f..1329271 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -530,6 +530,17 @@ do { \
 #define _MAX_PHYSMEM_BITS      (44)
 #endif
 
+#ifdef __powerpc32__
+
+#define __PAGE_OFFSET          (0xc0000000)
+#define KERNELBASE             PAGE_OFFSET
+#define VMALL_START            (info->vmalloc_start)
+#define KVBASE                 (SYMBOL(_stext))
+#define _SECTION_SIZE_BITS     (24)
+#define _MAX_PHYSMEM_BITS      (44)
+
+#endif
+
 #ifdef __s390x__
 #define __PAGE_OFFSET          (info->page_size - 1)
 #define KERNELBASE             (0)
@@ -667,6 +678,15 @@ unsigned long long vaddr_to_paddr_ppc64(unsigned long 
vaddr);
 #define vaddr_to_paddr(X)      vaddr_to_paddr_ppc64(X)
 #endif          /* powerpc64 */
 
+#ifdef __powerpc32__ /* powerpc32 */
+int get_machdep_info_ppc(void);
+unsigned long long vaddr_to_paddr_ppc(unsigned long vaddr);
+#define get_phys_base()                TRUE
+#define get_machdep_info()     get_machdep_info_ppc()
+#define get_versiondep_info()  TRUE
+#define vaddr_to_paddr(X)      vaddr_to_paddr_ppc(X)
+#endif          /* powerpc */
+
 #ifdef __s390x__ /* s390x */
 int get_machdep_info_s390x(void);
 unsigned long long vaddr_to_paddr_s390x(unsigned long vaddr);
@@ -1332,10 +1352,10 @@ int get_xen_info_ia64(void);
 
 #endif /* __ia64 */
 
-#ifdef __powerpc64__ /* powerpc64 */
+#if defined(__powerpc64__) || defined(__powerpc32__) /* powerpcXX */
 #define kvtop_xen(X)   FALSE
 #define get_xen_info_arch(X) FALSE
-#endif /* powerpc64 */
+#endif /* powerpcXX */
 
 #ifdef __s390x__ /* s390x */
 #define kvtop_xen(X)   FALSE


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to