From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from EUR01-HE1-obe.outbound.protection.outlook.com (EUR01-HE1-obe.outbound.protection.outlook.com [40.107.13.58]) by mx.groups.io with SMTP id smtpd.web10.1268.1639588766829805626 for ; Wed, 15 Dec 2021 09:19:28 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=VlfjFuLO; spf=pass (domain: arm.com, ip: 40.107.13.58, mailfrom: christopher.jones@arm.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k/FdE+j9LUvDhftsA6bhecykWBx5HldoRIdajXuLAb3l2d7aNz2jQ8lpdVGn1zVuZqAL23EszI+UOPMWTIHeWiRKcnaHVo4DTWFUyowVI+TV82tlgXmsp0DrmVAoucJXDZsrhX4W39sQpodh/0O1AeItSogbazJqEctH/OOXBEe7drqv+1WQ72kN+xb8dGJrypupASxUJicAuCZOsFQHEt8edZfqCinXoRly427KN97SGBXA1YeOzH+aw0usUuhRemYJTlAlxy3iTtKfrBUv0HVx01uI6hOS5Qmh8zcwDTFA9cV5nZuXKlYdBgLOLGncK18ondt+nWIfc9iV2tLkjQ== 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=F0tb1Io5Cp0Vf3rikWBSWFQ3Y+YjZL5r9kmbwhBaoLQ=; b=bWLc1shZZsA5BD7oziumoLtpAfiWY9aVTeWKV4VnzRE/VWy4M/Vd3WZL35r/+xihdbZpFEg7E2lt5jihD5hY2+yR5ppp8V3VF5z4KD35WekEttuWlMgxLp77Im7IUdflbiMhZ8MeGOuwaKiI9q5zrbl21Sw/ymeYZW9QXVa/7hKhkBRas5XB+fAwmJXN1Iyr5RbQcOIwch6KQkz1uiV6cEH+C5eT/K1OcSepcjadu1yPd7xlKDAOT3y2gC5PEfw0n411OSEpdMO8VzNaT6mkYJBcEW1hYJIjMDC61fRJLy7ECc49X75f17+lSIo5lZGCVr0yOMOD5kjVIC3o0RifpA== 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=F0tb1Io5Cp0Vf3rikWBSWFQ3Y+YjZL5r9kmbwhBaoLQ=; b=VlfjFuLOk5GvlJEwTOnQKWTUBo6+2f+xqutgIG64YwLaQxAVs4VMJ356UXMhGkVVwSGMf+mzZWzdxt5DYunnAMgA3E4j0DArL7rCZ7aVFtr5a+NOgKXtHvCHTC+VZCbQTwm3bGvcaIxzKYPR4nPNI4jVaTBBEWva636S/cvDwWE= Received: from VE1PR08MB5758.eurprd08.prod.outlook.com (2603:10a6:800:1a0::11) by VI1PR08MB2926.eurprd08.prod.outlook.com (2603:10a6:802:1f::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4778.16; Wed, 15 Dec 2021 17:19:22 +0000 Received: from VE1PR08MB5758.eurprd08.prod.outlook.com ([fe80::c81e:87f6:288c:db76]) by VE1PR08MB5758.eurprd08.prod.outlook.com ([fe80::c81e:87f6:288c:db76%8]) with mapi id 15.20.4778.018; Wed, 15 Dec 2021 17:19:22 +0000 From: "Chris Jones" To: "devel@edk2.groups.io" CC: "ray.ni@intel.com" , "zhichao.gao@intel.com" , Sami Mujawar , nd Subject: [PATCH v1 1/9] ShellPkg: Add AcpiView validators readme Thread-Topic: [PATCH v1 1/9] ShellPkg: Add AcpiView validators readme Thread-Index: AQHX8cspKsU7Zt/DSk+0q+uznRpL3w== Date: Wed, 15 Dec 2021 17:19:22 +0000 Message-ID: References: <20211215154722.4860-1-christopher.jones@arm.com> In-Reply-To: <20211215154722.4860-1-christopher.jones@arm.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email received-spf: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VE1PR08MB5758.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(508600001)(37630700001)(36756003)(86362001)(2906002)(66446008)(4326008)(5660300002)(8936002)(91956017)(83380400001)(66946007)(76116006)(66556008)(64756008)(66476007)(6916009)(6506007)(71200400001)(316002)(8676002)(54906003)(2616005)(6512007)(26005)(38070700005)(38100700002)(186003)(6486002)(122000001);DIR:OUT;SFP:1101; x-microsoft-antispam: BCL:0; x-ms-exchange-crosstenant-originalarrivaltime: 15 Dec 2021 15:47:55.1307 (UTC) x-ms-exchange-crosstenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d x-ms-exchange-transport-crosstenantheadersstamped: AM0PR08MB3940 x-ms-exchange-crosstenant-fromentityheader: HybridOnPrem x-ms-traffictypediagnostic: AS8PR08MB6136:EE_|AM5EUR03FT029:EE_|AM0PR08MB3940:EE_|VE1PR08MB5758:EE_|VI1PR08MB2926:EE_ x-ms-exchange-crosstenant-network-message-id: e4b0228c-c1bc-4bbc-a575-08d9bfe242b1 x-checkrecipientchecked: true x-eopattributedmessage: 1 x-ms-office365-filtering-correlation-id: bbc8110c-28d5-4e62-1757-08d9bfef0995 x-checkrecipientrouted: true x-ms-oob-tlc-oobclassifiers: OLM:8882;OLM:8882;OLM:8882; x-ms-exchange-crosstenant-originalattributedtenantconnectingip: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] x-cr-mta-tid: 64aa7808 x-forefront-antispam-report-untrusted: CIP:40.67.248.234;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:nebula.arm.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(4636009)(46966006)(36840700001)(40470700001)(36860700001)(4326008)(40460700001)(83380400001)(54906003)(426003)(36756003)(82310400004)(70206006)(70586007)(508600001)(2616005)(6666004)(5660300002)(1076003)(26005)(2906002)(316002)(336012)(47076005)(8676002)(86362001)(186003)(6916009)(356005)(7696005)(8936002)(81166007)(36900700001);DIR:OUT;SFP:1101; x-microsoft-antispam-untrusted: BCL:0; x-microsoft-antispam-message-info-original: f3QjMGD1p9S8ztViJKNl3BbryVX7M+e7DhtWCdAvjcA6/Fm6Lqdn3wD+fLVyjHt9Af+7eFt3I2zIbnrdYSxiRT7xTtVCmnGCHVtXt4RB6zbBx9cSV8L/ktMPRUVP+IkILQyq5RrRYRsCSMHFw9i06C35Jo1p0Siqiuv3pcicyD1stBDb0arz1yf7FKF1EHr5qMteW3k032k1Fr6ccvd/tE4a40MOgSGK0AJFfP6/agcmatP/+fYRUCl4G3mZfXD/ervKjTEQa+gp5vbAH3slDJvBOdtR7Ffl6WGk/0erf4i+j8u63IWaBnPNXKhyn92xxJi/JEy7wTKPLhZpsO85uwQsNWL3lIVNPlz5L+e7XrsOvYadG2h9DJo9QEK1cqCeh522zyxbSeSDR5a1l3j6Ne+7F5j0b5yr4NtGWBpot4T6gXJy4PlLuPxNWMKo+wQQw8f5bsfV8xM1ZU0oNUPQ/rjukPlmolfeXF3+touXQPnSrsayhsCYGxBYf2uwrfKeXp9D8kWDz6S4ylp1q/lgHiH6jYzH0q1j+UEGs8UcaiPMWZa3ViVsrrs2sz2DgILDYxhzkuW6EkOBZsjDzfzyT8/XFtbMPNb1uoZgiA8nUHidW62pJQxZ3nxnxQWD6unS4TpsphWi0QZUBhPTNlr8kfiIlUi7GvNBKqZNl4jfhrN4Uvm95B89y68MstP9w2BnQ9pWMWu1eD/z8lO383OtbMJOgV33wh8gZk/1zKsE+30NmwZCPG9salhI0oWxDl2z6mnNEy0i8QJ1CX+1QYIi5Tz8W7ZCb7bHFZ6lIoXMdP8mymsmguNhp8jvY2JkX+Ugsdsdcu3+mvsNmcQhTPBDHOJpF/N7a2htIGsY3HQLllz6FpNGdhbetmtx0SQcXsm9 x-ms-exchange-transport-crosstenantheadersstripped: AM5EUR03FT029.eop-EUR03.prod.protection.outlook.com x-ms-office365-filtering-correlation-id-prvs: e4b0228c-c1bc-4bbc-a575-08d9bfe242b1 x-ms-exchange-crosstenant-authas: Anonymous x-ms-exchange-crosstenant-authsource: AM5EUR03FT029.eop-EUR03.prod.protection.outlook.com x-microsoft-antispam-message-info: S3KS2/Q+a2OUqEhU5JWi54BYjCa00W5GRK9RlUJMeQ9TiQgZ5kSYm1JSWSiaJ5bYpCRT/XKLuLmUBeSdkxCq47lKmoaU0pY58QPIRhGXFezSngND58Ksrvt/DJea5Rls+6oUS46abJ4LtnL8/6joWjRfSJcy0Rr9RVcXE7J79h1iKvo3skeP42KWBPaO4DbFwNAFRVRpHojTljq3loiN0x3QIvng8iwb4V3tP7nW0PplSMsl05bTwobOTgeJOLpMWD+ZDT4MUSGW3hUhhl8Ekj9qwZbUpA0hvpF0cV2w8HRkS5k1xUeXEQWuAwfbHxRc7kecvtWOIJgepy+Ls9+2/qtOxWgLVXL4F7twlMxEZIiWtItb7Wax1NPD81fC4cBe301wvV5FFAnzzc9ViI4JtBe5LohETc21LFocIdopKkgQ8ILfRe2SWpLscQwSHr7e2dxD3NW/fyhBQN4VG+9CCjArxeBp7wdDNKXxxcMCbc8iugMKfBMCJh4/8VbjuUWLvQ0DH8tmb0YQonhblqiGLkc7esOvO02kpxILm45k6clSXgvQRmKSinl20T0sCynvSomHSwudoN0YdzH2ATMLM6VUl0akkUMcNPu43SUQOke9/1N3omhrfUPGxUEXMRUTVPOH2OunTxRJ1LDuVILd4nyZii5hMVJvoHQooR7iW0hiBPFK2n/ms0PFZ58L1jheQThEhJFYzL14mA5SEszvWJ/H34DjIIUEknZoOeW8TSudeRpjNfNHXDQqiMpitRCQK5J9VaJ397cUCmb5I4fIq/pfZBm7kVk27eTwlf2o/cs= x-mailer: git-send-email 2.17.1 x-cr-mta-cid: 4dd8aad43b30c5e4 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=eBMaIaeGZEja6ZVMlBsrbLfWA2KCIYtP+zA0I4D34ZM=; b=h6boCJgUlrclUd00gBG7ePxr0XKhj7Y4dI7qNTcNmbLPOYlWGW8vcqgMNo3gfW/7e0HpqqcbLhSd5WB98vONjeyBX+rmBQg6du7T8Sex6tZ9XWylrCuhvKM+oM6J2/XkrHf2NmhVbd1ofg0WFqTiNmUhaTx8TsvsDXpHPS/5oAM= suggested_attachment_session_id: 383f4284-fbcd-a1c2-4c93-fd5de0ffddf2 authentication-results: dkim=error (no key for signature) header.d=none;dmarc=none action=none header.from=arm.com; x-microsoft-antispam-prvs: nodisclaimer: true x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?OWPQqAgQMI5gKJSr8oexbXVpwolf+wpd9N0POcNh0uDmDb+STgraLJgGN7?= =?iso-8859-1?Q?7mb8osbZQGTyX+jL7PmASq4SZrixvk8zjHfGiQeFECs5EC1YQO5vSKSdLh?= =?iso-8859-1?Q?qmh2EyStjvKCjfyGSKrMt/QOQu7v/NcWjFiqvrmaZjG+Vt4Uojg6Y0JHJg?= =?iso-8859-1?Q?F0pHCbJTiyzJVDxnHYrPZmtzoSFzI+6KaM8rW8nNT62cH5VpiLnfGmCGlz?= =?iso-8859-1?Q?G39hLk7qQO7sfKs3heKjoPt1r4s7CaHT+MrnTd5aWP61afQiosKSPsNl4Q?= =?iso-8859-1?Q?umZ+1Z2B8iwEDi6YD+U82oZnCic4xThlRk+4dMhdBlpJeQfKli9nQXDV8r?= =?iso-8859-1?Q?BKo5TZ/XF4xSDUNwRSKSBXKsdTXM7BurW7usG/cSLN2cptJXa5RuporE4d?= =?iso-8859-1?Q?wLfR8kBeUH72C9RmGafFYDE51dD/xQGXlH6859kckaVok0Twktpesr86En?= =?iso-8859-1?Q?9HV4yDiwi5ZDaGJH5xItOXvU2C2eO3ENqhyqx0+e1pUB1wur2uJ3oK0mJn?= =?iso-8859-1?Q?dmaMBgynMgyL9Ij0FNNW+ZJaA9+DGnwBeFwCxMi7ftZozUXyYql50LN84W?= =?iso-8859-1?Q?X5wX3AXiTTIqPtRZ41lPEb2mrqrbDCbHBJTQxsMfT8iUV8kMDrUgMIQgd3?= =?iso-8859-1?Q?2aiMiZYwmwZct6pwZVUOj3ZdGwD40JB7oWwyA2RLkchXsdIeEhT+5C/NJp?= =?iso-8859-1?Q?svtxXfpoHKulEzO1SD7to9VpqpLdj9JhrMmO+wHbPyIFgXAEtxboffNZD9?= =?iso-8859-1?Q?4gaY7Le/47Fgfm0xGgIJUqTf2QfmtE0yzgB7Mv9DNGCC8yCtowhM60w/r2?= =?iso-8859-1?Q?Nkpr42qFvAYoLh/3nvsCiIrB/y+43gHd84aUjDB7G+VYqeruho2NSaS7QQ?= =?iso-8859-1?Q?20uRt1eSjGkTvFuuXdmJN31V5z21Thxz9o1UNRw4Hd6EazhH9YAQ9P9aKf?= =?iso-8859-1?Q?7ZFw/thGljXmnjHsUTjCDVLvnuez9FmgN9NB1/FWNaOus0C1GXZoKeuNTR?= =?iso-8859-1?Q?YqaJoflJpPj7TmbVFkWlBlJuU6m3xUZjXTgVnV5RQHU7R6ZmUSOr2yJpTO?= =?iso-8859-1?Q?kCC2wmc79KikU01dNilHU2quq7ZLzlx1vQX25hgmP8sbay7NdAkeKAUqFR?= =?iso-8859-1?Q?ZCF5w1htySR1ir4BLsjqpjnxbDFiEtpuq3ZXkoidcM5x37z2E8/T0EUsAF?= =?iso-8859-1?Q?kUfG90a+Rqjxm/+unFYkchACe37Zp/ASAGM/2+wcwbalVK3aqcs6NKG2dQ?= =?iso-8859-1?Q?RRdSIstxiJ7LSO1AUpQqFft116L4JOcLeU3n4Hg2ZDuMrzJ09C5zs+S8pi?= =?iso-8859-1?Q?h2BE/gJTcL26Aydd2rgFusJCw+yOAfeecXVnC3TufIdYf2el9z8vk4B/b4?= =?iso-8859-1?Q?9bprNMdFrmCSN0V4R6zEUo3WXaGbhr7FgcioVQDvBmeP1wZjlGLJAckUiL?= =?iso-8859-1?Q?jqFwqDhzfRc9WCEoGKkRgSl890p7WF2hh8/5swh3/iPBoaK2EIP+sXuFM+?= =?iso-8859-1?Q?V+hQPdvhvmT4tnjCCXQFDAaWSdHpV6XLZmpM7uCG4KVRBrCXguJWh2FVGo?= =?iso-8859-1?Q?rrfgExFULTbMDvNLa3HnhsReEjf40QjxYK2NNg6s0feE9/jUL/PRMr8crx?= =?iso-8859-1?Q?32206MsDJ2+aj+fGYk8SZBlx2w3yytnXcqWH0B1n4lhwcAlD8Tohq29HPv?= =?iso-8859-1?Q?sYBCn6xJUGZeoAl76rJJJBj1J+qf0GctTWtS03gvMVBNjlkfQKxUS+45JB?= =?iso-8859-1?Q?5TsA=3D=3D?= MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: VE1PR08MB5758.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bbc8110c-28d5-4e62-1757-08d9bfef0995 X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Dec 2021 17:19:22.6509 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 47pMWeoZjyJLDZ24DY+EPqsvx82LGCcP95gZvAcNg2cC0Ojl+hL0bLRIxa0CxKMOD1JF6TYc7XxExagwZzRVfpbG6G4IzyaT7VhzD+WlZp4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB2926 Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-ID: <5471175CEBF9BA4FA5C897CEC45DEB73@eurprd08.prod.outlook.com> Content-Transfer-Encoding: quoted-printable Bugzilla: 3773 (https://bugzilla.tianocore.org/show_bug.cgi?id=3D3773)=0A= =0A= Add readme to explain the function and use of the new AcpiView validator=0A= framework.=0A= =0A= Signed-off-by: Chris Jones =0A= ---=0A= ShellPkg/Library/UefiShellAcpiViewCommandLib/Validators/Readme.md | 113 ++= ++++++++++++++++++=0A= 1 file changed, 113 insertions(+)=0A= =0A= diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Validators/Readme= .md b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Validators/Readme.md=0A= new file mode 100644=0A= index 0000000000000000000000000000000000000000..ed8c29f00a3f99f272654e5dcae= 5d067eae574ed=0A= --- /dev/null=0A= +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Validators/Readme.md=0A= @@ -0,0 +1,113 @@=0A= +# Validators Framework=0A= +=0A= +The validators framework allows for simple and easy post-parsing validatio= n to=0A= +take place. This framework gives AcpiView the ability to perform more comp= lex=0A= +validations by allowing validators access to ACPI data from all parsed tab= les=0A= +at the same time.=0A= +=0A= +This framework is intended to be both generic and extensible to allow anyo= ne to=0A= +create their own validators with minimal changes needed to parsers and the= =0A= +AcpiView internal application code.=0A= +=0A= +## Running ACPI Validators=0A= +=0A= +The ACPI standard validator is always run after the parsing stage in AcpiV= iew.=0A= +Additional validators can also be run by using the command line flag=0A= +`-r ValidatorId`, more information on this flag can be found in the AcpiVi= ew=0A= +help string (`acpiview -?`).=0A= +=0A= +## Cross-table Validations=0A= +=0A= +The validators framework provides the ability to perform more complex=0A= +validations, on ACPI data, than single field validation. By storing the da= ta=0A= +during the parsing stage it can later be used to perform validations using= data=0A= +from multiple tables. This is especially useful with ACPI fields of variab= le=0A= +length as the storage and validation is handled dynamically at runtime.=0A= +=0A= +# ACPI Data Store=0A= +=0A= +The ACPI data store allows for any type of ACPI data to be stored and late= r=0A= +accessed via the relevant methods in `AcpiDataStore.h`.=0A= +=0A= +`StoreAcpiMetaData(ListType, NodeType, Ptr, Length)`:=0A= + Called during the parsing stage to store relevant ACPI meta data as nee= ded=0A= + for validation later. Each call stores one "packet" of meta data, of th= e=0A= + given length, in a linked list of the given ListType. NodeType can be u= sed=0A= + to store nodes of different types within the same linked list.=0A= +=0A= +`GetMetaDataListHead(Type, Node)`:=0A= + Called during the validation stage to retrieve ACPI meta data stored in= the=0A= + ACPI data store. The head of a linked list is returned that contains al= l=0A= + stored meta data of the given type.=0A= +=0A= + Note: `GetMetaDataListHead()` returns the *head* of a linked list of me= ta=0A= + data. This head node is created upon initialisation and does not contai= n=0A= + any meta data itself, therefore=0A= + `(META_DATA_NODE*)GetFirstNode (&ListHead->Link);` should be used befor= e=0A= + trying to dereference any meta data.=0A= +=0A= +## Example usage=0A= +=0A= +An example parser storing an ACPI table in the data store.=0A= +```C=0A= +// Parser.c=0A= +=0A= +// Our example table signature to store. This could be any data type as it= will=0A= +// be casted to VOID* in the data store.=0A= +UINT32 Signature =3D SIGNATURE_32('A', 'B', 'C', 'D');=0A= +=0A= +// Store our table signature into our ACPI data store.=0A= +Status =3D StoreAcpiMetaData (=0A= + MetaDataExampleSig,=0A= + MetaDataExampleNodeSig,=0A= + &Signature,=0A= + sizeof (Siganture)=0A= + );=0A= +if (EFI_ERROR (Status)) {=0A= + return Status;=0A= +}=0A= +```=0A= +=0A= +An example validator retrieving and using meta data from the ACPI data sto= re:=0A= +```C=0A= +// Validator.c=0A= +=0A= +META_DATA_NODE *ListHead;=0A= +META_DATA_NODE *Node;=0A= +=0A= +// Retrieve a list of installed tables from the data store.=0A= +Status =3D GetMetaDataListHead (MetaDataInstalledTables, &ListHead);=0A= +if (EFI_ERROR (Status)) {=0A= + return Status;=0A= +}=0A= +=0A= +// The first node is just a list head and contains no data, get the first= =0A= +// "real" node in the list.=0A= +Node =3D (META_DATA_NODE*)GetFirstNode (&ListHead->Link);=0A= +=0A= +// Iterate through nodes and perform some validations with the data.=0A= +while (!IsNull (&ListHead->Link, &Node->Link)) {=0A= + // ...=0A= +}=0A= +```=0A= +=0A= +## Structure=0A= +=0A= +The ACPI data store structure is an array containing linked lists of relat= ed=0A= +META_DATA_NODE's. These nodes are grouped according to their META_DATA_TYP= E=0A= +with each META_DATA_TYPE pertaining to one linked list of META_DATA_NODEs.= =0A= +=0A= +Each linked list of meta nodes is implemented via the standard doubly link= ed=0A= +list implementation in MdePkg. This allows any of the standard traversal,= =0A= +query and accessing functions located in `MdePkg/Library/BaseLib/LinkedLis= t.c`=0A= +to be used on the linked list returned from calls to `GetMetaDataListHead(= )`.=0A= +=0A= +An example ACPI data store structure can be seen here:=0A= +=0A= +|---------------------------|=0A= +| MetaDataPpttProcs | ---> Proc0 ---> Proc1=0A= +|---------------------------|=0A= +| MetaDataMadtGicC | ---> Proc0 ---> Proc1=0A= +|---------------------------|=0A= +| MetaDataInstalledTables | ---> "RSDP" ---> "XSDT" ---> "HMAT" ---> "PP= TT"=0A= +|---------------------------|=0A= -- =0A= Guid("CE165669-3EF3-493F-B85D-6190EE5B9759")=0A= =0A=