diff --git a/configure.ac b/configure.ac index 9261255..8b2a1a5 100644 --- a/configure.ac +++ b/configure.ac @@ -245,17 +245,23 @@ elif test $cpu = arm; then #if defined(__linux__) FILE *fp; char buf[128]; + int version = 0, revision; # if !defined(__ARM_PCS_VFP) if ((fp = fopen("/proc/cpuinfo", "r")) == NULL) return 1; while (fgets(buf, sizeof(buf), fp)) { - if (strncmp(buf, "Features\t:", 10) == 0 && - strstr(buf + 10, "vfp")) { - fclose(fp); - return 0; + if (strncmp(buf, "CPU architecture:", 17) == 0) { + version = strtol(buf + 17, &ptr, 10); + } + else if (strncmp(buf, "Revision\t:", 10) == 0) { + if (sscanf(buf + 10, "%d", &revision) == 1) { + if (version < 7 || revision < 3) + break; + } } } fclose(fp); + return 0; # endif #endif return 1; diff --git a/include/lightning/jit_arm.h b/include/lightning/jit_arm.h index 81451f1..2136e74 100644 --- a/include/lightning/jit_arm.h +++ b/include/lightning/jit_arm.h @@ -117,6 +117,8 @@ typedef struct { * due to some memory ordering constraint not being respected, so, * disable by default */ jit_uint32_t ldrt_strt : 1; + /* arm instruction set? */ + jit_uint32_t arm : 1; } jit_cpu_t; /* diff --git a/lib/jit_arm.c b/lib/jit_arm.c index 783fa90..be555b4 100644 --- a/lib/jit_arm.c +++ b/lib/jit_arm.c @@ -159,6 +159,7 @@ jit_get_cpu(void) char *ptr; char buf[128]; + jit_cpu.arm = 1; if ((fp = fopen("/proc/cpuinfo", "r")) != NULL) { while (fgets(buf, sizeof(buf), fp)) { if (strncmp(buf, "CPU architecture:", 17) == 0) { @@ -184,6 +185,11 @@ jit_get_cpu(void) if ((ptr = strstr(buf + 10, "thumb"))) jit_cpu.thumb = 1; } + else if (strncmp(buf, "Revision\t:", 10) == 0) { + jit_int32_t revision; + if (sscanf(buf + 10, "%d", &revision) == 1) + jit_cpu.arm = jit_cpu.version < 7 || revision < 3; + } } fclose(fp); } diff --git a/lib/jit_disasm.c b/lib/jit_disasm.c index 15b91b9..68ce80e 100644 --- a/lib/jit_disasm.c +++ b/lib/jit_disasm.c @@ -131,6 +131,10 @@ jit_init_debug(const char *progname) # else disasm_info.mach = bfd_mach_riscv64; # endif +# endif +# if defined(__arm__) + if (!jit_cpu.arm) + disasm_info.mach = bfd_mach_arm_5TE; # endif disasm_info.print_address_func = disasm_print_address;