aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys-utils/lscpu-arm.c37
-rw-r--r--sys-utils/lscpu.c3
-rw-r--r--sys-utils/lscpu.h2
3 files changed, 40 insertions, 2 deletions
diff --git a/sys-utils/lscpu-arm.c b/sys-utils/lscpu-arm.c
index 2c76c376bd..ad714e77ae 100644
--- a/sys-utils/lscpu-arm.c
+++ b/sys-utils/lscpu-arm.c
@@ -334,14 +334,49 @@ static int parse_id(const char *str)
#define parse_model_id(_cxt) (parse_id((_cxt)->model))
+static inline int get_implementer_id(struct lscpu_cputype *ct)
+{
+ if (ct->vendor_id)
+ return ct->vendor_id;
+ return parse_id(ct->vendor);
+}
+
static inline int parse_implementer_id(struct lscpu_cputype *ct)
{
+ int id;
+
if (ct->vendor_id)
return ct->vendor_id;
- ct->vendor_id = parse_id(ct->vendor);
+ id = get_implementer_id(ct);
+ if (id <= 0)
+ return id;
+
+ ct->vendor_id = id;
return ct->vendor_id;
}
+int is_arm(struct lscpu_cxt *cxt)
+{
+ size_t i;
+
+ if (is_live(cxt))
+ return strcmp(cxt->arch->name, "aarch64") == 0;
+
+ /* dump; assume ARM if vendor ID is known */
+ for (i = 0; i < cxt->ncputypes; i++) {
+
+ int j, id = get_implementer_id(cxt->cputypes[i]);
+ if (id <= 0)
+ continue;
+ for (j = 0; hw_implementer[j].id != -1; j++) {
+ if (hw_implementer[j].id == id)
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
/*
* Use model and vendor IDs to decode to human readable names.
*/
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index c073fc0dc4..60a0912370 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -1365,7 +1365,8 @@ int main(int argc, char *argv[])
lscpu_read_numas(cxt);
lscpu_read_topology(cxt);
- lscpu_decode_arm(cxt);
+ if (is_arm(cxt))
+ lscpu_decode_arm(cxt);
cxt->virt = lscpu_read_virtualization(cxt);
diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
index cf1147d60f..b68d1fff5f 100644
--- a/sys-utils/lscpu.h
+++ b/sys-utils/lscpu.h
@@ -271,6 +271,8 @@ struct lscpu_cxt {
((_cxt) && (_cpu) && (_cxt)->present && \
CPU_ISSET_S((_cpu)->logical_id, (_cxt)->setsize, (_cxt)->present))
+int is_arm(struct lscpu_cxt *cxt);
+
struct lscpu_cputype *lscpu_new_cputype(void);
void lscpu_ref_cputype(struct lscpu_cputype *ct);
void lscpu_unref_cputype(struct lscpu_cputype *ct);