static UINT8 AbHexByteToBinary ( char *HexString, char *OutBinary) { UINT8 Local1; UINT8 Local2; if (!UtHexCharToValue (HexString[0], &Local1)) { return (0); } if (!UtHexCharToValue (HexString[1], &Local2)) { return (0); } *OutBinary = (UINT8) ((Local1 << 4) | Local2); return (2); }
static void OpcDoUuId ( ACPI_PARSE_OBJECT *Op) { char *InString; char *Buffer; ACPI_STATUS Status = AE_OK; ACPI_NATIVE_UINT i; ACPI_PARSE_OBJECT *NewOp; InString = (char *) Op->Asl.Value.String; if (ACPI_STRLEN (InString) != 36) { Status = AE_BAD_PARAMETER; } else { /* Check all 36 characters for correct format */ for (i = 0; i < 36; i++) { if ((i == 8) || (i == 13) || (i == 18) || (i == 23)) { if (InString[i] != '-') { Status = AE_BAD_PARAMETER; } } else { if (!isxdigit (InString[i])) { Status = AE_BAD_PARAMETER; } } } } Buffer = UtLocalCalloc (16); if (ACPI_FAILURE (Status)) { AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String); } else for (i = 0; i < 16; i++) { Buffer[i] = (char) (UtHexCharToValue (InString[OpcMapToUUID[i]]) << 4); Buffer[i] |= (char) UtHexCharToValue (InString[OpcMapToUUID[i] + 1]); } /* Change Op to a Buffer */ Op->Asl.ParseOpcode = PARSEOP_BUFFER; Op->Common.AmlOpcode = AML_BUFFER_OP; /* Disable further optimization */ Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; UtSetParseOpName (Op); /* Child node is the buffer length */ NewOp = TrAllocateNode (PARSEOP_INTEGER); NewOp->Asl.AmlOpcode = AML_BYTE_OP; NewOp->Asl.Value.Integer = 16; NewOp->Asl.Parent = Op; Op->Asl.Child = NewOp; Op = NewOp; /* Peer to the child is the raw buffer data */ NewOp = TrAllocateNode (PARSEOP_RAW_DATA); NewOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER; NewOp->Asl.AmlLength = 16; NewOp->Asl.Value.String = (char *) Buffer; NewOp->Asl.Parent = Op->Asl.Parent; Op->Asl.Next = NewOp; }
static void OpcDoEisaId ( ACPI_PARSE_OBJECT *Op) { UINT32 EisaId = 0; UINT32 BigEndianId; char *InString; ACPI_STATUS Status = AE_OK; ACPI_NATIVE_UINT i; InString = (char *) Op->Asl.Value.String; /* * The EISAID string must be exactly 7 characters and of the form * "UUUXXXX" -- 3 uppercase letters and 4 hex digits (e.g., "PNP0001") */ if (ACPI_STRLEN (InString) != 7) { Status = AE_BAD_PARAMETER; } else { /* Check all 7 characters for correct format */ for (i = 0; i < 7; i++) { /* First 3 characters must be uppercase letters */ if (i < 3) { if (!isupper (InString[i])) { Status = AE_BAD_PARAMETER; } } /* Last 4 characters must be hex digits */ else if (!isxdigit (InString[i])) { Status = AE_BAD_PARAMETER; } } } if (ACPI_FAILURE (Status)) { AslError (ASL_ERROR, ASL_MSG_INVALID_EISAID, Op, Op->Asl.Value.String); } else { /* Create ID big-endian first (bits are contiguous) */ BigEndianId = (UINT32) (InString[0] - 0x40) << 26 | (UINT32) (InString[1] - 0x40) << 21 | (UINT32) (InString[2] - 0x40) << 16 | (UtHexCharToValue (InString[3])) << 12 | (UtHexCharToValue (InString[4])) << 8 | (UtHexCharToValue (InString[5])) << 4 | UtHexCharToValue (InString[6]); /* Swap to little-endian to get final ID (see function header) */ EisaId = AcpiUtDwordByteSwap (BigEndianId); } /* * Morph the Op into an integer, regardless of whether there * was an error in the EISAID string */ Op->Asl.Value.Integer = EisaId; Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; Op->Asl.ParseOpcode = PARSEOP_INTEGER; (void) OpcSetOptimalIntegerSize (Op); /* Op is now an integer */ UtSetParseOpName (Op); }