1 /* ----------------------------------------------------------------------- *
2 *
3 * Copyright 2009 Erwan Velu - All Rights Reserved
4 *
5 * Permission is hereby granted, free of charge, to any person
6 * obtaining a copy of this software and associated documentation
7 * files (the "Software"), to deal in the Software without
8 * restriction, including without limitation the rights to use,
9 * copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom
11 * the Software is furnished to do so, subject to the following
12 * conditions:
13 *
14 * The above copyright notice and this permission notice shall
15 * be included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 * OTHER DEALINGS IN THE SOFTWARE.
25 *
26 * -----------------------------------------------------------------------
27 */
28
29 #include <stdio.h>
30 #include <string.h>
31 #include <stdlib.h>
32 #include <errno.h>
33
34 #include "hdt-cli.h"
35 #include "hdt-common.h"
36
show_dmi_modules(int argc __unused,char ** argv __unused,struct s_hardware * hardware)37 static void show_dmi_modules(int argc __unused, char **argv __unused,
38 struct s_hardware *hardware)
39 {
40 char available_dmi_commands[1024];
41 reset_more_printf();
42 memset(available_dmi_commands, 0, sizeof(available_dmi_commands));
43
44 more_printf("Available DMI modules on your system:\n");
45 if (hardware->dmi.base_board.filled == true)
46 more_printf("\t%s\n", CLI_DMI_BASE_BOARD);
47 if (hardware->dmi.battery.filled == true)
48 more_printf("\t%s\n", CLI_DMI_BATTERY);
49 if (hardware->dmi.bios.filled == true)
50 more_printf("\t%s\n", CLI_DMI_BIOS);
51 if (hardware->dmi.chassis.filled == true)
52 more_printf("\t%s\n", CLI_DMI_CHASSIS);
53 for (int i = 0; i < hardware->dmi.memory_count; i++) {
54 if (hardware->dmi.memory[i].filled == true) {
55 more_printf("\tbank <number>\n");
56 break;
57 }
58 }
59 for (int i = 0; i < hardware->dmi.memory_module_count; i++) {
60 if (hardware->dmi.memory_module[i].filled == true) {
61 more_printf("\tmodule <number>\n");
62 break;
63 }
64 }
65 if (hardware->dmi.processor.filled == true)
66 more_printf("\t%s\n", CLI_DMI_PROCESSOR);
67 if (hardware->dmi.system.filled == true)
68 more_printf("\t%s\n", CLI_DMI_SYSTEM);
69 if (hardware->dmi.ipmi.filled == true)
70 more_printf("\t%s\n", CLI_DMI_IPMI);
71 if (hardware->dmi.cache_count)
72 more_printf("\t%s\n", CLI_DMI_CACHE);
73 if (strlen(hardware->dmi.oem_strings))
74 more_printf("\t%s\n", CLI_DMI_OEM);
75 if (hardware->dmi.hardware_security.filled)
76 more_printf("\t%s\n", CLI_DMI_SECURITY);
77 }
78
show_dmi_base_board(int argc __unused,char ** argv __unused,struct s_hardware * hardware)79 static void show_dmi_base_board(int argc __unused, char **argv __unused,
80 struct s_hardware *hardware)
81 {
82 if (hardware->dmi.base_board.filled == false) {
83 more_printf("base_board information not found on your system, see "
84 "`show list' to see which module is available.\n");
85 return;
86 }
87 reset_more_printf();
88 more_printf("Base board\n");
89 more_printf(" Manufacturer : %s\n", hardware->dmi.base_board.manufacturer);
90 more_printf(" Product Name : %s\n", hardware->dmi.base_board.product_name);
91 more_printf(" Version : %s\n", hardware->dmi.base_board.version);
92 more_printf(" Serial : %s\n", hardware->dmi.base_board.serial);
93 more_printf(" Asset Tag : %s\n", hardware->dmi.base_board.asset_tag);
94 more_printf(" Location : %s\n", hardware->dmi.base_board.location);
95 more_printf(" Type : %s\n", hardware->dmi.base_board.type);
96 for (int i = 0; i < BASE_BOARD_NB_ELEMENTS; i++) {
97 if (((bool *) (&hardware->dmi.base_board.features))[i] == true) {
98 more_printf(" %s\n", base_board_features_strings[i]);
99 }
100 }
101
102 for (unsigned int i = 0;
103 i <
104 sizeof hardware->dmi.base_board.devices_information /
105 sizeof *hardware->dmi.base_board.devices_information; i++) {
106 if (strlen(hardware->dmi.base_board.devices_information[i].type)) {
107 more_printf("On Board Device #%u Information\n", i)
108 more_printf(" Type : %s\n",
109 hardware->dmi.base_board.devices_information[i].
110 type);
111 more_printf(" Status : %s\n",
112 hardware->dmi.base_board.devices_information[i].
113 status ? "Enabled" : "Disabled");
114 more_printf(" Description : %s\n",
115 hardware->dmi.base_board.devices_information[i].
116 description);
117 }
118 }
119 }
120
show_dmi_system(int argc __unused,char ** argv __unused,struct s_hardware * hardware)121 static void show_dmi_system(int argc __unused, char **argv __unused,
122 struct s_hardware *hardware)
123 {
124 if (hardware->dmi.system.filled == false) {
125 more_printf("system information not found on your system, see "
126 "`show list' to see which module is available.\n");
127 return;
128 }
129 reset_more_printf();
130 more_printf("System\n");
131 more_printf(" Manufacturer : %s\n", hardware->dmi.system.manufacturer);
132 more_printf(" Product Name : %s\n", hardware->dmi.system.product_name);
133 more_printf(" Version : %s\n", hardware->dmi.system.version);
134 more_printf(" Serial : %s\n", hardware->dmi.system.serial);
135 more_printf(" UUID : %s\n", hardware->dmi.system.uuid);
136 more_printf(" Wakeup Type : %s\n", hardware->dmi.system.wakeup_type);
137 more_printf(" SKU Number : %s\n", hardware->dmi.system.sku_number);
138 more_printf(" Family : %s\n", hardware->dmi.system.family);
139
140 if (strlen(hardware->dmi.system.configuration_options)) {
141 more_printf("System Configuration Options\n");
142 more_printf("%s\n", hardware->dmi.system.configuration_options);
143 }
144
145 if (hardware->dmi.system.system_reset.filled) {
146 more_printf("System Reset\n");
147 more_printf(" Status : %s\n",
148 (hardware->dmi.system.system_reset.
149 status ? "Enabled" : "Disabled"));
150 more_printf(" Watchdog Timer : %s\n",
151 (hardware->dmi.system.system_reset.
152 watchdog ? "Present" : "Not Present"));
153 if (strlen(hardware->dmi.system.system_reset.boot_option))
154 more_printf(" Boot Option : %s\n",
155 hardware->dmi.system.system_reset.boot_option);
156 if (strlen(hardware->dmi.system.system_reset.boot_option_on_limit))
157 more_printf(" Boot Option On Limit : %s\n",
158 hardware->dmi.system.system_reset.boot_option_on_limit);
159 if (strlen(hardware->dmi.system.system_reset.reset_count))
160 more_printf(" Reset Count : %s\n",
161 hardware->dmi.system.system_reset.reset_count);
162 if (strlen(hardware->dmi.system.system_reset.reset_limit))
163 more_printf(" Reset Limit : %s\n",
164 hardware->dmi.system.system_reset.reset_limit);
165 if (strlen(hardware->dmi.system.system_reset.timer_interval))
166 more_printf(" Timer Interval : %s\n",
167 hardware->dmi.system.system_reset.timer_interval);
168 if (strlen(hardware->dmi.system.system_reset.timeout))
169 more_printf(" Timeout : %s\n",
170 hardware->dmi.system.system_reset.timeout);
171 }
172
173 more_printf("System Boot Information\n");
174 more_printf(" Status : %s\n",
175 hardware->dmi.system.system_boot_status);
176 }
177
show_dmi_bios(int argc __unused,char ** argv __unused,struct s_hardware * hardware)178 static void show_dmi_bios(int argc __unused, char **argv __unused,
179 struct s_hardware *hardware)
180 {
181 if (hardware->dmi.bios.filled == false) {
182 more_printf("bios information not found on your system, see "
183 "`show list' to see which module is available.\n");
184 return;
185 }
186 reset_more_printf();
187 more_printf("BIOS\n");
188 more_printf(" Vendor : %s\n", hardware->dmi.bios.vendor);
189 more_printf(" Version : %s\n", hardware->dmi.bios.version);
190 more_printf(" Release Date : %s\n", hardware->dmi.bios.release_date);
191 more_printf(" Bios Revision : %s\n", hardware->dmi.bios.bios_revision);
192 if (strlen(hardware->dmi.bios.firmware_revision))
193 more_printf(" Firmware Revision : %s\n",
194 hardware->dmi.bios.firmware_revision);
195 more_printf(" Address : 0x%04X0\n", hardware->dmi.bios.address);
196 more_printf(" Runtime address : %u %s\n",
197 hardware->dmi.bios.runtime_size,
198 hardware->dmi.bios.runtime_size_unit);
199 more_printf(" Rom size : %u %s\n", hardware->dmi.bios.rom_size,
200 hardware->dmi.bios.rom_size_unit);
201
202 for (int i = 0; i < BIOS_CHAR_NB_ELEMENTS; i++) {
203 if (((bool *) (&hardware->dmi.bios.characteristics))[i] == true) {
204 more_printf(" %s\n", bios_charac_strings[i]);
205 }
206 }
207 for (int i = 0; i < BIOS_CHAR_X1_NB_ELEMENTS; i++) {
208 if (((bool *) (&hardware->dmi.bios.characteristics_x1))[i] == true) {
209 more_printf(" %s\n", bios_charac_x1_strings[i]);
210 }
211 }
212
213 for (int i = 0; i < BIOS_CHAR_X2_NB_ELEMENTS; i++) {
214 if (((bool *) (&hardware->dmi.bios.characteristics_x2))[i] == true) {
215 more_printf(" %s\n", bios_charac_x2_strings[i]);
216 }
217 }
218
219 }
220
show_dmi_chassis(int argc __unused,char ** argv __unused,struct s_hardware * hardware)221 static void show_dmi_chassis(int argc __unused, char **argv __unused,
222 struct s_hardware *hardware)
223 {
224 if (hardware->dmi.chassis.filled == false) {
225 more_printf("chassis information not found on your system, see "
226 "`show list' to see which module is available.\n");
227 return;
228 }
229 reset_more_printf();
230 more_printf("Chassis\n");
231 more_printf(" Manufacturer : %s\n",
232 hardware->dmi.chassis.manufacturer);
233 more_printf(" Type : %s\n", hardware->dmi.chassis.type);
234 more_printf(" Lock : %s\n", hardware->dmi.chassis.lock);
235 more_printf(" Version : %s\n", hardware->dmi.chassis.version);
236 more_printf(" Serial : %s\n", hardware->dmi.chassis.serial);
237 more_printf(" Asset Tag : %s\n",
238 del_multi_spaces(hardware->dmi.chassis.asset_tag));
239 more_printf(" Boot up state : %s\n",
240 hardware->dmi.chassis.boot_up_state);
241 more_printf(" Power supply state : %s\n",
242 hardware->dmi.chassis.power_supply_state);
243 more_printf(" Thermal state : %s\n",
244 hardware->dmi.chassis.thermal_state);
245 more_printf(" Security Status : %s\n",
246 hardware->dmi.chassis.security_status);
247 more_printf(" OEM Information : %s\n",
248 hardware->dmi.chassis.oem_information);
249 more_printf(" Height : %u\n", hardware->dmi.chassis.height);
250 more_printf(" NB Power Cords : %u\n",
251 hardware->dmi.chassis.nb_power_cords);
252 }
253
show_dmi_ipmi(int argc __unused,char ** argv __unused,struct s_hardware * hardware)254 static void show_dmi_ipmi(int argc __unused, char **argv __unused,
255 struct s_hardware *hardware)
256 {
257 if (hardware->dmi.ipmi.filled == false) {
258 more_printf("IPMI module not available\n");
259 return;
260 }
261 reset_more_printf();
262 more_printf("IPMI\n");
263 more_printf(" Interface Type : %s\n",
264 hardware->dmi.ipmi.interface_type);
265 more_printf(" Specification Ver. : %u.%u\n",
266 hardware->dmi.ipmi.major_specification_version,
267 hardware->dmi.ipmi.minor_specification_version);
268 more_printf(" I2C Slave Address : 0x%02x\n",
269 hardware->dmi.ipmi.I2C_slave_address);
270 more_printf(" Nv Storage Address : %u\n", hardware->dmi.ipmi.nv_address);
271 uint32_t high = hardware->dmi.ipmi.base_address >> 32;
272 uint32_t low = hardware->dmi.ipmi.base_address & 0xFFFF;
273 more_printf(" Base Address : %08X%08X\n", high, (low & ~1));
274 more_printf(" IRQ : %d\n", hardware->dmi.ipmi.irq);
275 }
276
show_dmi_battery(int argc __unused,char ** argv __unused,struct s_hardware * hardware)277 static void show_dmi_battery(int argc __unused, char **argv __unused,
278 struct s_hardware *hardware)
279 {
280 if (hardware->dmi.battery.filled == false) {
281 more_printf("battery information not found on your system, see "
282 "`show list' to see which module is available.\n");
283 return;
284 }
285 reset_more_printf();
286 more_printf("Battery \n");
287 more_printf(" Vendor : %s\n",
288 hardware->dmi.battery.manufacturer);
289 more_printf(" Manufacture Date : %s\n",
290 hardware->dmi.battery.manufacture_date);
291 more_printf(" Serial : %s\n", hardware->dmi.battery.serial);
292 more_printf(" Name : %s\n", hardware->dmi.battery.name);
293 more_printf(" Chemistry : %s\n", hardware->dmi.battery.chemistry);
294 more_printf(" Design Capacity : %s\n",
295 hardware->dmi.battery.design_capacity);
296 more_printf(" Design Voltage : %s\n",
297 hardware->dmi.battery.design_voltage);
298 more_printf(" SBDS : %s\n", hardware->dmi.battery.sbds);
299 more_printf(" SBDS Manuf. Date : %s\n",
300 hardware->dmi.battery.sbds_manufacture_date);
301 more_printf(" SBDS Chemistry : %s\n",
302 hardware->dmi.battery.sbds_chemistry);
303 more_printf(" Maximum Error : %s\n",
304 hardware->dmi.battery.maximum_error);
305 more_printf(" OEM Info : %s\n", hardware->dmi.battery.oem_info);
306 }
307
show_dmi_cpu(int argc __unused,char ** argv __unused,struct s_hardware * hardware)308 static void show_dmi_cpu(int argc __unused, char **argv __unused,
309 struct s_hardware *hardware)
310 {
311 if (hardware->dmi.processor.filled == false) {
312 more_printf("processor information not found on your system, see "
313 "`show list' to see which module is available.\n");
314 return;
315 }
316 reset_more_printf();
317 more_printf("CPU\n");
318 more_printf(" Socket Designation : %s\n",
319 hardware->dmi.processor.socket_designation);
320 more_printf(" Type : %s\n", hardware->dmi.processor.type);
321 more_printf(" Family : %s\n", hardware->dmi.processor.family);
322 more_printf(" Manufacturer : %s\n",
323 hardware->dmi.processor.manufacturer);
324 more_printf(" Version : %s\n", hardware->dmi.processor.version);
325 more_printf(" External Clock : %u\n",
326 hardware->dmi.processor.external_clock);
327 more_printf(" Max Speed : %u\n",
328 hardware->dmi.processor.max_speed);
329 more_printf(" Current Speed : %u\n",
330 hardware->dmi.processor.current_speed);
331 more_printf(" Cpu Type : %u\n",
332 hardware->dmi.processor.signature.type);
333 more_printf(" Cpu Family : %u\n",
334 hardware->dmi.processor.signature.family);
335 more_printf(" Cpu Model : %u\n",
336 hardware->dmi.processor.signature.model);
337 more_printf(" Cpu Stepping : %u\n",
338 hardware->dmi.processor.signature.stepping);
339 more_printf(" Cpu Minor Stepping : %u\n",
340 hardware->dmi.processor.signature.minor_stepping);
341 more_printf("Voltage : %d.%02d\n",
342 hardware->dmi.processor.voltage_mv / 1000,
343 hardware->dmi.processor.voltage_mv -
344 ((hardware->dmi.processor.voltage_mv / 1000) * 1000));
345 more_printf(" Status : %s\n", hardware->dmi.processor.status);
346 more_printf(" Upgrade : %s\n", hardware->dmi.processor.upgrade);
347 more_printf(" Cache L1 Handle : %s\n", hardware->dmi.processor.cache1);
348 more_printf(" Cache L2 Handle : %s\n", hardware->dmi.processor.cache2);
349 more_printf(" Cache L3 Handle : %s\n", hardware->dmi.processor.cache3);
350 more_printf(" Serial : %s\n", hardware->dmi.processor.serial);
351 more_printf(" Part Number : %s\n",
352 hardware->dmi.processor.part_number);
353 if (hardware->dmi.processor.core_count != 0)
354 more_printf(" Cores Count : %d\n", hardware->dmi.processor.core_count);
355 if (hardware->dmi.processor.core_enabled != 0)
356 more_printf(" Cores Enabled : %d\n", hardware->dmi.processor.core_enabled);
357 if (hardware->dmi.processor.thread_count != 0)
358 more_printf(" Threads Count : %d\n", hardware->dmi.processor.thread_count);
359
360 more_printf(" ID : %s\n", hardware->dmi.processor.id);
361 for (int i = 0; i < PROCESSOR_FLAGS_ELEMENTS; i++) {
362 if (((bool *) (&hardware->dmi.processor.cpu_flags))[i] == true) {
363 more_printf(" %s\n", cpu_flags_strings[i]);
364 }
365 }
366 }
367
show_dmi_memory_bank(int argc,char ** argv,struct s_hardware * hardware)368 void show_dmi_memory_bank(int argc, char **argv, struct s_hardware *hardware)
369 {
370 int bank = -1;
371
372 /* Sanitize arguments */
373 if (argc > 0)
374 bank = strtol(argv[0], (char **)NULL, 10);
375
376 if (errno == ERANGE || bank < 0) {
377 more_printf("This bank number is incorrect\n");
378 return;
379 }
380
381 if ((bank >= hardware->dmi.memory_count) || (bank < 0)) {
382 more_printf("Bank %d number doesn't exist\n", bank);
383 return;
384 }
385 if (hardware->dmi.memory[bank].filled == false) {
386 more_printf("Bank %d doesn't contain any information\n", bank);
387 return;
388 }
389
390 reset_more_printf();
391 more_printf("Memory Bank %d\n", bank);
392 more_printf(" Form Factor : %s\n", hardware->dmi.memory[bank].form_factor);
393 more_printf(" Type : %s\n", hardware->dmi.memory[bank].type);
394 more_printf(" Type Detail : %s\n", hardware->dmi.memory[bank].type_detail);
395 more_printf(" Speed : %s\n", hardware->dmi.memory[bank].speed);
396 more_printf(" Size : %s\n", hardware->dmi.memory[bank].size);
397 more_printf(" Device Set : %s\n", hardware->dmi.memory[bank].device_set);
398 more_printf(" Device Loc. : %s\n",
399 hardware->dmi.memory[bank].device_locator);
400 more_printf(" Bank Locator : %s\n",
401 hardware->dmi.memory[bank].bank_locator);
402 more_printf(" Total Width : %s\n", hardware->dmi.memory[bank].total_width);
403 more_printf(" Data Width : %s\n", hardware->dmi.memory[bank].data_width);
404 more_printf(" Error : %s\n", hardware->dmi.memory[bank].error);
405 more_printf(" Vendor : %s\n",
406 hardware->dmi.memory[bank].manufacturer);
407 more_printf(" Serial : %s\n", hardware->dmi.memory[bank].serial);
408 more_printf(" Asset Tag : %s\n", hardware->dmi.memory[bank].asset_tag);
409 more_printf(" Part Number : %s\n", hardware->dmi.memory[bank].part_number);
410 }
411
show_dmi_cache(int argc,char ** argv,struct s_hardware * hardware)412 static void show_dmi_cache(int argc, char **argv, struct s_hardware *hardware)
413 {
414 if (!hardware->dmi.cache_count) {
415 more_printf("cache information not found on your system, see "
416 "`show list' to see which module is available.\n");
417 return;
418 }
419
420 int cache = strtol(argv[0], NULL, 10);
421
422 if (argc != 1 || cache > hardware->dmi.cache_count) {
423 more_printf("show cache [0-%d]\n", hardware->dmi.cache_count - 1);
424 return;
425 }
426
427 reset_more_printf();
428
429 more_printf("Cache Information #%d\n", cache);
430 more_printf(" Socket Designation : %s\n",
431 hardware->dmi.cache[cache].socket_designation);
432 more_printf(" Configuration : %s\n",
433 hardware->dmi.cache[cache].configuration);
434 more_printf(" Operational Mode : %s\n",
435 hardware->dmi.cache[cache].mode);
436 more_printf(" Location : %s\n",
437 hardware->dmi.cache[cache].location);
438 more_printf(" Installed Size : %u KB",
439 hardware->dmi.cache[cache].installed_size);
440 more_printf("\n");
441 more_printf(" Maximum Size : %u KB",
442 hardware->dmi.cache[cache].max_size);
443 more_printf("\n");
444 more_printf(" Supported SRAM Types : %s",
445 hardware->dmi.cache[cache].supported_sram_types);
446 more_printf("\n");
447 more_printf(" Installed SRAM Type : %s",
448 hardware->dmi.cache[cache].installed_sram_types);
449 more_printf("\n");
450 more_printf(" Speed : %u ns",
451 hardware->dmi.cache[cache].speed);
452 more_printf("\n");
453 more_printf(" Error Correction Type : %s\n",
454 hardware->dmi.cache[cache].error_correction_type);
455 more_printf(" System Type : %s\n",
456 hardware->dmi.cache[cache].system_type);
457 more_printf(" Associativity : %s\n",
458 hardware->dmi.cache[cache].associativity);
459 }
460
show_dmi_memory_module(int argc,char ** argv,struct s_hardware * hardware)461 void show_dmi_memory_module(int argc, char **argv, struct s_hardware *hardware)
462 {
463 int module = -1;
464
465 /* Sanitize arguments */
466 if (argc > 0)
467 module = strtol(argv[0], (char **)NULL, 10);
468
469 if (errno == ERANGE || module < 0) {
470 more_printf("This module number is incorrect\n");
471 return;
472 }
473
474 if ((module >= hardware->dmi.memory_module_count) || (module < 0)) {
475 more_printf("Module number %d doesn't exist\n", module);
476 return;
477 }
478
479 if (hardware->dmi.memory_module[module].filled == false) {
480 more_printf("Module %d doesn't contain any information\n", module);
481 return;
482 }
483
484 reset_more_printf();
485 more_printf("Memory Module %d\n", module);
486 more_printf(" Socket Designation : %s\n",
487 hardware->dmi.memory_module[module].socket_designation);
488 more_printf(" Bank Connections : %s\n",
489 hardware->dmi.memory_module[module].bank_connections);
490 more_printf(" Current Speed : %s\n",
491 hardware->dmi.memory_module[module].speed);
492 more_printf(" Type : %s\n",
493 hardware->dmi.memory_module[module].type);
494 more_printf(" Installed Size : %s\n",
495 hardware->dmi.memory_module[module].installed_size);
496 more_printf(" Enabled Size : %s\n",
497 hardware->dmi.memory_module[module].enabled_size);
498 more_printf(" Error Status : %s\n",
499 hardware->dmi.memory_module[module].error_status);
500 }
501
main_show_dmi(int argc __unused,char ** argv __unused,struct s_hardware * hardware)502 void main_show_dmi(int argc __unused, char **argv __unused,
503 struct s_hardware *hardware)
504 {
505
506 if (hardware->is_dmi_valid == false) {
507 more_printf("No valid DMI table found, exiting.\n");
508 return;
509 }
510 reset_more_printf();
511 more_printf("DMI Table version %u.%u found\n",
512 hardware->dmi.dmitable.major_version,
513 hardware->dmi.dmitable.minor_version);
514
515 show_dmi_modules(0, NULL, hardware);
516 }
517
show_dmi_memory_modules(int argc __unused,char ** argv __unused,struct s_hardware * hardware)518 void show_dmi_memory_modules(int argc __unused, char **argv __unused,
519 struct s_hardware *hardware)
520 {
521 /* Do we have so display unpopulated banks ? */
522 int show_free_banks = 1;
523
524 more_printf("Memory Size : %lu MB (%lu KB)\n",
525 (hardware->detected_memory_size + (1 << 9)) >> 10,
526 hardware->detected_memory_size);
527
528 if ((hardware->dmi.memory_count <= 0)
529 && (hardware->dmi.memory_module_count <= 0)) {
530 more_printf("No memory bank found\n");
531 return;
532 }
533
534 /* Sanitize arguments */
535 if (argc > 0) {
536 /* When we display a summary, there is no need to show the unpopulated banks
537 * The first argv is set to define this behavior
538 */
539 show_free_banks = strtol(argv[0], NULL, 10);
540 if (errno == ERANGE || show_free_banks < 0 || show_free_banks > 1)
541 goto usage;
542 }
543
544 reset_more_printf();
545 /* If type 17 is available */
546 if (hardware->dmi.memory_count > 0) {
547 char bank_number[255];
548 more_printf("Memory Banks\n");
549 for (int i = 0; i < hardware->dmi.memory_count; i++) {
550 if (hardware->dmi.memory[i].filled == true) {
551 memset(bank_number, 0, sizeof(bank_number));
552 snprintf(bank_number, sizeof(bank_number), "%d ", i);
553 if (show_free_banks == false) {
554 if (strncmp(hardware->dmi.memory[i].size, "Free", 4))
555 more_printf(" bank %02d : %s %s@%s\n",
556 i, hardware->dmi.memory[i].size,
557 hardware->dmi.memory[i].type,
558 hardware->dmi.memory[i].speed);
559 } else {
560 more_printf(" bank %02d : %s %s@%s\n", i,
561 hardware->dmi.memory[i].size,
562 hardware->dmi.memory[i].type,
563 hardware->dmi.memory[i].speed);
564 }
565 }
566 }
567 } else if (hardware->dmi.memory_module_count > 0) {
568 /* Let's use type 6 as a fallback of type 17 */
569 more_printf("Memory Modules\n");
570 for (int i = 0; i < hardware->dmi.memory_module_count; i++) {
571 if (hardware->dmi.memory_module[i].filled == true) {
572 more_printf(" module %02d : %s %s@%s\n", i,
573 hardware->dmi.memory_module[i].enabled_size,
574 hardware->dmi.memory_module[i].type,
575 hardware->dmi.memory_module[i].speed);
576 }
577 }
578 }
579
580 return;
581 //printf("Type 'show bank<bank_number>' for more details.\n");
582
583 usage:
584 more_printf("show memory <clear screen? <show free banks?>>\n");
585 return;
586 }
587
show_dmi_oem_strings(int argc __unused,char ** argv __unused,struct s_hardware * hardware)588 void show_dmi_oem_strings(int argc __unused, char **argv __unused,
589 struct s_hardware *hardware)
590 {
591 reset_more_printf();
592
593 if (strlen(hardware->dmi.oem_strings))
594 more_printf("OEM Strings\n%s", hardware->dmi.oem_strings);
595 }
596
show_dmi_hardware_security(int argc __unused,char ** argv __unused,struct s_hardware * hardware)597 void show_dmi_hardware_security(int argc __unused, char **argv __unused,
598 struct s_hardware *hardware)
599 {
600 reset_more_printf();
601
602 if (!hardware->dmi.hardware_security.filled)
603 return;
604
605 more_printf("Hardware Security\n");
606 more_printf(" Power-On Password Status : %s\n",
607 hardware->dmi.hardware_security.power_on_passwd_status);
608 more_printf(" Keyboard Password Status : %s\n",
609 hardware->dmi.hardware_security.keyboard_passwd_status);
610 more_printf(" Administrator Password Status : %s\n",
611 hardware->dmi.hardware_security.administrator_passwd_status);
612 more_printf(" Front Panel Reset Status : %s\n",
613 hardware->dmi.hardware_security.front_panel_reset_status);
614 }
615
616 struct cli_callback_descr list_dmi_show_modules[] = {
617 {
618 .name = CLI_DMI_BASE_BOARD,
619 .exec = show_dmi_base_board,
620 .nomodule = false,
621 },
622 {
623 .name = CLI_DMI_BIOS,
624 .exec = show_dmi_bios,
625 .nomodule = false,
626 },
627 {
628 .name = CLI_DMI_BATTERY,
629 .exec = show_dmi_battery,
630 .nomodule = false,
631 },
632 {
633 .name = CLI_DMI_CHASSIS,
634 .exec = show_dmi_chassis,
635 .nomodule = false,
636 },
637 {
638 .name = CLI_DMI_MEMORY,
639 .exec = show_dmi_memory_modules,
640 .nomodule = false,
641 },
642 {
643 .name = CLI_DMI_MEMORY_BANK,
644 .exec = show_dmi_memory_bank,
645 .nomodule = false,
646 },
647 {
648 .name = "module",
649 .exec = show_dmi_memory_module,
650 .nomodule = false,
651 },
652 {
653 .name = CLI_DMI_PROCESSOR,
654 .exec = show_dmi_cpu,
655 .nomodule = false,
656 },
657 {
658 .name = CLI_DMI_SYSTEM,
659 .exec = show_dmi_system,
660 .nomodule = false,
661 },
662 {
663 .name = CLI_DMI_OEM,
664 .exec = show_dmi_oem_strings,
665 .nomodule = false,
666 },
667 {
668 .name = CLI_DMI_SECURITY,
669 .exec = show_dmi_hardware_security,
670 .nomodule = false,
671 },
672 {
673 .name = CLI_DMI_IPMI,
674 .exec = show_dmi_ipmi,
675 .nomodule = false,
676 },
677 {
678 .name = CLI_DMI_CACHE,
679 .exec = show_dmi_cache,
680 .nomodule = false,
681 },
682 {
683 .name = CLI_DMI_LIST,
684 .exec = show_dmi_modules,
685 .nomodule = false,
686 },
687 {
688 .name = NULL,
689 .exec = NULL,
690 .nomodule = false,
691 },
692 };
693
694 struct cli_module_descr dmi_show_modules = {
695 .modules = list_dmi_show_modules,
696 .default_callback = main_show_dmi,
697 };
698
699 struct cli_mode_descr dmi_mode = {
700 .mode = DMI_MODE,
701 .name = CLI_DMI,
702 .default_modules = NULL,
703 .show_modules = &dmi_show_modules,
704 .set_modules = NULL,
705 };
706