4 #define ldmilib_c /* Define the library */
6 /* Include the Lua API header files */
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
);
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
);
24 typedef int (*table_fn
)(lua_State
*, s_dmi
*);
26 /* Add a Lua_String entry to the table on stack
27 xxx_P is the poiter version (i.e., pBase is a pointer)
28 xxx_S is the staic version (i.e., Base is the struct)
30 #define LUA_ADD_STR_P(pLua_state, pBase, Field) \
31 add_string_item(pLua_state, #Field, pBase->Field);
32 #define LUA_ADD_STR_S(pLua_state, Base, Field) \
33 add_string_item(pLua_state, #Field, Base.Field);
35 /* Add a Lua_Number entry to the table on stack
36 xxx_P is the poiter version (i.e., pBase is a pointer)
37 xxx_S is the staic version (i.e., Base is the struct)
39 #define LUA_ADD_NUM_P(pLua_state, pBase, Field) \
40 add_int_item(pLua_state, #Field, pBase->Field);
41 #define LUA_ADD_NUM_S(pLua_state, Base, Field) \
42 add_int_item(pLua_state, #Field, Base.Field);
44 /* Add a sub-DMI table to the table on stack
45 All (*table_fn)() have to be named as get_<tabel_name>_table() for this
46 macro to work. For example, for the bios subtable, the table_fn is
47 get_bios_table() and the subtable name is "bios".
48 All (*table_fn)() have to return 1 if a subtable is created on the stack
49 or 0 if the subtable is not created (no corresponding dim subtable found).
51 #define LUA_ADD_TABLE(pLua_state, pDmi, tb_name) \
52 add_dmi_sub_table(pLua_state, pDmi, #tb_name, get_ ## tb_name ## _table);
55 static void add_dmi_sub_table(lua_State
*L
, s_dmi
*dmi_ptr
, char *table_name
,
56 table_fn get_table_fn
)
58 if (get_table_fn(L
, dmi_ptr
)) { /* only adding it when it is there */
59 lua_pushstring(L
, table_name
);
66 void get_bool_table(lua_State
*L
, const char *str_table
[], int n_elem
,
70 for (i
= 0; i
< n_elem
; i
++) {
71 if (!str_table
[i
] || !*str_table
[i
]) /* aviod NULL/empty string */
74 lua_pushstring(L
, str_table
[i
]);
75 lua_pushboolean(L
, bool_table
[i
]);
82 ** {======================================================
84 ** =======================================================
86 static int get_bios_table(lua_State
*L
, s_dmi
*dmi_ptr
)
88 s_bios
*bios
= &dmi_ptr
->bios
;
94 LUA_ADD_STR_P(L
, bios
, vendor
)
95 LUA_ADD_STR_P(L
, bios
, version
)
96 LUA_ADD_STR_P(L
, bios
, release_date
)
97 LUA_ADD_STR_P(L
, bios
, bios_revision
)
98 LUA_ADD_STR_P(L
, bios
, firmware_revision
)
99 LUA_ADD_NUM_P(L
, bios
, address
)
100 LUA_ADD_NUM_P(L
, bios
, runtime_size
)
101 LUA_ADD_STR_P(L
, bios
, runtime_size_unit
)
102 LUA_ADD_NUM_P(L
, bios
, rom_size
)
103 LUA_ADD_STR_P(L
, bios
, rom_size_unit
)
105 /* bios characteristics */
106 lua_pushstring(L
, "chars");
108 get_bool_table(L
, bios_charac_strings
,
109 sizeof(s_characteristics
)/sizeof(bool),
110 (bool *)(&bios
->characteristics
));
111 get_bool_table(L
, bios_charac_x1_strings
,
112 sizeof(s_characteristics_x1
)/sizeof(bool),
113 (bool *)(&bios
->characteristics_x1
));
114 get_bool_table(L
, bios_charac_x2_strings
,
115 sizeof(s_characteristics_x2
)/sizeof(bool),
116 (bool *)(&bios
->characteristics_x2
));
123 static int get_system_table(lua_State
*L
, s_dmi
*dmi_ptr
)
125 s_system
*system
= &dmi_ptr
->system
;
131 LUA_ADD_STR_P(L
, system
, manufacturer
)
132 LUA_ADD_STR_P(L
, system
, product_name
)
133 LUA_ADD_STR_P(L
, system
, version
)
134 LUA_ADD_STR_P(L
, system
, serial
)
135 LUA_ADD_STR_P(L
, system
, uuid
)
136 LUA_ADD_STR_P(L
, system
, wakeup_type
)
137 LUA_ADD_STR_P(L
, system
, sku_number
)
138 LUA_ADD_STR_P(L
, system
, family
)
139 LUA_ADD_STR_P(L
, system
, system_boot_status
)
140 LUA_ADD_STR_P(L
, system
, configuration_options
)
143 if (system
->system_reset
.filled
) {
144 lua_pushstring(L
, "reset");
146 LUA_ADD_NUM_S(L
, system
->system_reset
, status
)
147 LUA_ADD_NUM_S(L
, system
->system_reset
, watchdog
)
148 LUA_ADD_STR_S(L
, system
->system_reset
, boot_option
)
149 LUA_ADD_STR_S(L
, system
->system_reset
, boot_option_on_limit
)
150 LUA_ADD_STR_S(L
, system
->system_reset
, reset_count
)
151 LUA_ADD_STR_S(L
, system
->system_reset
, reset_limit
)
152 LUA_ADD_STR_S(L
, system
->system_reset
, timer_interval
)
153 LUA_ADD_STR_S(L
, system
->system_reset
, timeout
)
161 static int get_base_board_table(lua_State
*L
, s_dmi
*dmi_ptr
)
163 s_base_board
*base_board
= &dmi_ptr
->base_board
;
164 int n_dev
= sizeof(base_board
->devices_information
) /
165 sizeof(base_board
->devices_information
[0]);
168 if (!base_board
->filled
)
172 LUA_ADD_STR_P(L
, base_board
, manufacturer
)
173 LUA_ADD_STR_P(L
, base_board
, product_name
)
174 LUA_ADD_STR_P(L
, base_board
, version
)
175 LUA_ADD_STR_P(L
, base_board
, serial
)
176 LUA_ADD_STR_P(L
, base_board
, asset_tag
)
177 LUA_ADD_STR_P(L
, base_board
, location
)
178 LUA_ADD_STR_P(L
, base_board
, type
)
180 /* base board features */
181 lua_pushstring(L
, "features");
183 get_bool_table(L
, base_board_features_strings
,
184 sizeof(s_base_board_features
)/sizeof(bool),
185 (bool *)(&base_board
->features
));
188 /* on-board devices */
189 for (has_dev
= 0, i
= 0; i
< n_dev
; i
++)
190 if (*base_board
->devices_information
[i
].type
)
194 lua_pushstring(L
, "devices");
196 for (i
= 0, j
= 1; i
< n_dev
; i
++) {
197 if (!*base_board
->devices_information
[i
].type
) /* empty device */
200 lua_pushinteger(L
, j
++);
202 LUA_ADD_STR_S(L
, base_board
->devices_information
[i
], type
)
203 LUA_ADD_STR_S(L
, base_board
->devices_information
[i
], description
)
204 LUA_ADD_NUM_S(L
, base_board
->devices_information
[i
], status
)
214 static int get_chassis_table(lua_State
*L
, s_dmi
*dmi_ptr
)
216 s_chassis
*chassis
= &dmi_ptr
->chassis
;
218 if (!chassis
->filled
)
222 LUA_ADD_STR_P(L
, chassis
, manufacturer
)
223 LUA_ADD_STR_P(L
, chassis
, type
)
224 LUA_ADD_STR_P(L
, chassis
, lock
)
225 LUA_ADD_STR_P(L
, chassis
, version
)
226 LUA_ADD_STR_P(L
, chassis
, serial
)
227 LUA_ADD_STR_P(L
, chassis
, asset_tag
)
228 LUA_ADD_STR_P(L
, chassis
, boot_up_state
)
229 LUA_ADD_STR_P(L
, chassis
, power_supply_state
)
230 LUA_ADD_STR_P(L
, chassis
, thermal_state
)
231 LUA_ADD_STR_P(L
, chassis
, security_status
)
232 LUA_ADD_STR_P(L
, chassis
, oem_information
)
233 LUA_ADD_NUM_P(L
, chassis
, height
)
234 LUA_ADD_NUM_P(L
, chassis
, nb_power_cords
)
240 static int get_processor_table(lua_State
*L
, s_dmi
*dmi_ptr
)
242 s_processor
*processor
= &dmi_ptr
->processor
;
243 s_signature
*signature
= &processor
->signature
;
245 if (!processor
->filled
)
249 LUA_ADD_STR_P(L
, processor
, socket_designation
)
250 LUA_ADD_STR_P(L
, processor
, type
)
251 LUA_ADD_STR_P(L
, processor
, family
)
252 LUA_ADD_STR_P(L
, processor
, manufacturer
)
253 LUA_ADD_STR_P(L
, processor
, version
)
254 LUA_ADD_NUM_P(L
, processor
, external_clock
)
255 LUA_ADD_NUM_P(L
, processor
, max_speed
)
256 LUA_ADD_NUM_P(L
, processor
, current_speed
)
257 LUA_ADD_NUM_P(L
, processor
, voltage_mv
)
258 LUA_ADD_STR_P(L
, processor
, status
)
259 LUA_ADD_STR_P(L
, processor
, upgrade
)
260 LUA_ADD_STR_P(L
, processor
, cache1
)
261 LUA_ADD_STR_P(L
, processor
, cache2
)
262 LUA_ADD_STR_P(L
, processor
, cache3
)
263 LUA_ADD_STR_P(L
, processor
, serial
)
264 LUA_ADD_STR_P(L
, processor
, part_number
)
265 LUA_ADD_STR_P(L
, processor
, id
)
266 LUA_ADD_NUM_P(L
, processor
, core_count
)
267 LUA_ADD_NUM_P(L
, processor
, core_enabled
)
268 LUA_ADD_NUM_P(L
, processor
, thread_count
)
270 /* processor signature */
271 lua_pushstring(L
, "signature");
273 LUA_ADD_NUM_P(L
, signature
, type
)
274 LUA_ADD_NUM_P(L
, signature
, family
)
275 LUA_ADD_NUM_P(L
, signature
, model
)
276 LUA_ADD_NUM_P(L
, signature
, stepping
)
277 LUA_ADD_NUM_P(L
, signature
, minor_stepping
)
280 /* processor flags */
281 lua_pushstring(L
, "flags");
283 get_bool_table(L
, cpu_flags_strings
,
284 sizeof(s_dmi_cpu_flags
)/sizeof(bool),
285 (bool *)(&processor
->cpu_flags
));
292 static int get_battery_table(lua_State
*L
, s_dmi
*dmi_ptr
)
294 s_battery
*battery
= &dmi_ptr
->battery
;
296 if (!battery
->filled
)
300 LUA_ADD_STR_P(L
, battery
, location
)
301 LUA_ADD_STR_P(L
, battery
, manufacturer
)
302 LUA_ADD_STR_P(L
, battery
, manufacture_date
)
303 LUA_ADD_STR_P(L
, battery
, serial
)
304 LUA_ADD_STR_P(L
, battery
, name
)
305 LUA_ADD_STR_P(L
, battery
, chemistry
)
306 LUA_ADD_STR_P(L
, battery
, design_capacity
)
307 LUA_ADD_STR_P(L
, battery
, design_voltage
)
308 LUA_ADD_STR_P(L
, battery
, sbds
)
309 LUA_ADD_STR_P(L
, battery
, sbds_serial
)
310 LUA_ADD_STR_P(L
, battery
, maximum_error
)
311 LUA_ADD_STR_P(L
, battery
, sbds_manufacture_date
)
312 LUA_ADD_STR_P(L
, battery
, sbds_chemistry
)
313 LUA_ADD_STR_P(L
, battery
, oem_info
)
319 static int get_memory_table(lua_State
*L
, s_dmi
*dmi_ptr
)
321 s_memory
*memory
= dmi_ptr
->memory
;
322 int i
, j
, n_mem
= dmi_ptr
->memory_count
;
324 if (n_mem
<= 0) /* no memory info */
329 for (j
= 1, i
= 0; i
< n_mem
; i
++) {
330 if (!memory
[i
].filled
)
333 lua_pushinteger(L
, j
++);
335 LUA_ADD_STR_S(L
, memory
[i
], manufacturer
)
336 LUA_ADD_STR_S(L
, memory
[i
], error
)
337 LUA_ADD_STR_S(L
, memory
[i
], total_width
)
338 LUA_ADD_STR_S(L
, memory
[i
], data_width
)
339 LUA_ADD_STR_S(L
, memory
[i
], size
)
340 LUA_ADD_STR_S(L
, memory
[i
], form_factor
)
341 LUA_ADD_STR_S(L
, memory
[i
], device_set
)
342 LUA_ADD_STR_S(L
, memory
[i
], device_locator
)
343 LUA_ADD_STR_S(L
, memory
[i
], bank_locator
)
344 LUA_ADD_STR_S(L
, memory
[i
], type
)
345 LUA_ADD_STR_S(L
, memory
[i
], type_detail
)
346 LUA_ADD_STR_S(L
, memory
[i
], speed
)
347 LUA_ADD_STR_S(L
, memory
[i
], serial
)
348 LUA_ADD_STR_S(L
, memory
[i
], asset_tag
)
349 LUA_ADD_STR_S(L
, memory
[i
], part_number
)
356 static int get_memory_module_table(lua_State
*L
, s_dmi
*dmi_ptr
)
358 s_memory_module
*memory_module
= dmi_ptr
->memory_module
;
359 int i
, j
, n_mem
= dmi_ptr
->memory_module_count
;
361 if (n_mem
<= 0) /* no memory module info */
366 for (j
= 1, i
= 0; i
< n_mem
; i
++) {
367 if (!memory_module
[i
].filled
)
370 lua_pushinteger(L
, j
++);
372 LUA_ADD_STR_S(L
, memory_module
[i
], socket_designation
)
373 LUA_ADD_STR_S(L
, memory_module
[i
], bank_connections
)
374 LUA_ADD_STR_S(L
, memory_module
[i
], speed
)
375 LUA_ADD_STR_S(L
, memory_module
[i
], type
)
376 LUA_ADD_STR_S(L
, memory_module
[i
], installed_size
)
377 LUA_ADD_STR_S(L
, memory_module
[i
], enabled_size
)
378 LUA_ADD_STR_S(L
, memory_module
[i
], error_status
)
385 static int get_cache_table(lua_State
*L
, s_dmi
*dmi_ptr
)
387 s_cache
*cache
= dmi_ptr
->cache
;
388 int i
, n_cache
= dmi_ptr
->cache_count
;
390 if (n_cache
<= 0) /* no cache info */
395 for (i
= 0; i
< n_cache
; i
++) {
396 lua_pushinteger(L
, i
+ 1);
398 LUA_ADD_STR_S(L
, cache
[i
], socket_designation
)
399 LUA_ADD_STR_S(L
, cache
[i
], configuration
)
400 LUA_ADD_STR_S(L
, cache
[i
], mode
)
401 LUA_ADD_STR_S(L
, cache
[i
], location
)
402 LUA_ADD_NUM_S(L
, cache
[i
], installed_size
)
403 LUA_ADD_NUM_S(L
, cache
[i
], max_size
)
404 LUA_ADD_STR_S(L
, cache
[i
], supported_sram_types
)
405 LUA_ADD_STR_S(L
, cache
[i
], installed_sram_types
)
406 LUA_ADD_NUM_S(L
, cache
[i
], speed
)
407 LUA_ADD_STR_S(L
, cache
[i
], error_correction_type
)
408 LUA_ADD_STR_S(L
, cache
[i
], system_type
)
409 LUA_ADD_STR_S(L
, cache
[i
], associativity
)
416 static int get_hardware_security_table(lua_State
*L
, s_dmi
*dmi_ptr
)
418 if (!dmi_ptr
->hardware_security
.filled
)
420 /* hardware_security */
422 LUA_ADD_STR_S(L
, dmi_ptr
->hardware_security
, power_on_passwd_status
)
423 LUA_ADD_STR_S(L
, dmi_ptr
->hardware_security
, keyboard_passwd_status
)
424 LUA_ADD_STR_S(L
, dmi_ptr
->hardware_security
, administrator_passwd_status
)
425 LUA_ADD_STR_S(L
, dmi_ptr
->hardware_security
, front_panel_reset_status
)
431 static int get_dmi_info_table(lua_State
*L
, s_dmi
*dmi_ptr
)
433 dmi_table
*dmitable
= &dmi_ptr
->dmitable
;
437 LUA_ADD_NUM_P(L
, dmitable
, num
)
438 LUA_ADD_NUM_P(L
, dmitable
, len
)
439 LUA_ADD_NUM_P(L
, dmitable
, ver
)
440 LUA_ADD_NUM_P(L
, dmitable
, base
)
441 LUA_ADD_NUM_P(L
, dmitable
, major_version
)
442 LUA_ADD_NUM_P(L
, dmitable
, minor_version
)
448 static int get_ipmi_table(lua_State
*L
, s_dmi
*dmi_ptr
)
450 s_ipmi
*ipmi
= &dmi_ptr
->ipmi
;
456 LUA_ADD_STR_P(L
, ipmi
, interface_type
)
457 LUA_ADD_NUM_P(L
, ipmi
, major_specification_version
)
458 LUA_ADD_NUM_P(L
, ipmi
, minor_specification_version
)
459 LUA_ADD_NUM_P(L
, ipmi
, I2C_slave_address
)
460 LUA_ADD_NUM_P(L
, ipmi
, nv_address
)
461 LUA_ADD_NUM_P(L
, ipmi
, base_address
)
462 LUA_ADD_NUM_P(L
, ipmi
, irq
)
467 ** {======================================================
468 ** End of DMI subtables
469 ** =======================================================
473 static int dmi_gettable(lua_State
*L
)
479 if ( ! dmi_iterate(&dmi
) ) {
480 printf("No DMI Structure found\n");
484 parse_dmitable(&dmi
);
486 LUA_ADD_NUM_S(L
, dmi
, memory_module_count
)
487 LUA_ADD_NUM_S(L
, dmi
, memory_count
)
488 LUA_ADD_NUM_S(L
, dmi
, cache_count
)
489 LUA_ADD_STR_S(L
, dmi
, oem_strings
)
491 LUA_ADD_TABLE(L
, &dmi
, bios
)
492 LUA_ADD_TABLE(L
, &dmi
, system
)
493 LUA_ADD_TABLE(L
, &dmi
, base_board
)
494 LUA_ADD_TABLE(L
, &dmi
, chassis
)
495 LUA_ADD_TABLE(L
, &dmi
, processor
)
496 LUA_ADD_TABLE(L
, &dmi
, battery
)
497 LUA_ADD_TABLE(L
, &dmi
, memory
)
498 LUA_ADD_TABLE(L
, &dmi
, memory_module
)
499 LUA_ADD_TABLE(L
, &dmi
, cache
)
500 LUA_ADD_TABLE(L
, &dmi
, ipmi
)
501 LUA_ADD_TABLE(L
, &dmi
, hardware_security
)
502 LUA_ADD_TABLE(L
, &dmi
, dmi_info
)
504 /* set global variable: lua_setglobal(L, "dmitable"); */
506 /* return number of return values on stack */
511 static int dmi_supported(lua_State
*L
)
515 if ( dmi_iterate(&dmi
) ) {
516 lua_pushboolean(L
, 1);
518 lua_pushboolean(L
, 0);
524 static const luaL_Reg dmilib
[] = {
525 {"gettable", dmi_gettable
},
526 {"supported", dmi_supported
},
531 LUALIB_API
int luaopen_dmi (lua_State
*L
) {
532 luaL_newlib(L
, dmilib
);