• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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