X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fcpu.c;h=ef08dc7c022faa62a98366e7c77b54b75e78ecde;hb=8b6b5ab7dba7cb5fe738c887e27c65bee6a2f600;hp=b13527a40b58f85753e8b308d3fa5495b4053f70;hpb=bfe470c04a58bceed5ba1892dd97e1708b700685;p=vpp.git diff --git a/src/vppinfra/cpu.c b/src/vppinfra/cpu.c index b13527a40b5..ef08dc7c022 100644 --- a/src/vppinfra/cpu.c +++ b/src/vppinfra/cpu.c @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include #include #include #include @@ -56,6 +57,18 @@ _(0x06, 0x1a, "Nehalem", "Nehalem EP,Bloomfield)") \ _(0x06, 0x17, "Penryn", "Yorkfield,Wolfdale,Penryn,Harpertown") +#define foreach_aarch64_cpu_uarch \ + _(0x41, 0xd03, "ARM", "Cortex-A53") \ + _(0x41, 0xd07, "ARM", "Cortex-A57") \ + _(0x41, 0xd08, "ARM", "Cortex-A72") \ + _(0x41, 0xd09, "ARM", "Cortex-A73") \ + _(0x43, 0x0a1, "Cavium", "ThunderX CN88XX") \ + _(0x43, 0x0a2, "Cavium", "Octeon TX CN81XX") \ + _(0x43, 0x0a3, "Cavium", "Octeon TX CN83XX") \ + _(0x43, 0x0af, "Cavium", "ThunderX2 CN99XX") \ + _(0x43, 0x0b1, "Cavium", "Octeon TX2 CN98XX") \ + _(0x43, 0x0b2, "Cavium", "Octeon TX2 CN93XX") \ + u8 * format_cpu_uarch (u8 * s, va_list * args) { @@ -74,6 +87,43 @@ format_cpu_uarch (u8 * s, va_list * args) #undef _ return format (s, "unknown (family 0x%02x model 0x%02x)", family, model); +#elif __aarch64__ + int fd; + unformat_input_t input; + u32 implementer, primary_part_number, variant, revision; + + fd = open ("/proc/cpuinfo", 0); + if (fd < 0) + return format (s, "unknown"); + + unformat_init_clib_file (&input, fd); + while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (&input, "CPU implementer%_: 0x%x", &implementer)) + ; + else if (unformat (&input, "CPU part%_: 0x%x", &primary_part_number)) + ; + else if (unformat (&input, "CPU variant%_: 0x%x", &variant)) + ; + else if (unformat (&input, "CPU revision%_: %u", &revision)) + ; + else + unformat_skip_line (&input); + } + unformat_free (&input); + close (fd); + + /* Note: Cavium starts counting variants from 1 instead of 0 */ + if (implementer == 0x43) + variant++; + +#define _(i,p,a,c) if ((implementer == i) && (primary_part_number == p)) \ + return format(s, "%s (%s PASS %u.%u)", a, c, variant, revision); + foreach_aarch64_cpu_uarch +#undef _ + return format (s, "unknown (implementer 0x%02x part 0x%03x PASS %u.%u)", + implementer, primary_part_number, variant, revision); + #else /* ! __x86_64__ */ return format (s, "unknown"); #endif @@ -126,16 +176,33 @@ format_cpu_model_name (u8 * s, va_list * args) #endif } + +static inline char const * +flag_skip_prefix (char const *flag) +{ + if (memcmp (flag, "x86_", sizeof ("x86_") - 1) == 0) + return flag + sizeof ("x86_") - 1; + if (memcmp (flag, "aarch64_", sizeof ("aarch64_") - 1) == 0) + return flag + sizeof ("aarch64_") - 1; + return flag; +} + u8 * format_cpu_flags (u8 * s, va_list * args) { #if defined(__x86_64__) #define _(flag, func, reg, bit) \ if (clib_cpu_supports_ ## flag()) \ - s = format (s, #flag " "); + s = format (s, "%s ", flag_skip_prefix(#flag)); foreach_x86_64_flags return s; #undef _ -#else /* ! __x86_64__ */ +#elif defined(__aarch64__) +#define _(flag, bit) \ + if (clib_cpu_supports_ ## flag()) \ + s = format (s, "%s ", flag_skip_prefix(#flag)); + foreach_aarch64_flags return s; +#undef _ +#else /* ! ! __x86_64__ && ! __aarch64__ */ return format (s, "unknown"); #endif }