dtfield.c (208625) | dtfield.c (209734) |
---|---|
1/****************************************************************************** 2 * 3 * Module Name: dtfield.c - Code generation for individual source fields 4 * 5 *****************************************************************************/ 6 7/****************************************************************************** 8 * --- 117 unchanged lines hidden (view full) --- 126 127static void 128DtCompileString ( 129 UINT8 *Buffer, 130 DT_FIELD *Field, 131 UINT32 ByteLength); 132 133static char * | 1/****************************************************************************** 2 * 3 * Module Name: dtfield.c - Code generation for individual source fields 4 * 5 *****************************************************************************/ 6 7/****************************************************************************** 8 * --- 117 unchanged lines hidden (view full) --- 126 127static void 128DtCompileString ( 129 UINT8 *Buffer, 130 DT_FIELD *Field, 131 UINT32 ByteLength); 132 133static char * |
134DtPciPathToBuffer ( 135 char *PciPath); | 134DtNormalizeBuffer ( 135 char *Buffer, 136 UINT32 *Count); |
136 | 137 |
137static void 138DtCompilePciPath ( 139 UINT8 *Buffer, 140 char *StringValue, 141 DT_FIELD *Field, 142 UINT32 ByteLength); | |
143 | 138 |
144 | |
145/****************************************************************************** 146 * 147 * FUNCTION: DtCompileOneField 148 * 149 * PARAMETERS: Buffer - Output buffer 150 * Field - Field to be compiled 151 * ByteLength - Byte length of the field 152 * Type - Field type --- 22 unchanged lines hidden (view full) --- 175 case DT_FIELD_TYPE_STRING: 176 DtCompileString (Buffer, Field, ByteLength); 177 break; 178 179 case DT_FIELD_TYPE_BUFFER: 180 DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); 181 break; 182 | 139/****************************************************************************** 140 * 141 * FUNCTION: DtCompileOneField 142 * 143 * PARAMETERS: Buffer - Output buffer 144 * Field - Field to be compiled 145 * ByteLength - Byte length of the field 146 * Type - Field type --- 22 unchanged lines hidden (view full) --- 169 case DT_FIELD_TYPE_STRING: 170 DtCompileString (Buffer, Field, ByteLength); 171 break; 172 173 case DT_FIELD_TYPE_BUFFER: 174 DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); 175 break; 176 |
183 case DT_FIELD_TYPE_PCI_PATH: 184 DtCompilePciPath (Buffer, Field->Value, Field, ByteLength); 185 break; 186 | |
187 default: 188 DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); 189 break; 190 } 191} 192 193 194/****************************************************************************** --- 25 unchanged lines hidden (view full) --- 220 221 if (Length > ByteLength) 222 { 223 sprintf (MsgBuffer, "Maximum %u characters", ByteLength); 224 DtError (ASL_ERROR, ASL_MSG_STRING_LENGTH, Field, MsgBuffer); 225 Length = ByteLength; 226 } 227 | 177 default: 178 DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); 179 break; 180 } 181} 182 183 184/****************************************************************************** --- 25 unchanged lines hidden (view full) --- 210 211 if (Length > ByteLength) 212 { 213 sprintf (MsgBuffer, "Maximum %u characters", ByteLength); 214 DtError (ASL_ERROR, ASL_MSG_STRING_LENGTH, Field, MsgBuffer); 215 Length = ByteLength; 216 } 217 |
228 /* If input string is shorter than ByteLength, pad with blanks */ 229 230 ACPI_MEMSET (Buffer, 0x20, ByteLength); | |
231 ACPI_MEMCPY (Buffer, Field->Value, Length); 232} 233 234 235/****************************************************************************** 236 * 237 * FUNCTION: DtCompileInteger 238 * --- 103 unchanged lines hidden (view full) --- 342Exit: 343 ACPI_MEMCPY (Buffer, &Value, ByteLength); 344 return; 345} 346 347 348/****************************************************************************** 349 * | 218 ACPI_MEMCPY (Buffer, Field->Value, Length); 219} 220 221 222/****************************************************************************** 223 * 224 * FUNCTION: DtCompileInteger 225 * --- 103 unchanged lines hidden (view full) --- 329Exit: 330 ACPI_MEMCPY (Buffer, &Value, ByteLength); 331 return; 332} 333 334 335/****************************************************************************** 336 * |
350 * FUNCTION: DtPciPathToBuffer | 337 * FUNCTION: DtNormalizeBuffer |
351 * | 338 * |
352 * PARAMETERS: PciPath - DMAR "PCI Path" field | 339 * PARAMETERS: Buffer - Input buffer 340 * Count - Output the count of hex number in 341 * the Buffer |
353 * | 342 * |
354 * RETURN: Strings of PCI path | 343 * RETURN: The normalized buffer, freed by caller |
355 * | 344 * |
356 * DESCRIPTION: Remove brackets and comma from DMAR "PCI Path" string, for 357 * example: [1D, 01] ==> 1D 01 | 345 * DESCRIPTION: [1A,2B,3C,4D] or 1A, 2B, 3C, 4D will be normalized 346 * to 1A 2B 3C 4D |
358 * 359 *****************************************************************************/ 360 361static char * | 347 * 348 *****************************************************************************/ 349 350static char * |
362DtPciPathToBuffer ( 363 char *PciPath) | 351DtNormalizeBuffer ( 352 char *Buffer, 353 UINT32 *Count) |
364{ | 354{ |
365 char *Buffer; | 355 char *NewBuffer; 356 char *TmpBuffer; 357 UINT32 BufferCount = 0; 358 BOOLEAN Separator = TRUE; 359 char c; |
366 367 | 360 361 |
368 Buffer = UtLocalCalloc (6); | 362 NewBuffer = UtLocalCalloc (ACPI_STRLEN (Buffer) + 1); 363 TmpBuffer = NewBuffer; |
369 | 364 |
370 Buffer[0] = PciPath[1]; 371 Buffer[1] = PciPath[2]; 372 Buffer[2] = ' '; 373 Buffer[3] = PciPath[5]; 374 Buffer[4] = PciPath[6]; | 365 while ((c = *Buffer++)) 366 { 367 switch (c) 368 { 369 /* Valid separators */ |
375 | 370 |
376 return (Buffer); | 371 case '[': 372 case ']': 373 case ' ': 374 case ',': 375 Separator = TRUE; 376 break; 377 378 default: 379 if (Separator) 380 { 381 /* Insert blank as the standard separator */ 382 383 if (NewBuffer[0]) 384 { 385 *TmpBuffer++ = ' '; 386 BufferCount++; 387 } 388 389 Separator = FALSE; 390 } 391 392 *TmpBuffer++ = c; 393 break; 394 } 395 } 396 397 *Count = BufferCount + 1; 398 return (NewBuffer); |
377} 378 379 380/****************************************************************************** 381 * 382 * FUNCTION: DtCompileBuffer 383 * 384 * PARAMETERS: Buffer - Output buffer --- 17 unchanged lines hidden (view full) --- 402{ 403 ACPI_STATUS Status; 404 char Hex[3]; 405 UINT64 Value; 406 UINT32 i; 407 UINT32 Count; 408 409 | 399} 400 401 402/****************************************************************************** 403 * 404 * FUNCTION: DtCompileBuffer 405 * 406 * PARAMETERS: Buffer - Output buffer --- 17 unchanged lines hidden (view full) --- 424{ 425 ACPI_STATUS Status; 426 char Hex[3]; 427 UINT64 Value; 428 UINT32 i; 429 UINT32 Count; 430 431 |
410 Count = ACPI_STRLEN (StringValue) / 3 + 1; | 432 /* Allow several different types of value separators */ |
411 | 433 |
434 StringValue = DtNormalizeBuffer (StringValue, &Count); 435 |
|
412 Hex[2] = 0; 413 for (i = 0; i < Count; i++) 414 { | 436 Hex[2] = 0; 437 for (i = 0; i < Count; i++) 438 { |
415 Hex[0] = StringValue[0]; 416 Hex[1] = StringValue[1]; | 439 /* Each element of StringValue is three chars */ |
417 | 440 |
441 Hex[0] = StringValue[(3 * i)]; 442 Hex[1] = StringValue[(3 * i) + 1]; 443 |
|
418 /* Convert one hex byte */ 419 420 Value = 0; 421 Status = DtStrtoul64 (Hex, &Value); 422 if (ACPI_FAILURE (Status)) 423 { 424 DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, MsgBuffer); 425 return (ByteLength - Count); 426 } 427 428 Buffer[i] = (UINT8) Value; | 444 /* Convert one hex byte */ 445 446 Value = 0; 447 Status = DtStrtoul64 (Hex, &Value); 448 if (ACPI_FAILURE (Status)) 449 { 450 DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, MsgBuffer); 451 return (ByteLength - Count); 452 } 453 454 Buffer[i] = (UINT8) Value; |
429 StringValue += 3; | |
430 } 431 | 455 } 456 |
457 ACPI_FREE (StringValue); |
|
432 return (ByteLength - Count); 433} 434 435 436/****************************************************************************** 437 * | 458 return (ByteLength - Count); 459} 460 461 462/****************************************************************************** 463 * |
438 * FUNCTION: DtCompilePciPath 439 * 440 * PARAMETERS: Buffer - Output buffer 441 * StringValue - DMAR pci path string 442 * ByteLength - Byte length of DMAR pci path string, 2 443 * 444 * RETURN: None 445 * 446 * DESCRIPTION: Compile DMAR PCI path string to binary 447 * 448 *****************************************************************************/ 449 450static void 451DtCompilePciPath ( 452 UINT8 *Buffer, 453 char *StringValue, 454 DT_FIELD *Field, 455 UINT32 ByteLength) 456{ 457 char *PciPathBuffer; 458 459 460 /* Parse path to simple hex digits, then convert to binary */ 461 462 PciPathBuffer = DtPciPathToBuffer (StringValue); 463 464 DtCompileBuffer (Buffer, PciPathBuffer, Field, ByteLength); 465 ACPI_FREE (PciPathBuffer); 466} 467 468 469/****************************************************************************** 470 * | |
471 * FUNCTION: DtCompileFlag 472 * 473 * PARAMETERS: Buffer - Output buffer 474 * Field - Field to be compiled 475 * Info - Flag info | 464 * FUNCTION: DtCompileFlag 465 * 466 * PARAMETERS: Buffer - Output buffer 467 * Field - Field to be compiled 468 * Info - Flag info |
476 * BitPosition - Flag bit position | |
477 * | 469 * |
478 * RETURN: Next flag bit position | 470 * RETURN: |
479 * 480 * DESCRIPTION: Compile a flag 481 * 482 *****************************************************************************/ 483 | 471 * 472 * DESCRIPTION: Compile a flag 473 * 474 *****************************************************************************/ 475 |
484UINT32 | 476void |
485DtCompileFlag ( 486 UINT8 *Buffer, 487 DT_FIELD *Field, | 477DtCompileFlag ( 478 UINT8 *Buffer, 479 DT_FIELD *Field, |
488 ACPI_DMTABLE_INFO *Info, 489 UINT32 BitPosition) | 480 ACPI_DMTABLE_INFO *Info) |
490{ 491 UINT64 Value = 0; 492 UINT32 BitLength = 1; | 481{ 482 UINT64 Value = 0; 483 UINT32 BitLength = 1; |
484 UINT8 BitPosition = 0; |
|
493 ACPI_STATUS Status; 494 495 496 Status = DtStrtoul64 (Field->Value, &Value); 497 if (ACPI_FAILURE (Status)) 498 { 499 DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL); 500 } --- 4 unchanged lines hidden (view full) --- 505 case ACPI_DMT_FLAG1: 506 case ACPI_DMT_FLAG2: 507 case ACPI_DMT_FLAG3: 508 case ACPI_DMT_FLAG4: 509 case ACPI_DMT_FLAG5: 510 case ACPI_DMT_FLAG6: 511 case ACPI_DMT_FLAG7: 512 | 485 ACPI_STATUS Status; 486 487 488 Status = DtStrtoul64 (Field->Value, &Value); 489 if (ACPI_FAILURE (Status)) 490 { 491 DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL); 492 } --- 4 unchanged lines hidden (view full) --- 497 case ACPI_DMT_FLAG1: 498 case ACPI_DMT_FLAG2: 499 case ACPI_DMT_FLAG3: 500 case ACPI_DMT_FLAG4: 501 case ACPI_DMT_FLAG5: 502 case ACPI_DMT_FLAG6: 503 case ACPI_DMT_FLAG7: 504 |
505 BitPosition = Info->Opcode; |
|
513 BitLength = 1; 514 break; 515 516 case ACPI_DMT_FLAGS0: | 506 BitLength = 1; 507 break; 508 509 case ACPI_DMT_FLAGS0: |
510 511 BitPosition = 0; 512 BitLength = 2; 513 break; 514 515 |
|
517 case ACPI_DMT_FLAGS2: 518 | 516 case ACPI_DMT_FLAGS2: 517 |
518 BitPosition = 2; |
|
519 BitLength = 2; 520 break; 521 522 default: 523 524 DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode"); 525 break; 526 } 527 528 /* Check range of the input flag value */ 529 530 if (Value >= ((UINT64) 1 << BitLength)) 531 { 532 sprintf (MsgBuffer, "Maximum %u bit", BitLength); 533 DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, MsgBuffer); 534 Value = 0; 535 } 536 | 519 BitLength = 2; 520 break; 521 522 default: 523 524 DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode"); 525 break; 526 } 527 528 /* Check range of the input flag value */ 529 530 if (Value >= ((UINT64) 1 << BitLength)) 531 { 532 sprintf (MsgBuffer, "Maximum %u bit", BitLength); 533 DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, MsgBuffer); 534 Value = 0; 535 } 536 |
537 /* Insert the flag, return next flag bit position */ 538 539 Buffer += ACPI_DIV_8 (BitPosition); 540 *Buffer |= (UINT8) (Value << ACPI_MOD_8 (BitPosition)); 541 542 return (BitPosition + BitLength); | 537 *Buffer |= (UINT8) (Value << BitPosition); |
543} | 538} |