From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web10.1340.1624926243182584340 for ; Mon, 28 Jun 2021 17:24:03 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=XRqLiorq; spf=pass (domain: intel.com, ip: 192.55.52.151, mailfrom: hao.a.wu@intel.com) X-IronPort-AV: E=McAfee;i="6200,9189,10029"; a="188438447" X-IronPort-AV: E=Sophos;i="5.83,307,1616482800"; d="scan'208";a="188438447" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2021 17:23:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.83,307,1616482800"; d="scan'208";a="489083185" Received: from fmsmsx604.amr.corp.intel.com ([10.18.126.84]) by orsmga001.jf.intel.com with ESMTP; 28 Jun 2021 17:23:56 -0700 Received: from fmsmsx607.amr.corp.intel.com (10.18.126.87) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Mon, 28 Jun 2021 17:23:55 -0700 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx607.amr.corp.intel.com (10.18.126.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4 via Frontend Transport; Mon, 28 Jun 2021 17:23:55 -0700 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.175) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.4; Mon, 28 Jun 2021 17:23:55 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PL3b43NIZI5zYwtubvjJkP8trqKmb7QpGbdobRoNYGmVb2be99AdGveh1m2k17nwWM42Tf2BcujzNLDI7bSQ4+tCOIFbHQ99YAEe8UAAqRNPpTkVv07sZfYrnnArGUpkM3Q94uchuQclVflR/0LND2EiahuO1YMdRdNa25pcz86ATTUkJ+YbQw+5nDsndrGV82iiMflYl4tvxyzDl5eJpFfNzPPiUpnzMJGzGhXI0ag24kc1nl84+x//LOX/AorZ2OIIS4wUJIyAcBopzqTk/P5Fhz6Hh0tyWQKetukD+4QhLHkE6bOYackpVGNklmUb6sByc8QKvpajmKhKVs0q/g== 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-SenderADCheck; bh=w6jbX/0KBZPqC9e9/1M+AxR24i/uYUBHiwyM6DlhIVE=; b=BYkFV6ePT2e2eZdvndbzOTouT4shJiB1Rn/WL8F7ikgToKcytykpWCGE5yQj7CdmKHC0Cho89lR9w8qC4pf2EPsBCO18UodIxxbfYTqhrajFvq86K5QwcUU9bObrcFN5a0QDnhwn064C9mbmmYTLq9Go8DPXHHleldQ4/De7iHIp2ttDAwk0zPLooKiSArbZoxlY/vdnszuoQSyloHKQ4R6tZh1NqBPE/SAoiP002tX9+H5kKj1zC8QtYZggStcB1DEva84XeTiX17KUI/8Bi8m7C7uHj6MeU9WFMMENwoqMic8dgEvUsqjeICCpXdWhQS+4LVV88FDMAg6lyXc9EQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=w6jbX/0KBZPqC9e9/1M+AxR24i/uYUBHiwyM6DlhIVE=; b=XRqLiorqZ5uiL6+/KDmg3BfoWLIOS2w2sA+wGX8hiLE6BdKIAOaZ8HiY9yHKIrCTZYod+y/gKLNAgkqk7cGu6MRzvUsGeRCZUgB1PFuv1xFS5FwaCsg4L+dmfjZYcyUBl9i8YGG4vL9LMRa05dZ1sT5MBSe0X/KSoAJ0BTNxw+Q= Received: from BN8PR11MB3666.namprd11.prod.outlook.com (2603:10b6:408:8c::19) by BN6PR11MB1891.namprd11.prod.outlook.com (2603:10b6:404:107::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.23; Tue, 29 Jun 2021 00:23:54 +0000 Received: from BN8PR11MB3666.namprd11.prod.outlook.com ([fe80::cd58:25ce:5017:619d]) by BN8PR11MB3666.namprd11.prod.outlook.com ([fe80::cd58:25ce:5017:619d%5]) with mapi id 15.20.4264.026; Tue, 29 Jun 2021 00:23:54 +0000 From: "Wu, Hao A" To: "devel@edk2.groups.io" , "Bassa, Damian" CC: "Rusocki, Krzysztof" Subject: Re: [PATCH] MdeModulePkg/RamDiskDxe: RamDisk driver to assign non-zero SPA range index Thread-Topic: [PATCH] MdeModulePkg/RamDiskDxe: RamDisk driver to assign non-zero SPA range index Thread-Index: AddsONUgby5jzvH7RlyOzRrwimnSFAAQ1plA Date: Tue, 29 Jun 2021 00:23:54 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.5.1.3 authentication-results: edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=none action=none header.from=intel.com; x-originating-ip: [192.198.142.16] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: a938af6e-4a3c-4950-a596-08d93a942dbd x-ms-traffictypediagnostic: BN6PR11MB1891: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:6790; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: lmcjS8DHffkC4lu2vKe0gpii7Mu4wu+XKyua8KY0NLWETnrK0qFcxsq9Iw27UEXTneGAK/tgiKN/BSXLh3ZVN/srdj9Tjvwe+UKa4ruYOu9zX8NdGir+6Ee5GhPeVmJV1jc1k2MbRPqGcSAZe8gw2euyHA51+NswfTcX8fRAaUnjUH7PcbUKHpc/xw9SKZC7YDtmd5P6WQjBfalaBrpKojTB8fgZI9q87gVE4t27UllbWJDyju6S/+P61tVzllUJa3C900IHoImJGxdI/2VgRM4/MrnpdDvzz2EIflB8zst7GIXjMt2jFg4wih3kpmqjRO++8H6sHTlPccgARHfFJcNn31gIAtbsvfD65prZGWlQVzxKmmUheGjhdmrbian511yxT/f29MdNzg/RWb+B/gxS7NDWOLHFD7Oss4KflxtBkvOihB9M55h2dfEI1tBt/48Rh41vpz9OaZdhXqHXfRfBLEJFQJ4cyuBUTEwixHw+FR1l2jdIN4vBKl5xv5skvKIpHhZoSte9mC0RaQhF1yBMqd436ubTuHT9HOUK5sAhtbnkHaZNXfSVk4uMkp0lCEYsQ5gS5UEZEa85ESLUB0DXJQEEZLB0fA+ncTEkBltB2f9uOVFHchsDmYS/Y+L2kIZcgNOkiMPYjtvmrYekX7xPQvvQM7u7YG6w+j0DOC7q6P5cRchV9sz8x8HBeVyhDcVo3Ctgp63DEjaxquARs8RF1vg2IcJYE66tPFRVqUC50ycNYb5eEt0isYRrFHufI2vXgATJHXtlvih7QFgdb2c6Fz6HV0Nz+wr4FAMxEadmyjd3bIoSzdKb0U/nTmTVaf7xzU1f8JXn6P70c4hR/nxLlhUncNNqiHModGygilk= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BN8PR11MB3666.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(396003)(376002)(136003)(366004)(39860400002)(346002)(53546011)(6506007)(71200400001)(966005)(83380400001)(76116006)(122000001)(26005)(6636002)(8936002)(7696005)(186003)(478600001)(38100700002)(52536014)(33656002)(5660300002)(55016002)(2906002)(107886003)(8676002)(316002)(66446008)(66946007)(64756008)(110136005)(66556008)(4326008)(66476007)(86362001)(9686003)(44824005);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?3OJRIeEAzYfgnOb99ONBEfhV7PSkUIX21Cq/n2IDa6+VarvW6I7Vr5JqPXuO?= =?us-ascii?Q?0BeDy6ADezmhAF5DPvqzZ+gkhjwNm2/Tbmh8WbyYY3jIfK5Hu9kvSL5WRK+R?= =?us-ascii?Q?bmUIA5OPGe++M1Xw53qOGId+48xfaR+OQyBpNf8/ciZfEJJDtHKVJKjf8BfA?= =?us-ascii?Q?QIn94H4p/IZKLk66V7GDpRfWQ7YVtorR4XO1ImKTyd4776Nl5+XLLBLwBhr+?= =?us-ascii?Q?vhe09i6CQN9OVvrc54c2FmSQVa1L8JBjcRz1A6O7XEVBGqirpSkMuGWpj1v4?= =?us-ascii?Q?cDf/Wae45epARexRwEyPPUej6BtuNDW1GbVrWEyeC8Re6BRfepBQjHlwX0Ai?= =?us-ascii?Q?LLiXDgCdIqbUxEGyWlrDMGHbLqitHZXt8YpQkAu4U5w7klZ1pYJ/gvEcYQR6?= =?us-ascii?Q?Akp/knvHi6w3EePue5SoTX5064EfzC1QueBjKJGweqkhH9TjodsCO7E80blm?= =?us-ascii?Q?cJSNcMaL0q2WrHr2jnfulXfE/ftVS5QBXuKhF/SMq9y6RU6/Wnrh7YEhnO34?= =?us-ascii?Q?IhnhDxUu6tc+TbwC0np9GrMEJETmpovWnhGZXNaWF+9opzm+wZzMrQORqYxg?= =?us-ascii?Q?61xFeJGgI2qvRbThdodpB0y7D6J35FesfQt/97JjuHt1IdaoSHEdrBopWI71?= =?us-ascii?Q?Cf20qok12bNvAKH1KP9+TNyH0tAn10j1Uf76kvZzLR4A7exVmB8mqcUoZDfL?= =?us-ascii?Q?4dqScSBeeGcGG/S+YCBEXd6Ct4Omwd1sEifqvwRaFwKOSAQYomSwzjr85wNM?= =?us-ascii?Q?2HaOxUqazHfvX4hqWeBHJh5FCTLB2fqgGpvfClNEIOATJjWVLKhhD2MGV8P6?= =?us-ascii?Q?FynuM1WAbOKTyE/lnK9735g2wsI3j+dAP2veUC7IWDJbIDOLZJRxoMyieob7?= =?us-ascii?Q?q2JGpZnvJtdwgwee91B7gaxRocPEch6qV365ZyKth8OC7sjhpzFIbUCRJV0F?= =?us-ascii?Q?TSrnt1gSroIxzK9jYVNmqf4LSraoM/TuS6y7VfELVGtv+haXOznv2CZ+sLnq?= =?us-ascii?Q?rrvaHHufUGOszMJ+5do1i5S8byxlxLt1MCYy6P4vSPsg3QDHBrFsMllBiV95?= =?us-ascii?Q?Nx2AQTBkQcjFawRZ97F92HcscIkFLYikqweilsVEAqlQvEj9JSmoF1IYX++V?= =?us-ascii?Q?SV5UGeE62nIRrAWNCCQtUzaZuPqbP2tHcIEezPmCpw5kIuX82EWMUIzjxl4E?= =?us-ascii?Q?1nk36U7OsTSIs30Z8efN3ifxBthiVudLnELH5LLaFlEc1UO1wORQtbxv63Ve?= =?us-ascii?Q?Z80m/0tL5qsWAciKgo2n/Q21RWYxpYBZrP94r6gtmV2kI0s9lzO92nZj85/L?= =?us-ascii?Q?qI/ThY6zEi/57xuqZPZyVtGC?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BN8PR11MB3666.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a938af6e-4a3c-4950-a596-08d93a942dbd X-MS-Exchange-CrossTenant-originalarrivaltime: 29 Jun 2021 00:23:54.4681 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 8QETUoe6sbvYLo+AAnzHVf+ycX477Ql5+PbREv7ezT1MohFzTQXRqqjMF4qStE28C2Ah/W6mdO8qbW+eFl3OKg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR11MB1891 Return-Path: hao.a.wu@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Bassa, > Damian > Sent: Tuesday, June 29, 2021 2:22 AM > To: devel@edk2.groups.io > Cc: Rusocki, Krzysztof > Subject: [edk2-devel] [PATCH] MdeModulePkg/RamDiskDxe: RamDisk driver to > assign non-zero SPA range index >=20 > Driver should not use default zero value to assign SPA range since it is= invalid > value according to ACPI spec. > After the change driver will look for highest index existing in the tabl= e. > If maximum number is already taken it will look for holes in table. Hello Damian Bassa, Thanks a lot for the patch. The reason the current implementation leave the 'SPARangeStructureIndex' f= ield as value 0 for RamDisk is that in Section 5.2.25.2 of the ACPI 6.1 specifi= cation (also applies for ACPI 6.3): |> For Virtual CD Region and Virtual Disk Region (both volatile and persis= tent), |> the following fields - Proximity Domain, SPA Range Structure Index, Fla= gs, and |> Address Range Memory Mapping Attribute, are not relevant and shall be s= et to 0. Assigning a non-zero value proposed in this patch seems not following the = above statement. Best Regards, Hao Wu >=20 > Signed-off-by: Damian Bassa > --- > .../Disk/RamDiskDxe/RamDiskProtocol.c | 131 ++++++++++++++++++ > 1 file changed, 131 insertions(+) >=20 > diff --git a/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskProtocol.c > b/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskProtocol.c > index 4333e00053..b47e3af929 100644 > --- a/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskProtocol.c > +++ b/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskProtocol.c > @@ -116,6 +116,136 @@ RamDiskPublishSsdt ( > return Status; > } >=20 > +/** > + Finds highest Spa Range Index in Nfit table. > + > + @param[in] TableHeader Points to Nfit table. > + > + @retval Index Highest Spa range index > + @retval 0 Free index not found > +**/ > +UINT16 > +GetHighestSpaRangeIndex ( > + VOID *TableHeader > + ) > +{ > + INT32 Length; > + UINT16 HighestIndex; > + > + HighestIndex =3D 0; > + > + EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER *NfitStruct= Header; > + EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE > *SpaRange; > + > + Length =3D ((EFI_ACPI_DESCRIPTION_HEADER *)TableHeader)->Length - > + sizeof (EFI_ACPI_6_1_NVDIMM_FIRMWARE_INTERFACE_TABLE); > + NfitStructHeader =3D (EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER *) > + ((UINT8 *)TableHeader + sizeof > + (EFI_ACPI_6_1_NVDIMM_FIRMWARE_INTERFACE_TABLE)); > + > + while (Length > sizeof(EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER)) { > + if (NfitStructHeader->Length < > sizeof(EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER)) { > + break; > + } > + if ((NfitStructHeader->Type =3D=3D > EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE_TYPE) > && > + (NfitStructHeader->Length >=3D sizeof > (EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE))) { > + SpaRange =3D > (EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE > *)NfitStructHeader; > + if (SpaRange->SPARangeStructureIndex > HighestIndex) { > + HighestIndex =3D SpaRange->SPARangeStructureIndex; > + } > + } > + > + // > + // Move to the header of next NFIT structure. > + // > + Length -=3D NfitStructHeader->Length; > + NfitStructHeader =3D (EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER *) > + ((UINT8 *)NfitStructHeader + > +NfitStructHeader->Length); > + } > + return HighestIndex; > +} > + > +/** > + Finds if Spa range index exists in Nfit table. > + > + @param[in] SpaRangeIndex Number of index to look for. > + @param[in] TableHeader Points to Nfit table. > + > + @retval TRUE Index number already exists in the = table > + @retval FALSE Index number doesn't exist in the t= able > +**/ > +BOOLEAN > +DoesSpaIndexExist ( > + UINT16 SpaRangeIndex, > + VOID *TableHeader > + ) > +{ > + INT32 Length; > + EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER *NfitStruct= Header; > + EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE > *SpaRange; > + > + Length =3D ((EFI_ACPI_DESCRIPTION_HEADER *)TableHeader)->Length - + > + sizeof (EFI_ACPI_6_1_NVDIMM_FIRMWARE_INTERFACE_TABLE); > + NfitStructHeader =3D (EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER *) > + ((UINT8 *)TableHeader + sizeof > + (EFI_ACPI_6_1_NVDIMM_FIRMWARE_INTERFACE_TABLE)); > + > + while (Length > sizeof(EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER)) { > + if (NfitStructHeader->Length < > sizeof(EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER)) { > + break; > + } > + if ((NfitStructHeader->Type =3D=3D > EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE_TYPE) > && > + (NfitStructHeader->Length >=3D sizeof > (EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE))) { > + SpaRange =3D > (EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE > *)NfitStructHeader; > + if (SpaRange->SPARangeStructureIndex =3D=3D SpaRangeIndex) { > + return TRUE; > + } > + } > + > + // > + // Move to the header of next NFIT structure. > + // > + Length -=3D NfitStructHeader->Length; > + NfitStructHeader =3D (EFI_ACPI_6_1_NFIT_STRUCTURE_HEADER *) > + ((UINT8 *)NfitStructHeader + > +NfitStructHeader->Length); > + } > + return FALSE; > +} > + > +/** > + Finds lowest available Spa range index in Nfit table. > + > + @param[in] TableHeader Points to Nfit table. > + > + @retval Index Lowest free Spa range index > + @retval 0 Free index not found > +**/ > +UINT16 > +GetFreeSpaIndex ( > + VOID *TableHeader > + ) > +{ > + UINT16 Index; > + > + Index =3D GetHighestSpaRangeIndex (TableHeader); > + > + // > + // If highest range found is not maximum allowed number use value > +increased by 1 > + // > + if (Index !=3D MAX_UINT16) { > + return Index + 1; > + } > + // > + // If highest possible index value is already used, see if there is > +any that is not taken > + // > + for (Index =3D 1; Index < MAX_UINT16; Index++) > + { > + if (!DoesSpaIndexExist(Index, TableHeader)) { > + return Index; > + } > + } > + DEBUG (( > + EFI_D_ERROR, > + "GetFreeSpaIndex: Nfit index not found, table is full\n" > + )); > + return 0; > +} >=20 > /** > Publish the RAM disk NVDIMM Firmware Interface Table (NFIT) to the AC= PI > @@ -334,6 +464,7 @@ RamDiskPublishNfit ( > SpaRange->Length =3D sizeof > (EFI_ACPI_6_1_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE); > SpaRange->SystemPhysicalAddressRangeBase =3D PrivateData->StartingA= ddr; > SpaRange->SystemPhysicalAddressRangeLength =3D PrivateData->Size; > + SpaRange->SPARangeStructureIndex =3D GetFreeSpaIndex (Nfit); > CopyGuid (&SpaRange->AddressRangeTypeGUID, &PrivateData->TypeGuid); >=20 > Checksum =3D CalculateCheckSum8((UINT8 *)Nfit, NfitHeader= ->Length); > -- > 2.27.0.windows.1 >=20 > Intel Technology Poland sp. z o.o. > ul. Sowackiego 173 | 80-298 Gdask | Sd Rejonowy Gdask Pnoc | VII Wydzia > Gospodarczy Krajowego Rejestru Sdowego - KRS 101882 | NIP 957-07-52-316 = | > Kapita zakadowy 200.000 PLN. > Ta wiadomo wraz z zacznikami jest przeznaczona dla okrelonego adresata i= moe > zawiera informacje poufne. W razie przypadkowego otrzymania tej wiadomoc= i, > prosimy o powiadomienie nadawcy oraz trwae jej usunicie; jakiekolwiek > przegldanie lub rozpowszechnianie jest zabronione. > This e-mail and any attachments may contain confidential material for th= e sole > use of the intended recipient(s). If you are not the intended recipient,= please > contact the sender and delete all copies; any review or distribution by = others is > strictly prohibited. >=20 >=20 >=20 >=20 >=20