You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.5 KiB
83 lines
2.5 KiB
diff -up rpm-4.11.1/lib/rpmrc.c.armhfp-logic rpm-4.11.1/lib/rpmrc.c |
|
--- rpm-4.11.1/lib/rpmrc.c.armhfp-logic 2013-10-01 14:59:12.841041726 +0300 |
|
+++ rpm-4.11.1/lib/rpmrc.c 2013-10-01 14:59:12.856041684 +0300 |
|
@@ -733,6 +733,56 @@ static int is_sun4v() |
|
} |
|
#endif |
|
|
|
+#if defined(__linux__) && defined(__arm__) |
|
+static int has_neon() |
|
+{ |
|
+ 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, "Features"); |
|
+ p = strtok(p, "\n"); |
|
+ p = strstr(p, "neon"); |
|
+ p = strtok(p, " "); |
|
+ if (p == NULL) { |
|
+ rpmlog(RPMLOG_WARNING, _("/proc/cpuinfo has no 'Features' line\n")); |
|
+ return 0; |
|
+ } else if (strcmp(p, "neon") == 0) { |
|
+ return 1; |
|
+ } |
|
+ return 0; |
|
+} |
|
+ |
|
+static int has_hfp() |
|
+{ |
|
+ 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, "Features"); |
|
+ p = strtok(p, "\n"); |
|
+ p = strstr(p, "vfpv3"); |
|
+ p = strtok(p, " "); |
|
+ if (p == NULL) { |
|
+ rpmlog(RPMLOG_WARNING, _("/proc/cpuinfo has no 'Features' line\n")); |
|
+ return 0; |
|
+ } else if (strcmp(p, "vfpv3") == 0) { |
|
+ return 1; |
|
+ } |
|
+ return 0; |
|
+} |
|
+#endif |
|
+ |
|
|
|
# if defined(__linux__) && defined(__i386__) |
|
#include <setjmp.h> |
|
@@ -1136,6 +1186,22 @@ static void defaultMachine(const char ** |
|
# endif /* __ORDER_BIG_ENDIAN__ */ |
|
# endif /* ppc64*-linux */ |
|
|
|
+# if defined(__linux__) && defined(__arm__) |
|
+ { |
|
+ if (strcmp(un.machine, "armv7l") == 0 ) { |
|
+ if (has_neon() && has_hfp()) |
|
+ strcpy(un.machine, "armv7hnl"); |
|
+ else if (has_hfp()) |
|
+ strcpy(un.machine, "armv7hl"); |
|
+ } else if (strcmp(un.machine, "armv6l") == 0 ) { |
|
+ if (has_neon() && has_hfp()) |
|
+ strcpy(un.machine, "armv6hnl"); |
|
+ else if (has_hfp()) |
|
+ strcpy(un.machine, "armv6hl"); |
|
+ } |
|
+ } |
|
+# endif /* arm*-linux */ |
|
+ |
|
# if defined(__GNUC__) && defined(__alpha__) |
|
{ |
|
unsigned long amask, implver;
|
|
|