1 /****************************************************************************** 2 * 3 * Module Name: aeinitfile - Support for optional initialization file 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2016, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include "aecommon.h" 45 #include "acdispat.h" 46 47 #define _COMPONENT ACPI_TOOLS 48 ACPI_MODULE_NAME ("aeinitfile") 49 50 51 /* Local prototypes */ 52 53 static void 54 AeDoOneOverride ( 55 char *Pathname, 56 char *ValueString, 57 ACPI_OPERAND_OBJECT *ObjDesc, 58 ACPI_WALK_STATE *WalkState); 59 60 61 #define AE_FILE_BUFFER_SIZE 512 62 63 static char LineBuffer[AE_FILE_BUFFER_SIZE]; 64 static char NameBuffer[AE_FILE_BUFFER_SIZE]; 65 static char ValueBuffer[AE_FILE_BUFFER_SIZE]; 66 static FILE *InitFile; 67 68 69 /****************************************************************************** 70 * 71 * FUNCTION: AeOpenInitializationFile 72 * 73 * PARAMETERS: Filename - Path to the init file 74 * 75 * RETURN: Status 76 * 77 * DESCRIPTION: Open the initialization file for the -fi option 78 * 79 *****************************************************************************/ 80 81 int 82 AeOpenInitializationFile ( 83 char *Filename) 84 { 85 86 InitFile = fopen (Filename, "r"); 87 if (!InitFile) 88 { 89 fprintf (stderr, 90 "Could not open initialization file: %s\n", Filename); 91 return (-1); 92 } 93 94 AcpiOsPrintf ("Opened initialization file [%s]\n", Filename); 95 return (0); 96 } 97 98 99 /****************************************************************************** 100 * 101 * FUNCTION: AeDoObjectOverrides 102 * 103 * PARAMETERS: None 104 * 105 * RETURN: None 106 * 107 * DESCRIPTION: Read the initialization file and perform all overrides 108 * 109 * NOTE: The format of the file is multiple lines, each of format: 110 * <ACPI-pathname> <Integer Value> 111 * 112 *****************************************************************************/ 113 114 void 115 AeDoObjectOverrides ( 116 void) 117 { 118 ACPI_OPERAND_OBJECT *ObjDesc; 119 ACPI_WALK_STATE *WalkState; 120 int i; 121 122 123 if (!InitFile) 124 { 125 return; 126 } 127 128 /* Create needed objects to be reused for each init entry */ 129 130 ObjDesc = AcpiUtCreateIntegerObject (0); 131 WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 132 NameBuffer[0] = '\\'; 133 134 /* Read the entire file line-by-line */ 135 136 while (fgets (LineBuffer, AE_FILE_BUFFER_SIZE, InitFile) != NULL) 137 { 138 if (sscanf (LineBuffer, "%s %s\n", 139 &NameBuffer[1], ValueBuffer) != 2) 140 { 141 goto CleanupAndExit; 142 } 143 144 /* Add a root prefix if not present in the string */ 145 146 i = 0; 147 if (NameBuffer[1] == '\\') 148 { 149 i = 1; 150 } 151 152 AeDoOneOverride (&NameBuffer[i], ValueBuffer, ObjDesc, WalkState); 153 } 154 155 /* Cleanup */ 156 157 CleanupAndExit: 158 fclose (InitFile); 159 AcpiDsDeleteWalkState (WalkState); 160 AcpiUtRemoveReference (ObjDesc); 161 } 162 163 164 /****************************************************************************** 165 * 166 * FUNCTION: AeDoOneOverride 167 * 168 * PARAMETERS: Pathname - AML namepath 169 * ValueString - New integer value to be stored 170 * ObjDesc - Descriptor with integer override value 171 * WalkState - Used for the Store operation 172 * 173 * RETURN: None 174 * 175 * DESCRIPTION: Perform an override for a single namespace object 176 * 177 *****************************************************************************/ 178 179 static void 180 AeDoOneOverride ( 181 char *Pathname, 182 char *ValueString, 183 ACPI_OPERAND_OBJECT *ObjDesc, 184 ACPI_WALK_STATE *WalkState) 185 { 186 ACPI_HANDLE Handle; 187 ACPI_STATUS Status; 188 UINT64 Value; 189 190 191 AcpiOsPrintf ("Value Override: %s, ", Pathname); 192 193 /* 194 * Get the namespace node associated with the override 195 * pathname from the init file. 196 */ 197 Status = AcpiGetHandle (NULL, Pathname, &Handle); 198 if (ACPI_FAILURE (Status)) 199 { 200 AcpiOsPrintf ("%s\n", AcpiFormatException (Status)); 201 return; 202 } 203 204 /* Extract the 64-bit integer */ 205 206 Status = AcpiUtStrtoul64 (ValueString, 207 (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &Value); 208 if (ACPI_FAILURE (Status)) 209 { 210 AcpiOsPrintf ("%s %s\n", ValueString, 211 AcpiFormatException (Status)); 212 return; 213 } 214 215 ObjDesc->Integer.Value = Value; 216 217 /* 218 * At the point this function is called, the namespace is fully 219 * built and initialized. We can simply store the new object to 220 * the target node. 221 */ 222 AcpiExEnterInterpreter (); 223 Status = AcpiExStore (ObjDesc, Handle, WalkState); 224 AcpiExExitInterpreter (); 225 226 if (ACPI_FAILURE (Status)) 227 { 228 AcpiOsPrintf ("%s\n", AcpiFormatException (Status)); 229 return; 230 } 231 232 AcpiOsPrintf ("New value: 0x%8.8X%8.8X\n", 233 ACPI_FORMAT_UINT64 (Value)); 234 } 235