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 | |
---|