<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2312115678472184515</id><updated>2026-09-07T10:12:17.840+08:00</updated><category term="UEFI Notes"/><category term="EDK II"/><category term="PC Architecture"/><category term="UEFI Utility"/><title type='text'>Leon Notes</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-8557775096210649288</id><published>2019-02-23T00:01:00.003+08:00</published><updated>2026-09-07T10:12:17.840+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EDK II"/><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Utility"/><title type='text'>UEFI BIOS Editor</title><content type='html'>This utility can parse the standard UEFI BIOS image to extract the firmware volumes, firmware files, sections, variables IFR, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large; color: #FF8040&quot;&gt;&lt;b&gt;Update History&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;Sep 07, 2026&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Added Intel mFIT tooling (Tools &amp;rarr; mFIT Config&amp;hellip;): view, search, diff and edit mFIT platform-config XML files, cross-check a config against an opened ROM (regions, master access, every named soft strap), and decompose an image through your own mfit.exe. &lt;/li&gt;
&lt;li&gt;Added soft-strap decode (Tools &amp;rarr; Decode Straps&amp;hellip;): bit-level flash-descriptor soft straps decoded with schemas harvested from your own mfit.exe &amp;mdash; 7 platform generations, schema auto-matched from the ROM&amp;#39;s CSE firmware version, SMIP straps included. &lt;/li&gt;
&lt;li&gt;Strap values can be modified through mFIT itself: edit in the grid, rebuild with Intel&amp;#39;s tool, verified automatically. &lt;/li&gt;
&lt;li&gt;Compare ROMs is one window with four tabs now &amp;mdash; Variables, Flash Map, Setup and Straps &amp;mdash; sharing one Base/Other selection. &lt;/li&gt;
&lt;li&gt;Compare Variables (byte-level variable merge) overhauled: resizable, status/GUID/size columns, search, CSV export, scroll-locked hex views with next-diff jump, and unsaved-change tracking on merged ROMs. &lt;/li&gt;
&lt;li&gt;Device Path Converter rewritten: labeled panes, live byte-format options, Copy buttons, resizable. &lt;/li&gt;
&lt;li&gt;Info tab shows Intel platform facts (SPI components, CSE firmware and generation, descriptor lock state) and selected soft straps. &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Sep 05, 2026&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Releases are now also published on GitHub: &lt;a href=&quot;https://github.com/iorlvskyo/UefiBiosEditor-Releases/releases&quot;&gt;github.com/iorlvskyo/UefiBiosEditor-Releases&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Much faster opening of large images (the firmware and PCD trees now load on demand). &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Jul 19, 2026&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Moved to .NET 8. The .NET 8 Desktop Runtime is required now. &lt;/li&gt;
&lt;li&gt;Added Setup browser: browse the Setup screens interactively from the HII data, with dynamic visibility and values joined to their variables. &lt;/li&gt;
&lt;li&gt;Added Flash Map: whole-flash usage (per-FV used/free/%) reverse-engineered from the image. &lt;/li&gt;
&lt;li&gt;FFS editing: Replace accepts a larger file now (the FV is rebuilt automatically), and Insert FFS / Remove FFS / Export Decompressed were added. &lt;/li&gt;
&lt;li&gt;The saved image is re-parsed to verify itself after Save As. &lt;/li&gt;
&lt;li&gt;AMD support improved: PSP / BIOS firmware directories, AMD microcode, and zlib PEI FVs are parsed now. &lt;/li&gt;
&lt;li&gt;Intel OSSE region is parsed (layout table, BPDT boot partitions, $CPD modules), in the firmware tree and in Flash Map. &lt;/li&gt;
&lt;li&gt;The toolbar search runs across all tabs now and reports the matches per tab. &lt;/li&gt;
&lt;li&gt;Added Compare ROMs and Compare Setup to diff two opened images. &lt;/li&gt;
&lt;li&gt;Added Data Inspector (Ctrl+I). &lt;/li&gt;
&lt;li&gt;Setup settings and the variable list can be exported. &lt;/li&gt;
&lt;li&gt;High-DPI support, unsaved-change warning, and other UI improvements. &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Apr 16, 2026&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed issues. &lt;/li&gt;
&lt;li&gt;Improved ME parser. &lt;/li&gt;
&lt;li&gt;Support Boot Guard. &lt;/li&gt;
&lt;li&gt;Support AMD (testing). &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Oct 05, 2022&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an exception for the old PCD version. &lt;/li&gt;
&lt;li&gt;Improved the code to find FIT and Microcode. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Apr 16, 2022&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Updated the EfiCompress code to fix the exception when when decompressing some BIOS. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Feb 26, 2020&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Feb 23, 2020&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Improved the parsing speed. &lt;/li&gt;
&lt;li&gt;DEPEX can be parsed. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Feb 20, 2020&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Update UI. &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;li&gt;Search and Find are available in VFR. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Feb 10, 2020&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an UNI exception for some BIOS. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Jan 30, 2020&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Improved EFI Variable. &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Jan 19, 2020&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Oct 24, 2019&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Aug 07, 2019&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Added language support. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Aug 02, 2019&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Added Variable compare function. &lt;/li&gt;
&lt;li&gt;The selected image name will be shown on the title. &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Feb 22, 2019&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the problem that IFR couldn&#39;t be found. &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Feb 21, 2019&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Added BootOption editor. &lt;/li&gt;
&lt;li&gt;Added DevicePath converter. &lt;/li&gt;
&lt;li&gt;Variable list is sortable now. &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;May 18, 2018&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Changed FFS2 ExtendedSize to UINT64. &lt;/li&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Dec 19, 2017&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed some BIOS couldn&#39;t find IFR data. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Nov 20, 2017&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Variable compatibility enhanced. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Nov 05, 2017&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;IFR interpreter improved. &lt;/li&gt;
&lt;li&gt;Convert UNI to text. &lt;/li&gt;
&lt;li&gt;Convert IFR from text. &lt;/li&gt;
&lt;li&gt;Convert IFR from binary. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Oct 29, 2017&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed some bugs. &lt;/li&gt;
&lt;li&gt;IFR interpreter improved. &lt;/li&gt;
&lt;li&gt;Firmware Contents Signed supported. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;May 11, 2017&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Parse the default variable value.&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;September 05, 2016&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Implemented VFR browser. It now can view the contents of VFR and UNI in the VFR page.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;EFI Compress and Tiano Compress supported. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;June 28, 2016&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The first version released. &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsGW-P5F4pNYiCxPAHk-_pJAk-6_PFhCcdlnpWqbCA2o6EiB_M7QC8GfLbkmvSUZUC4e2yJ9EspwL_74kNwV3IgsEpoUyP6Mlx_gzeAHLrCxZsiOtde9jbrsGIN165KuBbmts5odlZBk4/s1600/UBE1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;181&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsGW-P5F4pNYiCxPAHk-_pJAk-6_PFhCcdlnpWqbCA2o6EiB_M7QC8GfLbkmvSUZUC4e2yJ9EspwL_74kNwV3IgsEpoUyP6Mlx_gzeAHLrCxZsiOtde9jbrsGIN165KuBbmts5odlZBk4/s320/UBE1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdnOysqhOf6qi1R7c8T3kBSEWFSyD0vW19Z_T3gXfu6KGe1SXUiP7xPHmxg8sb-aOyMe5QkUFXE96VEQ9OiFA_VWYndbVzfe4wdLAiBZ5S4oQh7y6DkIMnzPh0vQRwXr9TehyphenhyphenOfjQYeWM/s1600/UBE2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;181&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdnOysqhOf6qi1R7c8T3kBSEWFSyD0vW19Z_T3gXfu6KGe1SXUiP7xPHmxg8sb-aOyMe5QkUFXE96VEQ9OiFA_VWYndbVzfe4wdLAiBZ5S4oQh7y6DkIMnzPh0vQRwXr9TehyphenhyphenOfjQYeWM/s320/UBE2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-_fczXq-nMQTe2q35yCW-sEHYyIx1PPt6WDu_B54qIr4fcZZXFG1YUcWCcRHeip86rx83ZTWO3b2xQJdbYfCaNuXqC_8BlZ3dTxi7l12sLVN3A8lO-4rS4OwAFupaNLAufX3po8Yk-BA/s1600/UBE3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;181&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-_fczXq-nMQTe2q35yCW-sEHYyIx1PPt6WDu_B54qIr4fcZZXFG1YUcWCcRHeip86rx83ZTWO3b2xQJdbYfCaNuXqC_8BlZ3dTxi7l12sLVN3A8lO-4rS4OwAFupaNLAufX3po8Yk-BA/s320/UBE3.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Download:&lt;/b&gt; the latest version is on &lt;a href=&quot;https://github.com/iorlvskyo/UefiBiosEditor-Releases/releases/latest&quot;&gt;GitHub Releases&lt;/a&gt;.&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/8557775096210649288/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2016/06/uefi-bios-editor.html#comment-form' title='56 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8557775096210649288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8557775096210649288'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2016/06/uefi-bios-editor.html' title='UEFI BIOS Editor'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsGW-P5F4pNYiCxPAHk-_pJAk-6_PFhCcdlnpWqbCA2o6EiB_M7QC8GfLbkmvSUZUC4e2yJ9EspwL_74kNwV3IgsEpoUyP6Mlx_gzeAHLrCxZsiOtde9jbrsGIN165KuBbmts5odlZBk4/s72-c/UBE1.png" height="72" width="72"/><thr:total>56</thr:total><georss:featurename>台灣</georss:featurename><georss:point>23.69781 120.960515</georss:point><georss:box>16.258457 110.6333665 31.137163 131.2876635</georss:box></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-8963928648505327041</id><published>2017-03-29T11:11:00.003+08:00</published><updated>2022-11-03T11:22:11.938+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Utility"/><title type='text'>DevicePath Converter</title><content type='html'>This utility can convert the UEFI device path.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Update History&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Nov 01, 2017&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the minor bug. &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;May 16, 2017&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the minor bug. &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;March 29, 2017&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The first version released. &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHSM-b8WuYc9KAC5qSk8E2e_b9Ny_bshUHkX8gscyEKlVsNNIfbuBXgAUtQ8s_lyYr87_9EaDTlUR004WO9NpZfGV1gyA2y3P1HjK6IJzdRA8U2TUCQZm0txI8ZRkBJLVn34xOb6vJUnw/s1600/DevicePathConverter.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHSM-b8WuYc9KAC5qSk8E2e_b9Ny_bshUHkX8gscyEKlVsNNIfbuBXgAUtQ8s_lyYr87_9EaDTlUR004WO9NpZfGV1gyA2y3P1HjK6IJzdRA8U2TUCQZm0txI8ZRkBJLVn34xOb6vJUnw/s320/DevicePathConverter.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
&lt;a href=&quot;https://drive.google.com/file/d/1fjbuqaVhOlfmt5rOFQ_Ih7Ua_PQ1Ryar/view?usp=share_link&quot;&gt;DevicePathConverter.7z&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/8963928648505327041/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2017/03/devicepath-converter.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8963928648505327041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8963928648505327041'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2017/03/devicepath-converter.html' title='DevicePath Converter'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHSM-b8WuYc9KAC5qSk8E2e_b9Ny_bshUHkX8gscyEKlVsNNIfbuBXgAUtQ8s_lyYr87_9EaDTlUR004WO9NpZfGV1gyA2y3P1HjK6IJzdRA8U2TUCQZm0txI8ZRkBJLVn34xOb6vJUnw/s72-c/DevicePathConverter.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-6174371147548047075</id><published>2015-02-10T17:47:00.001+08:00</published><updated>2022-10-19T15:24:26.304+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PC Architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Utility"/><title type='text'>HID Report Descriptor Parser</title><content type='html'>I studied HID a while ago, so I developed an application to convert HID report descriptor. &lt;br /&gt;
Please try it if you are interested. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; /&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Link：&lt;a href=&quot;https://drive.google.com/file/d/0B5QkTNcT9jCtdWhfQWhjZ2pwOWc/view?usp=sharing&amp;resourcekey=0-yHghdQhX_l0LN2VbMe1jAg&quot; target=&quot;_blank&quot;&gt;Google Drive&lt;/a&gt; </content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/6174371147548047075/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2015/02/hid-report-descriptor-parser.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/6174371147548047075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/6174371147548047075'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2015/02/hid-report-descriptor-parser.html' title='HID Report Descriptor Parser'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-924194827910063217</id><published>2015-01-20T18:10:00.000+08:00</published><updated>2015-01-20T18:10:17.124+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PC Architecture"/><title type='text'>HID over I2C Device</title><content type='html'>如果一個I2C Device是相容於HID規範的話，從Register 0位置便可讀取出HID Descriptor。&lt;br /&gt;
這邊有個範例，讀出來的資料如下：&lt;br /&gt;
&lt;span style=&quot;font-family: Consolas;&quot;&gt;
1E 00 00 01 A0 03 02 00 03 00 2A 00 00 00 00 00&lt;br /&gt;
04 00 05 00 AA AA BB BB 11 00 00 00 00 00&lt;br /&gt;
&lt;/span&gt;
&lt;br /&gt;
在此可對應到此表格：&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr style=&quot;background-color: #333333; text-align: center;&quot;&gt;
&lt;td&gt;Byte Offset&lt;/td&gt;&lt;td&gt;Field&lt;/td&gt;&lt;td&gt;Size(Bytes)&lt;/td&gt;&lt;td&gt;Example&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;&lt;td&gt;wHIDDescLength&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;1E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;&lt;td&gt;bcdVersion&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;&lt;td&gt;wReportDescLength&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;3A0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;&lt;td&gt;wReportDescRegister&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;&lt;td&gt;wInputRegister&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;&lt;td&gt;wMaxInputLength&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;2A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;&lt;td&gt;wOutputRegister&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;&lt;td&gt;wMaxOutputLength&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;&lt;td&gt;wCommandRegister&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;&lt;td&gt;wDataRegister&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;&lt;td&gt;wVendorID&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;AAAA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;&lt;td&gt;wProductID&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;BBBB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;&lt;td&gt;wVersionID&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;&lt;td&gt;RESERVED&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td style=&quot;text-align: right;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
此Table為Device的Information，除了最基本的VID、DID外，還有各個Register的Index指出Data該從哪邊讀與該從哪邊寫。&lt;br /&gt;
而wReportDescRegister是Report Descriptor的Index，從此Index將會讀取出一大串的Data，可參考wReportDescLength先配置好存放這些Data的記憶體空間。&lt;br /&gt;
關於一個Device的所支援的各種Type都會在這個Descriptor裡面，而一個Descriptor可能會有好幾組Usage Page與Report ID。&lt;br /&gt;
例如一個Touch Panel可能會支援Finger與Pen，而這兩個所使用的Report ID是不同的，所以需要去解析每個Report，去取得所要的資料。&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;color: #e69138;&quot;&gt;Report Descriptor&lt;/span&gt;&lt;/h3&gt;
這邊將探討如何去解析Report Descriptor。&lt;br /&gt;
Report Descriptor裡面是由一個個Item所組成的，可分為Short Items與Long Items，通常使用Long Items的情況為，需要存放額外的大量資料時才使用Long Items，否則一般都是用Short Items，長度為1到5 bytes。 &lt;br /&gt;
&lt;br /&gt;
可以先判斷一個Item是Short Item或Long Item：&lt;br /&gt;
&lt;b style=&quot;color: red;&quot;&gt;Short Items:&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&lt;img alt=&quot;&quot; height=&quot;105&quot; src=&quot;data:image/png;base64,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&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
先看第一個Byte (Offset 0)，可以分成三個部分並對應到下表： &lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr style=&quot;background-color: #333333; text-align: center;&quot;&gt;&lt;td&gt;bSize&lt;/td&gt;&lt;td&gt;Numeric expression specifying size of data&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0 bytes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1 bytes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2 bytes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4 bytes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr style=&quot;background-color: #333333; text-align: center;&quot;&gt;&lt;td&gt;bType&lt;/td&gt;&lt;td&gt;Numeric expression identifying type of item where&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;Main&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Global&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Local&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Reserved&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr style=&quot;background-color: #333333; text-align: center;&quot;&gt;&lt;td&gt;bTag&lt;/td&gt;&lt;td&gt;Numeric expression specifying the function of the item&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;[data]&lt;/td&gt;&lt;td&gt;Optional data&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Data長度可參考bSize，對Short Item來說最多就是4個Bytes。&lt;br /&gt;
&lt;br /&gt;
&lt;b style=&quot;color: red;&quot;&gt;Long Items:&lt;/b&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; height=&quot;87&quot; src=&quot;data:image/png;base64,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&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
如果第一個Byte (Offset 0)是0xFE，那這個便是Long Item，而第二個Byte就用來表示整個Data Size，第三個Byte為其Tag，而後面就是整個Data部分。&lt;br /&gt;
&lt;br /&gt;
在此簡單舉一個例子：&lt;br /&gt;
&lt;span style=&quot;font-family: Consolas;&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;
05 0D 09 04 A1 01 85 0C 95 01 75 08 26 FF 00 15&lt;br /&gt;
00 81 03&lt;/span&gt; 09 54 81 02 05 0D 09 22 A1 02 09 42 15&lt;br /&gt;
00 25 01 75 01 95 01 81 02 81 03 09 47 81 02 95&lt;br /&gt;
05 81 03 75 10 09 51 95 01 81 02 05 01 75 10 95&lt;br /&gt;
01 55 0E 65 11 09 30 26 0C 28 35 00 46 03 0A 81&lt;br /&gt;
02 46 A2 05 09 31 26 88 16 81 02 C0 05 0D 09 22&lt;br /&gt;
&lt;/span&gt;
&lt;br /&gt;
這是一部分的Report Descriptor，從第一個Byte開始。&lt;br /&gt;
05: 00000101b Tag: 0000b Type: 01b Size: 01b&lt;br /&gt;
Type: 01b (Global Items)&lt;br /&gt;
Tag: 0000b (Usage Page)&lt;br /&gt;
Data: 0D (Digitizer)&lt;br /&gt;
&lt;br /&gt;
09: 00001001b Tag: 0000b Type: 10b Size: 01b&lt;br /&gt;
Type: 10b (Local Items)&lt;br /&gt;
Tag: 0000b (Usage)&lt;br /&gt;
Data: 04 (Touch Screen)&lt;br /&gt;
&lt;br /&gt;
A1: 10100001b Tag: 1010b Type: 00b Size: 01b&lt;br /&gt;
Type: 00b (Main Items)&lt;br /&gt;
Tag: 1010b (Collection)&lt;br /&gt;
Data: 01 (Application)&lt;br /&gt;
&lt;br /&gt;
85: 10000101b Tag: 1000b Type: 01b Size: 01b&lt;br /&gt;
Type: 01b (Global Items)&lt;br /&gt;
Tag: 1000b (Report ID)&lt;br /&gt;
Data: 0C&lt;br /&gt;
&lt;br /&gt;
95: 10010101b Tag: 1001b Type: 01b Size: 01b&lt;br /&gt;
Type: 01b (Global Items)&lt;br /&gt;
Tag: 1001b (Report Count)&lt;br /&gt;
Data: 01&lt;br /&gt;
&lt;br /&gt;
75: 01110101b Tag: 0111b Type: 01b Size: 01b&lt;br /&gt;
Type: 01b (Global Items)&lt;br /&gt;
Tag: 0111b (Report Size)&lt;br /&gt;
Data: 08&lt;br /&gt;
&lt;br /&gt;
26: 00100110b Tag: 0010b Type: 01b Size: 10b&lt;br /&gt;
Type: 01b (Global Items)&lt;br /&gt;
Tag: 0010b (Logical Maximum)&lt;br /&gt;
Data: 00FF&lt;br /&gt;
&lt;br /&gt;
15: 00010101b Tag: 0010b Type: 01b Size: 01b&lt;br /&gt;
Type: 01b (Global Items)&lt;br /&gt;
Tag: 0010b (Logical Minimum)&lt;br /&gt;
Data: 00&lt;br /&gt;
&lt;br /&gt;
81: 10000001b Tag: 1000b Type: 00b Size: 01b&lt;br /&gt;
Type: 00b (Main Items)&lt;br /&gt;
Tag: 1000b (Input)&lt;br /&gt;
Data: 03&lt;br /&gt;
&lt;br /&gt;
以此類推，可以看到每個Item就是這樣串起來的。&lt;br /&gt;
解析整個Report Descriptor並不難，但需要一直對照Spec，可參考HID1_11.pdf。&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;color: #e69138;&quot;&gt;Input Register&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
Input Register可從wInputRegister這個位置讀出來，但還是必須先做一些前置處理，否則會不知道它的Layout（每個資料所在的Offset，如X、Y軸）。&lt;br /&gt;
這部分的資訊可從Report Descriptor取得。&lt;br /&gt;
Example:（這不是一個完整的Report Descriptor）&lt;br /&gt;
Usage Page (Digitizer)&lt;br /&gt;
Usage (Touch Screen)&lt;br /&gt;
Collection (Application)&lt;br /&gt;
&amp;nbsp; Report ID (0x0C)&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: #3d85c6;&quot;&gt;Report Count (1)&lt;br /&gt;&amp;nbsp; Report Size (8)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x03)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; Usage (Reserved)&lt;br /&gt;
&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x02)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; Usage Page (Digitizer)&lt;br /&gt;
&amp;nbsp; Usage (Finger)&lt;br /&gt;
&amp;nbsp; Collection (Logical)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Usage (Tip Switch)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #3d85c6;&quot;&gt;Report Size (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Report Count (1)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x02)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x03)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Usage (Reserved)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x02)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Report Count (5)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x03)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #3d85c6;&quot;&gt;Report Size (16)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Usage (Reserved)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #3d85c6;&quot;&gt;Report Count (1)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x02)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Usage Page (Generic Desktop Controls)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #3d85c6;&quot;&gt;Report Size (16)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Report Count (1)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Usage (X)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x02)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Usage (Y)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;Input (0x02)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; End Collection ()&lt;br /&gt;
&lt;br /&gt;
上面共有9個Input，首先可以注意在Input前面有Report Count與Report Size，每看到一個新的Report Count或Report Size，就以新的值來取代。&lt;br /&gt;
所以上面的例子：&lt;br /&gt;
Input 1st Length: 8 bits&lt;br /&gt;
Input 2nd Length: 8 bits&lt;br /&gt;
Input 3rd Length: 1 bits&lt;br /&gt;
Input 4th Length: 1 bits&lt;br /&gt;
Input 5th Length: 1 bits&lt;br /&gt;
Input 6th Length: 5 bits&lt;br /&gt;
Input 7th Length: 16 bits&lt;br /&gt;
Input 8th Length: 16 bits&lt;br /&gt;
Input 9th Length: 16 bits&lt;br /&gt;
&lt;br /&gt;
而在第8個Input前的Usage (X)是Usage Page (Generic Desktop Controls)的X座標值，第9個Input前的Usage (Y)為Y的座標值。&lt;br /&gt;
&lt;br /&gt;
以下為從Input Register讀出來的資料：&lt;br /&gt;
&lt;span style=&quot;font-family: Consolas;&quot;&gt;
2A 00 0C &lt;span style=&quot;color: #f6b26b;&quot;&gt;00&lt;/span&gt; &lt;span style=&quot;color: #e06666;&quot;&gt;01&lt;/span&gt; &lt;span style=&quot;color: #f6b26b;&quot;&gt;05&lt;/span&gt; &lt;span style=&quot;color: #e06666;&quot;&gt;01 00&lt;/span&gt; &lt;span style=&quot;color: #f6b26b;&quot;&gt;81 00&lt;/span&gt; &lt;span style=&quot;color: #e06666;&quot;&gt;2B 01&lt;/span&gt; 00 00 00 00&lt;br /&gt;
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&lt;br /&gt;
00 00 00 00 00 00 00 00 1C A9 &lt;br /&gt;
&lt;/span&gt;
&lt;br /&gt;
前面兩個Byte為整個資料的長度：2A (42個Bytes)&lt;br /&gt;
0C為對應的Report ID，代表讀回來的Register是對應到這個Report。&lt;br /&gt;
前面有提到一個Panel可能有支援Finger與Pen等。所以從Device讀出來的Report Descriptor會有好幾組Usage Page，每一組可能都會有對應的Report ID。&lt;br /&gt;
所以讀回來的Input Register會處理前，要先比對一下是不是相同的ID，不是的話就再換下一個Usage Page。&lt;br /&gt;
&lt;br /&gt;
而在這3個Bytes後面就是實際上要使用的Data，可以從剛剛上面的Input，來推算出對應的Usage的Offset。 &lt;br /&gt;
Usage (Tip Switch)的值: 05 (bit 0)&lt;br /&gt;
Usage (X)的值: 0081&lt;br /&gt;
Usage (Y)的值: 012B&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/924194827910063217/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2015/01/hid-over-i2c-device.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/924194827910063217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/924194827910063217'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2015/01/hid-over-i2c-device.html' title='HID over I2C Device'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-5583877515317860818</id><published>2014-10-22T14:48:00.000+08:00</published><updated>2014-11-11T18:08:31.806+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EDK II"/><title type='text'>PCD (Platform Configuration Database) - Part 3 (DXE)</title><content type='html'>將接續上一篇，繼續探討DXE部分。
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
&amp;nbsp; UINT32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdSetupConOutColumn_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0;&lt;br /&gt;
&amp;nbsp; UINT32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdSetupConOutRow_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; DYNAMICEX_MAPPING&amp;nbsp; ExMapTable[DXE_EXMAPPING_TABLE_SIZE];&lt;br /&gt;
&amp;nbsp; UINT32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LocalTokenNumberTable[DXE_LOCAL_TOKEN_NUMBER_TABLE_SIZE];&lt;br /&gt;
&amp;nbsp; GUID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GuidTable[DXE_GUID_TABLE_SIZE];&lt;br /&gt;
&amp;nbsp; STRING_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdWinNtMemorySize_0d79a645_1d91_40a6_a81f_61e6982b32b4[1];&lt;br /&gt;
&amp;nbsp; STRING_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdWinNtPhysicalDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4[1];&lt;br /&gt;
&amp;nbsp; STRING_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdWinNtVirtualDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4[1];&lt;br /&gt;
&amp;nbsp; STRING_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdWinNtFileSystem_0d79a645_1d91_40a6_a81f_61e6982b32b4[1];&lt;br /&gt;
&amp;nbsp; STRING_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdWinNtSerialPort_0d79a645_1d91_40a6_a81f_61e6982b32b4[1];&lt;br /&gt;
&amp;nbsp; STRING_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdWinNtGop_0d79a645_1d91_40a6_a81f_61e6982b32b4[1];&lt;br /&gt;
&amp;nbsp; STRING_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdWinNtUga_0d79a645_1d91_40a6_a81f_61e6982b32b4[1];&lt;br /&gt;
&amp;nbsp; STRING_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdWinNtConsole_0d79a645_1d91_40a6_a81f_61e6982b32b4[1];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; VARIABLE_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header[1];&lt;br /&gt;
&amp;nbsp; VARIABLE_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdPlatformBootTimeOut_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header[1];&lt;br /&gt;
&amp;nbsp; VARIABLE_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdSetupConOutColumn_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header[1];&lt;br /&gt;
&amp;nbsp; VARIABLE_HEAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdSetupConOutRow_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header[1];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable[12]; /* PcdWinNtMemorySize_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_1[100]; /* PcdWinNtPhysicalDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_2[26]; /* PcdWinNtVirtualDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_3[106]; /* PcdWinNtFileSystem_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_4[20]; /* PcdWinNtSerialPort_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_5[52]; /* PcdWinNtGop_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_6[52]; /* PcdWinNtUga_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_7[52]; /* PcdWinNtConsole_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_8[32]; /* PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_9[16]; /* PcdPlatformBootTimeOut_d3705011_bc19_4af7_be16_f68030378c15 */&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable_10[38]; /* PcdSetupConOutColumn_d3705011_bc19_4af7_be16_f68030378c15 */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; SIZE_INFO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SizeTable[DXE_SIZE_TABLE_SIZE];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; UINT16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0;&lt;br /&gt;
&amp;nbsp; UINT16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdPlatformBootTimeOut_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; BOOLEAN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PcdBootState_d3705011_bc19_4af7_be16_f68030378c15[1];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SkuIdTable[DXE_SKUID_TABLE_SIZE];&lt;br /&gt;
&lt;br /&gt;
} DXE_PCD_DATABASE_INIT;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp; dummy; /* PCD_DATABASE_UNINIT is emptry */&lt;br /&gt;
} DXE_PCD_DATABASE_UNINIT;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
&amp;nbsp; DXE_PCD_DATABASE_INIT&amp;nbsp;&amp;nbsp;&amp;nbsp; Init;&lt;br /&gt;
&amp;nbsp; DXE_PCD_DATABASE_UNINIT&amp;nbsp; Uninit;&lt;br /&gt;
} DXE_PCD_DATABASE;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
&amp;nbsp; PEI_PCD_DATABASE PeiDb;&lt;br /&gt;
&amp;nbsp; DXE_PCD_DATABASE DxeDb;&lt;br /&gt;
} PCD_DATABASE; &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.c&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;overflow: auto; scrollbar-3dlight-color: #996600; scrollbar-arrow-color: #FF0000; scrollbar-darkshadow-color: #996600; scrollbar-face-color: #996600; scrollbar-highlight-color: #996600; scrollbar-shadow-color: #996600; scrollbar-track-color: #996600;&quot;&gt;
&lt;nobr&gt;
DXE_PCD_DATABASE_INIT gDXEPcdDbInit = {&lt;br /&gt;
&amp;nbsp; 80U, /* PcdSetupConOutColumn_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0 */&lt;br /&gt;
&amp;nbsp; 25U, /* PcdSetupConOutRow_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0 */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; /* VPD */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; /* ExMapTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { 0U, 0U, 0U },&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; /* LocalTokenNumberTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdWinNtMemorySize_0d79a645_1d91_40a6_a81f_61e6982b32b4) | PCD_TYPE_STRING,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdWinNtPhysicalDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4) | PCD_TYPE_STRING,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdWinNtVirtualDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4) | PCD_TYPE_STRING,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdWinNtFileSystem_0d79a645_1d91_40a6_a81f_61e6982b32b4) | PCD_TYPE_STRING,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdWinNtSerialPort_0d79a645_1d91_40a6_a81f_61e6982b32b4) | PCD_TYPE_STRING,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdWinNtGop_0d79a645_1d91_40a6_a81f_61e6982b32b4) | PCD_TYPE_STRING,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdWinNtUga_0d79a645_1d91_40a6_a81f_61e6982b32b4) | PCD_TYPE_STRING,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdWinNtConsole_0d79a645_1d91_40a6_a81f_61e6982b32b4) | PCD_TYPE_STRING,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header) | PCD_TYPE_HII | PCD_DATUM_TYPE_UINT16,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdPlatformBootTimeOut_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header) | PCD_TYPE_HII | PCD_DATUM_TYPE_UINT16,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdSetupConOutColumn_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header) | PCD_DATUM_TYPE_UINT32 | PCD_TYPE_HII,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdSetupConOutRow_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header) | PCD_DATUM_TYPE_UINT32 | PCD_TYPE_HII,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(DXE_PCD_DATABASE, Init.PcdBootState_d3705011_bc19_4af7_be16_f68030378c15) | PCD_DATUM_TYPE_UINT8 | PCD_TYPE_DATA,&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; /* GuidTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }},&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; { 0U }, /* PcdWinNtMemorySize_0d79a645_1d91_40a6_a81f_61e6982b32b4[1] */&lt;br /&gt;
&amp;nbsp; { 12U }, /* PcdWinNtPhysicalDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4[1] */&lt;br /&gt;
&amp;nbsp; { 112U }, /* PcdWinNtVirtualDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4[1] */&lt;br /&gt;
&amp;nbsp; { 138U }, /* PcdWinNtFileSystem_0d79a645_1d91_40a6_a81f_61e6982b32b4[1] */&lt;br /&gt;
&amp;nbsp; { 244U }, /* PcdWinNtSerialPort_0d79a645_1d91_40a6_a81f_61e6982b32b4[1] */&lt;br /&gt;
&amp;nbsp; { 264U }, /* PcdWinNtGop_0d79a645_1d91_40a6_a81f_61e6982b32b4[1] */&lt;br /&gt;
&amp;nbsp; { 316U }, /* PcdWinNtUga_0d79a645_1d91_40a6_a81f_61e6982b32b4[1] */&lt;br /&gt;
&amp;nbsp; { 368U }, /* PcdWinNtConsole_0d79a645_1d91_40a6_a81f_61e6982b32b4[1] */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; /* PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header[1] */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { 420U, offsetof(DXE_PCD_DATABASE, Init.PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0), 0U, 0x0U }&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; /* PcdPlatformBootTimeOut_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header[1] */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { 452U, offsetof(DXE_PCD_DATABASE, Init.PcdPlatformBootTimeOut_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0), 0U, 0x0U }&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; /* PcdSetupConOutColumn_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header[1] */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { 468U, offsetof(DXE_PCD_DATABASE, Init.PcdSetupConOutColumn_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0), 0U, 0x0U }&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; /* PcdSetupConOutRow_d3705011_bc19_4af7_be16_f68030378c15_Variable_Header[1] */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { 468U, offsetof(DXE_PCD_DATABASE, Init.PcdSetupConOutRow_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0), 0U, 0x4U }&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;/* StringTable */&lt;br /&gt;
&amp;nbsp; {0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00}, /* PcdWinNtMemorySize_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; {0x61, 0x00, 0x3a, 0x00, 0x52, 0x00, 0x57, 0x00, 0x3b, 0x00, 0x32, 0x00, 0x38, 0x00, 0x38, 0x00, 0x30, 0x00, 0x3b, 0x00, 0x35, 0x00, 0x31, 0x00, 0x32, 0x00, 0x21, 0x00, 0x64, 0x00, 0x3a, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x30, 0x00, 0x37, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3b, 0x00, 0x32, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x21, 0x00, 0x6a, 0x00, 0x3a, 0x00, 0x52, 0x00, 0x57, 0x00, 0x3b, 0x00, 0x32, 0x00, 0x36, 0x00, 0x32, 0x00, 0x31, 0x00, 0x34, 0x00, 0x34, 0x00, 0x3b, 0x00, 0x35, 0x00, 0x31, 0x00, 0x32, 0x00, 0x00, 0x00}, /* PcdWinNtPhysicalDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; {0x46, 0x00, 0x57, 0x00, 0x3b, 0x00, 0x34, 0x00, 0x30, 0x00, 0x39, 0x00, 0x36, 0x00, 0x30, 0x00, 0x3b, 0x00, 0x35, 0x00, 0x31, 0x00, 0x32, 0x00, 0x00, 0x00}, /* PcdWinNtVirtualDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; {0x2e, 0x00, 0x21, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x5c, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x5c, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x5c, 0x00, 0x55, 0x00, 0x64, 0x00, 0x75, 0x00, 0x50, 0x00, 0x6b, 0x00, 0x67, 0x00, 0x5c, 0x00, 0x44, 0x00, 0x45, 0x00, 0x42, 0x00, 0x55, 0x00, 0x47, 0x00, 0x5f, 0x00, 0x56, 0x00, 0x53, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x78, 0x00, 0x38, 0x00, 0x36, 0x00, 0x5c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x33, 0x00, 0x32, 0x00, 0x00, 0x00}, /* PcdWinNtFileSystem_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; {0x43, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x31, 0x00, 0x21, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x32, 0x00, 0x00, 0x00}, /* PcdWinNtSerialPort_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; {0x55, 0x00, 0x47, 0x00, 0x41, 0x00, 0x20, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x20, 0x00, 0x31, 0x00, 0x00, 0x00}, /* PcdWinNtGop_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; {0x55, 0x00, 0x47, 0x00, 0x41, 0x00, 0x20, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x20, 0x00, 0x31, 0x00, 0x00, 0x00}, /* PcdWinNtUga_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; {0x42, 0x00, 0x75, 0x00, 0x73, 0x00, 0x20, 0x00, 0x44, 0x00, 0x72, 0x00, 0x69, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x00, 0x00}, /* PcdWinNtConsole_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; {0x48, 0x00, 0x77, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x52, 0x00, 0x65, 0x00, 0x63, 0x00, 0x53, 0x00, 0x75, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x00, 0x00}, /* PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15 */&lt;br /&gt;
&amp;nbsp; {0x54, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00}, /* PcdPlatformBootTimeOut_d3705011_bc19_4af7_be16_f68030378c15 */&lt;br /&gt;
&amp;nbsp; {0x53, 0x00, 0x65, 0x00, 0x74, 0x00, 0x75, 0x00, 0x70, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, 0x00, 0x00, 0x00}, /* PcdSetupConOutColumn_d3705011_bc19_4af7_be16_f68030378c15 */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; /* SizeTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 12U, 12U, /* PcdWinNtMemorySize_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 100U, 94U, /* PcdWinNtPhysicalDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 26U, 26U, /* PcdWinNtVirtualDisk_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 106U, 78U, /* PcdWinNtFileSystem_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 20U, 20U, /* PcdWinNtSerialPort_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 52U, 26U, /* PcdWinNtGop_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 52U, 26U, /* PcdWinNtUga_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 52U, 52U, /* PcdWinNtConsole_0d79a645_1d91_40a6_a81f_61e6982b32b4 */&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 1U, /* PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0 */&lt;br /&gt;
&amp;nbsp; 10U, /* PcdPlatformBootTimeOut_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0 */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; { 1U }, /*&amp;nbsp; PcdBootState_d3705011_bc19_4af7_be16_f68030378c15[1] */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; /* SkuIdTable */&lt;br /&gt;
&amp;nbsp; { 0U,&amp;nbsp; },&amp;nbsp; &lt;br /&gt;
};&lt;br /&gt;
&lt;/nobr&gt;
&lt;/div&gt;
&lt;br /&gt;
以上是在Compile過程中，Build Tool為PCD DXE所生成的檔案，跟PEIM的很相似，但多了一些沒看過的PCD。。&lt;br /&gt;
上面有個PCD_DATABASE，裡面分了PeiDb與DxeDb，在一開始的EntryPoint中會呼叫&lt;span style=&quot;color: #bf9000;&quot;&gt;BuildPcdDxeDataBase&lt;/span&gt;，並把PEI_PCD_DATABASE從HOB複製過來。&lt;br /&gt;
&lt;br /&gt;
PCD DXE的&lt;span style=&quot;color: #bf9000;&quot;&gt;GetWorker&lt;/span&gt;與&lt;span style=&quot;color: #bf9000;&quot;&gt;SetWorker&lt;/span&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
GetWorker:&lt;/h2&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;
VOID *&lt;br /&gt;
GetWorker (&lt;br /&gt;
&amp;nbsp; IN UINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TokenNumber,&lt;br /&gt;
&amp;nbsp; IN UINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetSize&lt;br /&gt;
&amp;nbsp; )&lt;br /&gt;
&lt;/span&gt;
&lt;br /&gt;
在一開始會做一些前置處理，判斷傳進來的TokenNumber判斷是PEI的PCD還是DXE的PCD。&lt;br /&gt;
然後把對應的LocalTokenNumber、LocalTokenNumber、StringTable、PcdDb的Pointer另取出來。 &lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;IsPeiDb = (BOOLEAN) ((TokenNumber + 1 &amp;lt; PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
透過Mask單獨取得Offset。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;Offset = LocalTokenNumber &amp;amp; PCD_DATABASE_OFFSET_MASK;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
接下來會依照各種不同PCD Type做不同的處理：&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_VPD:&lt;/span&gt;&lt;br /&gt;
傳回VPD (&lt;span class=&quot;st&quot;&gt;Vital Product Data)中特定的Offset的資料。&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;VPD_HEAD *VpdHead;&lt;br /&gt;VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);&lt;br /&gt;return (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead-&amp;gt;Offset);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_HII|PCD_TYPE_STRING:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_HII:&lt;/span&gt;&lt;br /&gt;
透過Offset取得Variable Head，裡面有著GUID與Name的Index。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);&lt;br /&gt;&lt;br /&gt;Guid = &amp;amp;(PeiPcdDb-&amp;gt;Init.GuidTable[VariableHead-&amp;gt;GuidTableIndex]);&lt;br /&gt;Name = (UINT16*)&amp;amp;StringTable[VariableHead-&amp;gt;StringIndex];&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
會先判斷是否為PCD_TYPE_HII|PCD_TYPE_STRING或PCD_TYPE_HII，再去做不同的處理，差別只是在於在GetVariable失敗時，&lt;br /&gt;
PCD_TYPE_HII|PCD_TYPE_STRING會於StringTable取得預設的資料（字串），而PCD_TYPE_HII會直接以DefaultValueOffset去取得對應的預設值。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;if ((LocalTokenNumber &amp;amp; PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {&lt;br /&gt;&amp;nbsp; StringTableIdx = *(STRING_HEAD*)((UINT8 *) PcdDb + VariableHead-&amp;gt;DefaultValueOffset);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; VaraiableDefaultBuffer = (VOID *) (StringTable + StringTableIdx);&lt;br /&gt;
&amp;nbsp; ...&lt;br /&gt;
} else {&lt;br /&gt;&amp;nbsp; VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead-&amp;gt;DefaultValueOffset;&lt;br /&gt;
&amp;nbsp; ...&lt;br /&gt;
}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_STRING:&lt;/span&gt;&lt;br /&gt;
先取得該PCD的STRING_HEAD (StringTableIdx (UINT32))，裡面存放著對應StringTable的Offset。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;StringTableIdx = * (STRING_HEAD*) ((UINT8 *) PeiPcdDb + Offset);&lt;br /&gt;
return (VOID *) (&amp;amp;StringTable[StringTableIdx]);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_DATA:&lt;/span&gt;&lt;br /&gt;
直接透過Offset取得Data。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;return (VOID *) ((UINT8 *)PeiPcdDb + Offset);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
SetWorker:&lt;/h2&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;
EFI_STATUS&lt;br /&gt;SetWorker (&lt;br /&gt;
&amp;nbsp; IN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TokenNumber,&lt;br /&gt;
&amp;nbsp; IN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VOID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Data,&lt;br /&gt;
&amp;nbsp; IN OUT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Size,&lt;br /&gt;
&amp;nbsp; IN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOLEAN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PtrType&lt;br /&gt;&amp;nbsp; )&lt;br /&gt;
&lt;/span&gt;
&lt;br /&gt;
透過Token Number取得該PCD的LocalTokenNumber (Offset、PCD Type、Data Type)。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;LocalTokenNumber = PeiPcdDb-&amp;gt;Init.LocalTokenNumberTable[TokenNumber];&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
會先判斷Data Type是不是Pointer，通常像String之類的，會被歸類為Pointer。&lt;br /&gt;
要注意到在Build Tool會在PCD Database中，先宣告好固定長度的陣列來存放String等其它Data。&lt;br /&gt;
如果PtrType為True，而傳入的Size又大於原先預留好的最大值的話，就會造成問題，這邊就先擋掉並回傳MaxSize。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;
if (PtrType) {&lt;br /&gt;&amp;nbsp; //&lt;br /&gt;&amp;nbsp; // Get MaxSize first, then check new size with max buffer size.&lt;br /&gt;&amp;nbsp; //&lt;br /&gt;&amp;nbsp; GetPtrTypeSize (TokenNumber, &amp;amp;MaxSize, PeiPcdDb);&lt;br /&gt;&amp;nbsp; if (*Size &amp;gt; MaxSize) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Size = MaxSize;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_INVALID_PARAMETER;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; if (*Size != PeiPcdGetSize (TokenNumber + 1)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_INVALID_PARAMETER;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
當某個PCD被修改時會去呼叫，為該PCD註冊Notify的Function。&lt;br /&gt;
可以透過PCD Library的LibPcdCallbackOnSet來進行註冊會比較方便。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;if ((TokenNumber + 1 &amp;lt; PEI_NEX_TOKEN_NUMBER + 1) || (TokenNumber + 1 &amp;gt;= PEI_LOCAL_TOKEN_NUMBER + 1 || TokenNumber + 1 &amp;lt; (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1))) {&lt;br /&gt;&amp;nbsp; InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size);&lt;br /&gt;
}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
跟GetWorker一樣會判斷傳進來的TokenNumber判斷是PEI的PCD還是DXE的PCD。&lt;br /&gt;
然後把對應的LocalTokenNumber、LocalTokenNumber、StringTable、PcdDb的Pointer另取出來。 &lt;br /&gt;
&lt;br /&gt;
透過Mask單獨取得Offset，並取得Data。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;Offset = LocalTokenNumber &amp;amp; PCD_DATABASE_OFFSET_MASK;&lt;br /&gt;
InternalData&amp;nbsp;&amp;nbsp;&amp;nbsp; = (VOID *) ((UINT8 *) PeiPcdDb + Offset);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
接下來會依照各種不同PCD Type做不同的處理：&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_VPD:&lt;/span&gt;&lt;br /&gt;
可能是上述幾個Type都不支援在PEI修改NVS，所以這邊就直接return回EFI_INVALID_PARAMETER。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_STRING:&lt;/span&gt;&lt;br /&gt;
傳入的資料為一串Array，資料長度可能會變動，所以先更改Current Size。&lt;br /&gt;
SizeTable中有兩個欄位，一個是Max Size，一個是Current Size。&lt;br /&gt;
之後再透過CopyMem，將傳入的Data Copy到StringTable中。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) {&lt;br /&gt;&amp;nbsp; CopyMem (StringTable + *((STRING_HEAD *)InternalData), Data, *Size);&lt;br /&gt;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; return EFI_INVALID_PARAMETER;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_HII:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_HII|PCD_TYPE_STRING:&lt;/span&gt;&lt;br /&gt;
透過SetVariable將資料存於NVS並更新PCD Database內的資料。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Guid = GuidTable + VariableHead-&amp;gt;GuidTableIndex;&lt;br /&gt;Name = (UINT16*) (StringTable + VariableHead-&amp;gt;StringIndex);&lt;br /&gt;VariableOffset = VariableHead-&amp;gt;Offset;&lt;br /&gt;Status = SetHiiVariable (Guid, Name, Data, *Size, VariableOffset);&lt;br /&gt;
&lt;br /&gt;if (EFI_NOT_FOUND == Status) {&lt;br /&gt;&amp;nbsp; if ((LocalTokenNumber &amp;amp; PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING))&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CopyMem (StringTable + *(STRING_HEAD *)(PcdDb + VariableHead-&amp;gt;DefaultValueOffset), Data, *Size);&lt;br /&gt;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CopyMem (PcdDb + VariableHead-&amp;gt;DefaultValueOffset, Data, *Size);&lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; Status = EFI_SUCCESS;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_DATA:&lt;/span&gt;&lt;br /&gt;
PtrType的處理方式跟PCD_TYPE_STRING很像。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;if (PtrType) {&lt;br /&gt;&amp;nbsp; if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CopyMem (InternalData, Data, *Size);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_INVALID_PARAMETER;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
其餘基本型態只是透過轉型來處理。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;switch (*Size) {&lt;br /&gt;&amp;nbsp; case sizeof(UINT8):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *((UINT8 *) InternalData) = *((UINT8 *) Data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; case sizeof(UINT16):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *((UINT16 *) InternalData) = *((UINT16 *) Data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; case sizeof(UINT32):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *((UINT32 *) InternalData) = *((UINT32 *) Data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; case sizeof(UINT64):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *((UINT64 *) InternalData) = *((UINT64 *) Data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ASSERT (FALSE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_NOT_FOUND;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/5583877515317860818/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2014/10/pcd-platform-configuration-database_22.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5583877515317860818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5583877515317860818'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2014/10/pcd-platform-configuration-database_22.html' title='PCD (Platform Configuration Database) - Part 3 (DXE)'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-8891118635017761657</id><published>2014-10-20T18:57:00.000+08:00</published><updated>2014-10-21T16:33:41.846+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EDK II"/><title type='text'>PCD (Platform Configuration Database) - Part 2 (PEI)</title><content type='html'>這篇將探討PCD背後的原理，PEI與DXE都分別提供PPI與Protocol給予其它Driver使用，雖然一般都是透過PcdLib來存取Dynamic類型的PCD，但實際上PcdLib是使用PPI或Protocol來達成存取PCD的目的。
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
&amp;nbsp; DYNAMICEX_MAPPING&amp;nbsp; ExMapTable[PEI_EXMAPPING_TABLE_SIZE];&lt;br /&gt;
&amp;nbsp; UINT32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LocalTokenNumberTable[PEI_LOCAL_TOKEN_NUMBER_TABLE_SIZE];&lt;br /&gt;
&amp;nbsp; GUID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GuidTable[PEI_GUID_TABLE_SIZE];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTable[1]; /* _ */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; SIZE_INFO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SizeTable[PEI_SIZE_TABLE_SIZE];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; UINT8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SkuIdTable[PEI_SKUID_TABLE_SIZE];&lt;br /&gt;
&amp;nbsp; SKU_ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SystemSkuId;&lt;br /&gt;
} PEI_PCD_DATABASE_INIT;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
&amp;nbsp; UINT64&amp;nbsp;&amp;nbsp; PcdS3BootScriptTablePrivateDataPtr_a1aff049_fdeb_442a_b320_13ab4cb72bbc[1];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; UINT32&amp;nbsp;&amp;nbsp; PcdFlashNvStorageFtwWorkingBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc[1];&lt;br /&gt;
&amp;nbsp; UINT32&amp;nbsp;&amp;nbsp; PcdFlashNvStorageFtwSpareBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc[1];&lt;br /&gt;
&amp;nbsp; UINT32&amp;nbsp;&amp;nbsp; PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc[1];&lt;br /&gt;
} PEI_PCD_DATABASE_UNINIT;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
&amp;nbsp; PEI_PCD_DATABASE_INIT&amp;nbsp;&amp;nbsp;&amp;nbsp; Init;&lt;br /&gt;
&amp;nbsp; PEI_PCD_DATABASE_UNINIT&amp;nbsp; Uninit;&lt;br /&gt;
} PEI_PCD_DATABASE;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.c&lt;/span&gt;&lt;br /&gt;
PEI_PCD_DATABASE_INIT gPEIPcdDbInit = {&lt;br /&gt;
&amp;nbsp; /* VPD */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; /* ExMapTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { 0U, 0U, 0U },&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; /* LocalTokenNumberTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(PEI_PCD_DATABASE, Uninit.PcdFlashNvStorageFtwWorkingBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(PEI_PCD_DATABASE, Uninit.PcdFlashNvStorageFtwSpareBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(PEI_PCD_DATABASE, Uninit.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetof(PEI_PCD_DATABASE, Uninit.PcdS3BootScriptTablePrivateDataPtr_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_DATUM_TYPE_UINT64 | PCD_TYPE_DATA,&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; /* GuidTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp;/* StringTable */&lt;br /&gt;
&amp;nbsp; { 0 }, /* _ */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; /* SizeTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 0U, 0U, /* _ */&lt;br /&gt;
&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; /* SkuIdTable */&lt;br /&gt;
&amp;nbsp; { 0U,&amp;nbsp; },&lt;br /&gt;
&amp;nbsp; 0U&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
以上是在Compile過程中，Build Tool為PCD PEIM所生成的檔案。&lt;br /&gt;
可以注意到這邊只有少數幾組PCD，原因是PCD PEIM中不會包含只在DXE被使用的PCD。&lt;br /&gt;
而這個PEI_PCD_DATABASE，最後會透過HOB傳給PCD DXE。&lt;br /&gt;
建立HOB的過程可參考&lt;span style=&quot;color: #bf9000;&quot;&gt;BuildPcdDatabase&lt;/span&gt;。&lt;br /&gt;
&lt;br /&gt;
整個Structure分為&lt;span style=&quot;color: #bf9000;&quot;&gt;Init&lt;/span&gt;與&lt;span style=&quot;color: #bf9000;&quot;&gt;Uninit&lt;/span&gt;的部分，兩個差別是在於，如果有定義好預設值的Dynamic PCD，其預設值會被放在Init裡面，但如果在DSC裡定義的值為0或NULL的話，會被視為無預設值，且會放置於Uninit中。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;
&amp;nbsp; /* LocalTokenNumberTable */&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
offsetof(PEI_PCD_DATABASE, 
Uninit.PcdFlashNvStorageFtwWorkingBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc)
 | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
offsetof(PEI_PCD_DATABASE, 
Uninit.PcdFlashNvStorageFtwSpareBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc)
 | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
offsetof(PEI_PCD_DATABASE, 
Uninit.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc)
 | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
offsetof(PEI_PCD_DATABASE, 
Uninit.PcdS3BootScriptTablePrivateDataPtr_a1aff049_fdeb_442a_b320_13ab4cb72bbc)
 | PCD_DATUM_TYPE_UINT64 | PCD_TYPE_DATA,&lt;br /&gt;
&amp;nbsp; },&lt;/span&gt;&lt;br /&gt;
PEI_PCD_DATABASE_INIT中的LocalTokenNumberTable會在Compile過程中，會決定好每個PCD中的Data在PEI_PCD_DATABASE中的Offset以及Data Type與PCD Type。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;#define offsetof(s,m)&amp;nbsp; (UINT32) (UINTN) &amp;amp;(((s *)0)-&amp;gt;m)&lt;/span&gt;&lt;br /&gt;
代入一個Structure的原型與其Member，會算出其Member的Offset為多少。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcLIwBttO43bBjWlPo4QK_7JJrjzekfGMg0LP0ZPWad31v7hw9zvGNshACU-p67bYt2r_osUy4wCIcgZNOB-yzCOXOB7qUdkd12ZffaCTrlm0sgAhZ8nTVxOoa_l-wzQHTPgPG3FmWUb8/s1600/%E5%9C%96%E7%89%871.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcLIwBttO43bBjWlPo4QK_7JJrjzekfGMg0LP0ZPWad31v7hw9zvGNshACU-p67bYt2r_osUy4wCIcgZNOB-yzCOXOB7qUdkd12ZffaCTrlm0sgAhZ8nTVxOoa_l-wzQHTPgPG3FmWUb8/s1600/%E5%9C%96%E7%89%871.png&quot; height=&quot;45&quot; width=&quot;400&quot; class=&#39;png-upload-img&#39; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD Type Mask:&lt;/span&gt;&lt;br /&gt;
PCD_TYPE_DATA&lt;br /&gt;
PCD_TYPE_HII&lt;br /&gt;
PCD_TYPE_VPD&lt;br /&gt;
PCD_TYPE_SKU_ENABLED&lt;br /&gt;
PCD_TYPE_STRING&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;Datum Type:&lt;/span&gt;&lt;br /&gt;
PCD_DATUM_TYPE_POINTER&lt;br /&gt;
PCD_DATUM_TYPE_UINT8&lt;br /&gt;
PCD_DATUM_TYPE_UINT16&lt;br /&gt;
PCD_DATUM_TYPE_UINT32&lt;br /&gt;
PCD_DATUM_TYPE_UINT64&lt;br /&gt;
&lt;br /&gt;
在上面的LocalTokenNumberTable中，共有四個PCD，如果去搜尋整套編譯過的Source Code，可以在某些AutoGen.h看到這些Dynamic PCD的Token Number，並且可以注意到第一個PCD的Token為1，那為何不是從0開始？0是給PCD_INVALID_TOKEN_NUMBER使用（Source Code中有註解），所以第一個PCD是從1開始，只是後面會將Token Number減1，再代入Table取得其相關資料。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;
#define _PCD_TOKEN_PcdFlashNvStorageFtwWorkingBase&amp;nbsp; 1U&lt;br /&gt;
#define _PCD_GET_MODE_32_...&amp;nbsp; LibPcdGet32(_PCD_TOKEN_PcdFlashNvStorageFtwWorkingBase)&lt;br /&gt;
#define
 _PCD_SET_MODE_32_...(Value)&amp;nbsp; 
LibPcdSet32(_PCD_TOKEN_PcdFlashNvStorageFtwWorkingBase, (Value))&lt;br /&gt;
&lt;br /&gt;
#define _PCD_TOKEN_PcdFlashNvStorageFtwSpareBase&amp;nbsp; 2U&lt;br /&gt;
#define _PCD_GET_MODE_32_...&amp;nbsp; LibPcdGet32(_PCD_TOKEN_PcdFlashNvStorageFtwSpareBase)&lt;br /&gt;
#define _PCD_SET_MODE_32_...(Value)&amp;nbsp; LibPcdSet32(_PCD_TOKEN_PcdFlashNvStorageFtwSpareBase, (Value))&lt;br /&gt;
&lt;br /&gt;
#define _PCD_TOKEN_PcdFlashNvStorageVariableBase&amp;nbsp; 3U&lt;br /&gt;
#define _PCD_GET_MODE_32_...&amp;nbsp; LibPcdGet32(_PCD_TOKEN_PcdFlashNvStorageVariableBase)&lt;br /&gt;
#define _PCD_SET_MODE_32_...(Value)&amp;nbsp; LibPcdSet32(_PCD_TOKEN_PcdFlashNvStorageVariableBase, (Value))&lt;br /&gt;
&lt;br /&gt;
#define _PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr&amp;nbsp; 4U&lt;br /&gt;
#define _PCD_GET_MODE_64_...&amp;nbsp; LibPcdGet64(_PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr)&lt;br /&gt;
#define _PCD_SET_MODE_64_...(Value)&amp;nbsp; LibPcdSet64(_PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr, (Value))&lt;br /&gt;
&lt;/span&gt;
&lt;br /&gt;
在PPI或Protocol的底層會透過呼叫&lt;span style=&quot;color: #bf9000;&quot;&gt;GetWorker&lt;/span&gt;或&lt;span style=&quot;color: #bf9000;&quot;&gt;SetWorker&lt;/span&gt;來存取PCD。&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
GetWorker:&lt;/h2&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;
VOID *&lt;br /&gt;
GetWorker (&lt;br /&gt;
&amp;nbsp; IN UINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TokenNumber,&lt;br /&gt;
&amp;nbsp; IN UINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetSize&lt;br /&gt;
&amp;nbsp; )&lt;br /&gt;
&lt;/span&gt;
&lt;br /&gt;
透過Token Number取得該PCD的LocalTokenNumber (Offset、PCD Type、Data Type)。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;LocalTokenNumber = PeiPcdDb-&amp;gt;Init.LocalTokenNumberTable[TokenNumber];&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
透過Mask單獨取得Offset。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;Offset = LocalTokenNumber &amp;amp; PCD_DATABASE_OFFSET_MASK;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
接下來會依照各種不同PCD Type做不同的處理：&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_VPD:&lt;/span&gt;&lt;br /&gt;
傳回VPD (&lt;span class=&quot;st&quot;&gt;Vital Product Data)中特定的Offset的資料。&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;VPD_HEAD *VpdHead;&lt;br /&gt;VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);&lt;br /&gt;return (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead-&amp;gt;Offset);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_HII|PCD_TYPE_STRING:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_HII:&lt;/span&gt;&lt;br /&gt;
透過Offset取得Variable Head，裡面有著GUID與Name的Index。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);&lt;br /&gt;&lt;br /&gt;Guid = &amp;amp;(PeiPcdDb-&amp;gt;Init.GuidTable[VariableHead-&amp;gt;GuidTableIndex]);&lt;br /&gt;Name = (UINT16*)&amp;amp;StringTable[VariableHead-&amp;gt;StringIndex];&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
透過GetVariable取得Variable Data。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;Status = GetHiiVariable (Guid, Name, &amp;amp;Data, &amp;amp;DataSize);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
如有錯誤則去取得PCD設定的預設值（如：NOT_FOUND）。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;if (Status == EFI_SUCCESS) {&lt;br /&gt;&amp;nbsp; return (VOID *) ((UINT8 *) Data + VariableHead-&amp;gt;Offset);&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; //&lt;br /&gt;&amp;nbsp; // Return the default value specified by Platform Integrator &lt;br /&gt;&amp;nbsp; //&lt;br /&gt;&amp;nbsp; if ((LocalTokenNumber &amp;amp; PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (VOID*)&amp;amp;StringTable[*(STRING_HEAD*)((UINT8*)PeiPcdDb + VariableHead-&amp;gt;DefaultValueOffset)];&lt;br /&gt;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead-&amp;gt;DefaultValueOffset);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_DATA:&lt;/span&gt;&lt;br /&gt;
直接透過Offset取得Data。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;return (VOID *) ((UINT8 *)PeiPcdDb + Offset);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_STRING:&lt;/span&gt;&lt;br /&gt;
先取得該PCD的STRING_HEAD (StringTableIdx)，裡面存放著對應StringTable的Offset。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;StringTableIdx = * (STRING_HEAD*) ((UINT8 *) PeiPcdDb + Offset);&lt;br /&gt;
return (VOID *) (&amp;amp;StringTable[StringTableIdx]);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
SetWorker:&lt;/h2&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;
EFI_STATUS&lt;br /&gt;SetWorker (&lt;br /&gt;
&amp;nbsp; IN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TokenNumber,&lt;br /&gt;
&amp;nbsp; IN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VOID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Data,&lt;br /&gt;
&amp;nbsp; IN OUT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINTN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Size,&lt;br /&gt;
&amp;nbsp; IN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOLEAN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PtrType&lt;br /&gt;&amp;nbsp; )&lt;br /&gt;
&lt;/span&gt;
&lt;br /&gt;
透過Token Number取得該PCD的LocalTokenNumber (Offset、PCD Type、Data Type)。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;LocalTokenNumber = PeiPcdDb-&amp;gt;Init.LocalTokenNumberTable[TokenNumber];&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
會先判斷Data Type是不是Pointer，通常像String之類的，會被歸類為Pointer。&lt;br /&gt;
要注意到在Build Tool會在PCD Database中，先宣告好固定長度的陣列來存放String等其它Data。&lt;br /&gt;
如果PtrType為True，而傳入的Size又大於原先預留好的最大值的話，就會造成問題，這邊就先擋掉並回傳MaxSize。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;
if (PtrType) {&lt;br /&gt;&amp;nbsp; //&lt;br /&gt;&amp;nbsp; // Get MaxSize first, then check new size with max buffer size.&lt;br /&gt;&amp;nbsp; //&lt;br /&gt;&amp;nbsp; GetPtrTypeSize (TokenNumber, &amp;amp;MaxSize, PeiPcdDb);&lt;br /&gt;&amp;nbsp; if (*Size &amp;gt; MaxSize) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Size = MaxSize;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_INVALID_PARAMETER;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; if (*Size != PeiPcdGetSize (TokenNumber + 1)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_INVALID_PARAMETER;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
當某個PCD被修改時會去呼叫，為該PCD註冊Notify的Function。&lt;br /&gt;
可以透過PCD Library的LibPcdCallbackOnSet來進行註冊會比較方便。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;if (TokenNumber + 1 &amp;lt; PEI_NEX_TOKEN_NUMBER + 1) {&lt;br /&gt;&amp;nbsp; InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size);&lt;br /&gt;
}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
透過Mask單獨取得Offset，並取得Data。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;Offset = LocalTokenNumber &amp;amp; PCD_DATABASE_OFFSET_MASK;&lt;br /&gt;
InternalData&amp;nbsp;&amp;nbsp;&amp;nbsp; = (VOID *) ((UINT8 *) PeiPcdDb + Offset);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
接下來會依照各種不同PCD Type做不同的處理：&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_VPD:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_HII:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_HII|PCD_TYPE_STRING:&lt;/span&gt;&lt;br /&gt;
可能是上述幾個Type都不支援在PEI修改NVS，所以這邊就直接return回EFI_INVALID_PARAMETER。&lt;br /&gt;
尤其PCD_TYPE_HII實際上就是個Variable。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;return EFI_INVALID_PARAMETER;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_STRING:&lt;/span&gt;&lt;br /&gt;
傳入的資料為一串Array，資料長度可能會變動，所以先更改Current Size。&lt;br /&gt;
SizeTable中有兩個欄位，一個是Max Size，一個是Current Size。&lt;br /&gt;
之後再透過CopyMem，將傳入的Data Copy到StringTable中。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) {&lt;br /&gt;&amp;nbsp; StringTableIdx = *((STRING_HEAD *)InternalData);&lt;br /&gt;&amp;nbsp; CopyMem (&amp;amp;PeiPcdDb-&amp;gt;Init.StringTable[StringTableIdx], Data, *Size);&lt;br /&gt;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; return EFI_INVALID_PARAMETER;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PCD_TYPE_DATA:&lt;/span&gt;&lt;br /&gt;
PtrType的處理方式跟PCD_TYPE_STRING很像。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;if (PtrType) {&lt;br /&gt;&amp;nbsp; if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CopyMem (InternalData, Data, *Size);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_INVALID_PARAMETER;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
其餘基本型態只是透過轉型來處理。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;switch (*Size) {&lt;br /&gt;&amp;nbsp; case sizeof(UINT8):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *((UINT8 *) InternalData) = *((UINT8 *) Data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; case sizeof(UINT16):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *((UINT16 *) InternalData) = *((UINT16 *) Data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; case sizeof(UINT32):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *((UINT32 *) InternalData) = *((UINT32 *) Data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; case sizeof(UINT64):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *((UINT64 *) InternalData) = *((UINT64 *) Data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_SUCCESS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ASSERT (FALSE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return EFI_NOT_FOUND;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/8891118635017761657/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2014/10/pcd-platform-configuration-database.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8891118635017761657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8891118635017761657'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2014/10/pcd-platform-configuration-database.html' title='PCD (Platform Configuration Database) - Part 2 (PEI)'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcLIwBttO43bBjWlPo4QK_7JJrjzekfGMg0LP0ZPWad31v7hw9zvGNshACU-p67bYt2r_osUy4wCIcgZNOB-yzCOXOB7qUdkd12ZffaCTrlm0sgAhZ8nTVxOoa_l-wzQHTPgPG3FmWUb8/s72-c/%E5%9C%96%E7%89%871.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-5182699120345745674</id><published>2013-12-26T12:04:00.000+08:00</published><updated>2016-10-26T10:14:06.882+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EDK II"/><title type='text'>PCD (Platform Configuration Database) - Part 1</title><content type='html'>EDK II相較於EDK來說，除了更模組化的設計（少了許多沒必要且重複的Library...），最大的不同就是多了PCD這個新功能！&lt;br /&gt;
&lt;br /&gt;
依照PCD類型的不同，我們的Module可以讀取在Compiler前就已設定好的Macro，或者是使用Dynamic PCD來讓各個Module相互存取數值。&lt;br /&gt;
&lt;br /&gt;
在EDK時BIOS內的不同Module要互相傳遞數值，最常使用的可能是CMOS、Memory或Variable。&lt;br /&gt;
但CMOS可使用的位置並不算多（雖然還算滿多的...），也要顧慮到該位址是否已被占用。&lt;br /&gt;
而Memory也要先配置好空間，然後別支Module也要知道該位置，說真的也有點麻煩...&lt;br /&gt;
再來就是Variable，Variable說方便是方便，但使用時都要做一些繁瑣動作，例如訂好Name、GUID還有Data Type（雖然PCD也要訂定好GUID與各資料型別等部分，但Compiler會做掉很多地方），對於一般不需保存於NVS的資料，個人比較偏好使用PCD，但其生命周期只有Boot-time而已。&lt;br /&gt;
&lt;br /&gt;
PCD分為五種型態：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;PcdsFeatureFlag&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;PcdsFixedAtBuild&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;PcdsPatchableInModule&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;PcdsDynamic&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;PcdsDynamicEx &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
某些PCD在編譯時，就會被宣告為使用它的Module裡的常數，所以只能去讀取它原先就定好的值。&lt;br /&gt;
其它PCD則是可以在Boot-time時期做存取的動作。&lt;br /&gt;
&lt;br /&gt;
可在Package中的DEC檔中宣告每個不同的PCD。&lt;br /&gt;
以&lt;span style=&quot;color: #bf9000;&quot;&gt;MdePkg.dec&lt;/span&gt;為例：&lt;br /&gt;
[&lt;span style=&quot;color: #bf9000;&quot;&gt;PcdsFixedAtBuild&lt;/span&gt;, &lt;span style=&quot;color: #bf9000;&quot;&gt;PcdsPatchableInModule&lt;/span&gt;, &lt;span style=&quot;color: #bf9000;&quot;&gt;PcdsDynamic&lt;/span&gt;, &lt;span style=&quot;color: #bf9000;&quot;&gt;PcdsDynamicEx&lt;/span&gt;]&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|&lt;span style=&quot;color: #bf9000;&quot;&gt;0xE0000000&lt;/span&gt;|&lt;span style=&quot;color: #bf9000;&quot;&gt;UINT64&lt;/span&gt;|&lt;span style=&quot;color: #bf9000;&quot;&gt;0x0000000a&amp;nbsp;&lt;/span&gt; gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangCodes|&lt;span style=&quot;color: #bf9000;&quot;&gt;&quot;engfraengfra&quot;|VOID*|0x0000001c&lt;/span&gt;&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLang|&lt;span style=&quot;color: #bf9000;&quot;&gt;&quot;eng&quot;&lt;/span&gt;|&lt;span style=&quot;color: #bf9000;&quot;&gt;VOID*&lt;/span&gt;|&lt;span style=&quot;color: #bf9000;&quot;&gt;0x0000001d&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
在DEC中的PCD宣告，可以有多種型態，以上面的例子來說，這些PCDs就宣告了四種型態，並且分別給予它們&lt;span style=&quot;color: #bf9000;&quot;&gt;初始值&lt;/span&gt;、&lt;span style=&quot;color: #bf9000;&quot;&gt;資料型別&lt;/span&gt;與&lt;span style=&quot;color: #bf9000;&quot;&gt;Token值&lt;/span&gt;。&lt;br /&gt;
&lt;br /&gt;
然後可在DSC中定義它實際的&lt;span style=&quot;color: #bf9000;&quot;&gt;PCD型態&lt;/span&gt;與&lt;span style=&quot;color: #bf9000;&quot;&gt;初始值&lt;/span&gt;。&lt;br /&gt;
以&lt;span style=&quot;color: #bf9000;&quot;&gt;MdePkg.dsc&lt;/span&gt;為例：&lt;br /&gt;
[&lt;span style=&quot;color: #bf9000;&quot;&gt;PcdsFixedAtBuild&lt;/span&gt;]&lt;br /&gt;
&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|&lt;span style=&quot;color: #bf9000;&quot;&gt;0x0f&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|&lt;span style=&quot;color: #bf9000;&quot;&gt;0x80000000&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|&lt;span style=&quot;color: #bf9000;&quot;&gt;0xE0000000&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
========================================&lt;br /&gt;
那如果在DSC定義一個與DEC中所宣告的型態不同會如何？&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;MdePkg.dec&lt;/span&gt; &lt;br /&gt;
[&lt;span style=&quot;color: #bf9000;&quot;&gt;PcdsFixedAtBuild&lt;/span&gt;,&lt;span style=&quot;color: #bf9000;&quot;&gt;PcdsPatchableInModule&lt;/span&gt;]&lt;br /&gt;
&amp;nbsp; gEfiMdePkg...Guid.PcdDebugPrintErrorLevel|0x80000000|UINT32|0x00000006&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;Nt32Pkg.dsc&lt;/span&gt;&lt;br /&gt;
[&lt;span style=&quot;color: #bf9000;&quot;&gt;PcdsDynamicDefault&lt;/span&gt;]&lt;br /&gt;
&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000040&lt;br /&gt;
&lt;br /&gt;
將會&lt;span style=&quot;color: #bf9000;&quot;&gt;Compile error&lt;/span&gt;...&lt;br /&gt;
Type [Dynamic] of PCD [gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel] in DSC file doesn&#39;t match the type [FixedAtBuild] defined in DEC file.&lt;br /&gt;
&lt;br /&gt;
底下這句話是Spec中所提到的：&lt;br /&gt;
Some DEC files define multiple PCD types, but only one type can be used and will be chosen by the platform DSC file.&lt;br /&gt;
========================================&lt;br /&gt;
&lt;br /&gt;
在編譯的時候Compiler會為每一支Module自動產生AutoGen.h與AutoGen.c。&lt;br /&gt;
關於PCD的部分，它會將使用者在inf中所加入的PCD轉換到上述的兩個檔案，對於不同型態的PCD，則會有不同的處理方式。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h3&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;以下將會介紹各種不同的PCD：&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsFeatureFlag&lt;/span&gt;&lt;/h2&gt;
FeatureFlag顧名思義可以用它來表示一個Feature是On或Off，所以它是一個Boolean值TRUE或FALSE。&lt;br /&gt;
可從下面的例子看出，PcdsFeatureFlag型態的PCD，將會被轉換成const的常數，也意味的它只能被唯讀。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;span style=&quot;color: #bf9000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DSC&lt;/span&gt;&lt;br /&gt;
[PcdsFeatureFlag]&lt;br /&gt;
&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport|TRUE&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
#define _PCD_TOKEN_PcdUgaConsumeSupport&amp;nbsp; 11U&lt;br /&gt;
#define &lt;span style=&quot;color: #3d85c6;&quot;&gt;_PCD_VALUE_PcdUgaConsumeSupport&lt;/span&gt;&amp;nbsp; ((BOOLEAN)1U)&lt;br /&gt;
extern const&amp;nbsp; BOOLEAN&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_FixedAtBuild_PcdUgaConsumeSupport&lt;/span&gt;;&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_GET_MODE_BOOL_PcdUgaConsumeSupport&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_FixedAtBuild_PcdUgaConsumeSupport&lt;/span&gt;&lt;br /&gt;
//#define _PCD_SET_MODE_BOOL_PcdUgaConsumeSupport&amp;nbsp; ASSERT(FALSE)&amp;nbsp; // It is not allowed to set value for a FIXED_AT_BUILD PCD&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.c&lt;/span&gt;&lt;br /&gt;
GLOBAL_REMOVE_IF_UNREFERENCED const BOOLEAN &lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_FixedAtBuild_PcdUgaConsumeSupport&lt;/span&gt; = &lt;span style=&quot;color: #3d85c6;&quot;&gt;_PCD_VALUE_PcdUgaConsumeSupport&lt;/span&gt;;&lt;br /&gt;
========================================&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsFixedAtBuild&lt;/span&gt;&lt;/h2&gt;
FixedAtBuild與FeatureFlag挺相似的，最大的不同則是在於它可以宣告多種不同的變數型別，而不是只有局限於Boolean而已。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DSC&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;&lt;/span&gt;[PcdsFixedAtBuild]&lt;br /&gt;
&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xE0000000&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
#define _PCD_TOKEN_PcdPciExpressBaseAddress&amp;nbsp; 16U&lt;br /&gt;
#define &lt;span style=&quot;color: #3d85c6;&quot;&gt;_PCD_VALUE_PcdPciExpressBaseAddress&lt;/span&gt;&amp;nbsp; 0xE0000000ULL&lt;br /&gt;
extern const&amp;nbsp; UINT64&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_FixedAtBuild_PcdPciExpressBaseAddress&lt;/span&gt;;&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_GET_MODE_64_PcdPciExpressBaseAddress&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_FixedAtBuild_PcdPciExpressBaseAddress&lt;/span&gt;&lt;br /&gt;
//#define _PCD_SET_MODE_64_PcdPciExpressBaseAddress&amp;nbsp; ASSERT(FALSE)&amp;nbsp; // It is not allowed to set value for a FIXED_AT_BUILD PCD&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.c&lt;/span&gt;&lt;br /&gt;
GLOBAL_REMOVE_IF_UNREFERENCED const UINT64 &lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_FixedAtBuild_PcdPciExpressBaseAddress&lt;/span&gt; = &lt;span style=&quot;color: #3d85c6;&quot;&gt;_PCD_VALUE_PcdPciExpressBaseAddress&lt;/span&gt;;&lt;br /&gt;
========================================&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsPatchableInModule&lt;/span&gt;&lt;/h2&gt;
宣告成PatchableInModule與上面兩種型態的PCD的最大不同是，它可以在Runtime時去變動它的數值。&lt;br /&gt;
然後它還有一個特質，通過下面的範例可以注意到，它被宣告成一個全域變數（Global Variable），在PE/COFF的檔案格式中，而全域變數將會被初始化並放置於Data Section之中。並有機會透過外部工具直接修改。&lt;br /&gt;
記得Compile完所產生的.efi檔案都是PE（Portable Executable）格式，有興趣的人可以用7z將.efi打開看看。&lt;br /&gt;
&lt;br /&gt;
由於它只被宣告一個全域變數，所以只有同一個Module能夠取存，不能透過它與各Module相互傳遞數值。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DSC&lt;/span&gt;&lt;br /&gt;
[PcdsPatchableInModule]&lt;br /&gt;
&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
#define _PCD_TOKEN_PcdDebugPrintErrorLevel&amp;nbsp; 17U&lt;br /&gt;
#define &lt;span style=&quot;color: #3d85c6;&quot;&gt;_PCD_PATCHABLE_VALUE_PcdDebugPrintErrorLevel&lt;/span&gt;&amp;nbsp; ((UINT32)0x80000040U)&lt;br /&gt;
extern volatile&amp;nbsp;&amp;nbsp; UINT32&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_BinaryPatch_PcdDebugPrintErrorLevel&lt;/span&gt;;&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_GET_MODE_32_PcdDebugPrintErrorLevel&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_BinaryPatch_PcdDebugPrintErrorLevel&lt;/span&gt;&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_SET_MODE_32_PcdDebugPrintErrorLevel&lt;/span&gt;(Value)&amp;nbsp; (&lt;span style=&quot;color: #6aa84f;&quot;&gt;_gPcd_BinaryPatch_PcdDebugPrintErrorLevel &lt;/span&gt;= (Value))&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.c&lt;/span&gt;&lt;br /&gt;
volatile&amp;nbsp; UINT32 _gPcd_BinaryPatch_PcdDebugPrintErrorLevel = &lt;span style=&quot;color: #3d85c6;&quot;&gt;_PCD_PATCHABLE_VALUE_PcdDebugPrintErrorLevel&lt;/span&gt;;&lt;br /&gt;
========================================&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsDynamic v.s. PcdsDynamicEx&lt;/span&gt;&lt;/h2&gt;
這兩種型態的PCD都是集中於PCD Database作集中管理，有PEI與DXE兩個部分。&lt;br /&gt;
型態又可細分為以下幾種：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;PcdsDynamicDefault and PcdsDynamicExDefault&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;PcdsDynamicHii and PcdsDynamicExHii&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;PcdsDynamicVpd and PcdsDynamicExVpd &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
在DEC所宣告的Section需要為PcdsDynamic或PcdsDynamicEx，而在DSC中則是它們的子分類。&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsDynamicDefault&lt;/span&gt;&lt;/h2&gt;
DynamicDefault型態的PCD的最大優勢是在於，各個Module之間可以藉由這個PCD來互相傳遞數值。&lt;br /&gt;
所以它有著多樣化的應用方式，例如預先把某個不會變動的值從HW讀出來，並存到某個PCD裡面，這樣接下來其它的Module就可以不用再經過繁複的動作去存取HW上的值，直接透過PCD即可。&lt;br /&gt;
&lt;br /&gt;
可以看到下面的例子，它會去透過一個Library去存取數值，而不是宣告一個常數或全域變數。&lt;br /&gt;
&lt;br /&gt;
還可注意到一點，在DEC中所定的Token與AutoGen.h的數值並不相同！&lt;br /&gt;
其實Spec有提到，不管DEC中如何訂，Compiler都會自己產生一組，這應該是為了避免人為因素而有重複的狀況。&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;Although
 the token is auto-generated. A value is required for the Token field; 
if it is not defined, then the the build will fail.&lt;/span&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;span style=&quot;color: #bf9000;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DEC&lt;/span&gt;&lt;br /&gt;
[PcdsDynamic, PcdsDynamicEx]&lt;br /&gt;
&amp;nbsp; gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0|UINT64|0x00030000&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DSC &lt;/span&gt;&lt;br /&gt;
[PcdsDynamicDefault]&amp;nbsp; &lt;br /&gt;
&amp;nbsp; gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0&lt;span style=&quot;color: #bf9000;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
#define _PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr&amp;nbsp; 1U&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_GET_MODE_64_PcdS3BootScriptTablePrivateDataPtr&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;LibPcdGet64&lt;/span&gt;(_PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr)&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_SET_MODE_64_PcdS3BootScriptTablePrivateDataPtr&lt;/span&gt;(Value)&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;LibPcdSet64&lt;/span&gt;(_PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr, (Value))&lt;br /&gt;
========================================&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsDynamicExDefault&lt;/span&gt;&lt;/h2&gt;
多了Ex的DynamicExDefault與DynamicDefault很相似，但如果一個Module不是同時間與整個Platform一起Build的，而是一個外部的Binary，Platform與Binary又需要互相存取某個PCD的數值的話，這時候一開始該PCD就需要宣告成DynamicEx型態的PCD。&lt;br /&gt;
但外部的Binary在使用DynamicEx PCD時，必須先知道該PCD的GUID與Token值，才能透過LibPcdGetExXX或LibPcdSetExXX來存取。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DEC&lt;/span&gt;&lt;br /&gt;
[PcdsDynamic, PcdsDynamicEx]&lt;br /&gt;
&amp;nbsp; gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0|UINT64|0x00030000&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DSC &lt;/span&gt;&lt;br /&gt;
[PcdsDynamicExDefault]&amp;nbsp; &lt;br /&gt;
&amp;nbsp; gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0&lt;span style=&quot;color: #bf9000;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
#define _PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr&amp;nbsp; 196608U&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_GET_MODE_64_PcdS3BootScriptTablePrivateDataPtr&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;LibPcdGetEx64&lt;/span&gt;(&amp;amp;gEfiMdeModulePkgTokenSpaceGuid, _PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr)&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_SET_MODE_64_PcdS3BootScriptTablePrivateDataPtr&lt;/span&gt;(Value)&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;LibPcdSetEx64&lt;/span&gt;(&amp;amp;gEfiMdeModulePkgTokenSpaceGuid, _PCD_TOKEN_PcdS3BootScriptTablePrivateDataPtr, (Value))&lt;br /&gt;
========================================&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsDynamicHii&lt;/span&gt;&lt;/h2&gt;
HII型態的PCD在DSC需定好它所對應的Variable Name、GUID、Offset（位於Variable Data的哪個Offset）還有Default Value。&lt;br /&gt;
如果系統中不存在著該Variable，那麼就會從PCD取得DSC所定好的預設值，否則就會回傳該Variable的Data加上Offset。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;span style=&quot;color: #bf9000;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DEC&lt;/span&gt;&lt;br /&gt;
[PcdsDynamic, PcdsDynamicEx]&lt;br /&gt;
&amp;nbsp; gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut|0xffff|UINT16|0x40000001&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DSC &lt;/span&gt;&lt;br /&gt;
[PcdsDynamicHii]&lt;br /&gt;
&amp;nbsp; gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L&quot;Timeout&quot;|gEfiGlobalVariableGuid|0x0|10&lt;span style=&quot;color: #bf9000;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
#define _PCD_TOKEN_PcdPlatformBootTimeOut&amp;nbsp; 15U&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_GET_MODE_16_PcdPlatformBootTimeOut&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;LibPcdGet16&lt;/span&gt;(_PCD_TOKEN_PcdPlatformBootTimeOut)&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_SET_MODE_16_PcdPlatformBootTimeOut&lt;/span&gt;(Value)&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;LibPcdSet16&lt;/span&gt;(_PCD_TOKEN_PcdPlatformBootTimeOut, (Value))&lt;br /&gt;
========================================&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsDynamicExHii&lt;/span&gt;&lt;/h2&gt;
多了Ex的DynamicExHii則意思跟DynamicEx很相似。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DEC&lt;/span&gt;&lt;br /&gt;
[PcdsDynamic, PcdsDynamicEx]&lt;br /&gt;
&amp;nbsp; gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut|0xffff|UINT16|0x40000001&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;DSC &lt;/span&gt;&lt;br /&gt;
[PcdsDynamicExHii]&lt;br /&gt;
&amp;nbsp; gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L&quot;Timeout&quot;|gEfiGlobalVariableGuid|0x0|10&lt;span style=&quot;color: #bf9000;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #bf9000;&quot;&gt;AutoGen.h&lt;/span&gt;&lt;br /&gt;
#define _PCD_TOKEN_PcdPlatformBootTimeOut&amp;nbsp; 1073741825U&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_GET_MODE_16_PcdPlatformBootTimeOut&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;LibPcdGetEx16&lt;/span&gt;(&amp;amp;gEfiIntelFrameworkModulePkgTokenSpaceGuid, _PCD_TOKEN_PcdPlatformBootTimeOut)&lt;br /&gt;
#define &lt;span style=&quot;color: #a64d79;&quot;&gt;_PCD_SET_MODE_16_PcdPlatformBootTimeOut&lt;/span&gt;(Value)&amp;nbsp; &lt;span style=&quot;color: #6aa84f;&quot;&gt;LibPcdSetEx16&lt;/span&gt;(&amp;amp;gEfiIntelFrameworkModulePkgTokenSpaceGuid, _PCD_TOKEN_PcdPlatformBootTimeOut, (Value))&lt;br /&gt;
========================================&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;PcdsDynamicVpd and PcdsDynamicExVpd&lt;/span&gt;&lt;/h2&gt;
VPD (&lt;span class=&quot;st&quot;&gt;Vital Product Data)&lt;/span&gt;，在NVS會有一塊區域被用來儲存VPD的資料，與其它Dynamic PCD不同，VPD只能唯讀，無法在執行期間去修改它的數值。&lt;br /&gt;
關於VPD的部分，目前我還沒有機會用到。&lt;br /&gt;
&lt;br /&gt;
以上就先介紹的這個部分，下一篇再來介紹應用與原理。</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/5182699120345745674/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2013/12/pcd-platform-configuration-database.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5182699120345745674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5182699120345745674'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2013/12/pcd-platform-configuration-database.html' title='PCD (Platform Configuration Database) - Part 1'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-973914205694001514</id><published>2013-12-17T16:03:00.001+08:00</published><updated>2016-07-13T10:53:06.784+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EDK II"/><title type='text'>Package, Component, DEC and DSC</title><content type='html'>&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;b&gt;Package&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
EDK II與EDK最大的差異就是在於多了Package這個模組化的設計，把具有相同類型的Component、Library與各種Declaration放在這同一個目錄。&lt;br /&gt;
而每一個Package都有.dec (EDK II Package Declaration File)還有.dsc (EDK II Package Description File)這兩個檔案。&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;b&gt;Component&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
每一個Component可以當作是EFI的執行檔，編譯完會產生出.efi的檔案。&lt;br /&gt;
而Component會在它的inf檔中宣告它的MODULE_TYPE，總共有以下這幾種類型：&lt;br /&gt;
BASE, SEC, PEI_CORE, PEIM, &lt;br /&gt;
DXE_CORE, DXE_DRIVER, DXE_RUNTIME_DRIVER, DXE_SMM_DRIVER, DXE_SAL_DRIVER, UEFI_DRIVER, UEFI_APPLICATION&lt;br /&gt;
&lt;br /&gt;
但要注意的是BASE這種類型只有Library可以使用。&lt;br /&gt;
對一般的開發人員來說，常用的應該只有PEIM、 DXE_DRIVER, DXE_RUNTIME_DRIVER, DXE_SMM_DRIVER, UEFI_DRIVER與UEFI_APPLICATION。&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;DEC (EDK II Package Declaration File)&lt;/span&gt;&lt;/h2&gt;
Package中有.dec這個檔案來宣告提供給內外部的Component所使用的interface，如：header files所在的位置、Library、GUID、protocol、PCD的宣告...等。&lt;br /&gt;
等於它是一個提供者的角色，對於使用者（Component、Library）來說，有用到該Package的資源的話，就需要在其inf加入這個DEC。&lt;br /&gt;
&lt;br /&gt;
DEC中包含了以下這些區塊：&lt;br /&gt;
Defines、Includes、LibraryClasses、Guids、Ppis、Protocols與Pcds。&lt;br /&gt;
&lt;br /&gt;
========================================&lt;br /&gt;
Includes：描述這個Package的header files都集中放在哪一個目錄底下，所以常可在實際的目錄下看到Library、Protocol、Ppi等資料夾存在。&lt;br /&gt;
&lt;span style=&quot;color: #6fa8dc;&quot;&gt;[Includes]&lt;br /&gt;&amp;nbsp; Include&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;br /&gt;[Includes.IA32]&lt;br /&gt;&amp;nbsp; Include/Ia32&lt;br /&gt;&lt;br /&gt;[Includes.X64]&lt;br /&gt;&amp;nbsp; Include/X64&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
======================================== &lt;br /&gt;
Guids、Ppis、Protocols：定義了這個Package所提供的Guids、Ppis與Protocols，在以往EDK使用某個GUID的變數時，都必須在.inf加入有定義這個變數的Library，不然就是要自己宣告一個。&lt;br /&gt;
而EDK II中我們只要加入包含它所被宣告的DEC即可使用，這部分Compiler都已經幫我們處理好了。 &lt;br /&gt;
&lt;span style=&quot;color: #6fa8dc;&quot;&gt;[Guids]&lt;br /&gt;&amp;nbsp; #GuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}}&lt;br /&gt;&lt;br /&gt;[Ppis]&lt;br /&gt;&amp;nbsp; #PpiGuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}}&lt;br /&gt;&lt;br /&gt;[Protocols]&lt;br /&gt;&amp;nbsp; #ProtocolGuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
========================================&lt;br /&gt;
以下描述的各種PCD型態的宣告與初始值。&lt;br /&gt;
&lt;span style=&quot;color: #6fa8dc;&quot;&gt;[PcdsFeatureFlag]&lt;br /&gt;&amp;nbsp; #FeatureFlag PCD is BOOLEAN type, the value is TRUR or FALSE.&lt;br /&gt;&amp;nbsp; #PcdTokenSpaceCGuidName.PcdName|TRUE|BOOLEAN|TokenNumber&lt;br /&gt;&amp;nbsp; #PcdTokenSpaceCGuidName.PcdName|FALSE|BOOLEAN|TokenNumber&lt;br /&gt;&lt;br /&gt;[PcdsFixedAtBuild]&lt;br /&gt;&amp;nbsp; #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber&lt;br /&gt;&lt;br /&gt;[PcdsPatchableInModule]&lt;br /&gt;&amp;nbsp; #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber&lt;br /&gt;&lt;br /&gt;[PcdsDynamic]&lt;br /&gt;&amp;nbsp; #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber&lt;br /&gt;&lt;br /&gt;[PcdsDynamicEx]&lt;br /&gt;&amp;nbsp; #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #6fa8dc;&quot;&gt;可以注意的是，在DEC中的PCD宣告可以是複合式的宣告。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #6fa8dc;&quot;&gt;[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]&amp;nbsp; gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xE0000000|UINT64|0x0000000a&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;DSC (EDK II Package Description File)&lt;/span&gt;&lt;/h2&gt;
每一個Package內通常會有一個.dsc的檔案，用來指定要編譯那些Component與Library，並且定義每一個PCD的類型與實際的初始值，因為DEC檔內只是宣告PCD型態與初始值，而實際上的定義，則是在DSC之中。&lt;br /&gt;
&lt;br /&gt;
DSC中包含了以下這些區塊：&lt;br /&gt;
Defines、LibraryClasses、與Pcds。</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/973914205694001514/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2013/12/package-component-dec-dsc.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/973914205694001514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/973914205694001514'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2013/12/package-component-dec-dsc.html' title='Package, Component, DEC and DSC'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-5891513399039173376</id><published>2013-12-11T17:46:00.000+08:00</published><updated>2013-12-11T17:46:13.854+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EDK II"/><title type='text'>UDK vs. EDK II</title><content type='html'>&lt;br /&gt;
在網路上會看到有UDK (UEFI Development Kits)跟EDK II這兩個相似的東西，但這兩者有甚麼樣的不同？&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;EDK II是基於開放原始碼，並由一群自願者所開發與維護。&lt;/li&gt;
&lt;li&gt;而UDK是由Intel基於某一個EDK II的特定版本所維護並發佈出來的，相對來講會來的比較穩定。&lt;/li&gt;
&lt;/ol&gt;
可經由此去取得EDK II與UDK。&lt;br /&gt;
&lt;a href=&quot;http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EDK2&quot; target=&quot;_blank&quot;&gt;http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EDK2&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/5891513399039173376/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2013/12/udk-vs-edk-ii.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5891513399039173376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5891513399039173376'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2013/12/udk-vs-edk-ii.html' title='UDK vs. EDK II'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-5802902453602088273</id><published>2013-12-11T16:38:00.001+08:00</published><updated>2013-12-11T16:40:37.950+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Utility"/><title type='text'>UEFI Detect Utility - 2014</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQTN9MpwkkXyWF5qXEIpSrkNNIns1X9B9ECB6LCB4Uyz9FLpt8XMh1VcRqYkU4TV7UYR2G0AyhoOrte9L00jN5ZELeXXEaTLP5-Z7oVm24cOIq1Nxq8XKYIH0bhq7ZkoboZzs4HuyJdnE/s1600/UduCaptureScreen_002340.bmp&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQTN9MpwkkXyWF5qXEIpSrkNNIns1X9B9ECB6LCB4Uyz9FLpt8XMh1VcRqYkU4TV7UYR2G0AyhoOrte9L00jN5ZELeXXEaTLP5-Z7oVm24cOIq1Nxq8XKYIH0bhq7ZkoboZzs4HuyJdnE/s320/UduCaptureScreen_002340.bmp&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW8dK9uGXFf3CfrSMc8MMNksE9uH0YEfg8y2vEbIzB5RBdYZ7gsCKW1KByiK_ZDFvMhcJWhs9Q8gwIufI5pJ-ujSX8GIzJ1Z-jhIxKdpo0uXedKznSDNvLWUxGob_WsdHNpIjcl4ZhSaQ/s1600/UduCaptureScreen_002350.bmp&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW8dK9uGXFf3CfrSMc8MMNksE9uH0YEfg8y2vEbIzB5RBdYZ7gsCKW1KByiK_ZDFvMhcJWhs9Q8gwIufI5pJ-ujSX8GIzJ1Z-jhIxKdpo0uXedKznSDNvLWUxGob_WsdHNpIjcl4ZhSaQ/s320/UduCaptureScreen_002350.bmp&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokdU4quG2Jhcdx1e_g6vnuEuKIi7OWNkgdS5KAiBrV-YccmqDoGjRg_UeDzd5BsKGFIfyhPkToFBsOvukDQ6prVMq7zqwb82riGMiApmNKNo5hXS0bW-CgAMyJvqJTJrcpYlz0BtboIw/s1600/LduCaptureScreen_155010.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
已做部分更新，先前版本在某些機台會無法使用。&lt;br /&gt;
&lt;br /&gt;
解壓密碼：leon&lt;br /&gt;
&lt;a href=&quot;https://drive.google.com/file/d/0B5QkTNcT9jCtS2ZFNzRRTVppS1k/edit?usp=sharing&quot;&gt;UefiDetectUtility_131211.7z&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/5802902453602088273/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2013/12/uefi-detect-utility-2014.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5802902453602088273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5802902453602088273'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2013/12/uefi-detect-utility-2014.html' title='UEFI Detect Utility - 2014'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQTN9MpwkkXyWF5qXEIpSrkNNIns1X9B9ECB6LCB4Uyz9FLpt8XMh1VcRqYkU4TV7UYR2G0AyhoOrte9L00jN5ZELeXXEaTLP5-Z7oVm24cOIq1Nxq8XKYIH0bhq7ZkoboZzs4HuyJdnE/s72-c/UduCaptureScreen_002340.bmp" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-3921965173082950936</id><published>2011-11-18T17:58:00.000+08:00</published><updated>2011-11-18T18:12:45.416+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PC Architecture"/><title type='text'>MTRR</title><content type='html'>&lt;style type=&quot;text/css&quot;&gt;
ul, ol, li {
  margin: 0;
  padding: 0;
  list-style-type: none;
}
li {
}
.desc li {
  //margin-left: 1em;
  //text-indent: -1em;
  margin-bottom: 5px;
}
.desc li .label {
  color: rgb(204, 153, 51);
}
&lt;/style&gt;&lt;br /&gt;
MTRR (Memory type range registers) 是CPU內的一組MSR (Model-specific registers) ，它作用為告訴CPU要如何最佳的存取各個記憶體區段，簡單來說是CPU要以哪種快取模式來進行存取。&lt;br /&gt;
&lt;br /&gt;
通常MTRR的初始化是BIOS的任務。&lt;br /&gt;
&lt;br /&gt;
在UEFI中可以使用EfiReadMsr, EfiWriteMsr, MsrRead64, MsrWrite64...等Function來存取，只要拉相對應的Header與Library就好。&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;IA32_MTRRCAP, Index: 0xFE, Read-Only.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWSBweApVe41kYA1gh-CK_0cEjBtqNGlKSKWromURfROFLtIJeT-He6E6nHKD-nu0rvbodu2uCejIKmVN4quQzT0-L89gKWbtj7FBAGXAqGI28-_qI05X43BiqT-XDvrYfBqrG6f3Vdn4/s1600/MTRR-2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;102&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWSBweApVe41kYA1gh-CK_0cEjBtqNGlKSKWromURfROFLtIJeT-He6E6nHKD-nu0rvbodu2uCejIKmVN4quQzT0-L89gKWbtj7FBAGXAqGI28-_qI05X43BiqT-XDvrYfBqrG6f3Vdn4/s400/MTRR-2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;desc&quot; style=&quot;padding: 0;&quot;&gt;&lt;li&gt;&lt;span class=&quot;label&quot;&gt;VCNT (variable range registers count) bits 0 ~ 7&lt;/span&gt; - 指出這個CPU支援幾組動態的MTRR，MTRR也是有數量的，也有機會被塞爆。&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;label&quot;&gt;FIX (fixed range registers supported) flag, bit 8&lt;/span&gt; - 指出是否支援Fixed range MTRRs (IA32_MTRR_FIX64K_00000 through IA32_MTRR_FIX4K_0F8000)。&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;label&quot;&gt;WC (write combining) flag, bit 10&lt;/span&gt; - 是否支援write-combining (WC) memory。&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;label&quot;&gt;SMRR (System-Management Range Register) flag, bit 11&lt;/span&gt; - 是否支援SMRR。&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;hr /&gt;IA32_MTRR_DEF_TYPE, Index: 0x2FF.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfXoQ-UgyVb3dMu-9PN0qAyO7x7vz-hiJHidXQKrz2BnqP9aUEbAm6p4b2ewIAkw3Bw0K3uuH_wHnIueDKsapveZII61_ZU856z5wcP44uN5VzlmciE4KFqIRfco6e3wdZx-0_3Pcawwo/s1600/MTRR-3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;94&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfXoQ-UgyVb3dMu-9PN0qAyO7x7vz-hiJHidXQKrz2BnqP9aUEbAm6p4b2ewIAkw3Bw0K3uuH_wHnIueDKsapveZII61_ZU856z5wcP44uN5VzlmciE4KFqIRfco6e3wdZx-0_3Pcawwo/s400/MTRR-3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;desc&quot; style=&quot;padding: 0;&quot;&gt;&lt;li&gt;&lt;span class=&quot;label&quot;&gt;Type field, bits 0 ~ 7&lt;/span&gt; - 指出未涵蓋在MTRR所定義的記憶體該以何種Cache為預設值。&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;label&quot;&gt;FE (fixed MTRRs enabled) flag, bit 10&lt;/span&gt; - Enable或Disable Fixed-range MTRR。&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;label&quot;&gt;E (MTRRs enabled) flag, bit 11&lt;/span&gt; - Enable或Disable動態的MTRR。&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;hr /&gt;Variable - Range Register Pair&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD80ap7ZuufGt6UhOZyT8dVJwpLA-BmEKgTNyhRX_78d7FSBckxyJnm6XKBbJ69WT4l1_9R2lqaTcMCstt3ISer4kNxc_I_6n3TaFe0cN0inWhb0fwW87wrPZYXr2-5ImRbOal0y4u8S4/s1600/MTRR-4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;205&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD80ap7ZuufGt6UhOZyT8dVJwpLA-BmEKgTNyhRX_78d7FSBckxyJnm6XKBbJ69WT4l1_9R2lqaTcMCstt3ISer4kNxc_I_6n3TaFe0cN0inWhb0fwW87wrPZYXr2-5ImRbOal0y4u8S4/s400/MTRR-4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;一組MTRR有兩個Registers，Base與Mask，起始索引可參考EDK的定義：&lt;br /&gt;
#define EFI_CACHE_VARIABLE_MTRR_BASE 0x200&lt;br /&gt;
&lt;br /&gt;
&lt;ul class=&quot;desc&quot; style=&quot;padding: 0;&quot;&gt;&lt;li&gt;&lt;span class=&quot;label&quot;&gt;Type field, bits 0 ~ 7&lt;/span&gt; - 此MTRR所定義的範圍該以何種Cache方式存取。&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;label&quot;&gt;Valid field, bits 11&lt;/span&gt; - 指出此組MTRR是否有效。&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;label&quot;&gt;PhysBase field, bits 12 ~ (MAXPHYADDR-1)&lt;/span&gt; - 取12 ~ (MAXPHYADDR-1) bits，補上3個0，就是組MTRR的Base Address。&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;label&quot;&gt;PhysMask field, bits 12 ~ (MAXPHYADDR-1)&lt;/span&gt; - 一樣只取12 ~ (MAXPHYADDR-1) bits，補上3個0，再做1的補數運算，即可算出此MTRR的長度，值得注意的是長度需為2的次方。&lt;/li&gt;
&lt;/ul&gt;MAXPHYADD代表是CPU的定址能力，長度依CPU而定。&lt;br /&gt;
&lt;br /&gt;
下表為各種存取方式對應到MTRR的Type：&lt;br /&gt;
&lt;table style=&quot;width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr style=&quot;background-color: #333333; text-align: center;&quot;&gt;&lt;td&gt;Memory Type and Mnemonic&lt;/td&gt;&lt;td&gt;Encoding in MTRR&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Uncacheable (UC)&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;00h&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Write Combining (WC)&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;01h&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Reserved*&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;02h&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Reserved*&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;03h&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Write-through (WT)&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;04h&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Write-protected (WP)&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;05h&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Writeback (WB)&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;06h&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Reserved*&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;07h ~ FFh&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;hr /&gt;範例：&lt;br /&gt;
&lt;table style=&quot;width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr style=&quot;background-color: #333333; text-align: center;&quot;&gt;&lt;td&gt;MTRR&lt;/td&gt;&lt;td&gt;Index&lt;/td&gt;&lt;td&gt;Value&lt;/td&gt;&lt;td&gt;Type/Size&lt;/td&gt;&lt;td&gt;Range&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;text-align: right;&quot;&gt;&lt;td style=&quot;text-align: center;&quot;&gt;Base&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;200&lt;/td&gt;&lt;td&gt;00000006&lt;/td&gt;&lt;td&gt;WriteBack&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;text-align: right;&quot;&gt;&lt;td style=&quot;text-align: center;&quot;&gt;Mask&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;201&lt;/td&gt;&lt;td&gt;F80000800&lt;/td&gt;&lt;td&gt;2048MB&lt;/td&gt;&lt;td&gt;0 ~ 7FFFFFFF&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;text-align: right;&quot;&gt;&lt;td style=&quot;text-align: center;&quot;&gt;Base&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;202&lt;/td&gt;&lt;td&gt;80000006&lt;/td&gt;&lt;td&gt;WriteBack&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;text-align: right;&quot;&gt;&lt;td style=&quot;text-align: center;&quot;&gt;Mask&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;203&lt;/td&gt;&lt;td&gt;FC0000800&lt;/td&gt;&lt;td&gt;1024MB&lt;/td&gt;&lt;td&gt;80000000 ~ BFFFFFFF&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;5&quot;&gt;略...&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;text-align: right;&quot;&gt;&lt;td style=&quot;text-align: center;&quot;&gt;Base&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;206&lt;/td&gt;&lt;td&gt;D8000000&lt;/td&gt;&lt;td&gt;Uncacheable&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;text-align: right;&quot;&gt;&lt;td style=&quot;text-align: center;&quot;&gt;Mask&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;207&lt;/td&gt;&lt;td&gt;FF8000800&lt;/td&gt;&lt;td&gt;128MB&lt;/td&gt;&lt;td&gt;D8000000 ~ DFFFFFFF&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;text-align: right;&quot;&gt;&lt;td style=&quot;text-align: center;&quot;&gt;Base&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;208&lt;/td&gt;&lt;td&gt;D7000000&lt;/td&gt;&lt;td&gt;Uncacheable&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;text-align: right;&quot;&gt;&lt;td style=&quot;text-align: center;&quot;&gt;Mask&lt;/td&gt;&lt;td style=&quot;text-align: center;&quot;&gt;209&lt;/td&gt;&lt;td&gt;FFF000800&lt;/td&gt;&lt;td&gt;16MB&lt;/td&gt;&lt;td&gt;D7000000 ~ D7FFFFFF&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;5&quot;&gt;略...&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
對於MTRR所需要注意的Type有沒有設定為正確的Type，還有MTRR有沒有被塞爆，可能導致某些要使用Cache的Memory區域會因沒有宣告Cacheable，造成效能低落...等。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/3921965173082950936/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2011/11/mtrr_18.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/3921965173082950936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/3921965173082950936'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2011/11/mtrr_18.html' title='MTRR'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWSBweApVe41kYA1gh-CK_0cEjBtqNGlKSKWromURfROFLtIJeT-He6E6nHKD-nu0rvbodu2uCejIKmVN4quQzT0-L89gKWbtj7FBAGXAqGI28-_qI05X43BiqT-XDvrYfBqrG6f3Vdn4/s72-c/MTRR-2.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-4661374564095380077</id><published>2011-11-17T17:04:00.000+08:00</published><updated>2014-09-22T00:19:34.352+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PC Architecture"/><title type='text'>Memory Map</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2N1fQaZB0f8K-Zdn-0NFuMatGpN5gcpCXK699Xwr8rWDeCai156QZsTpV1-FiAuzyy5K_EFAokJss1t3E29p8c9j7andAjhpCOdZg884xSvJcBfiTv3f5kSXN6n0A-MK7YBulk2qUMBc/s1600/MTRR-1.png&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2N1fQaZB0f8K-Zdn-0NFuMatGpN5gcpCXK699Xwr8rWDeCai156QZsTpV1-FiAuzyy5K_EFAokJss1t3E29p8c9j7andAjhpCOdZg884xSvJcBfiTv3f5kSXN6n0A-MK7YBulk2qUMBc/s1600/MTRR-1.png&quot; width=&quot;520&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
上圖擷取自Intel Spec.&lt;br /&gt;
以下以Intel Platfrom為例。&lt;br /&gt;
&lt;br /&gt;
左圖是實體記憶體大於4 GB以上，有Remap機制。&lt;br /&gt;
右圖是記憶體小於4 GB，無Remap機制發生。&lt;br /&gt;
&lt;br /&gt;
每張圖都有提供兩種觀點，System View與Memory Controller View。&lt;br /&gt;
System View為整個系統可以存取的記憶體範圍。&lt;br /&gt;
Memory Controller View為實際上Physical Memory的整體分布。&lt;br /&gt;
&lt;br /&gt;
通常TOLUD Base ~ 4 GB這段範圍都被PCI Resource Mapping，所以這塊記憶體位置就被占據了。&lt;br /&gt;
因此後來發展了Remap機制，把Reclaim Base ~ Reclaim Limit這段範圍的記憶體將它Mapping至實體記憶體4 GB以下OS invisible Reclaim的位置，以便回收利用那些被PCI Resource所佔據的記憶體。&lt;br /&gt;
※TOLUD: Top of Lower Usable DRAM
&lt;br /&gt;
※TOUUD: Top of Upper Usable DRAM
&lt;br /&gt;
&lt;br /&gt;
以下為Reclaim的Pseudo-code:&lt;br /&gt;
&lt;div style=&quot;color: #cc9933;&quot;&gt;
IF (ADDRESS_IN[38:20] ≥ REMAP_BASE[35:20]) AND&lt;br /&gt;
&lt;div style=&quot;margin-left: 1em;&quot;&gt;
(ADDRESS_IN[38:20] ≤ REMAP_LIMIT[35:20]) THEN&lt;br /&gt;
&lt;br /&gt;
ADDRESS_OUT[38:20] = (ADDRESS_IN[38:20] – REMAP_BASE[35:20]) +&lt;br /&gt;
0000000b &amp;amp; TOLUD[31:20]&lt;br /&gt;
&lt;br /&gt;
ADDRESS_OUT[19:0] = ADDRESS_IN[19:0]&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
ME Base = TOM（Top of Memory，實體記憶體總量）- ME UMA Size。&lt;br /&gt;
Reclaim Base = MAX (4GB, ME Base) 看何者為大。&lt;br /&gt;
Reclaim Limit = Remap Base + (PCI Resource Total Size - 1);&lt;br /&gt;
TOUUD Base = Reclaim Limit + 1。&lt;br /&gt;
而TOLUD Base在哪裡則是要看PCI Resource整體分配了多少的空間而定，還有Physical Memory Size而定。&lt;br /&gt;
&lt;br /&gt;
由於Intel Graphics本身沒有獨立的記憶體，所以它使用了Physical Memory當成自己的記憶體，所以這部分並沒有辦法Reclaim回來，可見GFX Stolen與GFX GTT Stolen這兩塊，而T SEG也佔據下面那一塊。&lt;br /&gt;
&lt;br /&gt;
OS存取Reclaim Base ~ Reclaim Limit這段範圍時，它其實是將資料儲存在Physical Memory中OS invisible Reclaim這個地方。&lt;br /&gt;
所以支援4 GB以上Memory的OS就可以使用被PCI Resource占據的Memory。&lt;br /&gt;
這也是預設的情況下，Windows 32-bit的OS常常只能用到3 GB甚至以下的記憶體。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/4661374564095380077/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2011/11/memory-map.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/4661374564095380077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/4661374564095380077'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2011/11/memory-map.html' title='Memory Map'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2N1fQaZB0f8K-Zdn-0NFuMatGpN5gcpCXK699Xwr8rWDeCai156QZsTpV1-FiAuzyy5K_EFAokJss1t3E29p8c9j7andAjhpCOdZg884xSvJcBfiTv3f5kSXN6n0A-MK7YBulk2qUMBc/s72-c/MTRR-1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-5646705083176802417</id><published>2011-10-31T17:44:00.001+08:00</published><updated>2014-10-21T16:23:09.997+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PC Architecture"/><title type='text'>PCI Configuration Space</title><content type='html'>&lt;style type=&quot;text/css&quot;&gt;
.title {
  font-weight: bold; 
  font-size: 16px;
  color: #FFF;
}
.subTitle {
  font-weight: bold; 
  color: #C33;
}
.subContent {
}
&lt;/style&gt;

&lt;br /&gt;
&lt;div&gt;
可以透過I/O方式或Memory方式來存取PCI Configuration Space，但在此之前要先算出該Device的PFA (PCI Function Address)。&lt;br /&gt;
&lt;br /&gt;
I/O可透過I/O Port的0xCF8來指定所要存取的PCI Device的Address，然後再透過0xCFC將Data讀出。 &lt;br /&gt;
其公式為：&lt;br /&gt;
Address = 0x80000000 + (Bus &amp;lt;&amp;lt; 16) + (Device &amp;lt;&amp;lt; 11) + (Function &amp;lt;&amp;lt; 8) + Index&lt;br /&gt;
其中0x80000000稱之為Enable bit。&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-jqiA1-DVxFaoKgKH3A8jR9D9BrPgtv2kKugR1gq-5A01Eb7oNlO7OM-okQoEaXx0YsO9ws3lzaMmwsdQpfi8xVLvXVuzvhlPHd-1wrwXRZ8f_OYCWRk4wDoAT3yDQB_9QUa6eQdbgnU/s1600/IoPci.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-jqiA1-DVxFaoKgKH3A8jR9D9BrPgtv2kKugR1gq-5A01Eb7oNlO7OM-okQoEaXx0YsO9ws3lzaMmwsdQpfi8xVLvXVuzvhlPHd-1wrwXRZ8f_OYCWRk4wDoAT3yDQB_9QUa6eQdbgnU/s1600/IoPci.png&quot; height=&quot;45&quot; width=&quot;400&quot; class=&quot;black-word-img&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;div class=&quot;subTitle&quot; style=&quot;clear: both;&quot;&gt;
I/O Mapped I/O&lt;/div&gt;
&lt;br /&gt;
Memory存取起來則比較方便，但缺點要先取得PCI的Base Address。&lt;br /&gt;
其公式為：&lt;br /&gt;
Address = Base Address + (Bus &amp;lt;&amp;lt; 20) + (Device &amp;lt;&amp;lt; 15) + (Function &amp;lt;&amp;lt; 12) + Index&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw2nkWaDajlBT8uAFRCliDWwjyHvTKGKJ_dK8mAkQU4Qv7fGPM44mSPq2lmyfUFTjJdFJcFmebOFsUXURJx4gei4a3uNAQojxszu96s8wsF9Ky2npsZNLpWdoZApL1QeRGzfzIBN6yz98/s1600/MmPci.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw2nkWaDajlBT8uAFRCliDWwjyHvTKGKJ_dK8mAkQU4Qv7fGPM44mSPq2lmyfUFTjJdFJcFmebOFsUXURJx4gei4a3uNAQojxszu96s8wsF9Ky2npsZNLpWdoZApL1QeRGzfzIBN6yz98/s1600/MmPci.png&quot; height=&quot;45&quot; width=&quot;400&quot; class=&quot;black-word-img&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;subTitle&quot; style=&quot;clear: both;&quot;&gt;
Memory Mapped I/O&lt;/div&gt;
&lt;br /&gt;
各個參數的長度：&lt;br /&gt;
Bus: 0 ~ 255, Device: 0 ~ 31, Function: 0 ~ 7&lt;br /&gt;
可以注意到兩者的Index長度是不同的，透過I/O的話只能存取0 ~ 255的範圍，Memory則可到0 ~ 4095。&lt;br /&gt;
&lt;br /&gt;
在這介紹一下PCI Configuration Registers。&lt;br /&gt;
PCI Device與PCI Bridge的前16個Bytes的格式是相同的。&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;title&quot;&gt;PCI Device Register (Type 0):&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGwUf7ugGhwJQsJtlGbIShUzH4FA8pWa0IvOAWJm-vcW7mLJ18nmkGoFECw41mfzt89a8AqOayAuBnuZyMrw3EHUy1MAEaIqAnklD8xEQNYQTgASk4ce98tQNOfy1tJh5WgdzPldYPRMk/s1600/650px-Pci-config-space.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGwUf7ugGhwJQsJtlGbIShUzH4FA8pWa0IvOAWJm-vcW7mLJ18nmkGoFECw41mfzt89a8AqOayAuBnuZyMrw3EHUy1MAEaIqAnklD8xEQNYQTgASk4ce98tQNOfy1tJh5WgdzPldYPRMk/s400/650px-Pci-config-space.png&quot; height=&quot;387&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;subTitle&quot; style=&quot;clear: both;&quot;&gt;
0E: Header Type&lt;/div&gt;
可藉由bit 0 ~ 7這三個定義來判斷是甚麼Device：&lt;br /&gt;
#define HEADER_TYPE_DEVICE 0x00&lt;br /&gt;
#define HEADER_TYPE_PCI_TO_PCI_BRIDGE 0x01&lt;br /&gt;
#define HEADER_TYPE_CARDBUS_BRIDGE 0x02&lt;br /&gt;
且可由第8個Bit判斷該Device是不是Multi Function：&lt;br /&gt;
#define HEADER_TYPE_MULTI_FUNCTION 0x80&lt;br /&gt;
#define IS_PCI_MULTI_FUNC(_p)         ((_p)-&amp;gt;Hdr.HeaderType &amp;amp; HEADER_TYPE_MULTI_FUNCTION)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;subTitle&quot; style=&quot;clear: both;&quot;&gt;
10 ~ 27: Base Address Register&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZmMZXBnffTG2WV9oOtT2C82xyXxa7NH47FctW403X1xfElNhbbTv0tXi9qQFR0Tu5bH-kpJPsf3_p-BLT0ZXBwcRNGKcwaAd3vJXZur_jkUrT68WP91N0f-LxS3U1QEnvE-2kmrrLH6g/s1600/BAR.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZmMZXBnffTG2WV9oOtT2C82xyXxa7NH47FctW403X1xfElNhbbTv0tXi9qQFR0Tu5bH-kpJPsf3_p-BLT0ZXBwcRNGKcwaAd3vJXZur_jkUrT68WP91N0f-LxS3U1QEnvE-2kmrrLH6g/s400/BAR.png&quot; height=&quot;359&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
上圖為BAR的Layout，長度為32 bits。&lt;br /&gt;
Bit 0: 判斷BAR為Memory還是I/O。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Memory:&lt;/span&gt;&lt;br /&gt;
Bits 0 ~ 3為ReadOnly。&lt;br /&gt;
Bits 1 ~ 2: Address Space的長度，00 - 32 bits、01, 11 - Reserved、10 - 64 bits。&lt;br /&gt;
Bit 3: 指出是否為Prefetchable，是的話該Device的Bridge Prefetchable Memory將會指定一段範圍。&lt;br /&gt;
Bits 4 ~ 31: Base Address。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;I/O:&lt;/span&gt;&lt;br /&gt;
Bits 0: Reserved。&lt;br /&gt;
Bits 2 ~ 31: Base Address。&lt;br /&gt;
&lt;br /&gt;
對BAR填入0xFFFFFFFF會得出一組數值，對此數值做1的補數即可得出這個BAR的長度。&lt;br /&gt;
BIOS在Enumerate PCI Device時候，便是以此來取得系統所要分配的PCI Resource。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;subTitle&quot;&gt;
2C ~ 2F: Subsystem Vendor ID and Subsystem ID&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;title&quot;&gt;
PCI Bridge Register (Type 1):&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg_9E8K0vVKBTHsOWypcVE0v0Rb79er1r4IvUr2C7785zUDEO4NvD96ELbHDAS-VcEKvpXX9lwP4jNE51qaFPWKwxRruDFlxx96OG1LuS_6QNrMOCnfXxM2-8g3FKoDDmodiQ4YyOQ4wQ/s1600/PCI+Bridge.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg_9E8K0vVKBTHsOWypcVE0v0Rb79er1r4IvUr2C7785zUDEO4NvD96ELbHDAS-VcEKvpXX9lwP4jNE51qaFPWKwxRruDFlxx96OG1LuS_6QNrMOCnfXxM2-8g3FKoDDmodiQ4YyOQ4wQ/s400/PCI+Bridge.png&quot; height=&quot;383&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;subTitle&quot; style=&quot;clear: both;&quot;&gt;
18 ~ 1A: Primary Bus, Secondary Bus and Subordinate Bus&lt;/div&gt;
Primary Bus: 此Bridge的前一個Bus Number是多少。&lt;br /&gt;
Secondary Bus: 此Bridge的下一個Bus Number是多少。&lt;br /&gt;
Subordinate Bus: 此Bridge底下的最後一個Bus Number是多少。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;subTitle&quot;&gt;
1C ~ 1D: I/O Base and Limit&lt;/div&gt;
&lt;div class=&quot;subContent&quot;&gt;
指此Bridge所涵蓋的I/O Resource是多少，1C為Base、1D為Limit，一般每個Byte只要看前4個bits就好，I/O Limit會自動補上0xFFF，也就是說I/O Resource至少是以0x1000為一個單位。&lt;br /&gt;
如：0x4040的範圍為0x4000 ~ 0x4FFF、0x6050為0x5000 ~ 0x6FFF。&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;subTitle&quot;&gt;
20 ~ 23: Memory Base and Limit&lt;/div&gt;
&lt;div class=&quot;subContent&quot;&gt;
指此Bridge所涵蓋的Memory Resource是多少，20 ~ 21為Base、22 ~ 23為Limit，也只需要看前12個bits就好，Limit會自動補上0xFFFFF，也就是說Memory Resource至少是以0x100000(1MB)為一個單位。&lt;br /&gt;
如：Base: 0x5A00, Limit: 0x5AF0範圍是0x5A000000 ~ 0x5AFFFFFF&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;subTitle&quot;&gt;
24 ~ 27: Prefetchable Memory Base and Limit&lt;/div&gt;
&lt;div class=&quot;subContent&quot;&gt;
Prefetchable Memory的範圍。&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;title&quot;&gt;
PCI Device Enumeration:&lt;/div&gt;
&lt;div&gt;
for (Bus = 0; Bus &amp;lt;= PCI_MAX_BUS; ++Bus) {
&lt;br /&gt;
&lt;div style=&quot;margin-left: 1em;&quot;&gt;
for (Device = 0; Device &amp;lt;= PCI_MAX_DEVICE; ++Device) {
&lt;br /&gt;
&lt;div style=&quot;margin-left: 1em;&quot;&gt;
for (Func = 0; Func &amp;lt;= PCI_MAX_FUNC; ++Func) {
&lt;br /&gt;
&lt;div style=&quot;margin-left: 1em;&quot;&gt;
&lt;br /&gt;
PciAddress = PCI_ACCRESS_ENABLE_BIT | PciCfgAddr (Bus, Device, Func);&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Get Vendor ID and Device ID&lt;br /&gt;
//&lt;br /&gt;
IoOutput32 (PCI_ADDRESS_INDEX, PciAddress);&lt;br /&gt;
VendorId = IoInput16 (PCI_DATA_INDEX);&lt;br /&gt;
DeviceId = IoInput16 (PCI_DATA_INDEX + PCI_DEVICE_ID_OFFSET);&lt;br /&gt;
&lt;br /&gt;
if (VendorId == 0xFFFF || DeviceId == 0xFFFF) {&lt;br /&gt;
&lt;div style=&quot;margin-left: 1em;&quot;&gt;
continue;&lt;/div&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Get HeaderType&lt;br /&gt;
//&lt;br /&gt;
IoOutput32 (PCI_ADDRESS_INDEX, PciAddress | 0x0C);&lt;br /&gt;
HeaderType = IoInput8 (PCI_DATA_INDEX + 0x02);&lt;br /&gt;
&lt;br /&gt;
if (Func == 0 &amp;amp;&amp;amp; !(HeaderType &amp;amp; HEADER_TYPE_MULTI_FUNCTION)) {&lt;br /&gt;
&lt;div style=&quot;margin-left: 1em;&quot;&gt;
break;&lt;/div&gt;
}&lt;/div&gt;
}&lt;/div&gt;
}&lt;/div&gt;
}&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/5646705083176802417/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2011/10/pci-configuration-space.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5646705083176802417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5646705083176802417'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2011/10/pci-configuration-space.html' title='PCI Configuration Space'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-jqiA1-DVxFaoKgKH3A8jR9D9BrPgtv2kKugR1gq-5A01Eb7oNlO7OM-okQoEaXx0YsO9ws3lzaMmwsdQpfi8xVLvXVuzvhlPHd-1wrwXRZ8f_OYCWRk4wDoAT3yDQB_9QUa6eQdbgnU/s72-c/IoPci.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-7020501449642678643</id><published>2011-10-28T13:56:00.000+08:00</published><updated>2013-12-11T16:40:53.735+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Utility"/><title type='text'>UEFI Detect Utility - 2012</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokdU4quG2Jhcdx1e_g6vnuEuKIi7OWNkgdS5KAiBrV-YccmqDoGjRg_UeDzd5BsKGFIfyhPkToFBsOvukDQ6prVMq7zqwb82riGMiApmNKNo5hXS0bW-CgAMyJvqJTJrcpYlz0BtboIw/s1600/LduCaptureScreen_155010.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokdU4quG2Jhcdx1e_g6vnuEuKIi7OWNkgdS5KAiBrV-YccmqDoGjRg_UeDzd5BsKGFIfyhPkToFBsOvukDQ6prVMq7zqwb82riGMiApmNKNo5hXS0bW-CgAMyJvqJTJrcpYlz0BtboIw/s400/LduCaptureScreen_155010.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
從踏入UEFI領域後，便陸續的開發這個Tool，目前先發布此版本。&lt;br /&gt;
部分功能只針對Phoenix SCT2與Intel HR、CR做開發。&lt;br /&gt;
目前提供的主要功能如下：&lt;br /&gt;
F1 - PCI&lt;br /&gt;
F2 - Variable&lt;br /&gt;
F3 - Handle&lt;br /&gt;
F4 - Memory, Memory Map&lt;br /&gt;
F5 - IO Space (預設的Address只針對Intel HR、CR)&lt;br /&gt;
F6 - IO Port&lt;br /&gt;
F7 - Flash (只支援Phoenix SCT2)&lt;br /&gt;
F8 - SPD (只支援Intel HR、CR)&lt;br /&gt;
F9 - MTRR (尚未在AMD Platform上測試...)&lt;br /&gt;
&lt;br /&gt;
其他附屬功能：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;儲存資料：Ctrl + S&lt;/li&gt;
&lt;li&gt;比較數值：Ctrl + C&lt;/li&gt;
&lt;li&gt;截取畫面：Ctrl + P&lt;/li&gt;
&lt;li&gt;更新速度：+, -&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
About尚未加入...&lt;br /&gt;
如有Bug請歡迎提出！&lt;br /&gt;
原先以EDK1做開發，預計之後將移植到EDK2重新開發，真是個浩大工程...&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/7020501449642678643/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2011/10/uefi-leon-detect-utility.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/7020501449642678643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/7020501449642678643'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2011/10/uefi-leon-detect-utility.html' title='UEFI Detect Utility - 2012'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokdU4quG2Jhcdx1e_g6vnuEuKIi7OWNkgdS5KAiBrV-YccmqDoGjRg_UeDzd5BsKGFIfyhPkToFBsOvukDQ6prVMq7zqwb82riGMiApmNKNo5hXS0bW-CgAMyJvqJTJrcpYlz0BtboIw/s72-c/LduCaptureScreen_155010.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-8525323722043055147</id><published>2011-02-20T16:33:00.000+08:00</published><updated>2011-06-22T22:29:51.317+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PC Architecture"/><title type='text'>Real Mode</title><content type='html'>&lt;style type=&quot;text/css&quot;&gt;
#memory-map {
}
#memory-map td {
 border: 1px solid #333;
 padding: 2px;
}
&lt;/style&gt;&lt;br /&gt;
在此先補點Hardware的基本觀念好了，以前都只做Windows上的Application，有許多底層的硬體基礎要研究...&lt;br /&gt;
&lt;br /&gt;
早期Intel在1978年所推出的16位元8086 CPU有20條位址線，所以可控制的記憶體最大為1048576Bytes = 1MB(2&lt;sup&gt;20&lt;/sup&gt;)。&lt;br /&gt;
&lt;br /&gt;
Intel CPU list:&lt;br /&gt;
&lt;table style=&quot;text-align: right; width: 100%;&quot;&gt;&lt;tr style=&quot;background-color: #333; text-align: center;&quot;&gt;&lt;td&gt;CPU&lt;/td&gt;&lt;td&gt;Data Bus&lt;/td&gt;&lt;td&gt;Address Bus&lt;/td&gt;&lt;td&gt;Max Addressable Memory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;8086/88&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;1MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;80286&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;16MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;80386SX&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;16MB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;80386DX&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;4GB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;80486SX/DX&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;4GB&lt;/td&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;Pentium&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;4GB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left;&quot;&gt;Pentium Pro&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;64GB&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
以下為1MB以下各區段的記憶體配置表。&lt;br /&gt;
Memory Map:&lt;br /&gt;
&lt;table id=&quot;memory-map&quot;&gt;&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0xE0000 - 0xFFFFF&lt;/td&gt;&lt;td&gt;BIOS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0xC8000 - 0xDFFFF&lt;/td&gt;&lt;td&gt;I/O BIOS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0xC0000 - 0xC7FFF&lt;/td&gt;&lt;td&gt;Video BIOS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0xB8000 - 0xBFFFF&lt;/td&gt;&lt;td&gt;VGA Color Mode Text RAM&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0xB0000 - 0xB7FFF&lt;/td&gt;&lt;td&gt;VGA Monochrome Mode Text RAM&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0xA0000 - 0xAFFFF&lt;/td&gt;&lt;td&gt;VGA Graphics Mode RAM&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0x00500 - 0x9FFFF&lt;/td&gt;&lt;td&gt;User Program Space&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0x00400 - 0x004FF&lt;/td&gt;&lt;td&gt;BIOS Data Area&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: #333;&quot;&gt;0x00000 - 0x003FF&lt;/td&gt;&lt;td&gt;Interrupt Vector Table&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;※其中0xA0000至0xBFFFF為Video RAM&lt;br /&gt;
&lt;br /&gt;
傳統記憶體(Conventional Memory)為640KB以下&lt;br /&gt;
延伸記憶體(Extended Memory)為1MB以上&lt;br /&gt;
UMB(Upper Memory Block)的範圍為0xA0000至0xFFFFF的位址，大小為384KB&lt;br /&gt;
&lt;br /&gt;
早期CPU的Register只有16bits，所以使用兩個Register來定址，表達方式&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;CS:IP&lt;/span&gt;(Code Segment:Instruction Pointer)，而一個Segment的長度為&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;64KB&lt;/span&gt;。&lt;br /&gt;
其算法為&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;Address = Segment * 16 + Offset&lt;/span&gt;&lt;br /&gt;
舉例C800:1234的實際位址為C8000 + 1234 = C9234，只要將CS往左偏移4個bits再加上IP即可。&lt;br /&gt;
&lt;br /&gt;
但由於Address Bus只有20bits，CS:IP最高卻可表達到FFFF:FFFF(10FFEF = 1114095Bytes)，超過了1MB界線的話，將會進行為&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;Memory Wrap&lt;/span&gt;，如0x10AAAA的位址為0xAAAA。&lt;br /&gt;
然而之後的CPU Address Bus都已超過20bits（如80286可定址到16MB的記憶體），若要以用額外的記憶體空間，就必須要將&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;A20 Enable&lt;/span&gt;。&lt;br /&gt;
有些利用Memory Wrap特性的程式可能最後發生問題了，所以遇到該類型程式還是必須將A20 Disable掉。&lt;br /&gt;
FFFF:0010(1MB)至FFFF:FFFF這段空間就稱為&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;HMA&lt;/span&gt;(High Memory Area)。&lt;br /&gt;
&lt;br /&gt;
關於A20的開關，這又是一門學問了...&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/8525323722043055147/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2011/02/real-mode.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8525323722043055147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8525323722043055147'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2011/02/real-mode.html' title='Real Mode'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-8267240091888267379</id><published>2011-01-14T17:09:00.000+08:00</published><updated>2011-01-14T17:26:55.791+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>ME沒起來與SPI Flash無法寫入的問題</title><content type='html'>這陣子使用了某家給的ME，但卻發生ME沒有起來，且Variable無法寫入，包含用tool刷BIOS...&lt;br /&gt;
原來是ME設定中他們只用了某家的Flash型號，而我們是用別家的，自然而然就發生了這樣的狀況。&lt;br /&gt;
可以用FITC去修改ME的設定與增加所支援的SPI Flash型號。&lt;br /&gt;
&lt;br /&gt;
於左邊樹狀目錄上的VSCC Table按下右鍵，選擇Add Table Entry...&lt;br /&gt;
輸入完Entry Name後，就可在右邊填入Flash的VID、DID與VSCC。&lt;br /&gt;
如不知道手邊的Flash資料可於FITC目錄底下的&lt;b style=&quot;color: rgb(204, 153, 51);&quot;&gt;VSCCommn_bin Content.pdf&lt;/b&gt;去做查詢的動作。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/8267240091888267379/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2011/01/mevariable.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8267240091888267379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8267240091888267379'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2011/01/mevariable.html' title='ME沒起來與SPI Flash無法寫入的問題'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-8262331128305795160</id><published>2011-01-04T16:48:00.000+08:00</published><updated>2011-01-04T16:48:56.103+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>ASF(Alert Standard Format)</title><content type='html'>最近剛好有碰到這東西，記一下找的相關資料，以防這記性越來越差的腦袋忘掉...&lt;br /&gt;
&lt;br /&gt;
ASF(&lt;b&gt;Alert Standard Format&lt;/b&gt;)是由DMTF所訂定的標準規範，可使具有ASF功能的電腦能夠遠端監控(Remote monitoring)、遠端管理(Remote management)及遠端控制(Remote control)，可在遠端電腦不具有OS的情況下作控管的功能。&lt;br /&gt;
ASF需有內建網路晶片(LOM)或網路卡(NIC)的支援，還有BIOS的啟用等搭配才能夠使用其功能。&lt;br /&gt;
&lt;br /&gt;
其功能有錯誤警報、監控(溫度、系統狀態等)與控制(開、關機)...等。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
※DMTF(&lt;b&gt;Distributed Management Task Force&lt;/b&gt;)為訂定、開發與維護電腦管理相關標準規範的組織。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/8262331128305795160/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2011/01/asfalert-standard-format.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8262331128305795160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8262331128305795160'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2011/01/asfalert-standard-format.html' title='ASF(Alert Standard Format)'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-5489857915539331006</id><published>2011-01-04T11:30:00.000+08:00</published><updated>2011-01-14T18:21:22.719+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>請做好EFI的指標動態記憶體配置...</title><content type='html'>新年第一帖：&lt;br /&gt;
最近使用了某家的Application，但每次執行到EFI_LEGACY_BIOS_PROTOCOL內的FarCall86時必當...&lt;br /&gt;
結果原來是該Application中的指標記憶體配置沒做好，以致它的起始位置在1MB以下，覆蓋掉原先的資料造成錯誤。&lt;br /&gt;
&lt;br /&gt;
佔版面時間：&lt;br /&gt;
#define EFI_LEGACY_BIOS_PROTOCOL_GUID \&lt;br /&gt;
{ 0xdb9a1e3d, 0x45cb, 0x4abb, 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d}&lt;br /&gt;
&lt;br /&gt;
typedef struct _EFI_LEGACY_BIOS_PROTOCOL {&lt;br /&gt;
　EFI_LEGACY_BIOS_INT86 Int86;&lt;br /&gt;
　EFI_LEGACY_BIOS_FARCALL86 FarCall86;&lt;br /&gt;
　EFI_LEGACY_BIOS_CHECK_ROM CheckPciRom;&lt;br /&gt;
　EFI_LEGACY_BIOS_INSTALL_ROM InstallPciRom;&lt;br /&gt;
　EFI_LEGACY_BIOS_BOOT LegacyBoot;&lt;br /&gt;
　EFI_LEGACY_BIOS_UPDATE_KEYBOARD_LED_STATUS UpdateKeyboardLedStatus;&lt;br /&gt;
　EFI_LEGACY_BIOS_GET_BBS_INFO GetBbsInfo;&lt;br /&gt;
　EFI_LEGACY_BIOS_SHADOW_ALL_LEGACY_OPROMS ShadowAllLegacyOproms;&lt;br /&gt;
　EFI_LEGACY_BIOS_PREPARE_TO_BOOT_EFI PrepareToBootEFI;&lt;br /&gt;
　EFI_LEGACY_BIOS_GET_LEGACY_REGION GetLegacyRegion;&lt;br /&gt;
　EFI_LEGACY_BIOS_COPY_LEGACY_REGION CopyLegacyRegion;&lt;br /&gt;
　EFI_LEGACY_BIOS_BOOT_UNCONVENTIONAL_DEVICE BootUnconventionalDevice;&lt;br /&gt;
} EFI_LEGACY_BIOS_PROTOCOL;&lt;br /&gt;
&lt;br /&gt;
可用此Protocol執行傳統的Legacy Code或OS。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/5489857915539331006/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2011/01/efi.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5489857915539331006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/5489857915539331006'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2011/01/efi.html' title='請做好EFI的指標動態記憶體配置...'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-9079756063567029871</id><published>2010-10-05T11:39:00.000+08:00</published><updated>2010-10-05T11:40:55.702+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>EFI中的CR (CONTAINING RECORD)</title><content type='html'>在EFI中常常可以見到CR這個define，而這個define的作用是，當擁有某個結構成員的位址時，但卻不知整個結構的頭在哪裡的時候，就可利用這個方法來取得整個結構所在的位址，此為CR的定義：&lt;br /&gt;
&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &amp;(((TYPE *) 0)-&gt;Field)))&lt;/span&gt;&lt;br /&gt;
Record：為該成員的位址&lt;br /&gt;
TYPE：為該結構的型態&lt;br /&gt;
Field：為在結構中指向的該成員&lt;br /&gt;
&lt;br /&gt;
這個方法可以分開兩段來看：&lt;br /&gt;
&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;(CHAR8 *) (Record)&lt;/span&gt;：該成員的實際位址&lt;br /&gt;
&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;(CHAR8 *) &amp;(((TYPE *) 0)-&gt;Field)&lt;/span&gt;：該成員在結構中的偏移量&lt;br /&gt;
&lt;br /&gt;
兩個做相減之後便可取得結構頭的位址，最後再來個(TYPE *)作強制轉換。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/9079756063567029871/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2010/10/eficr-containing-record.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/9079756063567029871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/9079756063567029871'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2010/10/eficr-containing-record.html' title='EFI中的CR (CONTAINING RECORD)'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-7080624230030914460</id><published>2010-10-04T17:19:00.000+08:00</published><updated>2011-01-04T11:38:04.056+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>PCI I/O Protocols</title><content type='html'>若要對PCI Device進行讀寫的動作時，可以使用EFI_PCI_IO_PROTOCOL所提供的Function來簡化以前所要做的步驟，以下是PCI IO Protocol的結構：&lt;br /&gt;
typedef struct _EFI_PCI_IO_PROTOCOL {&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_POLL_IO_MEM PollMem;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_POLL_IO_MEM PollIo;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_ACCESS Mem;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_ACCESS Io;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS Pci;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_COPY_MEM CopyMem;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_MAP Map;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_UNMAP Unmap;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER AllocateBuffer;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_FREE_BUFFER FreeBuffer;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_FLUSH Flush;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_GET_LOCATION GetLocation;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_ATTRIBUTES Attributes;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES GetBarAttributes;&lt;br /&gt;
　EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES SetBarAttributes;&lt;br /&gt;
　UINT64 RomSize;&lt;br /&gt;
　VOID *RomImage;&lt;br /&gt;
} EFI_PCI_IO_PROTOCOL;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;// ++++++++++PCI Configuration Space++++++++++&lt;/span&gt;&lt;br /&gt;
首先來講如何取得PCI Configuration Space：&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Pci-config-space.svg/650px-Pci-config-space.svg.png&quot;&gt;&lt;img style=&quot;margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 80%; height: 80%;&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Pci-config-space.svg/650px-Pci-config-space.svg.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
以上為PCI Configuration Space配置表Type 0。&lt;br /&gt;
&lt;br /&gt;
先使用LocateHandleBuffer，將所有PCI Device的Handle全都找出來：&lt;br /&gt;
gBS-&gt;LocateHandleBuffer (ByProtocol, &amp;gEfiPciIoProtocolGuid, NULL, &amp;PciHandleCount, &amp;PciHandleBuffer);&lt;br /&gt;
&lt;br /&gt;
隨後在指定的Handle中將PCI IO Protocol找出來：&lt;br /&gt;
gBS-&gt;OpenProtocol (PciHandle, &amp;gEfiPciIoProtocolGuid, &amp;PciIo, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);&lt;br /&gt;
&lt;br /&gt;
以下可取得PCI Device的四個參數：&lt;br /&gt;
UINTN Seg;&lt;br /&gt;
UINTN Bus;&lt;br /&gt;
UINTN Device;&lt;br /&gt;
UINTN Function;&lt;br /&gt;
PciIo-&gt;GetLocation (PciIo, &amp;Seg, &amp;Bus, &amp;Device, &amp;Function);&lt;br /&gt;
&lt;br /&gt;
若要取得整張配置表可以宣告此union型別變數：&lt;br /&gt;
typedef union {&lt;br /&gt;
　PCI_TYPE00  Device;&lt;br /&gt;
　PCI_TYPE01  Bridge;&lt;br /&gt;
} PCI_TYPE_GENERIC;&lt;br /&gt;
可用其Header Type來判斷它是Device或Bridge，00h與01h...等。&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
　PCI_DEVICE_INDEPENDENT_REGION Hdr;&lt;br /&gt;
　PCI_DEVICE_HEADER_TYPE_REGION Device;&lt;br /&gt;
} PCI_TYPE00;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
　PCI_DEVICE_INDEPENDENT_REGION Hdr;&lt;br /&gt;
　PCI_BRIDGE_CONTROL_REGISTER   Bridge;&lt;br /&gt;
} PCI_TYPE01;&lt;br /&gt;
&lt;br /&gt;
PCI_DEVICE_INDEPENDENT_REGION、PCI_DEVICE_HEADER_TYPE_REGION、PCI_BRIDGE_CONTROL_REGISTER&lt;br /&gt;
這三個結構定義可看Spec。&lt;br /&gt;
&lt;br /&gt;
宣告一個PCI_TYPE_GENERIC變數&lt;br /&gt;
PCI_TYPE_GENERIC Pci;&lt;br /&gt;
PciIo-&gt;Pci.Read (PciIo, EfiPciWidthUint32, 0, sizeof (PCI_TYPE_GENERIC) / sizeof (UINT32), &amp;Pci);&lt;br /&gt;
第二個參數可以設定每次所要取得的大小，詳情可看其定義。&lt;br /&gt;
第三個參數為起始位址，由於要抓整張表所以便填入0。&lt;br /&gt;
第四個參數為總共要抓取的次數。&lt;br /&gt;
成功後可一一取值，如：&lt;br /&gt;
Pci.Device.Hdr.VendorId;&lt;br /&gt;
Pci.Device.Device.SubsystemVendorID;&lt;br /&gt;
&lt;br /&gt;
若要取得配置表的其中一個值，可先算出所在位址，如Status位址在06h而大小是16bits，先宣告一個UINT16的變數Status，代入Pci.Read()。&lt;br /&gt;
PciIo-&gt;Pci.Read (PciIo, EfiPciWidthUint16, 0, 1, &amp;Status);&lt;br /&gt;
&lt;br /&gt;
如果要取得ClassCode的話，而它是3個8bits整數，所以宣告一個UINT8 ClassCode[3]陣列，再呼叫Pci.Read()。&lt;br /&gt;
PciIo-&gt;Pci.Read (PciIo, EfiPciWidthUint8, 0, 3, ClassCode);&lt;br /&gt;
&lt;br /&gt;
以下可印出整張表的內容：&lt;br /&gt;
UINT8 Content;&lt;br /&gt;
for (i = 0x00; i &lt;= 0x0F; ++i) {
　for (j = 0x00; j &lt;= 0x0F; ++j) {
　　Status = PciIo-&gt;Pci.Read (PciIo, EfiPciIoWidthUint8, ((i * 0x10) + j), sizeof (Content), &amp;Content);&lt;br /&gt;
　　PrintAt (j * 3, i, L&quot;%02x&quot;, Content);&lt;br /&gt;
　}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;// ++++++++++PCI Base Address Register++++++++++&lt;/span&gt;&lt;br /&gt;
接下來是Base Address Register的部分，一般PCI Device共有六個BAR，而PCI/PCI Bridge只有兩個BAR，可看Spec。&lt;br /&gt;
而BAR又分了IO Space與Memory Space兩種方式，可看其第一個bit決定，0是Memory Space而1是IO Space，也就是基偶之分，EFI也提供了一個結構儲存該BAR的屬性。&lt;br /&gt;
typedef struct {&lt;br /&gt;
　UINT8   Desc;&lt;br /&gt;
　UINT16  Len;&lt;br /&gt;
　UINT8   ResType;&lt;br /&gt;
　UINT8   GenFlag;&lt;br /&gt;
　UINT8   SpecificFlag;&lt;br /&gt;
　UINT64  AddrSpaceGranularity;&lt;br /&gt;
　UINT64  AddrRangeMin;&lt;br /&gt;
　UINT64  AddrRangeMax;&lt;br /&gt;
　UINT64  AddrTranslationOffset;&lt;br /&gt;
　UINT64  AddrLen;&lt;br /&gt;
} EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR;&lt;br /&gt;
&lt;br /&gt;
此時宣告其指標：&lt;br /&gt;
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Resources;&lt;br /&gt;
PciIo-&gt;GetBarAttributes (PciIo, PciBarIndex, NULL, &amp;Resources);&lt;br /&gt;
注意用完Resources後要釋放掉。&lt;br /&gt;
&lt;br /&gt;
Resources-&gt;ResType也可判斷BAR的屬性（IO/Memory）。&lt;br /&gt;
if (Resources-&gt;ResType == 0) {&lt;br /&gt;
　PciIo-&gt;Mem.Read(PciIo, EfiPciIoWidthUint8, PciBarIndex,0, sizeof (Content), &amp;Content);&lt;br /&gt;
} else {&lt;br /&gt;
　PciIo-&gt;Io.Read(PciIo, EfiPciIoWidthUint8, PciBarIndex, 0, sizeof (Content), &amp;Content);&lt;br /&gt;
}&lt;br /&gt;
BarIndex按自己所需的BAR代入0~5(P2P Bridge: 0~1)的整數。&lt;br /&gt;
至於寫入也是相同方式。</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/7080624230030914460/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2010/10/pci-io-protocols.html#comment-form' title='8 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/7080624230030914460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/7080624230030914460'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2010/10/pci-io-protocols.html' title='PCI I/O Protocols'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-2463607233814098415</id><published>2010-10-02T15:52:00.000+08:00</published><updated>2010-10-06T09:16:13.593+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>Variable Service</title><content type='html'>EFI BIOS使用Variable來儲存各個配置設定，通常存放於NVRAM或CMOS中，這部分就看IBV如何訂定，在DXE階段後可使用Runtime Services所提供的三個服務來存取Variable，基本上一個Variable是由Name、GUID與Data所組成，但其在記憶體中並沒有一定的順序性，所以要找到一個Data就得靠Name和GUID所提供的Index來取得，先介紹這三個Services。&lt;br /&gt;
&lt;br /&gt;
GetNextVariableName(&lt;br /&gt;
IN OUT UINTN    *VariableNameSize,&lt;br /&gt;
IN OUT CHAR16   *VariableName,&lt;br /&gt;
IN OUT EFI_GUID *VendorGuid&lt;br /&gt;
);&lt;br /&gt;
可以透過傳進去的Name與GUID來得到它下一個Name與GUID，並傳出Name的實際Size，如果您不知道任何的Name與GUID的話，此時可填入空的Name與GUID，便會將第一組傳回。&lt;br /&gt;
&lt;br /&gt;
GetVariable(&lt;br /&gt;
　IN     CHAR16   *VariableName,&lt;br /&gt;
　IN     EFI_GUID *VendorGuid,&lt;br /&gt;
　OUT    UINT32   *Attributes OPTIONAL,&lt;br /&gt;
　IN OUT UINTN    *DataSize,&lt;br /&gt;
　OUT    VOID     *Data&lt;br /&gt;
);&lt;br /&gt;
可傳回對應Name與GUID的Data，要傳出的Data要先為它配置好一個空間（動態或靜態皆可），如果不知道Data的Size，此時可先傳入一個非0的Size，它會將實際的Size傳出，並傳回EFI_BUFFER_TOO_SMALL的錯誤訊息，接下來再動態配置空間即可。&lt;br /&gt;
&lt;br /&gt;
SetVariable(&lt;br /&gt;
　IN CHAR16   *VariableName, &lt;br /&gt;
　IN EFI_GUID *VendorGuid,&lt;br /&gt;
　IN UINT32   Attributes,&lt;br /&gt;
　IN UINTN    DataSize,&lt;br /&gt;
　IN VOID     *Data&lt;br /&gt;
);&lt;br /&gt;
將傳入的Data寫入至對應的Name與GUID。&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
#define EFI_VARIABLE_NON_VOLATILE               0x00000001&lt;br /&gt;
#define EFI_VARIABLE_BOOTSERVICE_ACCESS         0x00000002&lt;br /&gt;
#define EFI_VARIABLE_RUNTIME_ACCESS             0x00000004&lt;br /&gt;
#define EFI_VARIABLE_HARDWARE_ERROR_RECORD      0x00000008&lt;br /&gt;
#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/2463607233814098415/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2010/10/variable-service.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/2463607233814098415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/2463607233814098415'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2010/10/variable-service.html' title='Variable Service'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-9108528743692875705</id><published>2010-09-29T22:45:00.000+08:00</published><updated>2010-10-05T09:33:25.389+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>淺談EFI Protocol</title><content type='html'>EFI的Protocol類似於物件導向中的Interface，它訂定好一個標準，而實作是經由別的程式來完成，而使用也是透過這個標準來使用。&lt;br /&gt;一個Protocol基本上是由數個變數與函式指標所組成的結構，也會跟隨著一個唯一識別的GUID(Globally Unique Identifier)，這部分與PEI階段的PEIM中的PPI滿像的，各個不同程式間可利用方法將所需的功能找出來使用。&lt;br /&gt;安裝一個Protocol時會與自己對應的GUID配在一起，放置於Handle Database中，Handle Database是一個Linked List，每個Handle被串在一起，而Handle底下又與屬於它的所有GUID | Protocol相連。&lt;br /&gt;&lt;br /&gt;EFI DRIVER BINDING PROTOCOL原型：&lt;br /&gt;typedef struct _EFI_DRIVER_BINDING_PROTOCOL {&lt;br /&gt;　EFI_DRIVER_BINDING_PROTOCOL_SUPPORTED Supported;&lt;br /&gt;　EFI_DRIVER_BINDING_PROTOCOL_START     Start;&lt;br /&gt;　EFI_DRIVER_BINDING_PROTOCOL_STOP      Stop;&lt;br /&gt;　UINT32                                Version;&lt;br /&gt;　EFI_HANDLE                            ImageHandle;&lt;br /&gt;　EFI_HANDLE                            DriverBindingHandle;&lt;br /&gt;} EFI_DRIVER_BINDING_PROTOCOL;&lt;br /&gt;&lt;br /&gt;其GUID：&lt;br /&gt;#define EFI_DRIVER_BINDING_PROTOCOL_GUID \&lt;br /&gt;  {0x18A031AB,0xB443,0x4D1A,0xA5,0xC0,0x0C,0x09,0x26,0x1E,0x9F,0x71}&lt;br /&gt;&lt;br /&gt;extern EFI_GUID gEfiDriverBindingProtocolGuid = EFI_DRIVER_BINDING_PROTOCOL_GUID;&lt;br /&gt;基本上是使用gEfiDriverBindingProtocolGuid這個變數來與EFI DRIVER BINDING PROTOCOL做關聯。&lt;br /&gt;&lt;br /&gt;與Protocol常用的相關服務如下：&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;InstallMultipleProtocolInterfaces (&lt;br /&gt;　IN OUT EFI_HANDLE *Handle,&lt;br /&gt;　...&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;安裝數個Protocol與搭配的GUID至指定的Handle底下。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;UninstallMultipleProtocolInterfaces (&lt;br /&gt;　IN EFI_HANDLE Handle,&lt;br /&gt;　...&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;移除數個Handle底下的Protocol與所搭配的GUID。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;LocateHandleBuffer (&lt;br /&gt;　IN EFI_LOCATE_SEARCH_TYPE SearchType,&lt;br /&gt;　IN EFI_GUID *Protocol OPTIONAL,&lt;br /&gt;　IN VOID *SearchKey OPTIONAL,&lt;br /&gt;　IN OUT UINTN *NoHandles,&lt;br /&gt;　OUT EFI_HANDLE **Buffer&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;可將全部或以特定的條件將Handle取出。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;ProtocolsPerHandle (&lt;br /&gt;　IN EFI_HANDLE Handle,&lt;br /&gt;　OUT EFI_GUID ***ProtocolBuffer,&lt;br /&gt;　OUT UINTN *ProtocolBufferCount&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;取得指定的Handle底下所有的Protocol GUID陣列，並傳出數量。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;OpenProtocolInformation (&lt;br /&gt;　IN EFI_HANDLE Handle,&lt;br /&gt;　IN EFI_GUID *Protocol,&lt;br /&gt;　OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,&lt;br /&gt;　OUT UINTN *EntryCount&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;取得Handle底下指定的GUID的Information Entry陣列，並回傳數量。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;LocateProtocol (&lt;br /&gt;　IN EFI_GUID *Protocol,&lt;br /&gt;　IN VOID *Registration OPTIONAL,&lt;br /&gt;　OUT VOID **Interface&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;以指定的GUID取出第一個Protocol。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;HandleProtocol (&lt;br /&gt;　IN EFI_HANDLE Handle,&lt;br /&gt;　IN EFI_GUID *Protocol,&lt;br /&gt;　OUT VOID **Interface&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;取出Handle中指定的Protocol，以GUID為識別。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;OpenProtocol (&lt;br /&gt;　IN EFI_HANDLE Handle,&lt;br /&gt;　IN EFI_GUID *Protocol,&lt;br /&gt;　OUT VOID **Interface OPTIONAL,&lt;br /&gt;　IN EFI_HANDLE AgentHandle,&lt;br /&gt;　IN EFI_HANDLE ControllerHandle,&lt;br /&gt;　IN UINT32 Attributes&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;類似HandleProtocol()，但提供了更安全的做法，綁訂指定的Handle，避免使用中的Protocol被Uninstall。&lt;br /&gt;此為最後一個參數的定義：&lt;br /&gt;#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001&lt;br /&gt;#define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002&lt;br /&gt;#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004&lt;br /&gt;#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008&lt;br /&gt;#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010&lt;br /&gt;#define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020&lt;br /&gt;依需要使用，有些定義可不用CloseProtocol()。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 153, 51);&quot;&gt;CloseProtocol (&lt;br /&gt;　IN EFI_HANDLE Handle,&lt;br /&gt;　IN EFI_GUID *Protocol,&lt;br /&gt;　IN EFI_HANDLE AgentHandle,&lt;br /&gt;　IN EFI_HANDLE ControllerHandle&lt;br /&gt;　);&lt;/span&gt;&lt;br /&gt;為以OpenProtocol()開啟的Protocol解除占用。&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/9108528743692875705/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2010/09/efi-protocol.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/9108528743692875705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/9108528743692875705'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2010/09/efi-protocol.html' title='淺談EFI Protocol'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-8905328326585409123</id><published>2010-08-31T20:15:00.000+08:00</published><updated>2010-10-05T09:34:07.080+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>於EDK中加入DXE Driver</title><content type='html'>建立好EDK環境後，先找到自己要放置Driver的資料夾，這個例子是放在Sample\Platform\Generic\底下，建立一個TestDriver的資料夾。&lt;br /&gt;&lt;br /&gt;依序建立以下檔案：&lt;br /&gt;TestDriver.h&lt;br /&gt;========================================&lt;br /&gt;#ifndef _TEST_DRIVER_H_&lt;br /&gt;#define _TEST_DRIVER_H_&lt;br /&gt;&lt;br /&gt;#include &quot;Tiano.h&quot;&lt;br /&gt;#include &quot;EfiDriverLib.h&quot;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;// Function Prototypes&lt;br /&gt;//&lt;br /&gt;EFI_STATUS&lt;br /&gt;EFIAPI&lt;br /&gt;TestDriverEntry (&lt;br /&gt;  IN  EFI_HANDLE           ImageHandle,&lt;br /&gt;  IN  EFI_SYSTEM_TABLE     *SystemTable&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;========================================&lt;br /&gt;&lt;br /&gt;TestDriver.c&lt;br /&gt;========================================&lt;br /&gt;#include &quot;TestDriver.h&quot;&lt;br /&gt;&lt;br /&gt;EFI_DRIVER_ENTRY_POINT (TestDriverEntry)&lt;br /&gt;&lt;br /&gt;EFI_STATUS&lt;br /&gt;EFIAPI&lt;br /&gt;TestDriverEntry (&lt;br /&gt;  IN EFI_HANDLE        ImageHandle,&lt;br /&gt;  IN EFI_SYSTEM_TABLE  *SystemTable&lt;br /&gt;  )&lt;br /&gt;{&lt;br /&gt;  EFI_STATUS  Status;&lt;br /&gt;&lt;br /&gt;  Status = EfiInitializeDriverLib(ImageHandle, SystemTable);&lt;br /&gt;&lt;br /&gt;  DEBUG_CODE (&lt;br /&gt;    DEBUG ((EFI_D_INFO | EFI_D_LOAD, &quot;Test = %s\n&quot;, L&quot;TestDriverEntry&quot;));&lt;br /&gt;  )&lt;br /&gt;&lt;br /&gt;  return Status;&lt;br /&gt;}&lt;br /&gt;========================================&lt;br /&gt;&lt;br /&gt;TestDriver.inf&lt;br /&gt;========================================&lt;br /&gt;[defines]&lt;br /&gt;BASE_NAME            = TestDriver&lt;br /&gt;FILE_GUID            = 7B257F2E-7177-408a-BA46-567C07301F69&lt;br /&gt;COMPONENT_TYPE       = BS_DRIVER&lt;br /&gt;&lt;br /&gt;[sources.common]&lt;br /&gt;  TestDriver.c&lt;br /&gt;&lt;br /&gt;[libraries.common]&lt;br /&gt;  EdkGuidLib&lt;br /&gt;  EfiGuidLib&lt;br /&gt;  EfiProtocolLib&lt;br /&gt;  EfiDriverLib&lt;br /&gt;&lt;br /&gt;[includes.common]&lt;br /&gt;  $(EDK_SOURCE)\Foundation&lt;br /&gt;  $(EDK_SOURCE)\Foundation\Efi&lt;br /&gt;  $(EDK_SOURCE)\Foundation\Framework&lt;br /&gt;  .&lt;br /&gt;  $(EDK_SOURCE)\Foundation\Include&lt;br /&gt;  $(EDK_SOURCE)\Foundation\Efi\Include&lt;br /&gt;  $(EDK_SOURCE)\Foundation\Framework\Include&lt;br /&gt;  $(EDK_SOURCE)\Foundation\Include\IndustryStandard&lt;br /&gt;  $(EDK_SOURCE)\Foundation\Core\Dxe&lt;br /&gt;  $(EDK_SOURCE)\Foundation\Library\Dxe\Include&lt;br /&gt;  $(EDK_SOURCE)\Sample\Include&lt;br /&gt;&lt;br /&gt;[nmake.common]&lt;br /&gt;  IMAGE_ENTRY_POINT=TestDriverEntry&lt;br /&gt;========================================&lt;br /&gt;&lt;br /&gt;其中.inf的FILE_GUID可由Visual Studio中的Tools-&gt;建立GUID這個工具建立。&lt;br /&gt;加入以上檔案後開啟Sample\Platform\Nt32\Build\Nt32.dsc&lt;br /&gt;找一個地方加入這一行：&lt;br /&gt;Sample\Platform\Generic\Test\TestDriver\TestDriver.inf&lt;br /&gt;&lt;br /&gt;範例：&lt;br /&gt;#&lt;br /&gt;# Fat File System driver. Default is binary only &lt;br /&gt;#&lt;br /&gt;Other\Maintained\Universal\Disk\FileSystem\EnhancedFat\Dxe\Fat.inf&lt;br /&gt;&lt;br /&gt;# By Yourself&lt;br /&gt;Sample\Platform\Generic\Test\TestDriver\TestDriver.inf&lt;br /&gt;&lt;br /&gt;存檔後即可build，此時在Console即可印出剛剛程式中的debug訊息：&lt;br /&gt;EventTest = EventTestDriverEntry&lt;br /&gt;&lt;br /&gt;Finish！&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/8905328326585409123/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2010/08/edkdxe-driver.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8905328326585409123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/8905328326585409123'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2010/08/edkdxe-driver.html' title='於EDK中加入DXE Driver'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-6818677752590239742</id><published>2010-08-12T11:19:00.000+08:00</published><updated>2011-03-07T11:17:56.454+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>建立EDK模擬環境與範例HelloWorld編譯</title><content type='html'>首先先下載&lt;a href=&quot;http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EDK&quot;&gt;EDK&lt;/a&gt;，其次下載&lt;a href=&quot;http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EFI_Shell&quot;&gt;EFI Shell&lt;/a&gt;，最後再到&lt;a href=&quot;http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Edk-apps&quot;&gt;EDK Apps&lt;/a&gt;下載HelloWorld範例檔。&lt;br /&gt;
&lt;br /&gt;
一、解壓縮EDK至C:\根目錄底下。&lt;br /&gt;
&lt;br /&gt;
&lt;p style=&quot;margin-left: 2em; text-indent: -2em;&quot;&gt;二、開啟剛下載的EFI Shell，將Shell目錄底下的檔案全部解壓縮至C:\EDK\Other\Maintained\Application\UefiShell\中。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
三、再來一樣把HelloWorld解壓縮至此。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; text-indent: -2em;&quot;&gt;四、開啟Sample\Platform\Nt32\Build\Nt32.dsc，找到[Libraries.Platform]這個區塊，&lt;br /&gt;
在下面加入Other\Maintained\Application\UefiShell\Library\EfiShellLib.inf；再來找到[Components]區塊，在DEFINE FV=FvRecovery後面添加Other\Maintained\Application\UefiShell\HelloWorld\HelloWorld.inf FV=NULL，之後存檔即可。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
編譯前依照您的Visual Studio版本修改Sample\Platform\Nt32\Build\Config.env，找到USE_VC8，只要您是2005(含以上版本)就改為YES。&lt;br /&gt;
&lt;br /&gt;
打開【Visual Studio 命令提示字元】，進入到Sample\Platform\Nt32目錄底下，鍵入SET EDK_SOURCE=C:\EDK，完成後再輸入build編譯即可。&lt;br /&gt;
&lt;br /&gt;
編譯完成後，先執行uefi底下的System.cmd設定好環境變數，最後可到IA32底下執行secmain.exe，這個就是Shell的模擬環境，相同的地方底下也有個剛剛一同建置好的HelloWorld.efi，可在Shell中執行他，預設是放在fsnt0(f9)裝置。&lt;br /&gt;
&lt;br /&gt;
======================================================================&lt;br /&gt;
&lt;br /&gt;
而起始Loading部分的Logo圖檔更換方式有兩種：&lt;br /&gt;
一、直接到Sample\Platform\Generic\Logo底下將logo.bmp換掉，再重新編譯一次。&lt;br /&gt;
&lt;p style=&quot;margin-left: 2em; text-indent: -2em;&quot;&gt;二、開啟Sample\Platform\Nt32\Build\Nt32.dsc到Sample\Platform\Generic\Logo\Logo.inf這一行，修改為Sample\Platform\Generic\Logo\Logo.inf           SOURCE_OVERRIDE_PATH=您自己的logo.bmp目錄（不含檔名）。&lt;/p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/6818677752590239742/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2010/08/edkhelloworld.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/6818677752590239742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/6818677752590239742'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2010/08/edkhelloworld.html' title='建立EDK模擬環境與範例HelloWorld編譯'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2312115678472184515.post-3629466636332377733</id><published>2010-08-03T19:32:00.000+08:00</published><updated>2017-05-09T22:58:00.707+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UEFI Notes"/><title type='text'>建立EDK II模擬環境</title><content type='html'>EDK II可於此&lt;a href=&quot;https://github.com/tianocore/edk2&quot;&gt;https://github.com/tianocore/edk2&lt;/a&gt;下載。&lt;br /&gt;
&lt;br /&gt;
我的系統為Win7 X64，Visual Studio版本為2010，欲編譯的架構為IA32&lt;br /&gt;
&lt;br /&gt;
假設EDK II的存放地點在C:\EDK2\，執行Visual Studio 命令提示字元 (2010)（依您所安裝的VS版本開啟）&lt;br /&gt;
目錄切換到C:\EDK2\，執行edksetup.bat佈署環境。&lt;br /&gt;
接下來開啟Conf\target.txt，進行編譯前的設置，有以下參數：&lt;br /&gt;
ACTIVE_PLATFORM = Nt32Pkg/Nt32Pkg.dsc&lt;br /&gt;
TARGET = DEBUG&lt;br /&gt;
TARGET_ARCH = IA32&lt;br /&gt;
TOOL_CHAIN_CONF = Conf/tools_def.txt&lt;br /&gt;
TOOL_CHAIN_TAG = MYTOOLS&lt;br /&gt;
MAX_CONCURRENT_THREAD_NUMBER = 1&lt;br /&gt;
MULTIPLE_THREAD = Disable&lt;br /&gt;
BUILD_RULE_CONF = Conf/build_rule.txt&lt;br /&gt;
&lt;br /&gt;
我只修改MAX_CONCURRENT_THREAD_NUMBER與MULTIPLE_THREAD，若您的CPU為多核心，則可做多執行續的程式編譯，其餘參數可依照自己所需的平台與架構做修改。&lt;br /&gt;
&lt;br /&gt;
另外由於我的系統為X64，VS 2010安裝的路徑為C:\Program Files (x86)\Microsoft Visual Studio 10.0，而Conf/tools_def.txt中並沒有定義VS 2010的變數，此時如要編譯程式將會有錯誤！&lt;br /&gt;
接下來開啟tools_def.txt這個文字檔，內有各項工具的定義，唯獨少了VS 2010，此時仿照VS 2008的方式為VS 2010定義一組新變數（或者直接修改VS 2008的變數），接下來搜尋到第二個MYTOOLS（約3083行），底下有各架構的定義，找到IA32 definitions，將他底下括號中的變數修改成剛為VS 2010所定義的變數即可。&lt;br /&gt;
其餘方法，自己的編譯器已有定義在內的話：&lt;br /&gt;
1. build -t VS2005 (直接指定)&lt;br /&gt;
2. 修改tools_def.txt中的MYTOOLS對應的變數。&lt;br /&gt;
3. 修改target.txt中的TOOL_CHAIN_TAG對應的變數。如：TOOL_CHAIN_TAG = VS2005&lt;br /&gt;
&lt;br /&gt;
修改完成後，繼續回到Visual Studio 命令提示字元 (2010)，在C:\EDK2\底下鍵入build執行，接下來就等待建置完成。&lt;br /&gt;
&lt;br /&gt;
完成後，輸入cd Build\NT32\DEBUG_MYTOOLS\IA32後，資料夾底下有secmain.exe，這個就是Shell的模擬環境，長得滿像DOS的，基本操作方式也很相似，fsnt0:底下有一些簡單的Apps可執行，如HelloWorld、Timer...等。</content><link rel='replies' type='application/atom+xml' href='http://iorlvskyo.blogspot.com/feeds/3629466636332377733/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://iorlvskyo.blogspot.com/2010/08/edk-ii.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/3629466636332377733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2312115678472184515/posts/default/3629466636332377733'/><link rel='alternate' type='text/html' href='http://iorlvskyo.blogspot.com/2010/08/edk-ii.html' title='建立EDK II模擬環境'/><author><name>BIOS Engineer</name><uri>http://www.blogger.com/profile/18102152335995867341</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>