Date: Thu, 31 Aug 2017 22:47:04 +0000 (UTC) From: Jung-uk Kim <jkim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r323076 - in head: sys/conf sys/contrib/dev/acpica sys/contrib/dev/acpica/common sys/contrib/dev/acpica/compiler sys/contrib/dev/acpica/components/debugger sys/contrib/dev/acpica/compon... Message-ID: <201708312247.v7VMl48i063322@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jkim Date: Thu Aug 31 22:47:04 2017 New Revision: 323076 URL: https://svnweb.freebsd.org/changeset/base/323076 Log: Merge ACPICA 20170831. Added: head/sys/contrib/dev/acpica/components/utilities/utstrsuppt.c - copied, changed from r323060, vendor-sys/acpica/dist/source/components/utilities/utstrsuppt.c Modified: head/sys/conf/files head/sys/contrib/dev/acpica/changes.txt head/sys/contrib/dev/acpica/common/dmtbinfo.c head/sys/contrib/dev/acpica/compiler/aslcompiler.h head/sys/contrib/dev/acpica/compiler/aslcompiler.l head/sys/contrib/dev/acpica/compiler/asldebug.c head/sys/contrib/dev/acpica/compiler/aslerror.c head/sys/contrib/dev/acpica/compiler/aslhelp.c head/sys/contrib/dev/acpica/compiler/aslmain.c head/sys/contrib/dev/acpica/compiler/aslmessages.c head/sys/contrib/dev/acpica/compiler/aslmessages.h head/sys/contrib/dev/acpica/compiler/aslresource.c head/sys/contrib/dev/acpica/compiler/aslrules.y head/sys/contrib/dev/acpica/compiler/asltree.c head/sys/contrib/dev/acpica/compiler/aslutils.c head/sys/contrib/dev/acpica/compiler/dtcompile.c head/sys/contrib/dev/acpica/compiler/dtcompiler.h head/sys/contrib/dev/acpica/compiler/dtfield.c head/sys/contrib/dev/acpica/compiler/dtparser.y head/sys/contrib/dev/acpica/compiler/dtutils.c head/sys/contrib/dev/acpica/compiler/prparser.y head/sys/contrib/dev/acpica/components/debugger/dbconvert.c head/sys/contrib/dev/acpica/components/disassembler/dmresrc.c head/sys/contrib/dev/acpica/components/dispatcher/dswexec.c head/sys/contrib/dev/acpica/components/events/evgpe.c head/sys/contrib/dev/acpica/components/executer/exconcat.c head/sys/contrib/dev/acpica/components/executer/exconvrt.c head/sys/contrib/dev/acpica/components/executer/exmisc.c head/sys/contrib/dev/acpica/components/executer/exresop.c head/sys/contrib/dev/acpica/components/hardware/hwgpe.c head/sys/contrib/dev/acpica/components/hardware/hwregs.c head/sys/contrib/dev/acpica/components/hardware/hwtimer.c head/sys/contrib/dev/acpica/components/hardware/hwxface.c head/sys/contrib/dev/acpica/components/namespace/nsconvert.c head/sys/contrib/dev/acpica/components/tables/tbxface.c head/sys/contrib/dev/acpica/components/utilities/utstrtoul64.c head/sys/contrib/dev/acpica/include/acexcep.h head/sys/contrib/dev/acpica/include/achware.h head/sys/contrib/dev/acpica/include/acinterp.h head/sys/contrib/dev/acpica/include/acpixf.h head/sys/contrib/dev/acpica/include/actbl1.h head/sys/contrib/dev/acpica/include/actbl2.h head/sys/contrib/dev/acpica/include/acutils.h head/sys/dev/acpica/acpi_cpu.c head/usr.sbin/acpi/acpidb/Makefile head/usr.sbin/acpi/iasl/Makefile Directory Properties: head/sys/contrib/dev/acpica/ (props changed) Modified: head/sys/conf/files ============================================================================== --- head/sys/conf/files Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/conf/files Thu Aug 31 22:47:04 2017 (r323076) @@ -497,6 +497,7 @@ contrib/dev/acpica/components/utilities/utresdecode.c contrib/dev/acpica/components/utilities/utresrc.c optional acpi contrib/dev/acpica/components/utilities/utstate.c optional acpi contrib/dev/acpica/components/utilities/utstring.c optional acpi +contrib/dev/acpica/components/utilities/utstrsuppt.c optional acpi contrib/dev/acpica/components/utilities/utstrtoul64.c optional acpi contrib/dev/acpica/components/utilities/utuuid.c optional acpi acpi_debug contrib/dev/acpica/components/utilities/utxface.c optional acpi Modified: head/sys/contrib/dev/acpica/changes.txt ============================================================================== --- head/sys/contrib/dev/acpica/changes.txt Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/changes.txt Thu Aug 31 22:47:04 2017 (r323076) @@ -1,4 +1,53 @@ ---------------------------------------- +31 August 2017. Summary of changes for version 20170831: + + +1) ACPICA kernel-resident subsystem: + +Implemented internal support for full 64-bit addresses that appear in all +Generic Address Structure (GAS) structures. Previously, only the lower 32 +bits were used. Affects the use of GAS structures in the FADT and other +tables, as well as the GAS structures passed to the AcpiRead and +AcpiWrite public external interfaces that are used by drivers. Lv Zheng. + +Added header support for the PDTT ACPI table (Processor Debug Trigger +Table). Full support in the iASL Data Table Compiler and disassembler is +forthcoming. + + +2) iASL Compiler/Disassembler and Tools: + +iASL/Disassembler: Fixed a problem with the PPTT ACPI table (Processor +Properties Topology Table) where a flag bit was specified in the wrong +bit position ("Line Size Valid", bit 6). + +iASL: Implemented support for Octal integer constants as defined by the +ASL language grammar, per the ACPI specification. Any integer constant +that starts with a zero is an octal constant. For example, + Store (037777, Local0) /* Octal constant */ + Store (0x3FFF, Local0) /* Hex equivalent */ + Store (16383, Local0) /* Decimal equivalent */ + +iASL: Improved overflow detection for 64-bit string conversions during +compilation of integer constants. "Overflow" in this case means a string +that represents an integer that is too large to fit into a 64-bit value. +Any 64-bit constants within a 32-bit DSDT or SSDT are still truncated to +the low-order 32 bits with a warning, as previously implemented. Several +new exceptions are defined that indicate a 64-bit overflow, as well as +the base (radix) that was used during the attempted conversion. Examples: + Local0 = 0xAAAABBBBCCCCDDDDEEEEFFFF // AE_HEX_OVERFLOW + Local0 = 01111222233334444555566667777 // AE_OCTAL_OVERFLOW + Local0 = 11112222333344445555666677778888 // AE_DECIMAL_OVERFLOW + +iASL: Added a warning for the case where a ResourceTemplate is declared +with no ResourceDescriptor entries (coded as "ResourceTemplate(){}"). In +this case, the resulting template is created with a single END_TAG +descriptor, which is essentially useless. + +iASL: Expanded the -vw option (ignore specific warnings/remarks) to +include compilation error codes as well. + +---------------------------------------- 28 July 2017. Summary of changes for version 20170728: Modified: head/sys/contrib/dev/acpica/common/dmtbinfo.c ============================================================================== --- head/sys/contrib/dev/acpica/common/dmtbinfo.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/common/dmtbinfo.c Thu Aug 31 22:47:04 2017 (r323076) @@ -2828,7 +2828,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPptt1[] = {ACPI_DMT_FLAG3, ACPI_PPTT1_FLAG_OFFSET (Flags,0), "Allocation Type valid", 0}, {ACPI_DMT_FLAG4, ACPI_PPTT1_FLAG_OFFSET (Flags,0), "Cache Type valid", 0}, {ACPI_DMT_FLAG5, ACPI_PPTT1_FLAG_OFFSET (Flags,0), "Write Policy valid", 0}, - {ACPI_DMT_FLAG5, ACPI_PPTT1_FLAG_OFFSET (Flags,0), "Line Size valid", 0}, + {ACPI_DMT_FLAG6, ACPI_PPTT1_FLAG_OFFSET (Flags,0), "Line Size valid", 0}, {ACPI_DMT_UINT32, ACPI_PPTT1_OFFSET (NextLevelOfCache), "Next Level of Cache", 0}, {ACPI_DMT_UINT32, ACPI_PPTT1_OFFSET (Size), "Size", 0}, {ACPI_DMT_UINT32, ACPI_PPTT1_OFFSET (NumberOfSets), "Number of Sets", 0}, Modified: head/sys/contrib/dev/acpica/compiler/aslcompiler.h ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslcompiler.h Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslcompiler.h Thu Aug 31 22:47:04 2017 (r323076) @@ -890,6 +890,11 @@ void TrSetOpCurrentFilename ( ACPI_PARSE_OBJECT *Op); +void +TrSetOpIntegerWidth ( + ACPI_PARSE_OBJECT *TableSignature, + ACPI_PARSE_OBJECT *Revision); + ACPI_PARSE_OBJECT * TrLinkOpChildren ( ACPI_PARSE_OBJECT *Op, Modified: head/sys/contrib/dev/acpica/compiler/aslcompiler.l ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslcompiler.l Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslcompiler.l Thu Aug 31 22:47:04 2017 (r323076) @@ -195,6 +195,7 @@ count (int type); LeadNameChar [A-Za-z_] DigitChar [0-9] +OctalChar [0-7] HexDigitChar [A-Fa-f0-9] RootChar [\\] Nothing [] @@ -278,8 +279,7 @@ NamePathTail [.]{NameSeg} /* * Begin standard ASL grammar */ -0[xX]{HexDigitChar}+ | -{DigitChar}+ { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext); +[0-9][a-zA-Z0-9]* { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext); count (1); return (PARSEOP_INTEGER); } "Include" { count (1); return (PARSEOP_INCLUDE); } Modified: head/sys/contrib/dev/acpica/compiler/asldebug.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/asldebug.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/asldebug.c Thu Aug 31 22:47:04 2017 (r323076) @@ -165,7 +165,11 @@ UtDumpParseOpName ( UINT32 Level, UINT32 DataLength); +static char * +UtCreateEscapeSequences ( + char *InString); + /******************************************************************************* * * FUNCTION: CvDbgPrint @@ -272,7 +276,6 @@ UtDumpStringOp ( String = Op->Asl.Value.String; - if (Op->Asl.ParseOpcode != PARSEOP_STRING_LITERAL) { /* @@ -294,10 +297,92 @@ UtDumpStringOp ( return; } + String = UtCreateEscapeSequences (String); + /* Emit the ParseOp name, leaving room for the string */ UtDumpParseOpName (Op, Level, strlen (String)); DbgPrint (ASL_TREE_OUTPUT, "%s", String); +} + + +/******************************************************************************* + * + * FUNCTION: UtCreateEscapeSequences + * + * PARAMETERS: InString - ASCII string to be expanded + * + * RETURN: Expanded string + * + * DESCRIPTION: Expand all non-printable ASCII bytes (0-0x1F) to escape + * sequences. For example, hex 14 becomes \x14 + * + * NOTE: Since this function is used for debug output only, it does + * not attempt to translate into the "known" escape sequences + * such as \a, \f, \t, etc. + * + ******************************************************************************/ + +static char * +UtCreateEscapeSequences ( + char *InString) +{ + char *String = InString; + char *OutString; + char *OutStringPtr; + UINT32 InStringLength = 0; + UINT32 EscapeCount = 0; + + + /* + * Determine up front how many escapes are within the string. + * Obtain the input string length while doing so. + */ + while (*String) + { + if ((*String <= 0x1F) || (*String >= 0x7F)) + { + EscapeCount++; + } + + InStringLength++; + String++; + } + + if (!EscapeCount) + { + return (InString); /* No escapes, nothing to do */ + } + + /* New string buffer, 3 extra chars per escape (4 total) */ + + OutString = UtLocalCalloc (InStringLength + (EscapeCount * 3)); + OutStringPtr = OutString; + + /* Convert non-ascii or non-printable chars to escape sequences */ + + while (*InString) + { + if ((*InString <= 0x1F) || (*InString >= 0x7F)) + { + /* Insert a \x hex escape sequence */ + + OutStringPtr[0] = '\\'; + OutStringPtr[1] = 'x'; + OutStringPtr[2] = AcpiUtHexToAsciiChar (*InString, 4); + OutStringPtr[3] = AcpiUtHexToAsciiChar (*InString, 0); + OutStringPtr += 4; + } + else /* Normal ASCII character */ + { + *OutStringPtr = *InString; + OutStringPtr++; + } + + InString++; + } + + return (OutString); } Modified: head/sys/contrib/dev/acpica/compiler/aslerror.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslerror.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslerror.c Thu Aug 31 22:47:04 2017 (r323076) @@ -757,6 +757,11 @@ AslCommonError ( ASL_ERROR_MSG *Enode; + if (AslIsExceptionIgnored (Level, MessageId)) + { + return; + } + Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG)); if (ExtraMessage) @@ -949,9 +954,9 @@ AslDisableException ( MessageId = (UINT32) strtoul (MessageIdString, NULL, 0); - if ((MessageId < 2000) || (MessageId > 5999)) + if ((MessageId < 2000) || (MessageId > 6999)) { - printf ("\"%s\" is not a valid warning/remark ID\n", + printf ("\"%s\" is not a valid warning/remark/error ID\n", MessageIdString); return (AE_BAD_PARAMETER); } @@ -1050,8 +1055,9 @@ AslIsExceptionDisabled ( case ASL_WARNING: case ASL_REMARK: + case ASL_ERROR: /* - * Ignore this warning/remark if it has been disabled by + * Ignore this error/warning/remark if it has been disabled by * the user (-vw option) */ EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId); @@ -1097,14 +1103,6 @@ AslError ( ACPI_PARSE_OBJECT *Op, char *ExtraMessage) { - - /* Check if user wants to ignore this exception */ - - if (AslIsExceptionIgnored (Level, MessageId)) - { - return; - } - if (Op) { AslCommonError (Level, MessageId, Op->Asl.LineNumber, Modified: head/sys/contrib/dev/acpica/compiler/aslhelp.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslhelp.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslhelp.c Thu Aug 31 22:47:04 2017 (r323076) @@ -203,7 +203,7 @@ Usage ( ACPI_OPTION ("-ve", "Report only errors (ignore warnings and remarks)"); ACPI_OPTION ("-vi", "Less verbose errors and warnings for use with IDEs"); ACPI_OPTION ("-vr", "Disable remarks"); - ACPI_OPTION ("-vw <messageid>", "Disable specific warning or remark"); + ACPI_OPTION ("-vw <messageid>", "Ignore specific error, warning or remark"); ACPI_OPTION ("-vx <messageid>", "Expect a specific warning, remark, or error"); ACPI_OPTION ("-w <1|2|3>", "Set warning reporting level"); ACPI_OPTION ("-we", "Report warnings as errors"); Modified: head/sys/contrib/dev/acpica/compiler/aslmain.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslmain.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslmain.c Thu Aug 31 22:47:04 2017 (r323076) @@ -386,11 +386,11 @@ AslInitialize ( AcpiGbl_DmOpt_Verbose = FALSE; - /* Default integer width is 64 bits */ + /* Default integer width is 32 bits */ - AcpiGbl_IntegerBitWidth = 64; - AcpiGbl_IntegerNybbleWidth = 16; - AcpiGbl_IntegerByteWidth = 8; + AcpiGbl_IntegerBitWidth = 32; + AcpiGbl_IntegerNybbleWidth = 8; + AcpiGbl_IntegerByteWidth = 4; for (i = 0; i < ASL_NUM_FILES; i++) { Modified: head/sys/contrib/dev/acpica/compiler/aslmessages.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslmessages.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslmessages.c Thu Aug 31 22:47:04 2017 (r323076) @@ -238,7 +238,7 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_HID_SUFFIX */ "_HID suffix must be all hex digits", /* ASL_MSG_INCLUDE_FILE_OPEN */ "Could not open include file", /* ASL_MSG_INPUT_FILE_OPEN */ "Could not open input file", -/* ASL_MSG_INTEGER_LENGTH */ "64-bit integer in 32-bit table, truncating (DSDT or SSDT version < 2)", +/* ASL_MSG_INTEGER_LENGTH */ "Truncating 64-bit constant found in 32-bit table", /* ASL_MSG_INTEGER_OPTIMIZATION */ "Integer optimized to single-byte AML opcode", /* ASL_MSG_INTERRUPT_LIST */ "Too many interrupts (16 max)", /* ASL_MSG_INTERRUPT_NUMBER */ "Invalid interrupt number (must be 0-15)", @@ -349,7 +349,8 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_ARG_NOT_USED */ "Method Argument is never used", /* ASL_MSG_CONSTANT_REQUIRED */ "Non-reducible expression", /* ASL_MSG_CROSS_TABLE_SCOPE */ "Illegal open scope on external object from within DSDT", -/* ASL_MSG_EXCEPTION_NOT_RECEIVED */ "Expected remark, warning, or error did not occur. Message ID:" +/* ASL_MSG_EXCEPTION_NOT_RECEIVED */ "Expected remark, warning, or error did not occur. Message ID:", +/* ASL_MSG_NULL_RESOURCE_TEMPLATE */ "Empty Resource Template (END_TAG only)" }; /* Table compiler */ Modified: head/sys/contrib/dev/acpica/compiler/aslmessages.h ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslmessages.h Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslmessages.h Thu Aug 31 22:47:04 2017 (r323076) @@ -352,6 +352,7 @@ typedef enum ASL_MSG_CONSTANT_REQUIRED, ASL_MSG_CROSS_TABLE_SCOPE, ASL_MSG_EXCEPTION_NOT_RECEIVED, + ASL_MSG_NULL_RESOURCE_TEMPLATE, /* These messages are used by the Data Table compiler only */ Modified: head/sys/contrib/dev/acpica/compiler/aslresource.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslresource.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslresource.c Thu Aug 31 22:47:04 2017 (r323076) @@ -1148,6 +1148,14 @@ RsDoResourceTemplate ( DescriptorTypeOp = ASL_GET_PEER_NODE (BufferOp); + /* DEFAULT_ARG indicates null template - ResourceTemplate(){} */ + + if (DescriptorTypeOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) + { + AslError (ASL_WARNING, ASL_MSG_NULL_RESOURCE_TEMPLATE, + DescriptorTypeOp, DescriptorTypeOp->Asl.Value.String); + } + /* * Process all resource descriptors in the list * Note: It is assumed that the EndTag node has been automatically Modified: head/sys/contrib/dev/acpica/compiler/aslrules.y ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslrules.y Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslrules.y Thu Aug 31 22:47:04 2017 (r323076) @@ -199,7 +199,8 @@ DefinitionBlockTerm String ',' String ',' DWordConst - PARSEOP_CLOSE_PAREN {TrSetOpEndLineNumber ($<n>3); COMMENT_CAPTURE_ON;} + PARSEOP_CLOSE_PAREN {TrSetOpIntegerWidth ($6,$8); + TrSetOpEndLineNumber ($<n>3); COMMENT_CAPTURE_ON;} '{' TermList '}' {$$ = TrLinkOpChildren ($<n>3,7, $4,$6,$8,$10,$12,$14,$18);} ; Modified: head/sys/contrib/dev/acpica/compiler/asltree.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/asltree.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/asltree.c Thu Aug 31 22:47:04 2017 (r323076) @@ -378,6 +378,39 @@ TrSetOpCurrentFilename ( /******************************************************************************* * + * FUNCTION: TrSetOpIntegerWidth + * + * PARAMETERS: Op - An existing parse op + * + * RETURN: None + * + * DESCRIPTION: + * + ******************************************************************************/ + +void +TrSetOpIntegerWidth ( + ACPI_PARSE_OBJECT *TableSignatureOp, + ACPI_PARSE_OBJECT *RevisionOp) +{ + + /* TBD: Check table sig? (DSDT vs. SSDT) */ + + /* Handle command-line version override */ + + if (Gbl_RevisionOverride) + { + AcpiUtSetIntegerWidth (Gbl_RevisionOverride); + } + else + { + AcpiUtSetIntegerWidth ((UINT8) RevisionOp->Asl.Value.Integer); + } +} + + +/******************************************************************************* + * * FUNCTION: TrSetOpEndLineNumber * * PARAMETERS: Op - An existing parse op Modified: head/sys/contrib/dev/acpica/compiler/aslutils.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslutils.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/aslutils.c Thu Aug 31 22:47:04 2017 (r323076) @@ -1004,11 +1004,11 @@ UtAttachNamepathToOwner ( * * FUNCTION: UtDoConstant * - * PARAMETERS: String - Hexadecimal or decimal string + * PARAMETERS: String - Hex/Decimal/Octal * * RETURN: Converted Integer * - * DESCRIPTION: Convert a string to an integer, with error checking. + * DESCRIPTION: Convert a string to an integer, with overflow/error checking. * ******************************************************************************/ @@ -1017,17 +1017,20 @@ UtDoConstant ( char *String) { ACPI_STATUS Status; - UINT64 Converted; + UINT64 ConvertedInteger; char ErrBuf[64]; - Status = AcpiUtStrtoul64 (String, ACPI_STRTOUL_64BIT, &Converted); + Status = AcpiUtStrtoul64 (String, &ConvertedInteger); if (ACPI_FAILURE (Status)) { - sprintf (ErrBuf, "%s %s\n", "Conversion error:", + sprintf (ErrBuf, "While creating 64-bit constant: %s\n", AcpiFormatException (Status)); - AslCompilererror (ErrBuf); + + AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber, + Gbl_LogicalLineNumber, Gbl_CurrentLineOffset, + Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename, ErrBuf); } - return (Converted); + return (ConvertedInteger); } Modified: head/sys/contrib/dev/acpica/compiler/dtcompile.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/dtcompile.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/dtcompile.c Thu Aug 31 22:47:04 2017 (r323076) @@ -319,6 +319,8 @@ DtInitialize ( return (Status); } + AcpiUtSetIntegerWidth (2); /* Set width to 64 bits */ + Gbl_FieldList = NULL; Gbl_RootTable = NULL; Gbl_SubtableStack = NULL; Modified: head/sys/contrib/dev/acpica/compiler/dtcompiler.h ============================================================================== --- head/sys/contrib/dev/acpica/compiler/dtcompiler.h Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/dtcompiler.h Thu Aug 31 22:47:04 2017 (r323076) @@ -481,6 +481,10 @@ DtFatal ( DT_FIELD *FieldObject, char *ExtraMessage); +UINT64 +DtDoConstant ( + char *String); + char* DtGetFieldValue ( DT_FIELD *Field); Modified: head/sys/contrib/dev/acpica/compiler/dtfield.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/dtfield.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/dtfield.c Thu Aug 31 22:47:04 2017 (r323076) @@ -628,15 +628,9 @@ DtCompileFlag ( UINT64 Value = 0; UINT32 BitLength = 1; UINT8 BitPosition = 0; - ACPI_STATUS Status; - Status = AcpiUtStrtoul64 (Field->Value, - (ACPI_STRTOUL_64BIT | ACPI_STRTOUL_BASE16), &Value); - if (ACPI_FAILURE (Status)) - { - DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL); - } + Value = AcpiUtImplicitStrtoul64 (Field->Value); switch (Info->Opcode) { Modified: head/sys/contrib/dev/acpica/compiler/dtparser.y ============================================================================== --- head/sys/contrib/dev/acpica/compiler/dtparser.y Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/dtparser.y Thu Aug 31 22:47:04 2017 (r323076) @@ -275,17 +275,24 @@ Expression | EXPOP_LABEL { $$ = DtResolveLabel (DtParsertext);} - /* Default base for a non-prefixed integer is 16 */ + /* + * All constants for the data table compiler are in hex, whether a (optional) 0x + * prefix is present or not. For example, these two input strings are equivalent: + * 1234 + * 0x1234 + */ - | EXPOP_NUMBER { AcpiUtStrtoul64 (DtParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);} + /* Non-prefixed hex number */ + | EXPOP_NUMBER { $$ = DtDoConstant (DtParsertext);} + /* Standard hex number (0x1234) */ - | EXPOP_HEX_NUMBER { AcpiUtStrtoul64 (DtParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);} + | EXPOP_HEX_NUMBER { $$ = DtDoConstant (DtParsertext);} - /* TBD: Decimal number with prefix (0d1234) - Not supported by strtoul64 at this time */ + /* Possible TBD: Decimal number with prefix (0d1234) - Not supported this time */ - | EXPOP_DECIMAL_NUMBER { AcpiUtStrtoul64 (DtParsertext, ACPI_STRTOUL_64BIT, &$$);} + | EXPOP_DECIMAL_NUMBER { $$ = DtDoConstant (DtParsertext);} ; %% Modified: head/sys/contrib/dev/acpica/compiler/dtutils.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/dtutils.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/dtutils.c Thu Aug 31 22:47:04 2017 (r323076) @@ -303,6 +303,38 @@ DtFatal ( } +/******************************************************************************* + * + * FUNCTION: DtDoConstant + * + * PARAMETERS: String - Only hex constants are supported, + * regardless of whether the 0x prefix + * is used + * + * RETURN: Converted Integer + * + * DESCRIPTION: Convert a string to an integer, with overflow/error checking. + * + ******************************************************************************/ + +UINT64 +DtDoConstant ( + char *String) +{ + UINT64 ConvertedInteger; + + + /* + * TBD: The ImplicitStrtoul64 function does not report overflow + * conditions. The input string is simply truncated. If it is + * desired to report overflow to the table compiler, this should + * somehow be added here. Note: integers that are prefixed with 0x + * or not are both hex integers. + */ + ConvertedInteger = AcpiUtImplicitStrtoul64 (String); + return (ConvertedInteger); +} + /****************************************************************************** * * FUNCTION: DtGetFieldValue Modified: head/sys/contrib/dev/acpica/compiler/prparser.y ============================================================================== --- head/sys/contrib/dev/acpica/compiler/prparser.y Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/compiler/prparser.y Thu Aug 31 22:47:04 2017 (r323076) @@ -290,11 +290,11 @@ Expression /* Default base for a non-prefixed integer is 10 */ - | EXPOP_NUMBER { AcpiUtStrtoul64 (PrParsertext, ACPI_STRTOUL_64BIT, &$$);} + | EXPOP_NUMBER { AcpiUtStrtoul64 (PrParsertext, &$$);} /* Standard hex number (0x1234) */ - | EXPOP_HEX_NUMBER { AcpiUtStrtoul64 (PrParsertext, (ACPI_STRTOUL_BASE16 | ACPI_STRTOUL_64BIT), &$$);} + | EXPOP_HEX_NUMBER { AcpiUtStrtoul64 (PrParsertext, &$$);} ; %% Modified: head/sys/contrib/dev/acpica/components/debugger/dbconvert.c ============================================================================== --- head/sys/contrib/dev/acpica/components/debugger/dbconvert.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/debugger/dbconvert.c Thu Aug 31 22:47:04 2017 (r323076) @@ -429,9 +429,7 @@ AcpiDbConvertToObject ( default: Object->Type = ACPI_TYPE_INTEGER; - Status = AcpiUtStrtoul64 (String, - (AcpiGbl_IntegerByteWidth | ACPI_STRTOUL_BASE16), - &Object->Integer.Value); + Status = AcpiUtStrtoul64 (String, &Object->Integer.Value); break; } Modified: head/sys/contrib/dev/acpica/components/disassembler/dmresrc.c ============================================================================== --- head/sys/contrib/dev/acpica/components/disassembler/dmresrc.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/disassembler/dmresrc.c Thu Aug 31 22:47:04 2017 (r323076) @@ -540,6 +540,20 @@ AcpiDmIsResourceTemplate ( BufferLength = NextOp->Common.Value.Size; /* + * Any buffer smaller than one byte cannot possibly be a resource + * template. Two bytes could possibly be a "NULL" resource template + * with a lone end tag descriptor (as generated via + * "ResourceTemplate(){}"), but this would be an extremely unusual + * case, as the template would be essentially useless. The disassembler + * therefore does not recognize any two-byte buffer as a resource + * template. + */ + if (BufferLength <= 2) + { + return (AE_TYPE); + } + + /* * Not a template if declared buffer length != actual length of the * intialization byte list. Because the resource macros will create * a buffer of the exact required length (buffer length will be equal Modified: head/sys/contrib/dev/acpica/components/dispatcher/dswexec.c ============================================================================== --- head/sys/contrib/dev/acpica/components/dispatcher/dswexec.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/dispatcher/dswexec.c Thu Aug 31 22:47:04 2017 (r323076) @@ -253,7 +253,7 @@ AcpiDsGetPredicateValue ( * object. Implicitly convert the argument if necessary. */ Status = AcpiExConvertToInteger (ObjDesc, &LocalObjDesc, - ACPI_STRTOUL_BASE16); + ACPI_IMPLICIT_CONVERSION); if (ACPI_FAILURE (Status)) { goto Cleanup; Modified: head/sys/contrib/dev/acpica/components/events/evgpe.c ============================================================================== --- head/sys/contrib/dev/acpica/components/events/evgpe.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/events/evgpe.c Thu Aug 31 22:47:04 2017 (r323076) @@ -551,8 +551,8 @@ AcpiEvGpeDetect ( ACPI_GPE_HANDLER_INFO *GpeHandlerInfo; UINT32 IntStatus = ACPI_INTERRUPT_NOT_HANDLED; UINT8 EnabledStatusByte; - UINT32 StatusReg; - UINT32 EnableReg; + UINT64 StatusReg; + UINT64 EnableReg; ACPI_CPU_FLAGS Flags; UINT32 i; UINT32 j; @@ -629,7 +629,7 @@ AcpiEvGpeDetect ( "RunEnable=%02X, WakeEnable=%02X\n", GpeRegisterInfo->BaseGpeNumber, GpeRegisterInfo->BaseGpeNumber + (ACPI_GPE_REGISTER_WIDTH - 1), - StatusReg, EnableReg, + (UINT32) StatusReg, (UINT32) EnableReg, GpeRegisterInfo->EnableForRun, GpeRegisterInfo->EnableForWake)); Modified: head/sys/contrib/dev/acpica/components/executer/exconcat.c ============================================================================== --- head/sys/contrib/dev/acpica/components/executer/exconcat.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/executer/exconcat.c Thu Aug 31 22:47:04 2017 (r323076) @@ -274,7 +274,7 @@ AcpiExDoConcatenate ( case ACPI_TYPE_INTEGER: Status = AcpiExConvertToInteger (LocalOperand1, &TempOperand1, - ACPI_STRTOUL_BASE16); + ACPI_IMPLICIT_CONVERSION); break; case ACPI_TYPE_BUFFER: Modified: head/sys/contrib/dev/acpica/components/executer/exconvrt.c ============================================================================== --- head/sys/contrib/dev/acpica/components/executer/exconvrt.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/executer/exconvrt.c Thu Aug 31 22:47:04 2017 (r323076) @@ -172,10 +172,10 @@ AcpiExConvertToAscii ( * * FUNCTION: AcpiExConvertToInteger * - * PARAMETERS: ObjDesc - Object to be converted. Must be an - * Integer, Buffer, or String - * ResultDesc - Where the new Integer object is returned - * Flags - Used for string conversion + * PARAMETERS: ObjDesc - Object to be converted. Must be an + * Integer, Buffer, or String + * ResultDesc - Where the new Integer object is returned + * ImplicitConversion - Used for string conversion * * RETURN: Status * @@ -187,14 +187,13 @@ ACPI_STATUS AcpiExConvertToInteger ( ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT **ResultDesc, - UINT32 Flags) + UINT32 ImplicitConversion) { ACPI_OPERAND_OBJECT *ReturnDesc; UINT8 *Pointer; UINT64 Result; UINT32 i; UINT32 Count; - ACPI_STATUS Status; ACPI_FUNCTION_TRACE_PTR (ExConvertToInteger, ObjDesc); @@ -244,13 +243,18 @@ AcpiExConvertToInteger ( * hexadecimal as per the ACPI specification. The only exception (as * of ACPI 3.0) is that the ToInteger() operator allows both decimal * and hexadecimal strings (hex prefixed with "0x"). + * + * Explicit conversion is used only by ToInteger. + * All other string-to-integer conversions are implicit conversions. */ - Status = AcpiUtStrtoul64 (ACPI_CAST_PTR (char, Pointer), - (AcpiGbl_IntegerByteWidth | Flags), &Result); - if (ACPI_FAILURE (Status)) + if (ImplicitConversion) { - return_ACPI_STATUS (Status); + Result = AcpiUtImplicitStrtoul64 (ACPI_CAST_PTR (char, Pointer)); } + else + { + Result = AcpiUtExplicitStrtoul64 (ACPI_CAST_PTR (char, Pointer)); + } break; case ACPI_TYPE_BUFFER: @@ -792,7 +796,7 @@ AcpiExConvertToTargetType ( * a Buffer or a String to an Integer if necessary. */ Status = AcpiExConvertToInteger (SourceDesc, ResultDesc, - ACPI_STRTOUL_BASE16); + ACPI_IMPLICIT_CONVERSION); break; case ACPI_TYPE_STRING: Modified: head/sys/contrib/dev/acpica/components/executer/exmisc.c ============================================================================== --- head/sys/contrib/dev/acpica/components/executer/exmisc.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/executer/exmisc.c Thu Aug 31 22:47:04 2017 (r323076) @@ -472,7 +472,7 @@ AcpiExDoLogicalOp ( case ACPI_TYPE_INTEGER: Status = AcpiExConvertToInteger (Operand1, &LocalOperand1, - ACPI_STRTOUL_BASE16); + ACPI_IMPLICIT_CONVERSION); break; case ACPI_TYPE_STRING: Modified: head/sys/contrib/dev/acpica/components/executer/exresop.c ============================================================================== --- head/sys/contrib/dev/acpica/components/executer/exresop.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/executer/exresop.c Thu Aug 31 22:47:04 2017 (r323076) @@ -541,7 +541,7 @@ AcpiExResolveOperands ( * Known as "Implicit Source Operand Conversion" */ Status = AcpiExConvertToInteger (ObjDesc, StackPtr, - ACPI_STRTOUL_BASE16); + ACPI_IMPLICIT_CONVERSION); if (ACPI_FAILURE (Status)) { if (Status == AE_TYPE) Modified: head/sys/contrib/dev/acpica/components/hardware/hwgpe.c ============================================================================== --- head/sys/contrib/dev/acpica/components/hardware/hwgpe.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/hardware/hwgpe.c Thu Aug 31 22:47:04 2017 (r323076) @@ -217,7 +217,7 @@ AcpiHwLowSetGpe ( { ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; ACPI_STATUS Status = AE_OK; - UINT32 EnableMask; + UINT64 EnableMask; UINT32 RegisterBit; @@ -342,7 +342,7 @@ AcpiHwGetGpeStatus ( ACPI_GPE_EVENT_INFO *GpeEventInfo, ACPI_EVENT_STATUS *EventStatus) { - UINT32 InByte; + UINT64 InByte; UINT32 RegisterBit; ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; ACPI_EVENT_STATUS LocalEventStatus = 0; Modified: head/sys/contrib/dev/acpica/components/hardware/hwregs.c ============================================================================== --- head/sys/contrib/dev/acpica/components/hardware/hwregs.c Thu Aug 31 21:56:17 2017 (r323075) +++ head/sys/contrib/dev/acpica/components/hardware/hwregs.c Thu Aug 31 22:47:04 2017 (r323076) @@ -355,9 +355,8 @@ AcpiHwValidateRegister ( * * RETURN: Status * - * DESCRIPTION: Read from either memory or IO space. This is a 32-bit max - * version of AcpiRead, used internally since the overhead of - * 64-bit values is not needed. + * DESCRIPTION: Read from either memory or IO space. This is a 64-bit max + * version of AcpiRead. * * LIMITATIONS: <These limitations also apply to AcpiHwWrite> * SpaceID must be SystemMemory or SystemIO. @@ -366,7 +365,7 @@ AcpiHwValidateRegister ( ACPI_STATUS AcpiHwRead ( - UINT32 *Value, + UINT64 *Value, ACPI_GENERIC_ADDRESS *Reg) { UINT64 Address; @@ -384,18 +383,18 @@ AcpiHwRead ( /* Validate contents of the GAS register */ - Status = AcpiHwValidateRegister (Reg, 32, &Address); + Status = AcpiHwValidateRegister (Reg, 64, &Address); if (ACPI_FAILURE (Status)) { return (Status); } /* - * Initialize entire 32-bit return value to zero, convert AccessWidth + * Initialize entire 64-bit return value to zero, convert AccessWidth * into number of bits based */ *Value = 0; - AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 32); + AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 64); BitWidth = Reg->BitOffset + Reg->BitWidth; BitOffset = Reg->BitOffset; @@ -408,7 +407,7 @@ AcpiHwRead ( { if (BitOffset >= AccessWidth) { - Value32 = 0; + Value64 = 0; BitOffset -= AccessWidth; } else @@ -418,31 +417,31 @@ AcpiHwRead ( Status = AcpiOsReadMemory ((ACPI_PHYSICAL_ADDRESS) Address + Index * ACPI_DIV_8 (AccessWidth), &Value64, AccessWidth); - Value32 = (UINT32) Value64; } else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */ { Status = AcpiHwReadPort ((ACPI_IO_ADDRESS) Address + Index * ACPI_DIV_8 (AccessWidth), &Value32, AccessWidth); + Value64 = (UINT64) Value32; } } /* * Use offset style bit writes because "Index * AccessWidth" is - * ensured to be less than 32-bits by AcpiHwValidateRegister(). + * ensured to be less than 64-bits by AcpiHwValidateRegister(). */ ACPI_SET_BITS (Value, Index * AccessWidth, - ACPI_MASK_BITS_ABOVE_32 (AccessWidth), Value32); + ACPI_MASK_BITS_ABOVE_64 (AccessWidth), Value64); BitWidth -= BitWidth > AccessWidth ? AccessWidth : BitWidth; Index++; } ACPI_DEBUG_PRINT ((ACPI_DB_IO, - "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n", - *Value, AccessWidth, ACPI_FORMAT_UINT64 (Address), - AcpiUtGetRegionName (Reg->SpaceId))); + "Read: %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n", + ACPI_FORMAT_UINT64 (*Value), AccessWidth, + ACPI_FORMAT_UINT64 (Address), AcpiUtGetRegionName (Reg->SpaceId))); return (Status); } @@ -457,15 +456,14 @@ AcpiHwRead ( * * RETURN: Status * - * DESCRIPTION: Write to either memory or IO space. This is a 32-bit max - * version of AcpiWrite, used internally since the overhead of - * 64-bit values is not needed. + * DESCRIPTION: Write to either memory or IO space. This is a 64-bit max + * version of AcpiWrite. * ******************************************************************************/ ACPI_STATUS AcpiHwWrite ( - UINT32 Value, + UINT64 Value, ACPI_GENERIC_ADDRESS *Reg) { UINT64 Address; @@ -473,7 +471,6 @@ AcpiHwWrite ( UINT32 BitWidth; UINT8 BitOffset; UINT64 Value64; - UINT32 Value32; UINT8 Index; ACPI_STATUS Status; @@ -483,7 +480,7 @@ AcpiHwWrite ( /* Validate contents of the GAS register */ - Status = AcpiHwValidateRegister (Reg, 32, &Address); + Status = AcpiHwValidateRegister (Reg, 64, &Address); if (ACPI_FAILURE (Status)) { return (Status); @@ -491,7 +488,7 @@ AcpiHwWrite ( /* Convert AccessWidth into number of bits based */ - AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 32); + AccessWidth = AcpiHwGetAccessBitWidth (Address, Reg, 64); BitWidth = Reg->BitOffset + Reg->BitWidth; BitOffset = Reg->BitOffset; @@ -504,10 +501,10 @@ AcpiHwWrite ( { /* * Use offset style bit reads because "Index * AccessWidth" is - * ensured to be less than 32-bits by AcpiHwValidateRegister(). + * ensured to be less than 64-bits by AcpiHwValidateRegister(). */ - Value32 = ACPI_GET_BITS (&Value, Index * AccessWidth, - ACPI_MASK_BITS_ABOVE_32 (AccessWidth)); + Value64 = ACPI_GET_BITS (&Value, Index * AccessWidth, + ACPI_MASK_BITS_ABOVE_64 (AccessWidth)); if (BitOffset >= AccessWidth) { @@ -517,7 +514,6 @@ AcpiHwWrite ( { if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY) { - Value64 = (UINT64) Value32; Status = AcpiOsWriteMemory ((ACPI_PHYSICAL_ADDRESS) Address + Index * ACPI_DIV_8 (AccessWidth), Value64, AccessWidth); @@ -526,7 +522,7 @@ AcpiHwWrite ( { Status = AcpiHwWritePort ((ACPI_IO_ADDRESS) Address + Index * ACPI_DIV_8 (AccessWidth), - Value32, AccessWidth); + (UINT32) Value64, AccessWidth); } } @@ -539,9 +535,9 @@ AcpiHwWrite ( } ACPI_DEBUG_PRINT ((ACPI_DB_IO, - "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n", - Value, AccessWidth, ACPI_FORMAT_UINT64 (Address), - AcpiUtGetRegionName (Reg->SpaceId))); + "Wrote: %8.8X%8.8X width %2d to %8.8X%8.8X (%s)\n", + ACPI_FORMAT_UINT64 (Value), AccessWidth, + ACPI_FORMAT_UINT64 (Address), AcpiUtGetRegionName (Reg->SpaceId))); return (Status); } @@ -688,6 +684,7 @@ AcpiHwRegisterRead ( UINT32 *ReturnValue) { UINT32 Value = 0; + UINT64 Value64; ACPI_STATUS Status; @@ -726,12 +723,14 @@ AcpiHwRegisterRead ( case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ - Status = AcpiHwRead (&Value, &AcpiGbl_FADT.XPm2ControlBlock); + Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPm2ControlBlock); + Value = (UINT32) Value64; break; case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ - Status = AcpiHwRead (&Value, &AcpiGbl_FADT.XPmTimerBlock); + Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPmTimerBlock); + Value = (UINT32) Value64; break; case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ @@ -749,7 +748,7 @@ AcpiHwRegisterRead ( if (ACPI_SUCCESS (Status)) { - *ReturnValue = Value; + *ReturnValue = (UINT32) Value; } return_ACPI_STATUS (Status); @@ -789,6 +788,7 @@ AcpiHwRegisterWrite ( { ACPI_STATUS Status; UINT32 ReadValue; + UINT64 ReadValue64; ACPI_FUNCTION_TRACE (HwRegisterWrite); @@ -850,11 +850,12 @@ AcpiHwRegisterWrite ( * For control registers, all reserved bits must be preserved, * as per the ACPI spec. */ - Status = AcpiHwRead (&ReadValue, &AcpiGbl_FADT.XPm2ControlBlock); + Status = AcpiHwRead (&ReadValue64, &AcpiGbl_FADT.XPm2ControlBlock); if (ACPI_FAILURE (Status)) *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201708312247.v7VMl48i063322>