| #include <stdlib.h> |
| #include <string.h> |
| |
| #define llua_cpu /* Define the library */ |
| |
| /* Include the Lua API header files */ |
| #include"lua.h" |
| #include"lauxlib.h" |
| #include"lualib.h" |
| #include"cpuid.h" |
| |
| static void add_string_item(lua_State *L, const char *item, const char *value_str) { |
| lua_pushstring(L,item); |
| lua_pushstring(L,value_str); |
| lua_settable(L,-3); |
| } |
| |
| static void add_int_item(lua_State *L, const char *item, int value_int) { |
| lua_pushstring(L,item); |
| lua_pushnumber(L,value_int); |
| lua_settable(L,-3); |
| } |
| |
| static void add_flag(lua_State *L, bool value, const char *value_str) { |
| char buffer[32] = { 0 }; |
| snprintf(buffer,sizeof(buffer), "flags.%s",value_str); |
| lua_pushstring(L,buffer); |
| // printf("%s=%d\n",value_str,value); |
| |
| if (value == true) { |
| lua_pushstring(L,"yes"); |
| } else { |
| lua_pushstring(L,"no"); |
| } |
| |
| lua_settable(L,-3); |
| } |
| |
| static int cpu_getflags(lua_State *L) |
| { |
| s_cpu lua_cpu; |
| |
| detect_cpu(&lua_cpu); |
| |
| lua_newtable(L); |
| |
| add_string_item(L, "vendor", lua_cpu.vendor); |
| add_string_item(L, "model", lua_cpu.model); |
| add_int_item(L, "cores", lua_cpu.num_cores); |
| add_int_item(L, "l1_instruction_cache", lua_cpu.l1_instruction_cache_size); |
| add_int_item(L, "l1_data_cache", lua_cpu.l1_data_cache_size); |
| add_int_item(L, "l2_cache", lua_cpu.l2_cache_size); |
| add_int_item(L, "family_id", lua_cpu.family); |
| add_int_item(L, "model_id", lua_cpu.model_id); |
| add_int_item(L, "stepping", lua_cpu.stepping); |
| |
| add_flag(L, lua_cpu.flags.fpu, "fpu"); |
| add_flag(L, lua_cpu.flags.vme, "vme"); |
| add_flag(L, lua_cpu.flags.de, "de"); |
| add_flag(L, lua_cpu.flags.pse, "pse"); |
| add_flag(L, lua_cpu.flags.tsc, "tsc"); |
| add_flag(L, lua_cpu.flags.msr, "msr"); |
| add_flag(L, lua_cpu.flags.pae, "pae"); |
| add_flag(L, lua_cpu.flags.mce, "mce"); |
| add_flag(L, lua_cpu.flags.cx8, "cx8"); |
| add_flag(L, lua_cpu.flags.apic, "apic"); |
| add_flag(L, lua_cpu.flags.sep, "sep"); |
| add_flag(L, lua_cpu.flags.mtrr, "mtrr"); |
| add_flag(L, lua_cpu.flags.pge, "pge"); |
| add_flag(L, lua_cpu.flags.mca, "mca"); |
| add_flag(L, lua_cpu.flags.cmov, "cmov"); |
| add_flag(L, lua_cpu.flags.pat, "pat"); |
| add_flag(L, lua_cpu.flags.pse_36, "pse_36"); |
| add_flag(L, lua_cpu.flags.psn, "psn"); |
| add_flag(L, lua_cpu.flags.clflsh, "clflsh"); |
| add_flag(L, lua_cpu.flags.dts, "dts"); |
| add_flag(L, lua_cpu.flags.acpi, "acpi"); |
| add_flag(L, lua_cpu.flags.mmx, "mmx"); |
| add_flag(L, lua_cpu.flags.sse, "sse"); |
| add_flag(L, lua_cpu.flags.sse2, "sse2"); |
| add_flag(L, lua_cpu.flags.ss, "ss"); |
| add_flag(L, lua_cpu.flags.htt, "ht"); |
| add_flag(L, lua_cpu.flags.acc, "acc"); |
| add_flag(L, lua_cpu.flags.syscall, "syscall"); |
| add_flag(L, lua_cpu.flags.mp, "mp"); |
| add_flag(L, lua_cpu.flags.nx, "nx"); |
| add_flag(L, lua_cpu.flags.mmxext, "mmxext"); |
| add_flag(L, lua_cpu.flags.lm, "lm"); |
| add_flag(L, lua_cpu.flags.nowext, "3dnowext"); |
| add_flag(L, lua_cpu.flags.now, "3dnow!"); |
| add_flag(L, lua_cpu.flags.svm, "svm"); |
| add_flag(L, lua_cpu.flags.vmx, "vmx"); |
| add_flag(L, lua_cpu.flags.pbe, "pbe"); |
| add_flag(L, lua_cpu.flags.fxsr_opt, "fxsr_opt"); |
| add_flag(L, lua_cpu.flags.gbpages, "gbpages"); |
| add_flag(L, lua_cpu.flags.rdtscp, "rdtscp"); |
| add_flag(L, lua_cpu.flags.pni, "pni"); |
| add_flag(L, lua_cpu.flags.pclmulqd, "pclmulqd"); |
| add_flag(L, lua_cpu.flags.dtes64, "dtes64"); |
| add_flag(L, lua_cpu.flags.smx, "smx"); |
| add_flag(L, lua_cpu.flags.est, "est"); |
| add_flag(L, lua_cpu.flags.tm2, "tm2"); |
| add_flag(L, lua_cpu.flags.sse3, "sse3"); |
| add_flag(L, lua_cpu.flags.fma, "fma"); |
| add_flag(L, lua_cpu.flags.cx16, "cx16"); |
| add_flag(L, lua_cpu.flags.xtpr, "xtpr"); |
| add_flag(L, lua_cpu.flags.pdcm, "pdcm"); |
| add_flag(L, lua_cpu.flags.dca, "dca"); |
| add_flag(L, lua_cpu.flags.xmm4_1, "xmm4_1"); |
| add_flag(L, lua_cpu.flags.xmm4_2, "xmm4_2"); |
| add_flag(L, lua_cpu.flags.x2apic, "x2apic"); |
| add_flag(L, lua_cpu.flags.movbe, "movbe"); |
| add_flag(L, lua_cpu.flags.popcnt, "popcnt"); |
| add_flag(L, lua_cpu.flags.aes, "aes"); |
| add_flag(L, lua_cpu.flags.xsave, "xsave"); |
| add_flag(L, lua_cpu.flags.osxsave, "osxsave"); |
| add_flag(L, lua_cpu.flags.avx, "avx"); |
| add_flag(L, lua_cpu.flags.hypervisor, "hypervisor"); |
| add_flag(L, lua_cpu.flags.ace2, "ace2"); |
| add_flag(L, lua_cpu.flags.ace2_en, "ace2_en"); |
| add_flag(L, lua_cpu.flags.phe, "phe"); |
| add_flag(L, lua_cpu.flags.phe_en, "phe_en"); |
| add_flag(L, lua_cpu.flags.pmm, "pmm"); |
| add_flag(L, lua_cpu.flags.pmm_en, "pmm_en"); |
| add_flag(L, lua_cpu.flags.extapic, "extapic"); |
| add_flag(L, lua_cpu.flags.cr8_legacy, "cr8_legacy"); |
| add_flag(L, lua_cpu.flags.abm, "abm"); |
| add_flag(L, lua_cpu.flags.sse4a, "sse4a"); |
| add_flag(L, lua_cpu.flags.misalignsse, "misalignsse"); |
| add_flag(L, lua_cpu.flags.nowprefetch, "3dnowprefetch"); |
| add_flag(L, lua_cpu.flags.osvw, "osvw"); |
| add_flag(L, lua_cpu.flags.ibs, "ibs"); |
| add_flag(L, lua_cpu.flags.sse5, "sse5"); |
| add_flag(L, lua_cpu.flags.skinit, "skinit"); |
| add_flag(L, lua_cpu.flags.wdt, "wdt"); |
| add_flag(L, lua_cpu.flags.ida, "ida"); |
| add_flag(L, lua_cpu.flags.arat, "arat"); |
| add_flag(L, lua_cpu.flags.tpr_shadow, "tpr_shadow"); |
| add_flag(L, lua_cpu.flags.vnmi, "vnmi"); |
| add_flag(L, lua_cpu.flags.flexpriority, "flexpriority"); |
| add_flag(L, lua_cpu.flags.ept, "ept"); |
| add_flag(L, lua_cpu.flags.vpid, "vpid"); |
| |
| /* return number of return values on stack */ |
| return 1; |
| } |
| |
| static const luaL_Reg cpulib[] = { |
| {"flags", cpu_getflags}, |
| {NULL, NULL} |
| }; |
| |
| |
| LUALIB_API int luaopen_cpu(lua_State *L) { |
| luaL_newlib(L, cpulib); |
| return 1; |
| } |
| |