Home | History | Annotate | Download | only in tests
      1 // This file determines MIPS features a processor supports.
      2 //
      3 // We return:
      4 // - 0 if the machine matches the asked-for feature.
      5 // - 1 if the machine does not.
      6 // - 2 if the asked-for feature isn't recognised (this will be the case for
      7 //     any feature if run on a non-MIPS machine).
      8 // - 3 if there was a usage error (it also prints an error message).
      9 #include <stdio.h>
     10 #include <stdlib.h>
     11 #include <string.h>
     12 #include <assert.h>
     13 
     14 #define FEATURE_PRESENT       0
     15 #define FEATURE_NOT_PRESENT   1
     16 #define UNRECOGNISED_FEATURE  2
     17 #define USAGE_ERROR           3
     18 
     19 #if defined(VGA_mips32) || defined(VGA_mips64)
     20 static int mipsCPUInfo(const char *search_string) {
     21    const char *file_name = "/proc/cpuinfo";
     22    /* Simple detection of MIPS DSP ASE at runtime for Linux.
     23    * It is based on /proc/cpuinfo, which reveals hardware configuration
     24    * to user-space applications. */
     25 
     26    char cpuinfo_line[256];
     27 
     28    FILE *f = NULL;
     29    if ((f = fopen (file_name, "r")) == NULL)
     30      return 0;
     31 
     32    while (fgets (cpuinfo_line, sizeof (cpuinfo_line), f) != NULL)
     33    {
     34      if (strstr (cpuinfo_line, search_string) != NULL)
     35      {
     36          fclose (f);
     37          return 1;
     38      }
     39    }
     40 
     41    fclose (f);
     42 
     43    /* Did not find string in the /proc/cpuinfo file. */
     44    return 0;
     45 }
     46 
     47 static int go(char *feature)
     48 {
     49    int cpuinfo;
     50    if (strcmp(feature, "fpu") == 0) {
     51 #if defined(__mips_hard_float)
     52       /* This is not a runtime detection.
     53          If mips_features is built as hard-float, the assumption is that
     54          the target MIPS platform has a floating-point unit. */
     55       return FEATURE_PRESENT;
     56 #else
     57       return FEATURE_NOT_PRESENT;
     58 #endif
     59    }
     60    else if (strcmp(feature, "mips32-dsp") == 0) {
     61       const char *dsp = "dsp";
     62       cpuinfo = mipsCPUInfo(dsp);
     63       if (cpuinfo == 1) {
     64          return FEATURE_PRESENT;
     65       } else{
     66          return FEATURE_NOT_PRESENT;
     67       }
     68    } else if (strcmp(feature, "mips32-dspr2") == 0) {
     69       const char *dsp2 = "dsp2";
     70       cpuinfo = mipsCPUInfo(dsp2);
     71       if (cpuinfo == 1) {
     72          return FEATURE_PRESENT;
     73       } else{
     74          return FEATURE_NOT_PRESENT;
     75       }
     76    } else if (strcmp(feature, "cavium-octeon") == 0) {
     77       const char *cavium = "Cavium Octeon";
     78       cpuinfo = mipsCPUInfo(cavium);
     79       if (cpuinfo == 1) {
     80          return FEATURE_PRESENT;
     81       } else{
     82          return FEATURE_NOT_PRESENT;
     83       }
     84    } else if (strcmp(feature, "cavium-octeon2") == 0) {
     85       const char *cavium2 = "Cavium Octeon II";
     86       cpuinfo = mipsCPUInfo(cavium2);
     87       if (cpuinfo == 1) {
     88          return FEATURE_PRESENT;
     89       } else{
     90          return FEATURE_NOT_PRESENT;
     91       }
     92    } else if (strcmp(feature, "mips-be") == 0) {
     93 #if defined (_MIPSEB)
     94      return FEATURE_PRESENT;
     95 #else
     96      return FEATURE_NOT_PRESENT;
     97 #endif
     98    } else {
     99       return UNRECOGNISED_FEATURE;
    100    }
    101 
    102 }
    103 
    104 #else
    105 
    106 static int go(char *feature)
    107 {
    108    /* Feature is not recognised. (non-MIPS machine!) */
    109    return UNRECOGNISED_FEATURE;
    110 }
    111 
    112 #endif
    113 
    114 
    115 //---------------------------------------------------------------------------
    116 // main
    117 //---------------------------------------------------------------------------
    118 int main(int argc, char **argv)
    119 {
    120    if (argc != 2) {
    121       fprintf( stderr, "usage: mips_features <feature>\n" );
    122       exit(USAGE_ERROR);
    123    }
    124    return go(argv[1]);
    125 }
    126