From b61377318bec54822e5bf81cb415e47f546ef2a9 Mon Sep 17 00:00:00 2001 From: Al Stone Date: Mar 09 2018 21:29:16 +0000 Subject: Include github patch to make hex header files more usable Signed-off-by: Al Stone --- diff --git a/acpica-tools.spec b/acpica-tools.spec index c1cd0e5..d46c8cf 100644 --- a/acpica-tools.spec +++ b/acpica-tools.spec @@ -39,6 +39,7 @@ Patch12: mips-be-fix.patch Patch13: cve-2017-13693.patch Patch14: cve-2017-13694.patch Patch15: cve-2017-13695.patch +Patch16: add-th-option.patch BuildRequires: bison patchutils flex @@ -104,6 +105,7 @@ gzip -dc %{SOURCE1} | tar -x --strip-components=1 -f - %patch13 -p1 -b .cve-2017-13693 %patch14 -p1 -b .cve-2017-13694 %patch15 -p1 -b .cve-2017-13695 +%patch16 -p1 -b .add-th-option cp -p %{SOURCE2} README.Fedora cp -p %{SOURCE3} iasl.1 @@ -206,7 +208,10 @@ fi github patch to fix the leaks. Resolves BZ#1485348. - CVE-2017-13695: operand cache leak in nseval.c -- applied github patch to fix the leak. Resolves BZ#1485349. -- Security fixes for the CVEs above applied. Closes BZ#1485355. +- Security fixes for the CVEs above applied. Closes BZ#1485355. NOTE: these + patches fix acpica-tools ONLY; the kernel needs to be patch separately. +- Add in option -th that allows one to better name generated hex files, and + clean up the header files generated (applied github patch) * Fri Feb 09 2018 Igor Gnatenko - 20180105-3 - Escape macros in %%changelog diff --git a/add-th-option.patch b/add-th-option.patch new file mode 100644 index 0000000..29951fe --- /dev/null +++ b/add-th-option.patch @@ -0,0 +1,353 @@ +From f0d66bb3979a2bcba84027cb2d09f5de76fec9a4 Mon Sep 17 00:00:00 2001 +From: Sami Mujawar +Date: Fri, 21 Apr 2017 17:07:03 +0100 +Subject: [PATCH] Add support for hex AML C header file generation + +The iAsl compiler provides a list of options to support +'Firmware Support - C Text Output'. + +One of the options, '-tc' supports generation of AML hex +tables in C. This command generates a character array that +represents the AML hex table data. + e.g. unsigned char AmlCode[] = { + // HEX AML data + ... + }; + +However, there is no option to change the name of the +generated character array (AmlCode) in the output hex file. +This limits the ability to reference more than one table from +the firmware code. + +Also, the generated output does not have header file include +guards. This is ideally desired if the hex file is to be +included from a C source file. + +A solution to this is to modify the Hex C output such that +the name of the array is derived from the input file name, +and to add header file include guards. + +To address the above, without breaking existing implementations, +a new option '-th' is introduced in the list of supported +'Firmware Support - C Text Output' commands. This option +generates an AML hex table output in a C header file suitable +for including from a C source file. + +The '-th' option: +1. Uses the input file name as a prefix for the generated + C array name. + e.g. 'unsigned char DadtAmlCode[]' + +2. Adds a header file include guard. + e.g. + #ifndef DSDT_HEX_ + #define DSDT_HEX_ + ... + + unsigned char DadtAmlCode[] = { + // HEX AML data + ... + }; + + #endif // DSDT_HEX_ + + Where Dadt.aml is the input file name. + + Note: The header file include guard uses '_HEX_' + format instead of '_H_' to avoid possible + collision with an existing header guard. + +Signed-off-by: Sami Mujawar +Signed-off-by: Evan Lloyd + +Github-Location: https://github.com/acpica/acpica/pull/368/commits/f0d66bb3979a2bcba84027cb2d09f5de76fec9a4 + +--- + source/compiler/aslcompile.c | 12 +++- + source/compiler/aslglobal.h | 1 + + source/compiler/aslhelp.c | 1 + + source/compiler/aslhex.c | 154 +++++++++++++++++++++++++++++++++++++++++++ + source/compiler/asloptions.c | 5 ++ + source/include/acapps.h | 6 ++ + 6 files changed, 176 insertions(+), 3 deletions(-) + +Index: acpica-unix2-20180209/source/compiler/aslcompile.c +=================================================================== +--- acpica-unix2-20180209.orig/source/compiler/aslcompile.c ++++ acpica-unix2-20180209/source/compiler/aslcompile.c +@@ -436,7 +436,8 @@ AslCompilerSignon ( + Prefix = "; "; + } + else if ((Gbl_HexOutputFlag == HEX_OUTPUT_C) || +- (Gbl_HexOutputFlag == HEX_OUTPUT_ASL)) ++ (Gbl_HexOutputFlag == HEX_OUTPUT_ASL) || ++ (Gbl_HexOutputFlag == HEX_OUTPUT_H)) + { + FlPrintFile (ASL_FILE_HEX_OUTPUT, "/*\n"); + Prefix = " * "; +@@ -471,7 +472,11 @@ AslCompilerSignon ( + /* Compiler signon with copyright */ + + FlPrintFile (FileId, "%s\n", Prefix); +- FlPrintFile (FileId, ACPI_COMMON_HEADER (UtilityName, Prefix)); ++ if (Gbl_HexOutputFlag == HEX_OUTPUT_H) { ++ FlPrintFile (FileId, ACPI_COMMON_HEADER_NO_COPYRIGHT (UtilityName, Prefix)); ++ } else { ++ FlPrintFile (FileId, ACPI_COMMON_HEADER (UtilityName, Prefix)); ++ } + } + + +@@ -513,7 +518,8 @@ AslCompilerFileHeader ( + Prefix = "; "; + } + else if ((Gbl_HexOutputFlag == HEX_OUTPUT_C) || +- (Gbl_HexOutputFlag == HEX_OUTPUT_ASL)) ++ (Gbl_HexOutputFlag == HEX_OUTPUT_ASL) || ++ (Gbl_HexOutputFlag == HEX_OUTPUT_H)) + { + Prefix = " * "; + } +Index: acpica-unix2-20180209/source/compiler/aslglobal.h +=================================================================== +--- acpica-unix2-20180209.orig/source/compiler/aslglobal.h ++++ acpica-unix2-20180209/source/compiler/aslglobal.h +@@ -220,6 +220,7 @@ ASL_EXTERN BOOLEAN ASL_ + #define HEX_OUTPUT_C 1 + #define HEX_OUTPUT_ASM 2 + #define HEX_OUTPUT_ASL 3 ++#define HEX_OUTPUT_H 4 + + ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_HexOutputFlag, HEX_OUTPUT_NONE); + +Index: acpica-unix2-20180209/source/compiler/aslhelp.c +=================================================================== +--- acpica-unix2-20180209.orig/source/compiler/aslhelp.c ++++ acpica-unix2-20180209/source/compiler/aslhelp.c +@@ -121,6 +121,7 @@ Usage ( + + printf ("\nFirmware Support - C Text Output:\n"); + ACPI_OPTION ("-tc", "Create hex AML table in C (*.hex)"); ++ ACPI_OPTION ("-th", "Create hex AML table in C header (*.hex)"); + ACPI_OPTION ("-sc", "Create named hex AML arrays in C (*.c)"); + ACPI_OPTION ("-ic", "Create include file in C for -sc symbols (*.h)"); + ACPI_OPTION ("-so", "Create namespace AML offset table in C (*.offset.h)"); +Index: acpica-unix2-20180209/source/compiler/aslhex.c +=================================================================== +--- acpica-unix2-20180209.orig/source/compiler/aslhex.c ++++ acpica-unix2-20180209/source/compiler/aslhex.c +@@ -46,6 +46,10 @@ + #define _COMPONENT ACPI_COMPILER + ACPI_MODULE_NAME ("ashex") + ++#ifndef PATH_MAX ++#define PATH_MAX 256 ++#endif ++ + /* + * This module emits ASCII hex output files in either C, ASM, or ASL format + */ +@@ -64,6 +68,10 @@ static void + HxDoHexOutputAsm ( + void); + ++static void ++HxDoHexOutputH ( ++ void); ++ + static UINT32 + HxReadAmlOutputFile ( + UINT8 *Buffer); +@@ -104,6 +112,11 @@ HxDoHexOutput ( + HxDoHexOutputAsl (); + break; + ++ case HEX_OUTPUT_H: ++ ++ HxDoHexOutputH (); ++ break; ++ + default: + + /* No other output types supported */ +@@ -233,6 +246,147 @@ HxDoHexOutputC ( + } + + ++/******************************************************************************* ++* ++* FUNCTION: HxDoHexOutputH ++* ++* PARAMETERS: None ++* ++* RETURN: None ++* ++* DESCRIPTION: Create the hex output file. This is the same data as the AML ++* output file, but formatted into hex/ASCII bytes suitable for ++* inclusion into a C source file. ++* ++******************************************************************************/ ++ ++static void ++HxDoHexOutputH ( ++ void) ++{ ++ UINT8 FileData[HEX_TABLE_LINE_SIZE]; ++ UINT32 LineLength; ++ UINT32 Offset = 0; ++ UINT32 AmlFileSize; ++ UINT32 i; ++ UINT32 FileNamePrefixLength; ++ char *DotPosition; ++ char *InputFileName; ++ char *NamePosition; ++ char *FileNameEndPosition; ++ char FileNamePrefix[PATH_MAX]; ++ char FileGuard[PATH_MAX]; ++ ++ /* Get AML size, seek back to start */ ++ ++ AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT); ++ FlSeekFile (ASL_FILE_AML_OUTPUT, 0); ++ ++ /* ++ * Find the filename and use it as a prefix for ++ * the AML code array and the header file guard ++ */ ++ InputFileName = Gbl_Files[ASL_FILE_INPUT].Filename; ++ FileNameEndPosition = InputFileName + strlen (InputFileName); ++ ++ NamePosition = strrchr (InputFileName, '/'); ++ if (NamePosition == NULL) { ++ /* '/' not found. This means the input file name ++ * does not contain the path and is in the current ++ * directory. ++ */ ++ NamePosition = InputFileName; ++ } else { ++ /* '/' was found. So move to the next character ++ * which is the name of the input file. ++ */ ++ NamePosition++; ++ } ++ ++ /* Get the file name without the extension to use ++ * as a prefix. ++ */ ++ DotPosition = strrchr (NamePosition, '.'); ++ if (DotPosition) { ++ /* No dot or suffix */ ++ FileNameEndPosition = DotPosition; ++ } ++ ++ FileNamePrefixLength = FileNameEndPosition - NamePosition; ++ if (FileNamePrefixLength > (PATH_MAX - 1)) { ++ AslError (ASL_ERROR, ASL_MSG_STRING_LENGTH, NULL, ": Input file name too long."); ++ return; ++ } ++ ++ strncpy (FileNamePrefix, NamePosition, FileNamePrefixLength); ++ /* NULL terminate the string */ ++ FileNamePrefix[FileNamePrefixLength] = '\0'; ++ ++ if (strrchr (FileNamePrefix, ' ')) { ++ AslError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, "Input file name has space."); ++ return; ++ } ++ ++ strcpy (FileGuard, FileNamePrefix); ++ AcpiUtStrupr (FileGuard); ++ ++ /* Generate the hex output. */ ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C header code output\n"); ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n", ++ AmlFileSize); ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n"); ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "#ifndef %s_HEX_\n", FileGuard); ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "#define %s_HEX_\n", FileGuard); ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n"); ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char %sAmlCode[] =\n{\n", FileNamePrefix); ++ ++ while (Offset < AmlFileSize) { ++ /* Read enough bytes needed for one output line */ ++ ++ LineLength = HxReadAmlOutputFile (FileData); ++ if (!LineLength) { ++ break; ++ } ++ ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); ++ ++ for (i = 0; i < LineLength; i++) { ++ /* ++ * Print each hex byte. ++ * Add a comma until the very last byte of the AML file ++ * (Some C compilers complain about a trailing comma) ++ */ ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]); ++ if ((Offset + i + 1) < AmlFileSize) { ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, ","); ++ } else { ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); ++ } ++ } ++ ++ /* Add fill spaces if needed for last line */ ++ ++ if (LineLength < HEX_TABLE_LINE_SIZE) { ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s", ++ 5 * (HEX_TABLE_LINE_SIZE - LineLength), " "); ++ } ++ ++ /* Emit the offset and ASCII dump for the entire line */ ++ ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, " /* %8.8X", Offset); ++ LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData); ++ ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n", ++ HEX_TABLE_LINE_SIZE - LineLength + 1, " "); ++ ++ Offset += LineLength; ++ } ++ ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "};\n"); ++ FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n#endif // %s_HEX_\n", FileGuard); ++} ++ ++ + /******************************************************************************* + * + * FUNCTION: HxDoHexOutputAsl +Index: acpica-unix2-20180209/source/compiler/asloptions.c +=================================================================== +--- acpica-unix2-20180209.orig/source/compiler/asloptions.c ++++ acpica-unix2-20180209/source/compiler/asloptions.c +@@ -734,6 +734,11 @@ AslDoOptions ( + Gbl_HexOutputFlag = HEX_OUTPUT_ASL; + break; + ++ case 'h': ++ ++ Gbl_HexOutputFlag = HEX_OUTPUT_H; ++ break; ++ + default: + + printf ("Unknown option: -t%s\n", AcpiGbl_Optarg); +Index: acpica-unix2-20180209/source/include/acapps.h +=================================================================== +--- acpica-unix2-20180209.orig/source/include/acapps.h ++++ acpica-unix2-20180209/source/include/acapps.h +@@ -80,6 +80,12 @@ + Prefix, ACPICA_COPYRIGHT, \ + Prefix + ++#define ACPI_COMMON_HEADER_NO_COPYRIGHT(UtilityName, Prefix) \ ++ "%s%s\n%s%s version %8.8X%s\n%s\n", \ ++ Prefix, ACPICA_NAME, \ ++ Prefix, UtilityName, ((UINT32) ACPI_CA_VERSION), ACPI_WIDTH, \ ++ Prefix ++ + #define ACPI_COMMON_BUILD_TIME \ + "Build date/time: %s %s\n", __DATE__, __TIME__ +