Deleted Added
full compact
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}