diff -rNu rpm-4.6.0-orig/lib/rpmrc.c rpm-4.6.0/lib/rpmrc.c --- rpm-4.6.0-orig/lib/rpmrc.c 2009-03-09 21:54:49.000000000 -0500 +++ rpm-4.6.0/lib/rpmrc.c 2009-03-11 12:00:44.000000000 -0500 @@ -763,6 +763,31 @@ return rc; } +#if defined(__linux__) && defined(__sparc__) +static int is_sun4v() +{ + char buffer[4096], *p; + int fd = open("/proc/cpuinfo", O_RDONLY); + if (read(fd, &buffer, sizeof(buffer) - 1) == -1) { + rpmlog(RPMLOG_WARNING, _("read(/proc/cpuinfo) failed\n")); + close(fd); + return 0; + } + close(fd); + + p = strstr(buffer, "type"); + p = strtok(p, "\n"); + p = strstr(p, "sun"); + if (p == NULL) { + rpmlog(RPMLOG_WARNING, _("/proc/cpuinfo has no 'type' line\n")); + return 0; + } else if (strcmp(p, "sun4v") == 0) { + return 1; + } + return 0; +} +#endif + # if defined(__linux__) && defined(__i386__) #include @@ -1179,6 +1204,13 @@ personality(oldpers); } } + if (is_sun4v()){ + if (strcmp(un.machine, "sparcv9") == 0 || strcmp(un.machine, "sparc") == 0 ) { + strcpy(un.machine, "sparcv9v"); + } else if (strcmp(un.machine, "sparc64") == 0 ) { + strcpy(un.machine, "sparc64v"); + } + } # endif /* sparc*-linux */ # if defined(__GNUC__) && defined(__alpha__) diff -rNu rpm-4.6.0-orig/rpmrc.in rpm-4.6.0/rpmrc.in --- rpm-4.6.0-orig/rpmrc.in 2009-03-09 21:54:49.000000000 -0500 +++ rpm-4.6.0/rpmrc.in 2009-03-11 11:50:49.000000000 -0500 @@ -312,7 +312,7 @@ arch_compat: sun4d: sparc arch_compat: sun4m: sparc arch_compat: sun4u: sparc64 -arch_compat: sparc64v: sparc64 +arch_compat: sparc64v: sparc64 sparcv9v arch_compat: sparc64: sparcv9 arch_compat: sparcv9v: sparcv9 arch_compat: sparcv9: sparcv8