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