1 /****************************************************************************** 2 * 3 * Module Name: ahasl - ASL operator decoding for acpihelp utility 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2017, 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 "acpihelp.h" 45 46 47 /* Local prototypes */ 48 49 static void 50 AhDisplayAslOperator ( 51 const AH_ASL_OPERATOR *Op); 52 53 static void 54 AhDisplayOperatorKeywords ( 55 const AH_ASL_OPERATOR *Op); 56 57 static void 58 AhDisplayAslKeyword ( 59 const AH_ASL_KEYWORD *Op); 60 61 62 /******************************************************************************* 63 * 64 * FUNCTION: AhFindAslKeywords (entry point for ASL keyword search) 65 * 66 * PARAMETERS: Name - Name or prefix for an ASL keyword. 67 * NULL means "find all" 68 * 69 * RETURN: None 70 * 71 * DESCRIPTION: Find all ASL keywords that match the input Name or name 72 * prefix. 73 * 74 ******************************************************************************/ 75 76 void 77 AhFindAslKeywords ( 78 char *Name) 79 { 80 const AH_ASL_KEYWORD *Keyword; 81 BOOLEAN Found = FALSE; 82 83 84 AcpiUtStrupr (Name); 85 86 for (Keyword = Gbl_AslKeywordInfo; Keyword->Name; Keyword++) 87 { 88 if (!Name || (Name[0] == '*')) 89 { 90 AhDisplayAslKeyword (Keyword); 91 Found = TRUE; 92 continue; 93 } 94 95 /* Upper case the operator name before substring compare */ 96 97 strcpy (Gbl_Buffer, Keyword->Name); 98 AcpiUtStrupr (Gbl_Buffer); 99 100 if (strstr (Gbl_Buffer, Name) == Gbl_Buffer) 101 { 102 AhDisplayAslKeyword (Keyword); 103 Found = TRUE; 104 } 105 } 106 107 if (!Found) 108 { 109 printf ("%s, no matching ASL keywords\n", Name); 110 } 111 } 112 113 114 /******************************************************************************* 115 * 116 * FUNCTION: AhDisplayAslKeyword 117 * 118 * PARAMETERS: Op - Pointer to ASL keyword with syntax info 119 * 120 * RETURN: None 121 * 122 * DESCRIPTION: Format and display syntax info for an ASL keyword. Splits 123 * long lines appropriately for reading. 124 * 125 ******************************************************************************/ 126 127 static void 128 AhDisplayAslKeyword ( 129 const AH_ASL_KEYWORD *Op) 130 { 131 132 /* ASL keyword name and description */ 133 134 printf ("%22s: %s\n", Op->Name, Op->Description); 135 if (!Op->KeywordList) 136 { 137 return; 138 } 139 140 /* List of actual keywords */ 141 142 AhPrintOneField (24, 0, AH_MAX_ASL_LINE_LENGTH, Op->KeywordList); 143 printf ("\n"); 144 } 145 146 147 /******************************************************************************* 148 * 149 * FUNCTION: AhFindAslAndAmlOperators 150 * 151 * PARAMETERS: Name - Name or prefix for an ASL operator. 152 * NULL means "find all" 153 * 154 * RETURN: None 155 * 156 * DESCRIPTION: Find all ASL operators that match the input Name or name 157 * prefix. Also displays the AML information if only one entry 158 * matches. 159 * 160 ******************************************************************************/ 161 162 void 163 AhFindAslAndAmlOperators ( 164 char *Name) 165 { 166 UINT32 MatchCount; 167 168 169 MatchCount = AhFindAslOperators (Name); 170 if (MatchCount == 1) 171 { 172 AhFindAmlOpcode (Name); 173 } 174 } 175 176 177 /******************************************************************************* 178 * 179 * FUNCTION: AhFindAslOperators (entry point for ASL operator search) 180 * 181 * PARAMETERS: Name - Name or prefix for an ASL operator. 182 * NULL means "find all" 183 * 184 * RETURN: Number of operators that matched the name prefix. 185 * 186 * DESCRIPTION: Find all ASL operators that match the input Name or name 187 * prefix. 188 * 189 ******************************************************************************/ 190 191 UINT32 192 AhFindAslOperators ( 193 char *Name) 194 { 195 const AH_ASL_OPERATOR *Operator; 196 BOOLEAN MatchCount = 0; 197 198 199 AcpiUtStrupr (Name); 200 201 /* Find/display all names that match the input name prefix */ 202 203 for (Operator = Gbl_AslOperatorInfo; Operator->Name; Operator++) 204 { 205 if (!Name || (Name[0] == '*')) 206 { 207 AhDisplayAslOperator (Operator); 208 MatchCount++; 209 continue; 210 } 211 212 /* Upper case the operator name before substring compare */ 213 214 strcpy (Gbl_Buffer, Operator->Name); 215 AcpiUtStrupr (Gbl_Buffer); 216 217 if (strstr (Gbl_Buffer, Name) == Gbl_Buffer) 218 { 219 AhDisplayAslOperator (Operator); 220 MatchCount++; 221 } 222 } 223 224 if (!MatchCount) 225 { 226 printf ("%s, no matching ASL operators\n", Name); 227 } 228 229 return (MatchCount); 230 } 231 232 233 /******************************************************************************* 234 * 235 * FUNCTION: AhDisplayAslOperator 236 * 237 * PARAMETERS: Op - Pointer to ASL operator with syntax info 238 * 239 * RETURN: None 240 * 241 * DESCRIPTION: Format and display syntax info for an ASL operator. Splits 242 * long lines appropriately for reading. 243 * 244 ******************************************************************************/ 245 246 static void 247 AhDisplayAslOperator ( 248 const AH_ASL_OPERATOR *Op) 249 { 250 251 /* ASL operator name and description */ 252 253 printf ("%16s: %s\n", Op->Name, Op->Description); 254 if (!Op->Syntax) 255 { 256 return; 257 } 258 259 /* Syntax for the operator */ 260 261 AhPrintOneField (18, 0, AH_MAX_ASL_LINE_LENGTH, Op->Syntax); 262 printf ("\n"); 263 264 AhDisplayOperatorKeywords (Op); 265 printf ("\n"); 266 } 267 268 269 /******************************************************************************* 270 * 271 * FUNCTION: AhDisplayOperatorKeywords 272 * 273 * PARAMETERS: Op - Pointer to ASL keyword with syntax info 274 * 275 * RETURN: None 276 * 277 * DESCRIPTION: Display any/all keywords that are associated with the ASL 278 * operator. 279 * 280 ******************************************************************************/ 281 282 static void 283 AhDisplayOperatorKeywords ( 284 const AH_ASL_OPERATOR *Op) 285 { 286 char *Token; 287 char *Separators = "(){}, "; 288 BOOLEAN FirstKeyword = TRUE; 289 290 291 if (!Op || !Op->Syntax) 292 { 293 return; 294 } 295 296 /* 297 * Find all parameters that have the word "keyword" within, and then 298 * display the info about that keyword 299 */ 300 strcpy (Gbl_LineBuffer, Op->Syntax); 301 Token = strtok (Gbl_LineBuffer, Separators); 302 while (Token) 303 { 304 if (strstr (Token, "Keyword")) 305 { 306 if (FirstKeyword) 307 { 308 printf ("\n"); 309 FirstKeyword = FALSE; 310 } 311 312 /* Found a keyword, display keyword information */ 313 314 AhFindAslKeywords (Token); 315 } 316 317 Token = strtok (NULL, Separators); 318 } 319 } 320