From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from EUR02-AM5-obe.outbound.protection.outlook.com (EUR02-AM5-obe.outbound.protection.outlook.com [40.107.0.40]) by mx.groups.io with SMTP id smtpd.web11.9908.1633702048391218157 for ; Fri, 08 Oct 2021 07:07:28 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=3djhDuof; spf=pass (domain: arm.com, ip: 40.107.0.40, mailfrom: sami.mujawar@arm.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=L9N8BB83rVV7FBSXWWoWOPBmjQ5+2Mhyj0osOGO+qXE=; b=3djhDuofMFybVJKIkkm4HrGKOIaZq6S9pAD2lXdOasbTJNbihAQu2BhJk3q/iV2GVO8havXgfuZkQcxa4Y+wbf7qD/0KKt+MJZavQEzr6pYAJf68kNOZS+MddSGYwKOq3oDtke1c0nIe1nv0yznmZutGdKw+LxwN8hoRumb1B9k= Received: from DU2PR04CA0025.eurprd04.prod.outlook.com (2603:10a6:10:3b::30) by AM0PR08MB4100.eurprd08.prod.outlook.com (2603:10a6:208:130::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.22; Fri, 8 Oct 2021 14:07:25 +0000 Received: from DB5EUR03FT005.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:3b:cafe::21) by DU2PR04CA0025.outlook.office365.com (2603:10a6:10:3b::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.18 via Frontend Transport; Fri, 8 Oct 2021 14:07:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; edk2.groups.io; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;edk2.groups.io; dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DB5EUR03FT005.mail.protection.outlook.com (10.152.20.122) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.18 via Frontend Transport; Fri, 8 Oct 2021 14:07:25 +0000 Received: ("Tessian outbound d5def7722ff7:v103"); Fri, 08 Oct 2021 14:07:25 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 898ee0ae36e1492b X-CR-MTA-TID: 64aa7808 Received: from 081f7375d1b2.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 4F90B619-9DF6-49BB-970A-26982297B55C.1; Fri, 08 Oct 2021 14:07:18 +0000 Received: from EUR05-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 081f7375d1b2.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 08 Oct 2021 14:07:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bSsfOZUWC5TTOzYediHBtZsMwHQBkeio0MPuD9e0J+zXWuS5aXF2ftUOYh+aQX3/SJQXKjNK561liY+XagAdYMQpBteRcmHGX+DSvpqCWp1H1Bndeaj+en3MkZ1nKWL8Y55tTHMrGY+e2qj5P5MFmkNnx2Bwoe/zS4T74rkfwoP3FYzNbZVQnSW+2jujpwcHyvePwSczviZE1/1VBwyHyZOVZqcsQ5H3ycA5wIIcAJJlTGNEwMCyXMNKKIgSxYI3pJb/yv1yyvVpankM7J0+lEqO37NDy8Pl0sLiz9MHnTfoaCl8K+94voqpuPLB4Znu1gOJcTwi3rtnwFdObdXcFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=L9N8BB83rVV7FBSXWWoWOPBmjQ5+2Mhyj0osOGO+qXE=; b=N5k9TaceQ3XY7QL0G7h+I+fA0CAMwnimpDpo4ArYPgoEZj6A/8fwFeitcEg4lB8rS8TLH9GYY+O6rYdt1TtqomIgmQMK79nZRaJh9S5CdfIN9WFHZvlBZc4w8B+ZEnkQ0rKk9qtwNCi8xJ7IPK9mfT4doaiwZkyFdDaQX3NIzQ8dHWwibHZjLjp7uOUkJfC0KZ+J45k76mhIks8sqMNW2UV4K1smYOWtuaF4WDUZ/iP6nuN5HnVPWfpXsyyrtAjwfrFZ8dz1tyAtD8Bc6Kc5Z3cFUL3kyBkVykU9CUZcXlBIX13ibByTKPMPr5msJ1as6xgjKNkJNVtNm6MaxalrdA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=L9N8BB83rVV7FBSXWWoWOPBmjQ5+2Mhyj0osOGO+qXE=; b=3djhDuofMFybVJKIkkm4HrGKOIaZq6S9pAD2lXdOasbTJNbihAQu2BhJk3q/iV2GVO8havXgfuZkQcxa4Y+wbf7qD/0KKt+MJZavQEzr6pYAJf68kNOZS+MddSGYwKOq3oDtke1c0nIe1nv0yznmZutGdKw+LxwN8hoRumb1B9k= Authentication-Results-Original: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=arm.com; Received: from AS8PR08MB6806.eurprd08.prod.outlook.com (2603:10a6:20b:39b::12) by AM6PR08MB3383.eurprd08.prod.outlook.com (2603:10a6:20b:50::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4566.22; Fri, 8 Oct 2021 14:07:17 +0000 Received: from AS8PR08MB6806.eurprd08.prod.outlook.com ([fe80::54b5:239d:9896:ee65]) by AS8PR08MB6806.eurprd08.prod.outlook.com ([fe80::54b5:239d:9896:ee65%4]) with mapi id 15.20.4587.022; Fri, 8 Oct 2021 14:07:17 +0000 Subject: Re: [PATCH v2 15/21] DynamicTablesPkg: AML code generation for a Method To: Pierre.Gondois@arm.com, devel@edk2.groups.io, Alexei.Fedorov@arm.com, nd References: <20211007153210.26608-1-Pierre.Gondois@arm.com> <20211007153210.26608-16-Pierre.Gondois@arm.com> From: "Sami Mujawar" Message-ID: <63792fad-f5fd-7b9a-d8a2-3cb5e8f2544e@arm.com> Date: Fri, 8 Oct 2021 15:07:23 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.0.1 In-Reply-To: <20211007153210.26608-16-Pierre.Gondois@arm.com> X-ClientProxiedBy: LO2P265CA0159.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9::27) To AS8PR08MB6806.eurprd08.prod.outlook.com (2603:10a6:20b:39b::12) MIME-Version: 1.0 Received: from [10.1.196.43] (217.140.106.52) by LO2P265CA0159.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4566.15 via Frontend Transport; Fri, 8 Oct 2021 14:07:16 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 77fb6833-2daa-4696-d603-08d98a64f4b6 X-MS-TrafficTypeDiagnostic: AM6PR08MB3383:|AM0PR08MB4100: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:7691;OLM:8882; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: lHYBTo1VwdLqwerWBnpA5YPKqGnHlTyTVQ3iCndvPdjonZLqfGZJKnx7w6LmwT7PKTqU8+6u4pqo1PLqXGHRSbrBpw/tFd3IfYGyfaLP7E874n5jPebaRl9H4knGimM954b6c+STS0tB4YBqeZKwUF1WMLtWAu6tZ2l99uvpvQ3KKmaIlpZkMNeCTKB7NxXxgU8Udiy5FUXeAhyt9lTUz7OQtJdiHbTQyk3hnqym40ISWLK4HC68DbWGaZ7QRWCr4JR3giSS5M3LHgBtaQlQScd0V7ZMlgu0UoKDtqJ96oH+ChDACMZjclm10GCafLQoeNYvw/llM3d18LUEwnlHkZ4Q8MjKTKJYIhOIn21RA2pgCCP0ZWLqb88pz+IRtPPQ/d0iS7tnAkFDDmRzeGFol8LmUqPg1bndqB2TrYltJ4cps+JkLo1jEDsMhJRqviyvc7yE1TL67zGkuLOgSeVft8kZ467mYJXtGCFaqijmrIf5zKvF7hu81rH1LuObSZoPaA9jjj7Eond6kbDQL+oR+ij7Uf+3uiWH04lXk5sqqI0IZJLYA3nGUGvtaibh+RfiICC6P6XrLc5isl8u+Mc0+g9ZDAKWN9pilyVmFIEFgwdrqAKKn55tlP0eVcTgIYRYxF8iBgbN4O0ruxw4S5pvaam4fLX+Jcrxnik2h5O9v2+W0Se3Jl4qfAKvmxcHIJxKLqiK8Xt0LYjc0E/EvGQhNfOVegPcfAroWpROrahlkei33MN6jOoz9imPH9EmFd690w4VSIo38Rc/OdLwEfDa5A== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR08MB6806.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(8936002)(86362001)(38100700002)(26005)(6862004)(38350700002)(6636002)(44832011)(508600001)(36756003)(53546011)(37006003)(316002)(16576012)(2616005)(66556008)(6486002)(5660300002)(186003)(66476007)(956004)(66946007)(52116002)(2906002)(8676002)(83380400001)(31686004)(31696002)(6666004)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB3383 Original-Authentication-Results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=arm.com; Return-Path: Sami.Mujawar@arm.com X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5EUR03FT005.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 8d06986c-2808-4840-3254-08d98a64ef8e X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 0Fc4So2ZI1FY7WjElkVA3lLtS71LtEaWgrY/dYaaBFuNUpPAtyp0NfaAfx+Bw+LDCmiyWkMwB1iSlQoDOwL1oj4lpiUP9ho93zEdiBWmeG3zNF+18lmtmyTVZP2OfZDNst9ENUy1jFZrEXFYjMX9r0zn4eBiCh+fV4ORks5mk7T8VucWMyHMr/kItAkW07Z7eA0Hj58/LBlbFDZEIm/l/LMXTSq/cN3t6uvk1p51+AHmTNuG3SKg3HLSZjs9DaXlwBA43/QQcfY6tfbXQViS7BCU042FZkISVNW4ij/mDlI16aYZq/8JnjQFV1PqIqPY/Z0Zn4xWM2OKHzcM35x149lThFbdWdjdeuWu7R0m26qcSAf3YQwTYIWnzRp1XTglD32usyt0FxSilLb201ENZV4Cx1UigUvJ946OOLzyQN35xDcCaauVvJXAaKKAP05x9iyqyXj3UFTHWYtIo/2dyG66gepzUYAAfMLLZljfu7T8huIjQzw+Apwd9998ZMMHXG/ApnxM/Bzwsg7RiQ/XrtZkO6McRUSt0SmNW++Rc7AKtgHnOhDO+Xs6DT5E6c15rtdLe7+UJ3HG/kz9bZ9obineKrlIOHeKbKSNN1eWMEzrmF1WE0/OuDkJtVQCJ2RrJCGuGWy7ElnICNT7fUobdPhUsbfdpCJv0GsSCjiz1/E0lhIVMsNGuLu9CZinA+xBxAh6YuHVpaKlJt5X5YVcqppX9Gtf5sEWesGOANXu0vA= X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(4636009)(36840700001)(46966006)(70586007)(82310400003)(6636002)(5660300002)(26005)(2906002)(186003)(6862004)(86362001)(36756003)(8936002)(81166007)(47076005)(336012)(83380400001)(356005)(2616005)(956004)(70206006)(37006003)(16576012)(316002)(31686004)(53546011)(6666004)(6486002)(508600001)(8676002)(44832011)(36860700001)(31696002)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Oct 2021 14:07:25.6541 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 77fb6833-2daa-4696-d603-08d98a64f4b6 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DB5EUR03FT005.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB4100 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Content-Language: en-GB Hi Pierre, Thank you for adding documentation for the steps for generating a Method. Reviewed-by: Sami Mujawar Regards, Sami Mujawar On 07/10/2021 04:32 PM, Pierre.Gondois@arm.com wrote: > From: Pierre Gondois > > Add AmlCodeGenMethod() to generate code for a control method. > > AmlCodeGenMethod ("MET0", 1, TRUE, 3, ParentNode, NewObjectNode) > is equivalent of the following ASL code: > Method(MET0, 1, Serialized, 3) {} > > Signed-off-by: Pierre Gondois > --- > .../Common/AmlLib/CodeGen/AmlCodeGen.c | 184 ++++++++++++++++++ > 1 file changed, 184 insertions(+) > > diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c = b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c > index da80e9d77cc2..dd519bc67007 100644 > --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c > +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c > @@ -970,3 +970,187 @@ error_handler1: > > return Status; > } > + > +/** AML code generation for a Method object node. > + > + AmlCodeGenMethod ("MET0", 1, TRUE, 3, ParentNode, NewObjectNode) is > + equivalent of the following ASL code: > + Method(MET0, 1, Serialized, 3) {} > + > + ACPI 6.4, s20.2.5.2 "Named Objects Encoding": > + DefMethod :=3D MethodOp PkgLength NameString MethodFlags TermList > + MethodOp :=3D 0x14 > + > + The ASL parameters "ReturnType" and "ParameterTypes" are not asked > + in this function. They are optional parameters in ASL. > + > + @param [in] NameString The new Method's name. > + Must be a NULL-terminated ASL NameString > + e.g.: "MET0", "_SB.MET0", etc. > + The input string is copied. > + @param [in] NumArgs Number of arguments. > + Must be 0 <=3D NumArgs <=3D 6. > + @param [in] IsSerialized TRUE is equivalent to Serialized. > + FALSE is equivalent to NotSerialized. > + Default is NotSerialized in ASL spec. > + @param [in] SyncLevel Synchronization level for the method. > + Must be 0 <=3D SyncLevel <=3D 15. > + Default is 0 in ASL. > + @param [in] ParentNode If provided, set ParentNode as the parent > + of the node created. > + @param [out] NewObjectNode If success, contains the created node. > + > + @retval EFI_SUCCESS Success. > + @retval EFI_INVALID_PARAMETER Invalid parameter. > + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > +**/ > +STATIC > +EFI_STATUS > +EFIAPI > +AmlCodeGenMethod ( > + IN CONST CHAR8 * NameString, > + IN UINT8 NumArgs, > + IN BOOLEAN IsSerialized, > + IN UINT8 SyncLevel, > + IN AML_NODE_HEADER * ParentNode, OPTIONAL > + OUT AML_OBJECT_NODE ** NewObjectNode OPTIONAL > + ) > +{ > + EFI_STATUS Status; > + UINT32 PkgLen; > + UINT8 Flags; > + AML_OBJECT_NODE * ObjectNode; > + AML_DATA_NODE * DataNode; > + CHAR8 * AmlNameString; > + UINT32 AmlNameStringSize; > + > + if ((NameString =3D=3D NULL) || > + (NumArgs > 6) || > + (SyncLevel > 15) || > + ((ParentNode =3D=3D NULL) && (NewObjectNode =3D=3D NULL))) { > + ASSERT (0); > + return EFI_INVALID_PARAMETER; > + } > + > + ObjectNode =3D NULL; > + DataNode =3D NULL; > + > + // ACPI 6.4, s20.2.5.2 "Named Objects Encoding": > + // DefMethod :=3D MethodOp PkgLength NameString MethodFlags TermList > + // MethodOp :=3D 0x14 > + // So: > + // 1- Create the NameString > + // 2- Compute the size to write in the PkgLen > + // 3- Create nodes for the NameString and Method object node > + // 4- Set the NameString DataNode as a fixed argument > + // 5- Create and link the MethodFlags node > + > + // 1- Create the NameString > + Status =3D ConvertAslNameToAmlName (NameString, &AmlNameString); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + return Status; > + } > + > + Status =3D AmlGetNameStringSize (AmlNameString, &AmlNameStringSize); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler1; > + } > + > + // 2- Compute the size to write in the PkgLen > + // Add 1 byte (ByteData) for MethodFlags. > + Status =3D AmlComputePkgLength (AmlNameStringSize + 1, &PkgLen); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler1; > + } > + > + // 3- Create nodes for the NameString and Method object node > + Status =3D AmlCreateObjectNode ( > + AmlGetByteEncodingByOpCode (AML_METHOD_OP, 0), > + PkgLen, > + &ObjectNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler1; > + } > + > + Status =3D AmlCreateDataNode ( > + EAmlNodeDataTypeNameString, > + (UINT8*)AmlNameString, > + AmlNameStringSize, > + &DataNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler2; > + } > + > + // 4- Set the NameString DataNode as a fixed argument > + Status =3D AmlSetFixedArgument ( > + ObjectNode, > + EAmlParseIndexTerm0, > + (AML_NODE_HEADER*)DataNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler2; > + } > + > + DataNode =3D NULL; > + > + // 5- Create and link the MethodFlags node > + Flags =3D NumArgs | > + (IsSerialized ? BIT3 : 0) | > + (SyncLevel << 4); > + > + Status =3D AmlCreateDataNode (EAmlNodeDataTypeUInt, &Flags, 1, &DataNo= de); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler2; > + } > + > + Status =3D AmlSetFixedArgument ( > + ObjectNode, > + EAmlParseIndexTerm1, > + (AML_NODE_HEADER*)DataNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler2; > + } > + > + // Data node is attached so set the pointer to > + // NULL to ensure correct error handling. > + DataNode =3D NULL; > + > + Status =3D LinkNode ( > + ObjectNode, > + ParentNode, > + NewObjectNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler2; > + } > + > + // Free AmlNameString before returning as it is copied > + // in the call to AmlCreateDataNode(). > + goto error_handler1; > + > +error_handler2: > + if (ObjectNode !=3D NULL) { > + AmlDeleteTree ((AML_NODE_HEADER*)ObjectNode); > + } > + if (DataNode !=3D NULL) { > + AmlDeleteTree ((AML_NODE_HEADER*)DataNode); > + } > + > +error_handler1: > + if (AmlNameString !=3D NULL) { > + FreePool (AmlNameString); > + } > + return Status; > +} IMPORTANT NOTICE: The contents of this email and any attachments are confid= ential and may also be privileged. If you are not the intended recipient, p= lease notify the sender immediately and do not disclose the contents to any= other person, use it for any purpose, or store or copy the information in = any medium. Thank you.