In recent kernels, the plaform property is removed from the /proc/device-tree. This property is used to determine whether the platform is LPAR or non-lpar, and reads htab-* and tce-* properties based on the platform. Fixed this issue such that read these properties if exists, otherwise continue instead of exiting with an error message. Signed-off-by: David Wilder Signed-off-by: Haren Myneni --- kexec/arch/ppc64/kexec-ppc64.c | 55 +++++++++++------------------------------ 1 file changed, 15 insertions(+), 40 deletions(-) Index: kexec-tools-1.101/kexec/arch/ppc64/kexec-ppc64.c =================================================================== --- kexec-tools-1.101.orig/kexec/arch/ppc64/kexec-ppc64.c +++ kexec-tools-1.101/kexec/arch/ppc64/kexec-ppc64.c @@ -34,13 +34,8 @@ #include "crashdump-ppc64.h" #include -/* Platforms supported by kexec on PPC64 */ -#define PLATFORM_PSERIES 0x0100 -#define PLATFORM_PSERIES_LPAR 0x0101 - static struct exclude_range exclude_range[MAX_MEMORY_RANGES]; static unsigned long long rmo_top; -static unsigned int platform; static struct memory_range memory_range[MAX_MEMORY_RANGES]; static struct memory_range base_memory_range[MAX_MEMORY_RANGES]; unsigned long long memory_max = 0; @@ -201,26 +196,6 @@ static int get_devtree_details(unsigned } if (strncmp(dentry->d_name, "chosen", 6) == 0) { - /* get platform details from /chosen node */ - strcat(fname, "/linux,platform"); - if ((file = fopen(fname, "r")) == NULL) { - perror(fname); - closedir(cdir); - closedir(dir); - return -1; - } - if (fread(&platform, sizeof(int), 1, file) != 1) { - perror(fname); - fclose(file); - closedir(cdir); - closedir(dir); - return -1; - } - fclose(file); - - memset(fname, 0, sizeof(fname)); - strcpy(fname, device_tree); - strcat(fname, dentry->d_name); strcat(fname, "/linux,kernel-end"); if ((file = fopen(fname, "r")) == NULL) { perror(fname); @@ -291,18 +266,18 @@ static int get_devtree_details(unsigned reserve(KDUMP_BACKUP_LIMIT, crash_base-KDUMP_BACKUP_LIMIT); } - /* if LPAR, no need to read any more from /chosen */ - if (platform != PLATFORM_PSERIES) { - closedir(cdir); - continue; - } memset(fname, 0, sizeof(fname)); strcpy(fname, device_tree); strcat(fname, dentry->d_name); strcat(fname, "/linux,htab-base"); if ((file = fopen(fname, "r")) == NULL) { - perror(fname); closedir(cdir); + if (errno == ENOENT) { + /* Non LPAR */ + errno = 0; + continue; + } + perror(fname); closedir(dir); return -1; } @@ -394,23 +369,23 @@ static int get_devtree_details(unsigned } rmo_base = ((unsigned long long *)buf)[0]; rmo_top = rmo_base + ((unsigned long long *)buf)[1]; - if (platform == PLATFORM_PSERIES) { - if (rmo_top > 0x30000000UL) - rmo_top = 0x30000000UL; - } + if (rmo_top > 0x30000000UL) + rmo_top = 0x30000000UL; + fclose(file); closedir(cdir); } /* memory */ if (strncmp(dentry->d_name, "pci@", 4) == 0) { - if (platform != PLATFORM_PSERIES) { - closedir(cdir); - continue; - } strcat(fname, "/linux,tce-base"); if ((file = fopen(fname, "r")) == NULL) { - perror(fname); closedir(cdir); + if (errno == ENOENT) { + /* Non LPAR */ + errno = 0; + continue; + } + perror(fname); closedir(dir); return -1; }