129e8807ea045e119e3adeaec40c5f8421901b6fbRandall Spangler/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * Use of this source code is governed by a BSD-style license that can be 3542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * found in the LICENSE file. 4542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * 5542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * Chrome OS firmware/system interface utility 6542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler */ 7542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 8542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler#include <stdio.h> 9542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler#include <stdlib.h> 10542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler#include <string.h> 11542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 12542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler#include "crossystem.h" 13542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 14c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendebury/* 15c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendebury * Call arch specific init, if provided, otherwise use the 'weak' stub. 16c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendebury */ 17c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendeburyint __VbArchInit(void) { return 0; } 18c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendeburyint VbArchInit(void) __attribute__((weak, alias("__VbArchInit"))); 19f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler/* Flags for Param */ 20f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler#define IS_STRING 0x01 /* String (not present = integer) */ 21f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler#define CAN_WRITE 0x02 /* Writable (not present = read-only */ 22f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler#define NO_PRINT_ALL 0x04 /* Don't print contents of parameter when 23f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler * doing a print-all */ 24f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler 25542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spanglertypedef struct Param { 26542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler const char* name; /* Parameter name */ 27f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler int flags; /* Flags (see above) */ 28542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler const char* desc; /* Human-readable description */ 290ca76fcc0cb17104579b4b4de678952590eed953Randall Spangler const char* format; /* Format string, if non-NULL and 0==is_string*/ 30542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler} Param; 31542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 32542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler/* List of parameters, terminated with a param with NULL name */ 33542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spanglerconst Param sys_param_list[] = { 34207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"arch", IS_STRING, "Platform architecture"}, 35b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson {"backup_nvram_request", CAN_WRITE, 36b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson "Backup the nvram somewhere at the next boot. Cleared on success."}, 37850b74fa19f6eadd1d3221f484c738f41f993653Bill Richardson {"block_devmode", CAN_WRITE, "Block all use of developer mode"}, 3829e8807ea045e119e3adeaec40c5f8421901b6fbRandall Spangler {"clear_tpm_owner_request", CAN_WRITE, "Clear TPM owner on next boot"}, 3929e8807ea045e119e3adeaec40c5f8421901b6fbRandall Spangler {"clear_tpm_owner_done", CAN_WRITE, "Clear TPM owner done"}, 40207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"cros_debug", 0, "OS should allow debug features"}, 41207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"dbg_reset", CAN_WRITE, "Debug reset mode request (writable)"}, 42d808a43d357371451c8ca4b4ad1a38f2251155c4Tom Wai-Hong Tam {"ddr_type", IS_STRING, "Type of DDR RAM"}, 4392cbd5d214e0f2f9a3d52db48dcdaaceb57993d4J. Richard Barnette {"debug_build", 0, "OS image built for debug features"}, 44daa807c51ef6d5bf6599e649d1777432bea8a3e5Randall Spangler {"dev_boot_usb", CAN_WRITE, 454312770fb197c237e560d18c9247425a1df23764Randall Spangler "Enable developer mode boot from USB/SD (writable)"}, 46a2326ee152ab5b8aee924ccf794cee38d54909bdStefan Reinauer {"dev_boot_legacy", CAN_WRITE, 47a2326ee152ab5b8aee924ccf794cee38d54909bdStefan Reinauer "Enable developer mode boot Legacy OSes (writable)"}, 487272a6951107251a5c9b26330c506319a92a54b3Bill Richardson {"dev_boot_signed_only", CAN_WRITE, 497272a6951107251a5c9b26330c506319a92a54b3Bill Richardson "Enable developer mode boot only from official kernels (writable)"}, 50f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler {"devsw_boot", 0, "Developer switch position at boot"}, 51207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"devsw_cur", 0, "Developer switch current position"}, 5292cbd5d214e0f2f9a3d52db48dcdaaceb57993d4J. Richard Barnette {"disable_dev_request", CAN_WRITE, "Disable virtual dev-mode on next boot"}, 53207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"ecfw_act", IS_STRING, "Active EC firmware"}, 54f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler {"fmap_base", 0, "Main firmware flashmap physical address", "0x%08x"}, 55207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"fwb_tries", CAN_WRITE, "Try firmware B count (writable)"}, 56d11086caf05c692815ae6f90aa83a4fc30d50ed7Daisuke Nojiri {"fw_vboot2", 0, "1 if firmware was selected by vboot2 or 0 otherwise"}, 57f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler {"fwid", IS_STRING, "Active firmware ID"}, 58207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"fwupdate_tries", CAN_WRITE, 59207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler "Times to try OS firmware update (writable, inside kern_nv)"}, 609e1da784487fb8cfbe4e76693e07205b66675bdaRandall Spangler {"fw_tried", IS_STRING, "Firmware tried this boot (vboot2)"}, 619e1da784487fb8cfbe4e76693e07205b66675bdaRandall Spangler {"fw_try_count", CAN_WRITE, "Number of times to try fw_try_next (writable)"}, 629e1da784487fb8cfbe4e76693e07205b66675bdaRandall Spangler {"fw_try_next", IS_STRING|CAN_WRITE, 639e1da784487fb8cfbe4e76693e07205b66675bdaRandall Spangler "Firmware to try next (vboot2,writable)"}, 649e1da784487fb8cfbe4e76693e07205b66675bdaRandall Spangler {"fw_result", IS_STRING|CAN_WRITE, 659e1da784487fb8cfbe4e76693e07205b66675bdaRandall Spangler "Firmware result this boot (vboot2,writable)"}, 6665ce99b3e2c75bbb416b6edf78b5ea0d7f8c3a94Julius Werner {"fw_prev_tried", IS_STRING, "Firmware tried on previous boot (vboot2)"}, 6765ce99b3e2c75bbb416b6edf78b5ea0d7f8c3a94Julius Werner {"fw_prev_result", IS_STRING, "Firmware result of previous boot (vboot2)"}, 68207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"hwid", IS_STRING, "Hardware ID"}, 69ff3f0006447330228f43ad2da5ec55e1f003f870Randall Spangler {"kern_nv", 0, "Non-volatile field for kernel use", "0x%08x"}, 70207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"kernkey_vfy", IS_STRING, "Type of verification done on kernel key block"}, 71207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"loc_idx", CAN_WRITE, "Localization index for firmware screens (writable)"}, 72f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler {"mainfw_act", IS_STRING, "Active main firmware"}, 73f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler {"mainfw_type", IS_STRING, "Active main firmware type"}, 74f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler {"nvram_cleared", CAN_WRITE, "Have NV settings been lost? Write 0 to clear"}, 7517b8224ea582b2ba90b30a3e8e2d913e49c7818aBill Richardson {"oprom_needed", CAN_WRITE, "Should we load the VGA Option ROM at boot?"}, 760b5789fee96b7213a9762c5b2cf7f705a99d95efBernie Thompson {"platform_family", IS_STRING, "Platform family type"}, 77207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"recovery_reason", 0, "Recovery mode reason for current boot"}, 78f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler {"recovery_request", CAN_WRITE, "Recovery mode request (writable)"}, 79699ebf398f84bb0a6138856c38db1d693e581f85Bill Richardson {"recovery_subcode", CAN_WRITE, "Recovery reason subcode (writable)"}, 80207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"recoverysw_boot", 0, "Recovery switch position at boot"}, 81207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"recoverysw_cur", 0, "Recovery switch current position"}, 82207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"recoverysw_ec_boot", 0, "Recovery switch position at EC boot"}, 83207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"ro_fwid", IS_STRING, "Read-only firmware ID"}, 84207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"savedmem_base", 0, "RAM debug data area physical address", "0x%08x"}, 85207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"savedmem_size", 0, "RAM debug data area size in bytes"}, 869dc62178c97b94e5c308f1c36fd0858c316959e5Bill Richardson {"sw_wpsw_boot", 0, 879dc62178c97b94e5c308f1c36fd0858c316959e5Bill Richardson "Firmware write protect software setting enabled at boot"}, 88207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"tpm_fwver", 0, "Firmware version stored in TPM", "0x%08x"}, 89207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"tpm_kernver", 0, "Kernel version stored in TPM", "0x%08x"}, 90207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"tried_fwb", 0, "Tried firmware B before A this boot"}, 91207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"vdat_flags", 0, "Flags from VbSharedData", "0x%08x"}, 927141571d55373fc2a84a70b5663409a653f8049dRandall Spangler {"vdat_lfdebug", IS_STRING|NO_PRINT_ALL, 937141571d55373fc2a84a70b5663409a653f8049dRandall Spangler "LoadFirmware() debug data (not in print-all)"}, 947141571d55373fc2a84a70b5663409a653f8049dRandall Spangler {"vdat_lkdebug", IS_STRING|NO_PRINT_ALL, 957141571d55373fc2a84a70b5663409a653f8049dRandall Spangler "LoadKernel() debug data (not in print-all)"}, 96207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"vdat_timers", IS_STRING, "Timer values from VbSharedData"}, 97207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"wpsw_boot", 0, "Firmware write protect hardware switch position at boot"}, 98207825b2e0dad6fb5de3076b81a86493bc9a87d6Randall Spangler {"wpsw_cur", 0, "Firmware write protect hardware switch current position"}, 99542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler /* Terminate with null name */ 100f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler {NULL, 0, NULL} 101542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler}; 102542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 103542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 104542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler/* Print help */ 105542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spanglervoid PrintHelp(const char *progname) { 106542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler const Param *p; 107542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 108542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler printf("\nUsage:\n" 10955af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler " %s [--all]\n" 110542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler " Prints all parameters with descriptions and current values.\n" 11155af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler " If --all is specified, prints even normally hidden fields.\n" 112542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler " %s [param1 [param2 [...]]]\n" 113542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler " Prints the current value(s) of the parameter(s).\n" 114542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler " %s [param1=value1] [param2=value2 [...]]]\n" 115542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler " Sets the parameter(s) to the specified value(s).\n" 116227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler " %s [param1?value1] [param2?value2 [...]]]\n" 117227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler " Checks if the parameter(s) all contain the specified value(s).\n" 118227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler "Stops at the first error." 119542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler "\n" 120227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler "Valid parameters:\n", progname, progname, progname, progname); 121542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler for (p = sys_param_list; p->name; p++) 122542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler printf(" %-22s %s\n", p->name, p->desc); 123542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler} 124542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 125542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 126542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler/* Find the parameter in the list. 127542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * 128542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * Returns the parameter, or NULL if no match. */ 129542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spanglerconst Param* FindParam(const char* name) { 130542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler const Param* p; 131f27583f08361522909e49155d8b14671f644ec85Randall Spangler if (!name) 132f27583f08361522909e49155d8b14671f644ec85Randall Spangler return NULL; 133542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler for (p = sys_param_list; p->name; p++) { 134542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (!strcasecmp(p->name, name)) 135542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return p; 136542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 137542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return NULL; 138542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler} 139542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 140542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 141542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler/* Set the specified parameter. 142542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * 143542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * Returns 0 if success, non-zero if error. */ 144542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spanglerint SetParam(const Param* p, const char* value) { 145f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler if (!(p->flags & CAN_WRITE)) 146542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return 1; /* Parameter is read-only */ 147542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 148f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler if (p->flags & IS_STRING) { 149542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return (0 == VbSetSystemPropertyString(p->name, value) ? 0 : 1); 150542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } else { 151542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler char* e; 152227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler int i = (int)strtol(value, &e, 0); 153542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (!*value || (e && *e)) 154542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return 1; 155542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return (0 == VbSetSystemPropertyInt(p->name, i) ? 0 : 1); 156542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 157542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler} 158542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 159542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 160227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler/* Compares the parameter with the expected value. 161227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler * 162227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler * Returns 0 if success (match), non-zero if error (mismatch). */ 163227f792c1ba64eb8dd3474395659e27696fcf355Randall Spanglerint CheckParam(const Param* p, char* expect) { 164f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler if (p->flags & IS_STRING) { 165a3d70a3d2b5c052db039d097aaffa42008da24b5J. Richard Barnette char buf[VB_MAX_STRING_PROPERTY]; 166227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler const char* v = VbGetSystemPropertyString(p->name, buf, sizeof(buf)); 167227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler if (!v || 0 != strcmp(v, expect)) 168227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler return 1; 169227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler } else { 170227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler char* e; 171227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler int i = (int)strtol(expect, &e, 0); 172227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler int v = VbGetSystemPropertyInt(p->name); 173227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler if (!*expect || (e && *e)) 174227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler return 1; 175227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler if (v == -1 || i != v) 176227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler return 1; 177227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler } 178227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler return 0; 179227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler} 180227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler 181227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler 182542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler/* Print the specified parameter. 183542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * 184542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * Returns 0 if success, non-zero if error. */ 185542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spanglerint PrintParam(const Param* p) { 186f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler if (p->flags & IS_STRING) { 187a3d70a3d2b5c052db039d097aaffa42008da24b5J. Richard Barnette char buf[VB_MAX_STRING_PROPERTY]; 188542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler const char* v = VbGetSystemPropertyString(p->name, buf, sizeof(buf)); 189542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (!v) 190542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return 1; 191542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler printf("%s", v); 192542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } else { 193542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler int v = VbGetSystemPropertyInt(p->name); 194542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (v == -1) 195542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return 1; 1960ca76fcc0cb17104579b4b4de678952590eed953Randall Spangler printf(p->format ? p->format : "%d", v); 197542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 198542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return 0; 199542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler} 200542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 201542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 20255af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler/* Print all parameters with descriptions. If force_all!=0, prints even 20355af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler * parameters that specify the NO_PRINT_ALL flag. 204542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * 205542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler * Returns 0 if success, non-zero if error. */ 20655af5b539a50b1faea736487f8fb51047d9f41e9Randall Spanglerint PrintAllParams(int force_all) { 207542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler const Param* p; 208542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler int retval = 0; 209a3d70a3d2b5c052db039d097aaffa42008da24b5J. Richard Barnette char buf[VB_MAX_STRING_PROPERTY]; 210542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler const char* value; 211542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 212542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler for (p = sys_param_list; p->name; p++) { 21355af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler if (0 == force_all && (p->flags & NO_PRINT_ALL)) 214f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler continue; 215f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler if (p->flags & IS_STRING) { 216542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler value = VbGetSystemPropertyString(p->name, buf, sizeof(buf)); 217542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } else { 218542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler int v = VbGetSystemPropertyInt(p->name); 219542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (v == -1) 220542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler value = NULL; 221542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler else { 2220ca76fcc0cb17104579b4b4de678952590eed953Randall Spangler snprintf(buf, sizeof(buf), p->format ? p->format : "%d", v); 223542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler value = buf; 224542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 225542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 226f4ba19d81d4fefa0dba4efbdd57dc863138fde3aRandall Spangler printf("%-22s = %-30s # %s\n", 227542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler p->name, (value ? value : "(error)"), p->desc); 228542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 229542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return retval; 230542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler} 231542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 232542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 233542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spanglerint main(int argc, char* argv[]) { 234542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler int retval = 0; 235542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler int i; 236542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 237542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler char* progname = strrchr(argv[0], '/'); 238542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (progname) 239542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler progname++; 240542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler else 241542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler progname = argv[0]; 242542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 243c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendebury if (VbArchInit()) { 244c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendebury fprintf(stderr, "Failed to initialize\n"); 245c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendebury return -1; 246c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendebury } 247c3574086a82d04b3584712f7e15a8eb4ea6d40a0Vadim Bendebury 248542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler /* If no args specified, print all params */ 249542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (argc == 1) 25055af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler return PrintAllParams(0); 25155af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler /* --all or -a prints all params including normally hidden ones */ 25255af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler if (!strcasecmp(argv[1], "--all") || !strcmp(argv[1], "-a")) 25355af5b539a50b1faea736487f8fb51047d9f41e9Randall Spangler return PrintAllParams(1); 254542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 255542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler /* Print help if needed */ 256542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (!strcasecmp(argv[1], "-h") || !strcmp(argv[1], "-?")) { 257542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler PrintHelp(progname); 258542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return 0; 259542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 260542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 261542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler /* Otherwise, loop through params and get/set them */ 262542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler for (i = 1; i < argc && retval == 0; i++) { 263f27583f08361522909e49155d8b14671f644ec85Randall Spangler char* has_set = strchr(argv[i], '='); 264f27583f08361522909e49155d8b14671f644ec85Randall Spangler char* has_expect = strchr(argv[i], '?'); 265227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler char* name = strtok(argv[i], "=?"); 266227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler char* value = strtok(NULL, "=?"); 267f27583f08361522909e49155d8b14671f644ec85Randall Spangler const Param* p; 268f27583f08361522909e49155d8b14671f644ec85Randall Spangler 269f27583f08361522909e49155d8b14671f644ec85Randall Spangler /* Make sure args are well-formed. '' or '=foo' or '?foo' not allowed. */ 270f27583f08361522909e49155d8b14671f644ec85Randall Spangler if (!name || has_set == argv[i] || has_expect == argv[i]) { 271f27583f08361522909e49155d8b14671f644ec85Randall Spangler fprintf(stderr, "Poorly formed parameter\n"); 272542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler PrintHelp(progname); 273542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return 1; 274542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 275f27583f08361522909e49155d8b14671f644ec85Randall Spangler if (!value) 276f27583f08361522909e49155d8b14671f644ec85Randall Spangler value=""; /* Allow setting/checking an empty string ('foo=' or 'foo?') */ 277227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler if (has_set && has_expect) { 278227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler fprintf(stderr, "Use either = or ? in a parameter, but not both.\n"); 279227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler PrintHelp(progname); 280227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler return 1; 281227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler } 282542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 283f27583f08361522909e49155d8b14671f644ec85Randall Spangler /* Find the parameter */ 284f27583f08361522909e49155d8b14671f644ec85Randall Spangler p = FindParam(name); 285f27583f08361522909e49155d8b14671f644ec85Randall Spangler if (!p) { 286f27583f08361522909e49155d8b14671f644ec85Randall Spangler fprintf(stderr, "Invalid parameter name: %s\n", name); 287f27583f08361522909e49155d8b14671f644ec85Randall Spangler PrintHelp(progname); 288f27583f08361522909e49155d8b14671f644ec85Randall Spangler return 1; 289f27583f08361522909e49155d8b14671f644ec85Randall Spangler } 290f27583f08361522909e49155d8b14671f644ec85Randall Spangler 291542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler if (i > 1) 292542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler printf(" "); /* Output params space-delimited */ 293227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler if (has_set) 294542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler retval = SetParam(p, value); 295227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler else if (has_expect) 296227f792c1ba64eb8dd3474395659e27696fcf355Randall Spangler retval = CheckParam(p, value); 297542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler else 298542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler retval = PrintParam(p); 299542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler } 300542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler 301542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler return retval; 302542186618a43fb0786ff161a4ecc226f2f0c59e9Randall Spangler} 303