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, "mips32-dsp") == 0) {
     51       const char *dsp = "dsp";
     52       cpuinfo = mipsCPUInfo(dsp);
     53       if (cpuinfo == 1) {
     54          return FEATURE_PRESENT;
     55       } else{
     56          return FEATURE_NOT_PRESENT;
     57       }
     58    } else if (strcmp(feature, "mips32-dspr2") == 0) {
     59       const char *dsp2 = "dsp2";
     60       cpuinfo = mipsCPUInfo(dsp2);
     61       if (cpuinfo == 1) {
     62          return FEATURE_PRESENT;
     63       } else{
     64          return FEATURE_NOT_PRESENT;
     65       }
     66    } else if (strcmp(feature, "cavium-octeon") == 0) {
     67       const char *cavium = "Cavium Octeon";
     68       cpuinfo = mipsCPUInfo(cavium);
     69       if (cpuinfo == 1) {
     70          return FEATURE_PRESENT;
     71       } else{
     72          return FEATURE_NOT_PRESENT;
     73       }
     74    } else if (strcmp(feature, "cavium-octeon2") == 0) {
     75       const char *cavium2 = "Cavium Octeon II";
     76       cpuinfo = mipsCPUInfo(cavium2);
     77       if (cpuinfo == 1) {
     78          return FEATURE_PRESENT;
     79       } else{
     80          return FEATURE_NOT_PRESENT;
     81       }
     82    } else if (strcmp(feature, "mips-be") == 0) {
     83 #if defined (_MIPSEB)
     84      return FEATURE_PRESENT;
     85 #else
     86      return FEATURE_NOT_PRESENT;
     87 #endif
     88    } else {
     89       return UNRECOGNISED_FEATURE;
     90    }
     91 
     92 }
     93 
     94 #else
     95 
     96 static int go(char *feature)
     97 {
     98    /* Feature is not recognised. (non-MIPS machine!) */
     99    return UNRECOGNISED_FEATURE;
    100 }
    101 
    102 #endif
    103 
    104 
    105 //---------------------------------------------------------------------------
    106 // main
    107 //---------------------------------------------------------------------------
    108 int main(int argc, char **argv)
    109 {
    110    if (argc != 2) {
    111       fprintf( stderr, "usage: mips_features <feature>\n" );
    112       exit(USAGE_ERROR);
    113    }
    114    return go(argv[1]);
    115 }
    116