Home | History | Annotate | Download | only in src
      1 #include <stdlib.h>
      2 #include <string.h>
      3 
      4 #define llua_cpu       /* Define the library */
      5 
      6 /* Include the Lua API header files */
      7 #include"lua.h"
      8 #include"lauxlib.h"
      9 #include"lualib.h"
     10 #include"cpuid.h"
     11 
     12 static void add_string_item(lua_State *L, const char *item, const char *value_str) {
     13  lua_pushstring(L,item);
     14  lua_pushstring(L,value_str);
     15  lua_settable(L,-3);
     16 }
     17 
     18 static void add_int_item(lua_State *L, const char *item, int value_int) {
     19  lua_pushstring(L,item);
     20  lua_pushnumber(L,value_int);
     21  lua_settable(L,-3);
     22 }
     23 
     24 static void add_flag(lua_State *L, bool value, const char *value_str) {
     25  char buffer[32] = { 0 };
     26  snprintf(buffer,sizeof(buffer), "flags.%s",value_str);
     27  lua_pushstring(L,buffer);
     28 // printf("%s=%d\n",value_str,value);
     29 
     30  if (value == true) {
     31   lua_pushstring(L,"yes");
     32  } else {
     33   lua_pushstring(L,"no");
     34  }
     35 
     36  lua_settable(L,-3);
     37 }
     38 
     39 static int cpu_getflags(lua_State *L)
     40 {
     41   s_cpu lua_cpu;
     42 
     43   detect_cpu(&lua_cpu);
     44 
     45   lua_newtable(L);
     46 
     47   add_string_item(L, "vendor", lua_cpu.vendor);
     48   add_string_item(L, "model", lua_cpu.model);
     49   add_int_item(L, "cores", lua_cpu.num_cores);
     50   add_int_item(L, "l1_instruction_cache", lua_cpu.l1_instruction_cache_size);
     51   add_int_item(L, "l1_data_cache", lua_cpu.l1_data_cache_size);
     52   add_int_item(L, "l2_cache", lua_cpu.l2_cache_size);
     53   add_int_item(L, "family_id", lua_cpu.family);
     54   add_int_item(L, "model_id", lua_cpu.model_id);
     55   add_int_item(L, "stepping", lua_cpu.stepping);
     56 
     57   add_flag(L, lua_cpu.flags.fpu, "fpu");
     58   add_flag(L, lua_cpu.flags.vme, "vme");
     59   add_flag(L, lua_cpu.flags.de, "de");
     60   add_flag(L, lua_cpu.flags.pse, "pse");
     61   add_flag(L, lua_cpu.flags.tsc, "tsc");
     62   add_flag(L, lua_cpu.flags.msr, "msr");
     63   add_flag(L, lua_cpu.flags.pae, "pae");
     64   add_flag(L, lua_cpu.flags.mce, "mce");
     65   add_flag(L, lua_cpu.flags.cx8, "cx8");
     66   add_flag(L, lua_cpu.flags.apic, "apic");
     67   add_flag(L, lua_cpu.flags.sep, "sep");
     68   add_flag(L, lua_cpu.flags.mtrr, "mtrr");
     69   add_flag(L, lua_cpu.flags.pge, "pge");
     70   add_flag(L, lua_cpu.flags.mca, "mca");
     71   add_flag(L, lua_cpu.flags.cmov, "cmov");
     72   add_flag(L, lua_cpu.flags.pat, "pat");
     73   add_flag(L, lua_cpu.flags.pse_36, "pse_36");
     74   add_flag(L, lua_cpu.flags.psn, "psn");
     75   add_flag(L, lua_cpu.flags.clflsh, "clflsh");
     76   add_flag(L, lua_cpu.flags.dts, "dts");
     77   add_flag(L, lua_cpu.flags.acpi, "acpi");
     78   add_flag(L, lua_cpu.flags.mmx, "mmx");
     79   add_flag(L, lua_cpu.flags.sse, "sse");
     80   add_flag(L, lua_cpu.flags.sse2, "sse2");
     81   add_flag(L, lua_cpu.flags.ss, "ss");
     82   add_flag(L, lua_cpu.flags.htt, "ht");
     83   add_flag(L, lua_cpu.flags.acc, "acc");
     84   add_flag(L, lua_cpu.flags.syscall, "syscall");
     85   add_flag(L, lua_cpu.flags.mp, "mp");
     86   add_flag(L, lua_cpu.flags.nx, "nx");
     87   add_flag(L, lua_cpu.flags.mmxext, "mmxext");
     88   add_flag(L, lua_cpu.flags.lm, "lm");
     89   add_flag(L, lua_cpu.flags.nowext, "3dnowext");
     90   add_flag(L, lua_cpu.flags.now, "3dnow!");
     91   add_flag(L, lua_cpu.flags.svm, "svm");
     92   add_flag(L, lua_cpu.flags.vmx, "vmx");
     93   add_flag(L, lua_cpu.flags.pbe, "pbe");
     94   add_flag(L, lua_cpu.flags.fxsr_opt, "fxsr_opt");
     95   add_flag(L, lua_cpu.flags.gbpages, "gbpages");
     96   add_flag(L, lua_cpu.flags.rdtscp, "rdtscp");
     97   add_flag(L, lua_cpu.flags.pni, "pni");
     98   add_flag(L, lua_cpu.flags.pclmulqd, "pclmulqd");
     99   add_flag(L, lua_cpu.flags.dtes64, "dtes64");
    100   add_flag(L, lua_cpu.flags.smx, "smx");
    101   add_flag(L, lua_cpu.flags.est, "est");
    102   add_flag(L, lua_cpu.flags.tm2, "tm2");
    103   add_flag(L, lua_cpu.flags.sse3, "sse3");
    104   add_flag(L, lua_cpu.flags.fma, "fma");
    105   add_flag(L, lua_cpu.flags.cx16, "cx16");
    106   add_flag(L, lua_cpu.flags.xtpr, "xtpr");
    107   add_flag(L, lua_cpu.flags.pdcm, "pdcm");
    108   add_flag(L, lua_cpu.flags.dca, "dca");
    109   add_flag(L, lua_cpu.flags.xmm4_1, "xmm4_1");
    110   add_flag(L, lua_cpu.flags.xmm4_2, "xmm4_2");
    111   add_flag(L, lua_cpu.flags.x2apic, "x2apic");
    112   add_flag(L, lua_cpu.flags.movbe, "movbe");
    113   add_flag(L, lua_cpu.flags.popcnt, "popcnt");
    114   add_flag(L, lua_cpu.flags.aes, "aes");
    115   add_flag(L, lua_cpu.flags.xsave, "xsave");
    116   add_flag(L, lua_cpu.flags.osxsave, "osxsave");
    117   add_flag(L, lua_cpu.flags.avx, "avx");
    118   add_flag(L, lua_cpu.flags.hypervisor, "hypervisor");
    119   add_flag(L, lua_cpu.flags.ace2, "ace2");
    120   add_flag(L, lua_cpu.flags.ace2_en, "ace2_en");
    121   add_flag(L, lua_cpu.flags.phe, "phe");
    122   add_flag(L, lua_cpu.flags.phe_en, "phe_en");
    123   add_flag(L, lua_cpu.flags.pmm, "pmm");
    124   add_flag(L, lua_cpu.flags.pmm_en, "pmm_en");
    125   add_flag(L, lua_cpu.flags.extapic, "extapic");
    126   add_flag(L, lua_cpu.flags.cr8_legacy, "cr8_legacy");
    127   add_flag(L, lua_cpu.flags.abm, "abm");
    128   add_flag(L, lua_cpu.flags.sse4a, "sse4a");
    129   add_flag(L, lua_cpu.flags.misalignsse, "misalignsse");
    130   add_flag(L, lua_cpu.flags.nowprefetch, "3dnowprefetch");
    131   add_flag(L, lua_cpu.flags.osvw, "osvw");
    132   add_flag(L, lua_cpu.flags.ibs, "ibs");
    133   add_flag(L, lua_cpu.flags.sse5, "sse5");
    134   add_flag(L, lua_cpu.flags.skinit, "skinit");
    135   add_flag(L, lua_cpu.flags.wdt, "wdt");
    136   add_flag(L, lua_cpu.flags.ida, "ida");
    137   add_flag(L, lua_cpu.flags.arat, "arat");
    138   add_flag(L, lua_cpu.flags.tpr_shadow, "tpr_shadow");
    139   add_flag(L, lua_cpu.flags.vnmi, "vnmi");
    140   add_flag(L, lua_cpu.flags.flexpriority, "flexpriority");
    141   add_flag(L, lua_cpu.flags.ept, "ept");
    142   add_flag(L, lua_cpu.flags.vpid, "vpid");
    143 
    144   /* return number of return values on stack */
    145   return 1;
    146 }
    147 
    148 static const luaL_Reg cpulib[] = {
    149   {"flags", cpu_getflags},
    150   {NULL, NULL}
    151 };
    152 
    153 
    154 LUALIB_API int luaopen_cpu(lua_State *L) {
    155   luaL_newlib(L, cpulib);
    156   return 1;
    157 }
    158 
    159