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