tag:blogger.com,1999:blog-129047872024-03-17T21:59:28.883-05:00Basic Input/Outputadventures in BIOS, software engineering, and computer history!Unknownnoreply@blogger.comBlogger123125tag:blogger.com,1999:blog-12904787.post-81729917044390861412024-03-05T07:00:00.212-06:002024-03-05T07:00:00.147-06:00SD Card Bus Speed Specifications<p>In what has accidentally turned into a three-part series, I'm going to share one final article on decoding the wide variety of SD Cards—what do all the markings on an SD Card mean? </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgRLZvNDasq0ILVs05lEWkLX48Sv8v4YGNc-To6nc7Ic2AcgqG4PW3nJUzY7VewU9JdPxargUHs0m9DC4tTnlAyoPkMw_lnsZsnFJhveZ2qpOUyneuwUDA8ggA1BGBvmQg_13Tz7dYFS0OInRykhyA8bsD0NE_Bqeb4ubdVNORkaD_89fvrm0MD" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="409" data-original-width="583" height="224" src="https://blogger.googleusercontent.com/img/a/AVvXsEgRLZvNDasq0ILVs05lEWkLX48Sv8v4YGNc-To6nc7Ic2AcgqG4PW3nJUzY7VewU9JdPxargUHs0m9DC4tTnlAyoPkMw_lnsZsnFJhveZ2qpOUyneuwUDA8ggA1BGBvmQg_13Tz7dYFS0OInRykhyA8bsD0NE_Bqeb4ubdVNORkaD_89fvrm0MD" width="320" /></a></div><p></p><p>I first wrote an article on the <a href="https://www.basicinputoutput.com/2024/01/new-sd-express-speed-classes.html">New SD Express Speed Classes</a>, which discussed the concept of speed classes in general, and the new speed classes created for SD Express cards, in particular.</p><p>Second, I wrote an article on SD Card capacity, as expressed in the various card types: SD, SDHC, SDXC, and SDUC. See: <a href="https://www.basicinputoutput.com/2024/02/sdhc-sdxc-sduc-oh-my.html">SDHC, SDXC, SDUC, Oh My!</a></p><p>It's hard to believe, but all these various compliance criteria, and their associated markings on an SD Card, are still not enough to decode an SD Card's capabilities. So, for part three, I'll discuss <b>SD Card Bus Speeds</b>.</p><p>The original bus speed of the SD Card specification was 12.5MB/s. As the speed of the card media and host devices continued to increase, the <a href="https://www.sdcard.org/">SD Association (SDA)</a> introduced faster bus technologies to keep up with it. The bus speed tells you the theoretical maximum transfer speed of which the host or card are capable. The following table from the SDA illustrates this nicely:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEigpphcg5TyPzNbXd1_KY4-lP98N5LnqNowwnZMdAfopoXZfcrSLPMEN-S29zPAboLwomkzh7Be1ERBNAzGKMeL3XItJEN_QHNUBuqH-L9_lzFhFoxHroYolSEXC-5i42mxXDgwkPFAgSYxKH1CU-ieD-qAXps-7Z8x5pZ2ZTNq_zGIpl1tYB-E" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1010" data-original-width="821" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEigpphcg5TyPzNbXd1_KY4-lP98N5LnqNowwnZMdAfopoXZfcrSLPMEN-S29zPAboLwomkzh7Be1ERBNAzGKMeL3XItJEN_QHNUBuqH-L9_lzFhFoxHroYolSEXC-5i42mxXDgwkPFAgSYxKH1CU-ieD-qAXps-7Z8x5pZ2ZTNq_zGIpl1tYB-E=w520-h640" width="520" /></a></div><br />A few things to keep in mind:<p></p><p></p><ol style="text-align: left;"><li>"UHS" here stands for "Ultra High Speed"</li><li>The "Express" in "SD Express" refers to its association with, and leveraging of, <a href="https://pcisig.com/">PCI Express</a> bus technology</li><li>SD Card capacities are orthogonal to the bus interface. UHS-I, UHS-II, UHS-III and SD Express bus technologies can host cards of any of the modern capacity types: SDHC, SDXC, or SDUC.</li><li>UHS-III has not been widely adopted in the industry, and so you are not likely to find UHS-III cards for sale</li><li>A UHS-III reader is backwards compatible with UHS-II and UHS-I cards, and a UHS-II reader is backwards compatible with UHS-I cards</li><li>SD Express is only backwards compatible with UHS-I, not with UHS-II or UHS-III. The reason has to do with the different ways that SD Express and UHS-II/UHS-III define the signals on the second row of pins on the card/connector. The net effect of this is that UHS-II cards inserted into an SD Express card reader will perform at UHS-I speed.</li></ol>So, if you want to ensure you're getting the best possible speed out of your equipment, you need to match the bus speed of your host card reader with the capability of the card. Putting a UHS-I card into a UHS-II reader isn't going to get you anything beyond UHS-I performance. Conversely, putting a UHS-II card into a reader that only supports UHS-I will limit that UHS-II card to UHS-I performance. Lastly, for an SD Express card reader, any card other than an SD Express card is going to perform at UHS-I performance levels.<p></p><p>Finally, recall that <a href="https://www.basicinputoutput.com/2024/01/new-sd-express-speed-classes.html">Speed Class</a> is distinct from the speed of the bus technologies we're discussing in this article. The speed class is the minimum sustained write speed of the card media. Between two cards with the same bus speed, the card with the higher speed class is going to perform better.</p><h3 style="text-align: left;">Real-Life Example</h3><div>Here is a real-life SD Card from SanDisk:</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhO0xWiikBH2VqmCclYCrqe7i-8iNjzwo2k0lxaJyA9sh74d8Pmc1KKv0D3Xzzxuagzj23kPia0V1WQyXdG8-1BcEyoDElwYUWjZ2qd5dpqfQf51o-2gFghpjMrBT_JZPsBP_HhW84aAGfiLb_bpS30bX6NBHRKT_duvhyXBldn8Wb1VLB3pSZ2" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1200" data-original-width="914" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEhO0xWiikBH2VqmCclYCrqe7i-8iNjzwo2k0lxaJyA9sh74d8Pmc1KKv0D3Xzzxuagzj23kPia0V1WQyXdG8-1BcEyoDElwYUWjZ2qd5dpqfQf51o-2gFghpjMrBT_JZPsBP_HhW84aAGfiLb_bpS30bX6NBHRKT_duvhyXBldn8Wb1VLB3pSZ2" width="183" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">Let's decode this card's capabilities:</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li><b>Capacity </b>= 128GB</li><li><b>Type </b>= SDXC</li><li><b>Bus interface</b> = UHS-II (denoted by both the "II" marking and "300MB/s"</li><li><b>Speed classes</b>: (minimum sustained write speed)</li><ul><li>speed class = 10 (10 MB/s)</li><li>UHS speed class = U3 (30MB/s)</li><li>video speed class = V90 (90MB/s)</li></ul></ul></div></div><h3 style="text-align: left;">Conclusion</h3><p>This concludes our interlude into the world of SD Card performance classifications. It is surprisingly complex, but considering the outsized-role that SD Cards play in our technology landscape, these concepts are important to master!</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-8235719060484549552024-02-06T07:00:00.119-06:002024-02-06T07:00:00.239-06:00SDHC, SDXC, SDUC, Oh My!<p>The complexity of the variety of Secure Digital (<a href="https://www.sdcard.org/">SD</a>) Cards continues to confuse me, in particular the various card standards: SD, SDHC, SDXC, and SDUC.</p><p>SD Cards are so important nowadays. They've become primary storage for many applications, like embedded applications and single-board computers (<a href="https://en.wikipedia.org/wiki/Single-board_computer">SBC</a>), e.g., Raspberry Pi. They've replaced floppy disks, <a href="https://en.wikipedia.org/wiki/Zip_drive">Zip disks</a>, etc. as "<a href="https://en.wikipedia.org/wiki/Sneakernet#:~:text=Sneakernet%2C%20also%20called%20sneaker%20net,it%20over%20a%20computer%20network.">sneaker net</a>" media. And of course their role in digital cameras of all types.</p><p>Therefore it is helpful to know about all these standards, especially since <b>SD card readers are NOT forwards compatible to the newer standards</b>. For example, you cannot take an SDXC card and use it in a card reader that only supports SD and SDHC. I've coalesced the following information from various sources to provide a high level timeline of when these cards were introduced and their capacities. (for information about SD Card speed classes, which is an independent concept from SD Card capacity see: <a href="New SD Express Speed Classes">New SD Express Speed Classes</a>)</p><h3 style="text-align: left;">1999</h3><p></p><ul style="text-align: left;"><li>original SD Card specification</li><li>called either "SD" or "SDSC" for <i>SD Standard Capacity</i></li><li>supported capacities: 4MB, 8MB, 16MB, 32MB, 64MB, 128MB, 256MB, 512MB and 1GB, 2GB</li></ul><h3 style="text-align: left;">2006</h3><div><ul style="text-align: left;"><li>"SDHC": <i>SD High Capacity</i></li><li>supported capacities: 4GB, 8GB, 16GB, 32GB</li></ul><h3 style="text-align: left;">2009</h3></div><div><ul style="text-align: left;"><li>"SDXC": <i>SD eXtended Capacity</i></li><li>supported capacities: 64GB, 128GB, 256GB, 512GB, 1TB, 2TB</li></ul><h3 style="text-align: left;">2019</h3></div><div><ul style="text-align: left;"><li>"SDUC": <i>SD Ultra Capacity</i></li><li>supported capacities: 4TB, 8TB, 16TB, 32TB, 64TB, 128TB</li></ul><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg6eCj8cADza_F3Q4dVddbsdRrDDIOJV4VlOag4UZ6agE-GXileSWctRkw4JlBr6Gp0aLuYtFSly9PfmBl8q_ntm8VSLis_ZGVjUrP9YyQXiIek13s37mvEKof32680khWMKBOtSVF1MaGYScE83lvhux7fCrZMnKq2A9Of4IZui1y5DTEfKW12" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="453" data-original-width="842" height="344" src="https://blogger.googleusercontent.com/img/a/AVvXsEg6eCj8cADza_F3Q4dVddbsdRrDDIOJV4VlOag4UZ6agE-GXileSWctRkw4JlBr6Gp0aLuYtFSly9PfmBl8q_ntm8VSLis_ZGVjUrP9YyQXiIek13s37mvEKof32680khWMKBOtSVF1MaGYScE83lvhux7fCrZMnKq2A9Of4IZui1y5DTEfKW12=w640-h344" width="640" /></a></div><br />Remember: As depicted in this image, SD Card readers can read media of the same standard or media of previous standards. SD Card readers cannot read media of subsequent standards.</div></div><p></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-8067033282055788302024-01-23T07:00:00.057-06:002024-01-23T07:00:00.133-06:00New SD Express Speed Classes<p><a href="https://en.wikipedia.org/wiki/SD_card">Secure Digital</a> (SD) Cards have become a most critical component to all of modern technology. They have supplanted all competitive technologies (<a href="https://en.wikipedia.org/wiki/Memory_Stick">Sony Memory Stick</a>, <a href="https://en.wikipedia.org/wiki/CompactFlash">CompactFlash</a>, <a href="https://en.wikipedia.org/wiki/MultiMediaCard">MultiMedia Card</a>, etc.) to be found in every type of portable, and even non-portable, computing device today.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh-oIs7CgMGMdMBEoTNk8A09wAyVAwF-jcf1f0NKvHYsJBiHhBY7FoEeAwVUe0wto3HVDvj99jLRBuhiKtQlliMq2OEN6iiEhl4XSdmmxl8TwO8W8QKwUSGGpaJ15y8f9Yu7EsQoSMAki60qT0z_P7gizbVTrdMRHveb2OSKGU7gIO9yWSBFUui" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="326" data-original-width="818" height="128" src="https://blogger.googleusercontent.com/img/a/AVvXsEh-oIs7CgMGMdMBEoTNk8A09wAyVAwF-jcf1f0NKvHYsJBiHhBY7FoEeAwVUe0wto3HVDvj99jLRBuhiKtQlliMq2OEN6iiEhl4XSdmmxl8TwO8W8QKwUSGGpaJ15y8f9Yu7EsQoSMAki60qT0z_P7gizbVTrdMRHveb2OSKGU7gIO9yWSBFUui" width="320" /></a></div><p></p><p>A recurring challenge has been how to make sure that the performance capability of a particular SD card matches what is expected from a host device. There is wide variance between card manufacturers and brands in terms of the speed of their SD cards.</p><p>To address this issue, for many years the <a href="https://www.sdcard.org/">SD Association</a> (SDA) has defined a set of speed classes, primarily geared towards supporting the digital imaging industry. A digital camera taking large RAW format digital images in quick succession needs to have much speedier write performance from its SD card than an SD card just being used to transfer a handful of files from one PC to another. Another example: a poor performing SD card could cause a digital video camera to drop frames, impacting the reliability of a recording.</p><p>More recently, the SDA has expanded the set of speed classes to include a new set for SD Express cards. Recall that SD Express cards were introduced in 2018, in version 7.0 of the SD specifications. This was a revolutionary upgrade to SD technology, which married SD protocols with <a href="https://pcisig.com/">PCIe</a> and <a href="https://nvmexpress.org/">NVMe</a> protocols. Now, an SD card could operate closer in performance to NVMe hard drives versus traditional SD cards.</p><p>SD Express technology was improved in SD 8.0 and SD 9.0, and then again in October 2023 when the SDA released SD 9.1. This revision of the SD specification introduced the following new speed classes specific to SD Express cards:</p><p></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg5a_ZX2RmhT_g8tJGsiUWX2-ev686scA7grU2T5ZAx_aNBpATnWFmPQICk-e0kucqP2VdDyb-56NYvzmktk8AHvOPtgMq60mqFgyFcmMHtM6BvIRODbvCBS1yaCviUglfUNNscdqJsjEs52fQJBl8KkEVPhfkCRrRpioVvh2gJn6KtMUi7a0q0" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="416" data-original-width="823" height="203" src="https://blogger.googleusercontent.com/img/a/AVvXsEg5a_ZX2RmhT_g8tJGsiUWX2-ev686scA7grU2T5ZAx_aNBpATnWFmPQICk-e0kucqP2VdDyb-56NYvzmktk8AHvOPtgMq60mqFgyFcmMHtM6BvIRODbvCBS1yaCviUglfUNNscdqJsjEs52fQJBl8KkEVPhfkCRrRpioVvh2gJn6KtMUi7a0q0=w400-h203" width="400" /></a></div></div><p>Therefore, the complete family of SD speed classes now looks like:</p><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh2kSVvzWf_4yknf80wC3obYrqkEppOqGmh3UtuR623S4HfOQfoF8SOcm8jHtf8zi40iqFhpoTYpbwzY7Vu8068HMp6VOv73WwSvK7MOaNvp7fshAU4tcK3rKolQ3AmhGkm4fC36M8PhxwY_2O6QwqnY8fK_1bWKWg4GrkuLnIjwMfV_pMxwLvB" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="841" data-original-width="804" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEh2kSVvzWf_4yknf80wC3obYrqkEppOqGmh3UtuR623S4HfOQfoF8SOcm8jHtf8zi40iqFhpoTYpbwzY7Vu8068HMp6VOv73WwSvK7MOaNvp7fshAU4tcK3rKolQ3AmhGkm4fC36M8PhxwY_2O6QwqnY8fK_1bWKWg4GrkuLnIjwMfV_pMxwLvB=w382-h400" width="382" /></a></div><br />An excellent whitepaper describing the new speed classes, as well as new features of SD Express 9.1 such as power management, thermal management, and multi-stream recording, can be found here: <a href="https://www.sdcard.org/cms/wp-content/uploads/2023/10/SDExpressSpeedClassSD9_1Specification.pdf">SD Express Speed Class</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-81129205547414803022023-12-05T07:00:00.010-06:002023-12-05T07:00:00.139-06:00Fall 2023 UEFI Developers Conference & Plugfest Materials Now Available<p>The <i>UEFI Fall 2023 Developers Conference & Plugfest</i> was held October 9-12, 2023 in Hillsboro, Oregon. This was the first in-person UEFI Forum event since 2019, and therefore the first since before the COVID-19 pandemic. It was nice to get back to an in-person event, including all the benefits such an event provides, like networking and watercooler conversations.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhtpn5f0E6_qvAJow4tk7ZqNP85al7IJ4DZQYFGqtuVeE-jvEf7tqA6dGcp7hDjND2MNT0FsLXgWFMK7ok47bRXzssmOMKEQp8KF_Z12wTjwx3pKxqPTAU8eS7Dp4KQwtVJgkGfVJ-IbFc9uYRwQIITH8u9_WSsMFO0ExPRLO5rbjtozktRqUeC" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="865" data-original-width="1608" height="172" src="https://blogger.googleusercontent.com/img/a/AVvXsEhtpn5f0E6_qvAJow4tk7ZqNP85al7IJ4DZQYFGqtuVeE-jvEf7tqA6dGcp7hDjND2MNT0FsLXgWFMK7ok47bRXzssmOMKEQp8KF_Z12wTjwx3pKxqPTAU8eS7Dp4KQwtVJgkGfVJ-IbFc9uYRwQIITH8u9_WSsMFO0ExPRLO5rbjtozktRqUeC" width="320" /></a></div><p>If you're not familiar with this event, the biannual <i>Developers Conference & Plugfest </i>features:</p><p></p><ul style="text-align: left;"><li>"plugfest" testing, i.e., engineers bring systems and peripherals and test them together in real-time</li><li>educational/technical sessions</li><li>working group meetings</li><li>networking opportunities</li></ul><p></p><p>Being that this was an in-person event, the sessions were not broadcast in real-time. It is welcome news, then, that all the presentations and video recordings are now available for on-demand viewing. In the following list, clicking the title of the presentation takes you to the slide deck for the talk, and links to the associated YouTube videos are found below each talk. Enjoy!</p><a href="https://uefi.org/sites/default/files/resources/State%20of%20UEFI_Mark%20Doran.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">State of the UEFI </a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;">- Mark Doran (UEFI Forum President)</span><br /><div><div style="text-align: center;"><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/1ACGNfdBgbs" width="320" youtube-src-id="1ACGNfdBgbs"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span></div><a href="https://uefi.org/sites/default/files/resources/Tuesday_02_Kubacki%20and%20Zimmer.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Using SPDM in UEFI for Device Attestation</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Michael Kubacki (Microsoft) and Vincent Zimmer (Intel) </span><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/RJHd3Mqk4Uw" width="320" youtube-src-id="RJHd3Mqk4Uw"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/UEFI%20Ecosystem%20Investments%20and%20Open-Source%20Contributions_Kubacki.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">UEFI Ecosystem Investments and Open-Source Contributions</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Michael Kubacki (Microsoft) </span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/UaGHZPgK_HA" width="320" youtube-src-id="UaGHZPgK_HA"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Evolving%20the%20Secure%20Boot%20Ecosystem_Flick%20and%20Sutherland.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Evolving the Secure Boot Ecosystem</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Doug Flick and Jeffrey Sutherland (Microsoft)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/o7kg1gX-KNc" width="320" youtube-src-id="o7kg1gX-KNc"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Hardening%20the%20Core%20Enhanced%20Memory%20Protection_Beebe.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Hardening the Core: Enhanced Memory Protections</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Taylor Beebe (Microsoft) </span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/gauuZTIB1R4" width="320" youtube-src-id="gauuZTIB1R4"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Conversations%20on%20Bolstering%20UEFI%20Cybersecurity_Spring.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Conversations on Bolstering UEFI Cybersecurity</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Jonathan Sping (CISA)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/kRhqBDUZG9Q" width="320" youtube-src-id="kRhqBDUZG9Q"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/UEFI%20Goes%20to%20Washington_Lewis.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">UEFI Goes to Washington</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Tim Lewis (Insyde)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/tZRdJkq2e-g" width="320" youtube-src-id="tZRdJkq2e-g"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/CVSSv4%20Firmware%20Scoring%20A%20Call%20For%20Collaborative%20Action_Wilkins.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">CVSSv4 Firmware Scoring: A Call For Collaborative Action</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Dick Wilkins (Phoenix)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/fB1nYVXC1kU" width="320" youtube-src-id="fB1nYVXC1kU"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Vulnerability%20Management%20in%20UEFI_Mullen.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Vulnerability Management in UEFI</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Brian Mullen (AMI)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/CTklN5tZ35U" width="320" youtube-src-id="CTklN5tZ35U"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/UEFI%20and%20ACPI%20in%20Arm%20System%20Architecture_Wei.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">UEFI and ACPI in Arm System Architecture</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Dong Wei (Arm) </span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/jpud1ahomdc" width="320" youtube-src-id="jpud1ahomdc"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Embracing%20Modularity%20and%20Boot-Time%20Configuration%20Faster%20TTM%20with%20Tiano-based%20Solutions_Warkentin.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Embracing Modularity and Boot-time Configuration: Faster TTM with Tiano-based Solutions</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Andrei Warkentin (Intel)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/2w9iQE8jA1w" width="320" youtube-src-id="2w9iQE8jA1w"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/UEFI%20Key%20Management%20Service%20%28KMS%29%20With%20TPM%C2%A0_Otumfuor%20and%20Polyudov.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">UEFI Key Management Service (KMS) With TPM</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Felix Polyudov and Frederick Otumfuor (AMI)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/nz8fx7m6bJk" width="320" youtube-src-id="nz8fx7m6bJk"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Multi-ISA%20Driver%20Compatibility%20What%E2%80%99s%20the%20Future_%20Warkentin.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Multi-ISA Driver Compatibility: What’s the Future?</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Andrei Warkentin (Intel)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/PZnVUToFSpo" width="320" youtube-src-id="PZnVUToFSpo"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Extending%20EDK2%20Functionalities%20to%20GNU-%20EFI_Lisik.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Extending EDK2 Functionalities to GNU- EFI</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Mikolaj Lisik (Google)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/3NH3Ilm8nY8" width="320" youtube-src-id="3NH3Ilm8nY8"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Creating%20an%20EDK2%20Firmware%20Image%20With%20an%20Embedded%20Application_Lisik.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Creating an EDK2 Firmware Image With an Embedded Application</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Mikolaj Lisik (Google)</span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/vYQwMeeWgi8" width="320" youtube-src-id="vYQwMeeWgi8"></iframe></div><br /><span style="font-size: 18px;"><br /></span></span><a href="https://uefi.org/sites/default/files/resources/Firmware%20Configuration%20%E2%80%93%20Past%2C%20Present%2C%20and%20Future_Zimmer.pdf" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: white; box-shadow: inset 0 -2px 0 0 var(--color--primary-50); box-sizing: border-box; font-family: Lora, georgia, serif; font-size: 18px; overflow-wrap: break-word; text-decoration-line: none; transition: box-shadow 0.3s cubic-bezier(0.55, 0.085, 0, 0.99) 0s;">Firmware Configuration – Past, Present, and Future</a><span style="background-color: white; color: #2b353b; font-family: Lora, georgia, serif; font-size: 18px;"> - Vincent Zimmer (Intel) </span></div><div><span style="color: #2b353b; font-family: Lora, georgia, serif;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/2uVTKyhhm8A" width="320" youtube-src-id="2uVTKyhhm8A"></iframe></div></span><p><br /></p></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-49866781111378242552023-11-14T07:00:00.032-06:002023-11-14T13:05:02.273-06:00JEDEC Manufacturer IDs Are a Mess<p>The <i>Vendor ID</i>. Seems like a pretty prosaic topic. What's to say? Every vendor has a numeric identifier that is globally unique so that we can distinguish between all the vendors in the industry. This is not rocket science. What could go wrong? </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjydgzu4vAwCQtffOy7exXdEf0R5lnCDwxqgKTZIUQcQcBmZLAU9in4T1fS7pPvqvKraL77JIHa2eIvC_oeEqktFHjscakb0C64wF0NwNR-_2Ob_XWHVCNp5VYXooUJyMO-PkzWCr_TltdFIdvAosZGgqOWjVXgV-fh0PFn_lBT534Z5raNM6iH" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="857" data-original-width="910" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEjydgzu4vAwCQtffOy7exXdEf0R5lnCDwxqgKTZIUQcQcBmZLAU9in4T1fS7pPvqvKraL77JIHa2eIvC_oeEqktFHjscakb0C64wF0NwNR-_2Ob_XWHVCNp5VYXooUJyMO-PkzWCr_TltdFIdvAosZGgqOWjVXgV-fh0PFn_lBT534Z5raNM6iH" width="255" /></a></div><p></p><p>The <a href="https://pcisig.com/">PCI-SIG</a> has done a fine job. From their <a href="https://pcisig.com/membership/member-companies">Member Companies</a> web page, you can search a list of all the vendors who make PCI devices and retrieve their vendor ID. The PCI vendor ID is a 16-bit number, and so in theory can represent up to 65536 different vendors. Intel is <span style="font-family: courier;">0x8086</span>. Dell Technologies is <span style="font-family: courier;">0x1028</span>. Apple is <span style="font-family: courier;">0x106B</span>. These numbers are unique and haven't changed in 30+ years.</p><p>But then there's the situation with JEDEC.</p><p>Recall that <a href="https://www.jedec.org/">JEDEC</a> (the <i>Joint Electron Device Engineering Council</i>) is the industry standards body for memory devices. From JEDEC come popular memory standards like SDRAM, DDR, GDDR, and many others.</p><p>The vendor ID, a.k.a. "Manufacturer ID", for memory devices is defined in the JEDEC standard <i>JEP106BH Standard Manufacturer’s Identification Code</i>. Unfortunately, things are quite messy. Here's how it works:</p><p></p><ul style="text-align: left;"><li>The Manufacturer ID is a one byte code consisting of 7 data bits and 1 parity bit. So, the one byte means a maximum of 256 manufacturers, but when you reserve one of the bits for parity, you're left with 7 bits, or a maximum of only 127 manufacturers. (!)</li><li>Since 127 IDs is not nearly enough, JEDEC introduced a concept they call a "continuation scheme". In this scheme, <span style="font-family: courier;">0x7F</span> is defined as a continuation code meaning that the Manufacturer ID is not in the current bank of 127 IDs, so continue the look-up in the next bank. Multiple continuations are permitted, and in fact the JEDEC Manufacturer IDs now span <b>fifteen </b>banks!</li></ul><div>This causes several issues which I've recently run into trying to determine the Manufacturer ID for a variety of serial NOR flash devices. Serial NOR flash are the kind of memory devices, typically connected via a <a href="https://en.wikipedia.org/wiki/Serial_Peripheral_Interface">Serial Peripheral Interface</a> (SPI) bus, that are used to hold BIOS code, as well as code for many other types of firmware. Suffice it to say that serial NOR flash is everywhere.</div><div><br /></div><h4 style="text-align: left;">Problem 1: Mergers & Acquisitions in the Serial NOR Flash Industry</h4><div>For whatever reason, it seems memory companies are constantly buying each other out, spinning off subsidiaries, and/or merging. That means that while these memory device companies have Manufacturer IDs assigned in <i>JEP106BH Standard Manufacturer’s Identification Code</i>, they often do not match the Manufacturer IDs found in their own serial NOR flash products.</div><div><br /><u><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjMFJjgQSrr_WzKkWr282LpsEAn_EYLmiNjWnCXy3queGDc4UcAaxPDZ5l3T8BXjt-f62XHT1jKo_N3QoGZ3BRo6tJ157a__9-5b_5VyqIaLzH7xQEnwgosWw19rPYc3ltCJvwg61anC2_cGQJ6ABqsXLa_ZcrAiT2MsS9LQ3VMJ7YknZ1lQ0X-" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><div class="separator" style="clear: both; text-align: center;"><br /></div><br /></a></div>Example 1</u>: <a href="https://www.winbond.com/">Winbond</a> is the #1 supplier of serial NOR flash worldwide, with over 25% of the market. <i>JEP106BH </i>assigns Winbond the ID <span style="font-family: courier;">0xDA</span> in Bank 1. However, I'd estimate that half of the Winbond parts out there use ID <span style="font-family: courier;">0xEF</span>, because Winbond purchased Nexcom's serial NOR flash business, and Nexcom's ID was <span style="font-family: courier;">0xEF</span>.</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEipgzTShXpcppYVEcYgpjG1ofPIwmS_92Joz93D3ZZaLyyWHv8QiwrwxuTGtZqMQgwmbgvuY_7aHixHVmud7uKaB7EWjbAkag-DwXxSOTGWulJdM63KI1cyJ_d8NbGxd7RCVLTFTVCRu_1_Qx7FZdGO1ZewR3wR8pMJxkM9w-vCm1thUimO9WCW" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="89" data-original-width="396" height="90" src="https://blogger.googleusercontent.com/img/a/AVvXsEipgzTShXpcppYVEcYgpjG1ofPIwmS_92Joz93D3ZZaLyyWHv8QiwrwxuTGtZqMQgwmbgvuY_7aHixHVmud7uKaB7EWjbAkag-DwXxSOTGWulJdM63KI1cyJ_d8NbGxd7RCVLTFTVCRu_1_Qx7FZdGO1ZewR3wR8pMJxkM9w-vCm1thUimO9WCW=w400-h90" width="400" /></a></div><br /></div><div><u>Example 2</u>: <a href="https://www.micron.com/">Micron Technologies</a> bought Numonyx. Therefore, you would think their ID would be one of these two assigned by <i>JEP106BH:</i></div><div style="text-align: left;">Micron's ID: <span style="font-family: courier;">0x2C</span></div><div style="text-align: left;">Numonyx's ID: <span style="font-family: courier;">0xFE</span></div><div style="text-align: left;"><br /></div><div style="text-align: left;">However, if you read the ID from a Micron serial NOR flash part, it will be neither <span style="font-family: courier;">0x2C</span> nor <span style="font-family: courier;">0xFE</span>. It will have ID <span style="font-family: courier;">0x20</span>, which is the JEDEC ID for <a href="https://www.st.com/">STMicro</a>, who originally formed Numonyx by merging their NAND flash business with Intel's serial NOR business!</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Clearly, trying to make sense of these Manufacturer IDs is a complicated business.</div><div style="text-align: left;"><br /></div><h4 style="text-align: left;">Problem 2: Confusion Caused by Banks</h4><div style="text-align: left;">I started out mentioning that PCI-SIG has only one "namespace" for IDs, a 16-bit value. Because JEDEC got stuck with only 7-bits for the Manufacturer ID, they had to create "banks" (like adding namespaces) to be able to extend the range of available IDs. The problem is, I don't think this continuation scheme is well understood in the industry. Take a look at one of the most popular ROM flashing programs out there, <a href="https://www.flashrom.org/">flashrom</a>. (<a href="https://github.com/flashrom/flashrom">github</a>).</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><a href="https://github.com/flashrom/flashrom/blob/main/include/flashchips.h">flashchips.h</a> says:</div><div style="text-align: left;"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0in; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="color: #61afef; font-family: "Courier New"; font-size: 10pt; mso-fareast-font-family: "Times New Roman"; mso-font-kerning: 0pt; mso-ligatures: none;">#define</span><span style="color: #abb2bf; font-family: "Courier New"; font-size: 10pt; mso-fareast-font-family: "Times New Roman"; mso-font-kerning: 0pt; mso-ligatures: none;"> ST_ID </span><span style="color: #d19a56; font-family: "Courier New"; font-size: 10pt; mso-fareast-font-family: "Times New Roman"; mso-font-kerning: 0pt; mso-ligatures: none;">0x20</span><i><span style="color: #717a8a; font-family: "Courier New"; font-size: 10pt; mso-fareast-font-family: "Times New Roman"; mso-font-kerning: 0pt; mso-ligatures: none;">/* ST / SGS/Thomson / Numonyx /
XMC(later acquired by Micron) */</span></i><span style="color: #abb2bf; font-family: "Courier New"; font-size: 10pt; mso-fareast-font-family: "Times New Roman"; mso-font-kerning: 0pt; mso-ligatures: none;"><o:p></o:p></span></p></div><div style="text-align: left;"><br /></div><div style="text-align: left;">As mentioned above, Micron purchased Numonyx, who inherited STMicro's Bank 1 ID of <span style="font-family: courier;">0x20</span> for their serial NOR flash products. It is also true that XMC has a JEDEC ID of <span style="font-family: courier;">0x20</span>. But XMC's ID of <span style="font-family: courier;">0x20</span> is not because they were part of the Micron/STMicro/Numonyx deal, but rather because <i>JEP106BH </i>gives XMC an ID of <span style="font-family: courier;">0x20</span> in <b>Bank 10</b>.</div><div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEitQOS9lXTYAswWPbMa6ef1hm0DLxxxCOUbosmoN6w5anKWJ1raeur_ek7sHKeHb8ctW_gAzmb9zROkLWuVuLh9ShShBAFIVZi3VDSA-UhlA4GpGoaimmQ41t8waS9hY1IiGEXlA36ngmDvCXAOWMz90XrVEHW-cy233moU8FqMoZbE9NPTaUnH" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="474" data-original-width="1069" height="285" src="https://blogger.googleusercontent.com/img/a/AVvXsEitQOS9lXTYAswWPbMa6ef1hm0DLxxxCOUbosmoN6w5anKWJ1raeur_ek7sHKeHb8ctW_gAzmb9zROkLWuVuLh9ShShBAFIVZi3VDSA-UhlA4GpGoaimmQ41t8waS9hY1IiGEXlA36ngmDvCXAOWMz90XrVEHW-cy233moU8FqMoZbE9NPTaUnH=w640-h285" width="640" /></a></div><br />Moreover, <a href="https://github.com/flashrom/flashrom/blob/main/include/flashchips.h">flashchips.h</a> also has:</div><div style="text-align: left;"><!--StartFragment-->
<div style="color: #abb2bf; font-family: Consolas; font-size: 11pt;">
<pre><span style="background-color: white;"><span style="color: #61afef;">#define</span> GIGADEVICE_ID <span style="color: #d19a56;">0xC8</span> <span style="color: #717a8a; font-style: italic;">/* GigaDevice */</span></span></pre></div></div><div style="text-align: left;">While it is true that Gigadevice's ID is <span style="font-family: courier;">0xC8</span>, it's <span style="font-family: courier;">0xC8 </span>in <b>Bank 7</b>. This necessary information of the applicable bank is missing from flashchips.h. In Bank 1, <span style="font-family: courier;">0xC8</span> is actually assigned to <a href="https://www.apple.com/">Apple</a>!</div><div style="text-align: left;"><br /></div><div style="text-align: left;">The flashrom project seems to acknowledge this problem, see <a href="https://github.com/flashrom/flashrom/blob/main/jedec.c">jedec.c</a>:</div><div style="text-align: left;"><!--StartFragment-->
<div style="color: #abb2bf; font-family: Consolas; font-size: 11pt;">
<pre><span style="background-color: white;"><span style="color: #717a8a; font-style: italic;">/* Check if it is a continuation ID, this should be a while loop. */</span>
<span style="color: #61afef;">if</span> (flashcontent1 <span style="color: #a2a9b5;">==</span> <span style="color: #d19a56;">0x7F</span>) <span style="color: #a2a9b5;">{</span>
flashcontent1 <span style="color: #a2a9b5;"><<=</span> <span style="color: #d19a56;">8</span><span style="color: #a2a9b5;">;</span>
flashcontent1 <span style="color: #a2a9b5;">|=</span> <span style="color: #c678dd;">chip_readb</span>(flash, bios <span style="color: #a2a9b5;">+</span> <span style="color: #d19a56;">0x100</span>)<span style="color: #a2a9b5;">;</span>
<span style="color: #a2a9b5;">}</span>
<span style="color: #61afef;">if</span> (flashcontent2 <span style="color: #a2a9b5;">==</span> <span style="color: #d19a56;">0x7F</span>) <span style="color: #a2a9b5;">{</span>
flashcontent2 <span style="color: #a2a9b5;"><<=</span> <span style="color: #d19a56;">8</span><span style="color: #a2a9b5;">;</span>
flashcontent2 <span style="color: #a2a9b5;">|=</span> <span style="color: #c678dd;">chip_readb</span>(flash, bios <span style="color: #a2a9b5;">+</span> <span style="color: #d19a56;">0x101</span>)<span style="color: #a2a9b5;">;</span>
<span style="color: #a2a9b5;">}</span></span><span style="background-color: #1e1e1e;">
</span></pre></div></div><div style="text-align: left;">The comment in the code is correct; what needs to happen is for a loop to count the number of <span style="font-family: courier;">0x7F</span> IDs in order to know in which bank to lookup the ID. It seems this is not currently supported.</div><div style="text-align: left;"><br /></div><h2 style="text-align: left;">In Conclusion</h2><div style="text-align: left;">Anyway, the point here is that correctly getting a JEDEC Manufacturer ID can be quite tricky. Mergers and acquisitions have scrambled the IDs, and industry-leading utilities like flashrom do not fully support how the continuation scheme of banks work. Please keep this in mind the next time you're working with serial NOR flash devices!</div><p></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-7800970710376391742023-10-17T07:00:00.369-05:002023-10-17T09:44:51.577-05:00Reverse Engineering UEFI with Ghidra<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjPcOyp3K4hpkf2U8CTD39w2DosiKFlg4QMIvu7lQd7V-x5I66gktfgwnOpMEJs4JA6Fp-FATgv94UEavTm-kirtJKK-eFdcKwOJGWxOUBjmIVzAV5o47aU7Z0GjTbSac6FUIydarxTLIEtA-62OCuzTKp4RRXQJyGGnhCxEoCpYjx0R7yuSF2m" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="521" data-original-width="778" height="214" src="https://blogger.googleusercontent.com/img/a/AVvXsEjPcOyp3K4hpkf2U8CTD39w2DosiKFlg4QMIvu7lQd7V-x5I66gktfgwnOpMEJs4JA6Fp-FATgv94UEavTm-kirtJKK-eFdcKwOJGWxOUBjmIVzAV5o47aU7Z0GjTbSac6FUIydarxTLIEtA-62OCuzTKp4RRXQJyGGnhCxEoCpYjx0R7yuSF2m" width="320" /></a></div><br /><a href="https://github.com/NationalSecurityAgency/ghidra">Ghidra</a> is a free and open-source tool for software reverse engineering. It is extensible, and allows for application-specific capabilities with small software bundles called extensions. It can be thought of as an open-source alternative to <a href="https://hex-rays.com/ida-pro/">IDA Pro</a>. Ghidra is written in Java, and uses the Swing framework for its GUI. Being Java-based, it is cross-platform, and therefore runs on Windows, Linux, and macOS.<p></p><h2 style="text-align: left;">History</h2><p>Ghidra was built by the U.S. National Security Agency (<a href="https://www.nsa.gov/">NSA</a>), in particular their Research Organization, for its own internal use, until the NSA released it publicly at the <a href="https://www.rsaconference.com/">RSA Conference</a> in 2019. Ghidra is over 1.2 million lines of code. Comments in the source code suggest that development at the NSA was underway at least as far back as 1999. A version history:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhSDIu6NcLBRdNKjBK-2tZxobpqs6It53Pc4aAI9tm9n-tAifnUcRGING_0mku3SEQjIdg1KT9lsbdTbV4j3B_DfDRtsjeW0DMxOpcKouXmuGv5xOVOiw5GFRAeQFLMSjhQy8rW8B3zoqt2w7S6J0olbJhyTEY5PQ5OpPD8dNB-B_3AMdBYHJPq" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="616" data-original-width="1078" height="229" src="https://blogger.googleusercontent.com/img/a/AVvXsEhSDIu6NcLBRdNKjBK-2tZxobpqs6It53Pc4aAI9tm9n-tAifnUcRGING_0mku3SEQjIdg1KT9lsbdTbV4j3B_DfDRtsjeW0DMxOpcKouXmuGv5xOVOiw5GFRAeQFLMSjhQy8rW8B3zoqt2w7S6J0olbJhyTEY5PQ5OpPD8dNB-B_3AMdBYHJPq=w400-h229" width="400" /></a></div><br /><h2 style="text-align: left;">Origin of the Name "Ghidra"</h2><p></p><p>Ghidra is the name of a fictional three-headed <a href="https://en.wikipedia.org/wiki/King_Ghidorah">monster</a> from the Japanese <a href="https://en.wikipedia.org/wiki/Kaiju">Kaiju</a> (monster movie) tradition. Think of it like a three-headed dragon. The theme of three-ness appealed to Ghidra's creators, whose goal was to create one tool where previously three were required: 1) a hex editor, 2) disassembler, and 3) debugger. With Ghidra, you get all three in one.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj6jSuHABDv35lP9FRbvv0fKOWliiPKRdqNAGFxMNceNoKRni8qT4_IWaQGPIZVAid4_G4-gPtylbluXg1uFnbe9Mi5dMtqp6thlkct4A36wdEzb6_NGO7i3d5ngNcwT_-InWIlD7JiCVSEOr5KJN_E-x3hbT7N2nfaOuw22ciKSFZuAJqrmX2P" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="368" data-original-width="689" height="342" src="https://blogger.googleusercontent.com/img/a/AVvXsEj6jSuHABDv35lP9FRbvv0fKOWliiPKRdqNAGFxMNceNoKRni8qT4_IWaQGPIZVAid4_G4-gPtylbluXg1uFnbe9Mi5dMtqp6thlkct4A36wdEzb6_NGO7i3d5ngNcwT_-InWIlD7JiCVSEOr5KJN_E-x3hbT7N2nfaOuw22ciKSFZuAJqrmX2P=w640-h342" width="640" /></a></div><br /><h2 style="text-align: left;">Overview of Features</h2><p></p><p>Popular use cases include: malware-analysis, algorithm reconstruction, vulnerability discovery, debugging, and as an educational aid—disassembly is a great way to learn about how programs run.</p><p>Ghidra has many of the features you would expect in a tool of this type. To list a few, there are function graphs, which show a graphical representation of the program's control flow. There is an inline assembler, for making small changes to the code. There is a version tracking feature; it allows following how functions and data get moved around from one version of a binary to the next, allowing the user to focus on new code, not the same function moved to a different place. There is scripting support for both Java and Python. The GUI is completely customizable, and windows can be reordered, docked in different locations, and dragged outside the main window. One neat feature is if you come across an assembly instruction you aren't familiar with, you can click on it and be taken to the CPU vendor's datasheet for that instruction. Ghidra supports multi-user analysis and collaboration. You can host a project on a server, and then a team of people can work together to reverse engineer a set of binaries. All the instruction set architectures you care about are <a href="https://en.wikipedia.org/wiki/Ghidra#:~:text=.%5B15%5D-,Supported%20architectures,-%5Bedit%5D">supported</a>. (AMD64, AArch64, RISC-V, etc.)</p><p>I could go on, but rather than try to describe the tool, the best way to learn about it is to jump right in and try it out. That's the point of the rest of this article.</p><h2 style="text-align: left;">Ghidra and UEFI</h2><p>Ghidra works great with Windows binaries and Linux binaries of all types, but as readers of <a href="http://BasicInputOutput.com">BasicInputOutput.com</a> have come to expect, this article will focus on how to use Ghidra with BIOS firmware. Let's start with the installation process, and then demo the tool.</p><h3 style="text-align: left;">Installation</h3><p>Installation is not bad, but a step-by-step explanation will make it much easier.</p><p></p>1. <b>Install the JDK (not the JRE)</b>. You'll need to install the Java Development Kit, v17 or later. I installed v21 of <a href="https://www.oracle.com/java/technologies/downloads/">Oracle's JDK</a>, but <a href="https://adoptium.net/temurin/releases/">OpenJDK</a> is recommended by the Ghidra team.<div><br /></div><div>2. <b>Download Ghidra from GitHub</b>. The <a href="https://github.com/NationalSecurityAgency/ghidra">download</a> comes in the form of a .zip file.</div><div><br /></div><div>3. <b>Download efiSeek (just download the master branch) from GitHub</b>. <a href="https://github.com/DSecurity/efiSeek">efiSeek</a> is an extension to Ghidra specific to working with UEFI images. Working with Ghidra and efiSeek is similar to working with IDA Pro and <a href="https://binarly.io/">Binarly's</a> <a href="https://github.com/binarly-io/efiXplorer">efiXplorer</a> plugin.</div><div><br /></div><div>4. <b>Set the environment variable <span style="font-family: courier;">GHIDRA_INSTALL_DIR</span></b> to the absolute path to where you unzipped the Ghidra download in step #2</div><div><br /></div><div>5. <b>Build efiSeek</b>. Run <span style="font-family: courier;">gradlew.bat</span> from within the root directory of the efiSeek source tree.</div><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgrcfA2ZgUcquhRfDvduOQHxExbesRlG-WNA__yzeEbeH4X3BoHuaJVyKLLnFk5XyVL1me5U9naRKK6eWvv-r10YZCkNyZ2pk4M9w094iGM7_05-NdhcnXOEmPOu45fC-JkgozKiNIgXX3ZFJDqUor43-JPPBM-7z0obmrGb-s4-cUmpeqjx5Pg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="532" data-original-width="979" height="347" src="https://blogger.googleusercontent.com/img/a/AVvXsEgrcfA2ZgUcquhRfDvduOQHxExbesRlG-WNA__yzeEbeH4X3BoHuaJVyKLLnFk5XyVL1me5U9naRKK6eWvv-r10YZCkNyZ2pk4M9w094iGM7_05-NdhcnXOEmPOu45fC-JkgozKiNIgXX3ZFJDqUor43-JPPBM-7z0obmrGb-s4-cUmpeqjx5Pg=w640-h347" width="640" /></a></div><br /><div style="text-align: left;">6. <b>Copy the build from efiSeek\dist to Ghidra</b>. After building efiSeek, a .zip file will be created in a new subdirectory of the efiSeek source tree called "dist". Inside, copy the build result, something like <span style="font-family: courier;">ghidra_10.4_PUBLIC_20231010_efiSeek-master.zip</span>, to the <GhidraRoot>\Extensions\Ghidra directory.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">7. <b>Run Ghidra and enable the efiSeek extension</b>. To run Ghidra, run the <span style="font-family: courier;">ghidraRun.bat</span> file from within the root directory of where you unzipped Ghidra. To turn on efiSeek, click File/Install Extensions, and check "efiSeek".</div></div><br /><h3 style="text-align: left;">Demonstration</h3></div><div><p>As a test, I built the latest <a href="https://github.com/tianocore/edk2/tree/master/ShellPkg">UEFI shell</a> from the <a href="https://github.com/tianocore/edk2">EDK2</a>, and added it to a test project in Ghidra. Clicking on the Ghidra monster icon launches the CodeBrowser. Some screenshots to give you an idea of what the tool is capable of:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgY0Lv96my0X5x5HC6u7Dhvw9kXX2a1DCwLkw3Mnn-CEd2zPKLPFW_olj4WPRSJ3xwY8e7HDwT2WoKZ_gZN1SISe-zRNfNFbEjybA9YpgH-yLvQZwlSROk3PON3RHky0v0TXH-9J9DjkjIZLZKEVJaJSfhyG7EBvFw9Y6D3p7kgVW6Pa_02Zq4k" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="559" data-original-width="786" height="456" src="https://blogger.googleusercontent.com/img/a/AVvXsEgY0Lv96my0X5x5HC6u7Dhvw9kXX2a1DCwLkw3Mnn-CEd2zPKLPFW_olj4WPRSJ3xwY8e7HDwT2WoKZ_gZN1SISe-zRNfNFbEjybA9YpgH-yLvQZwlSROk3PON3RHky0v0TXH-9J9DjkjIZLZKEVJaJSfhyG7EBvFw9Y6D3p7kgVW6Pa_02Zq4k=w640-h456" width="640" /></a></div><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjZOVfCdgFAbuYNwjDF_Kp7s_xA9I3JAevuu4t9W8k1jvzoTBRGL87gD4jlLnivchiCjN1caqOdP6QKcTIzritSzjb3jP-SRlPX6z6MrdEQB80XTJJxVk6FDmZ2G1uD3JAiRfKHGq_bNWcwuI3nUe8GGTqiIw5d250bchwW0mYUwbIWaDA-gHES" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="317" data-original-width="564" height="360" src="https://blogger.googleusercontent.com/img/a/AVvXsEjZOVfCdgFAbuYNwjDF_Kp7s_xA9I3JAevuu4t9W8k1jvzoTBRGL87gD4jlLnivchiCjN1caqOdP6QKcTIzritSzjb3jP-SRlPX6z6MrdEQB80XTJJxVk6FDmZ2G1uD3JAiRfKHGq_bNWcwuI3nUe8GGTqiIw5d250bchwW0mYUwbIWaDA-gHES=w640-h360" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgU-Fd3n0gNuuiX6hBb57WaMYHt0MOQSDtji27fH0QOOqqY2WQjfKY2gFyZdoiEkdrta21G4TBVyZo0YQs-oDTUzswOd5MrKmz3z_RjSEPvpAO3ISBXHKRCOi-MyheCLCRmEAhGVGfp8jvDQMX6TCWFcqUtWgKO6PA_ImR7poSeCnCRjfkEZGnZ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="540" data-original-width="765" height="452" src="https://blogger.googleusercontent.com/img/a/AVvXsEgU-Fd3n0gNuuiX6hBb57WaMYHt0MOQSDtji27fH0QOOqqY2WQjfKY2gFyZdoiEkdrta21G4TBVyZo0YQs-oDTUzswOd5MrKmz3z_RjSEPvpAO3ISBXHKRCOi-MyheCLCRmEAhGVGfp8jvDQMX6TCWFcqUtWgKO6PA_ImR7poSeCnCRjfkEZGnZ=w640-h452" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgu2OowXrGqn4-SszyHTa9iBrsAEYsaBTxEjhgljUSAvHMdUPfJQ0p3_vQyVsPScc2oZN0ge-GKBdogOq5wdMEe2mxzDCYSSOE_0dKzcjeQ8RLRDb5-FkOayC-DbF8bySKjN6biTbCr5_FjuiagEoTdpj32nSwoOKDiYfIG8MPtcl4sgXxeYcru" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="315" data-original-width="506" height="398" src="https://blogger.googleusercontent.com/img/a/AVvXsEgu2OowXrGqn4-SszyHTa9iBrsAEYsaBTxEjhgljUSAvHMdUPfJQ0p3_vQyVsPScc2oZN0ge-GKBdogOq5wdMEe2mxzDCYSSOE_0dKzcjeQ8RLRDb5-FkOayC-DbF8bySKjN6biTbCr5_FjuiagEoTdpj32nSwoOKDiYfIG8MPtcl4sgXxeYcru=w640-h398" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgg964_EIAHsRn8ey_zG3ru5LbjsEsBW17Yg7K_8xAlKSOt_J42yv9Gpv5_RKxDwkEMruUcz47tTnWH4IVoiwFsDMiUuFaZmKtd08176iduIrQb5pz9dveA8bmT5DKm6Gwi3VFam7AlVXTB5TKuL-E4yOsd25emJUSkyp3Bg6ZDaylVp48KylYv" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="309" data-original-width="683" height="290" src="https://blogger.googleusercontent.com/img/a/AVvXsEgg964_EIAHsRn8ey_zG3ru5LbjsEsBW17Yg7K_8xAlKSOt_J42yv9Gpv5_RKxDwkEMruUcz47tTnWH4IVoiwFsDMiUuFaZmKtd08176iduIrQb5pz9dveA8bmT5DKm6Gwi3VFam7AlVXTB5TKuL-E4yOsd25emJUSkyp3Bg6ZDaylVp48KylYv=w640-h290" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhJjyjRbkaTp1GyMEEaBT9iDwaOcT3Fx7EDkvF1AvtMXPERisQt_523n1XBmBaPUCC62y2cmcK0CdEQWVR_A8uPe-_xpJfus6ATmBviW2bV3ZVfDJ8JjEz979kpgJM11cJzvglCSh0zlAaDej9bPbXUG1yxDXLCSsPqjW0PRSrZsJysBH4f3RuW" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="372" data-original-width="506" height="470" src="https://blogger.googleusercontent.com/img/a/AVvXsEhJjyjRbkaTp1GyMEEaBT9iDwaOcT3Fx7EDkvF1AvtMXPERisQt_523n1XBmBaPUCC62y2cmcK0CdEQWVR_A8uPe-_xpJfus6ATmBviW2bV3ZVfDJ8JjEz979kpgJM11cJzvglCSh0zlAaDej9bPbXUG1yxDXLCSsPqjW0PRSrZsJysBH4f3RuW=w640-h470" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj50L9TgBgFTepXWxFN37U2meLqF1Oee5HnakOf79QLM_Sp-KJBFHyyqtZ39WBWqUmOs1eYKZ9vP8HMB15nKaBR7qxY8rj8y4zTl1c7hcyIC2Hk5q4VpSvfGJmo3vuIhFng5vkmbf0GRhbKsCA4VXdV-PNfjFYiAX4oyu6R4e4rW-AXzPzShZ4i" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="190" data-original-width="398" height="306" src="https://blogger.googleusercontent.com/img/a/AVvXsEj50L9TgBgFTepXWxFN37U2meLqF1Oee5HnakOf79QLM_Sp-KJBFHyyqtZ39WBWqUmOs1eYKZ9vP8HMB15nKaBR7qxY8rj8y4zTl1c7hcyIC2Hk5q4VpSvfGJmo3vuIhFng5vkmbf0GRhbKsCA4VXdV-PNfjFYiAX4oyu6R4e4rW-AXzPzShZ4i=w640-h306" width="640" /></a></div><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgm94K1a8xvF1Z3qLrNa3IRA2PvoagmXWZlYEFucgrZq8mjsADYPdJTs9R9AJ2CBiTe6jyV2_z1-rRFMR1idEhkbUH7iQ0478k8iNPnYZsTat3S5JQnRg9Y4dKLdejboiBSocRsrkVXI4RxAKJ_nbIFTr6JCCh4gJixucSJqCQFoELc_TIvn8o2" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="541" data-original-width="427" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEgm94K1a8xvF1Z3qLrNa3IRA2PvoagmXWZlYEFucgrZq8mjsADYPdJTs9R9AJ2CBiTe6jyV2_z1-rRFMR1idEhkbUH7iQ0478k8iNPnYZsTat3S5JQnRg9Y4dKLdejboiBSocRsrkVXI4RxAKJ_nbIFTr6JCCh4gJixucSJqCQFoELc_TIvn8o2=w504-h640" width="504" /></a></div><br /></div><div style="text-align: left;">... and so on, and so on.</div></div></div><div><br /></div>Bottom-line is that this is a world-class reverse engineering tool that is free as in beer, and free as in freedom. It costs nothing to try, and can be setup in less than 10 minutes, so you have nothing to lose! The tool documentation is top-notch—you will be pleasantly surprised!</div><div><br /><h2 style="text-align: left;">More Resources</h2><p>I hope you found this introduction helpful. This is a tool you will want to have in your toolkit. Here are a couple of videos worth watching if you want to learn more about Ghidra.</p><p><a href="https://www.youtube.com/watch?v=r3N13ig8H7s">Come Get Your Free NSA Reverse Engineering Tool!</a> (RSAC 2019)</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/r3N13ig8H7s" width="320" youtube-src-id="r3N13ig8H7s"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://www.youtube.com/watch?v=kx2xp7IQNSc">Ghidra - Journey from Classified NSA Tool to Open Source</a> (BlackHat 2019)</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/kx2xp7IQNSc" width="320" youtube-src-id="kx2xp7IQNSc"></iframe></div><br /><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><p><br /></p></div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-12904787.post-25255458649017057052023-10-03T16:35:00.000-05:002023-10-03T16:35:16.498-05:00Introduction to the Netwide Assembler (NASM)<p></p><div class="separator" style="clear: both; text-align: right;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhrx6jvUWAASI23kx5LFYg0lE73-kpQi5aAoxr6biuG_ugf3TdKB5O1NKxdpFLBs5H67Kp_qxawUn4ZEDTshofbVISTDMScB9JrG-1SqziesGvtmbO7os_DkXQopLbKiQavKrSBwxf6RWpmKNIXVNjsPLyH0aLJQvRTGoCdKS-GMX_wOl_GPo5R" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhrx6jvUWAASI23kx5LFYg0lE73-kpQi5aAoxr6biuG_ugf3TdKB5O1NKxdpFLBs5H67Kp_qxawUn4ZEDTshofbVISTDMScB9JrG-1SqziesGvtmbO7os_DkXQopLbKiQavKrSBwxf6RWpmKNIXVNjsPLyH0aLJQvRTGoCdKS-GMX_wOl_GPo5R" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjUbk17rBWYJnyj3COI_YVmH0bOlfIIMdKkqbebyhMSeERtKl7F8FWPhp3li9oGeMcDYE5TghhDh2Uxs9W7lvPKffAw8eqTIHORjjiJCtf9KoFYomjRoxSO0QjkpMFdIJCi8esSUf1aSHOoszQDDnPLdf2l2RCGJ-LLT8atAMa8UIDbaGSsJQO7" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="155" data-original-width="264" height="189" src="https://blogger.googleusercontent.com/img/a/AVvXsEjUbk17rBWYJnyj3COI_YVmH0bOlfIIMdKkqbebyhMSeERtKl7F8FWPhp3li9oGeMcDYE5TghhDh2Uxs9W7lvPKffAw8eqTIHORjjiJCtf9KoFYomjRoxSO0QjkpMFdIJCi8esSUf1aSHOoszQDDnPLdf2l2RCGJ-LLT8atAMa8UIDbaGSsJQO7=w320-h189" width="320" /></a></div><br /></div>NASM, or the <a href="https://www.nasm.us/">Netwide Assembler</a>, is an open-source assembler for x86 CPUs. Why is this important? NASM is a prerequisite for <a href="https://github.com/tianocore/tianocore.github.io/wiki/Nasm-Setup">building with EDKII</a>, and also popular in many other contexts.<p></p><p>NASM has an amazing legacy, dating back to 1996. Having started off as a modest hobbyist project, today it is arguably the most important x86 assembler. In bygone days of yore, BIOS engineers used either the Microsoft Macro Assembler (<a href="https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler">MASM</a>), or the Borland Turbo Assembler (<a href="https://en.wikipedia.org/wiki/Turbo_Assembler">TASM</a>). However, both those two programs were discontinued many years ago, and both were quite expensive. NASM filled the vacuum left by Microsoft discontinuing MASM* and Borland going out of business, and rode the wave of growth in popularity of open-source software to its current level of prominence.</p><p style="text-align: right;"><span style="font-size: x-small;"><i>*MASM exists today as part of Visual Studio, but is discontinued as a stand-alone product</i></span></p><p>NASM supports <a href="https://en.wikipedia.org/wiki/X86_assembly_language#Syntax">Intel-style syntax</a>, rather than the AT&T-style. It supports a range of object file formats, including Linux and BSD a.out, ELF, Mach-O, 16-bit and 32-bit .obj (OMF) format, and COFF (including its Win32 and Win64 variants.). A NASM "installation" is simply two files: <span style="font-family: courier;">nasm.exe</span>, the assembler, and <span style="font-family: courier;">ndisasm.exe</span>, the disassembler; just stick them anywhere in your <span style="font-family: courier;">%PATH%</span> and you're ready to go. NASM runs on Win64, Win32, Linux, MacOS, and MS-DOS. (yes, MS-DOS!)</p><p>The original developers have long since moved on, and now NASM is maintained by Mr. H. Peter Anvin and a <a href="https://www.nasm.us/#:~:text=no%20longer%20maintained.-,Development%20Team,-NASM%20was%20originally">small team</a>. NASM has several <a href="https://lists.nasm.us/">mailing lists</a> to which you can subscribe, and you can file bugs in the team's <a href="https://bugzilla.nasm.us/">Bugzilla</a>. There is ample <a href="https://www.nasm.us/docs.php">documentation</a>, and an active <a href="https://forum.nasm.us/">discussion forum</a>. The code for the project is on GitHub: <a href="https://github.com/netwide-assembler/nasm">https://github.com/netwide-assembler/nasm</a></p><p>Wikibooks has some good "hello, world" <a href="https://en.wikibooks.org/wiki/X86_Assembly/NASM_Syntax">examples</a>. Finally, you can type <span style="font-family: courier;">nasm --help</span> for command-line help.</p><p>I hope you found this short introduction helpful. NASM is definitely a tool with which you want to keep familiar.</p><p><br /></p><p><br /></p><scribe-shadow id="crxjs-ext" style="height: 0px; left: 0px; overflow: visible; position: fixed; top: 0px; width: 0px; z-index: 2147483647;"></scribe-shadow>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-30756599550389471432023-08-31T15:02:00.006-05:002023-08-31T15:06:54.929-05:00Software Bill of Materials (SBOM) in Practice<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgO3yvLgNiu8QMuqqZGB7Cod8nzgo_2DQBa0S13JmefM4mtxV95NwmU8I4ANOmu44uEFP82LVd4L8wxXufBLYwUcvUHGmSVobaI9wxQz6-UrmzJFrOt6oslPlin9BJmpfvELc7J_4uERV_DW5zct0zVR3Tgay31NrLO0i49keLm-eX5TcM67CT0" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="343" data-original-width="846" height="163" src="https://blogger.googleusercontent.com/img/a/AVvXsEgO3yvLgNiu8QMuqqZGB7Cod8nzgo_2DQBa0S13JmefM4mtxV95NwmU8I4ANOmu44uEFP82LVd4L8wxXufBLYwUcvUHGmSVobaI9wxQz6-UrmzJFrOt6oslPlin9BJmpfvELc7J_4uERV_DW5zct0zVR3Tgay31NrLO0i49keLm-eX5TcM67CT0=w400-h163" width="400" /></a></div><br /><div style="text-align: left;">On May 12, 2021, U.S. President Joe Biden issued the <i>Executive Order on Improving the Nation’s Cybersecurity</i>. (<a href="https://www.whitehouse.gov/briefing-room/presidential-actions/2021/05/12/executive-order-on-improving-the-nations-cybersecurity/">Executive Order 14028</a>) A key piece of this order, and one that has garnered much attention in the FW/BIOS industry, is the requirement for a Software Bill of Materials (SBOM). The Order defines this as:</div><p></p><p><span face="MercurySSm-Book-Pro_Web, serif" style="background-color: white; color: #0a2458; font-size: 16px;"></span></p><blockquote>(j) the term “Software Bill of Materials” or “SBOM” means a formal record containing the details and supply chain relationships of various components used in building software. Software developers and vendors often create products by assembling existing open source and commercial software components. The SBOM enumerates these components in a product. It is analogous to a list of ingredients on food packaging. An SBOM is useful to those who develop or manufacture software, those who select or purchase software, and those who operate software. Developers often use available open source and third-party software components to create a product; an SBOM allows the builder to make sure those components are up to date and to respond quickly to new vulnerabilities. Buyers can use an SBOM to perform vulnerability or license analysis, both of which can be used to evaluate risk in a product. Those who operate software can use SBOMs to quickly and easily determine whether they are at potential risk of a newly discovered vulnerability. A widely used, machine-readable SBOM format allows for greater benefits through automation and tool integration. The SBOMs gain greater value when collectively stored in a repository that can be easily queried by other applications and systems. Understanding the supply chain of software, obtaining an SBOM, and using it to analyze known vulnerabilities are crucial in managing risk.</blockquote><p></p><div style="text-align: left;"><span face="MercurySSm-Book-Pro_Web, serif" style="color: #0a2458;"><span style="background-color: white;">The Order defines "software" in the SBOM to include <a href="https://www.whitehouse.gov/wp-content/uploads/2022/09/M-22-18.pdf">firmware and operating systems</a>, so the BIOS community has busy working on what this means for implementations of BIOS.</span></span></div><div style="text-align: left;"><span face="MercurySSm-Book-Pro_Web, serif" style="color: #0a2458;"><span style="background-color: white;"><br /></span></span></div><h2 style="text-align: left;"><span face="MercurySSm-Book-Pro_Web, serif" style="color: #0a2458;"><span style="background-color: white;">What is an SBOM Anyway?</span></span></h2><div><span style="color: #0a2458;"><span style="background-color: white;">Progress has already been made on SBOM in UEFI. So as not to repeat the great work that's already been done, let me direct you to a couple of good resources:</span></span></div><div><span style="color: #0a2458;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><a href="https://uefi.org/sites/default/files/resources/Traceable%20Firmware%20Bill%20of%20Materials%20-%2020211207%20-%20007.pdf">Traceable Firmware Bill of Materials Overview</a></div><div><i>Amy Nelson, Jiewen Yao, and Vincent Zimmer</i></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/BMHp7J5mI5Q" width="320" youtube-src-id="BMHp7J5mI5Q"></iframe></div><br /><div><a href="https://uefi.org/sites/default/files/resources/UEFI%20Support%20for%20Software%20Bill%20of%20Materials%20%28SBOM%29_AMI_UEFI_Final_Deck.pdf" style="background-color: white;">UEFI Support for Software Bill of Materials (SBOM)</a></div><div><span style="color: #0a2458;"><span style="background-color: white;"><div><i>Felix Polyudov and Brian Mullen</i></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/naDYSz1a3KQ" width="320" youtube-src-id="naDYSz1a3KQ"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><h2 style="text-align: left;">SBOM in Practice</h2><div>Since the aforementioned resources already do a good job introducing SBOM, my goal for this article is to experiment with SBOM more practically: by actually using some available tools to build an SBOM and see what we get.</div></span></span></div><div><span face="MercurySSm-Book-Pro_Web, serif" style="color: #0a2458;"><span style="background-color: white;"><br /></span></span></div><div><span face="MercurySSm-Book-Pro_Web, serif" style="color: #0a2458;"><span style="background-color: white;"><div>The SBOM community has identified three existing data standards (formats) that can convey the data needed to represent an SBOM: <a href="https://spdx.dev/">SPDX</a>, <a href="https://cyclonedx.org/">CycloneDX</a>, and <a href="https://csrc.nist.gov/projects/Software-Identification-SWID">SWID tags</a>.</div><div><br /></div><div>Experts in these formats have mapped between them to create interoperability for an SBOM baseline. Because these formats are already subject to public input and translation tools do exist, they serve as logical starting points for sharing basic data.</div><div><br /></div><h3 style="text-align: left;">EMBA and CycloneDX</h3><div>The first step is to download, install, and run <a href="https://github.com/e-m-b-a/emba">EMBA</a>. EMBA is a multi-purpose security analyzer for firmware, including SBOM scanning and generation. Installation is a simple and straightforward process, but be warned that it does take quite some time, maybe 40 minutes or more in my experience.</div><div><div><ol style="text-align: left;"><li><span style="font-family: courier;">git clone https://github.com/e-m-b-a/emba.git</span></li><li><span style="font-family: courier;">cd emba</span></li><li><span style="font-family: courier;">sudo ./installer.sh -d</span></li></ol></div></div></span></span></div><div style="text-align: left;"><span style="background-color: white; color: #0a2458; font-size: 16px;">Once that is complete, as an experiment, I ran EMBA on EDK2's UEFI Shell like:</span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;"><span style="font-family: courier;">sudo ./emba -l ~/log -f ~/emba/shell.efi -p ./scan-profiles/default-scan.emba</span></span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">(note: there is another scan profile called <i>sbom-default.emba</i>, but the <i>default-scan.emba</i> is a superset, and so also runs the SBOM portion of the test)</span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">Once EMBA was complete I got lots of neat information, here's a sampling:</span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi4-67v53dOtPooLPim5HdRZDUE1DFpKTdRSmo2oZLzFuOj8vJ-1WxhrBNPLj9jfpvTebkILr6KycWpKmJdoBarWEPiIr1vq4tNio8hyCb20upE4nDiW9arlEb1pZ4otV0acp_xbL7qGCBy2jyhdp5K5wTVexjhgg47V0dcBLx3dK368HdGps37" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="572" data-original-width="711" height="517" src="https://blogger.googleusercontent.com/img/a/AVvXsEi4-67v53dOtPooLPim5HdRZDUE1DFpKTdRSmo2oZLzFuOj8vJ-1WxhrBNPLj9jfpvTebkILr6KycWpKmJdoBarWEPiIr1vq4tNio8hyCb20upE4nDiW9arlEb1pZ4otV0acp_xbL7qGCBy2jyhdp5K5wTVexjhgg47V0dcBLx3dK368HdGps37=w640-h517" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi_Urrc7OrN6m4khrf-pJ7a9LdK40BpA26u5X_Oh6PF-2mIm018ZM7qYABT8lSygOU8IDnvQMs4BzEm4y03JsZlBYJlJhqMcGBleAC2SFt0lP1bIY0APxeoM90bBbzz_FwbvgFm_YI68Vf_Sb-_9LK0e6_8XxCJ80xEKPJLxyHNdl-jXHbgPq9W" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="229" data-original-width="798" height="184" src="https://blogger.googleusercontent.com/img/a/AVvXsEi_Urrc7OrN6m4khrf-pJ7a9LdK40BpA26u5X_Oh6PF-2mIm018ZM7qYABT8lSygOU8IDnvQMs4BzEm4y03JsZlBYJlJhqMcGBleAC2SFt0lP1bIY0APxeoM90bBbzz_FwbvgFm_YI68Vf_Sb-_9LK0e6_8XxCJ80xEKPJLxyHNdl-jXHbgPq9W=w640-h184" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgV1N08WWrlYekt-MQGOCgHPQGuoZC9ZGGZwE22qVTveNzWt4dUn6ieCskJfuYWdEol5RyH3XBaXrSKycR1qS3Gy2TJjtLL6mC1cR3LEeHSl9vHsvSYYLZuNN2ipCbKJbXSQqPyHrSwoYXS4rVKkVVLcNE3s_a_37fT6BYSvDDLjdHNyTSyBk5Y" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="715" data-original-width="644" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEgV1N08WWrlYekt-MQGOCgHPQGuoZC9ZGGZwE22qVTveNzWt4dUn6ieCskJfuYWdEol5RyH3XBaXrSKycR1qS3Gy2TJjtLL6mC1cR3LEeHSl9vHsvSYYLZuNN2ipCbKJbXSQqPyHrSwoYXS4rVKkVVLcNE3s_a_37fT6BYSvDDLjdHNyTSyBk5Y=w576-h640" width="576" /></a></div></div></div><br /></span></span></div><div style="text-align: left;"><span style="background-color: white; color: #0a2458;">However, what was NOT present was an actual SBOM. The log says:</span></div><div style="text-align: left;"><span style="color: #0a2458; font-family: courier;"><span style="background-color: white;"><div style="font-size: small;"></div><blockquote><div>[[0;34m+[0m] [0;36m[1mCycloneDX SBOM converter[0m</div><div>[1m=================================================================[0m</div><div>[[0;31m-[0m] Fri Jul 7 21:27:51 CDT 2023 - F21_cyclonedx_sbom nothing reported</div></blockquote><div style="font-size: small;"></div></span></span></div><div style="text-align: left;"><span style="background-color: white; color: #0a2458;">So, my take-away here is that the </span><i style="color: #0a2458;">shell.efi</i><span style="background-color: white; color: #0a2458;"> binary being examined does not contain the necessary metadata required for the EMBA tool to create a CycloneDX-style SBOM.</span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">Undeterred, I attempted to run the same EMBA scan on a <a href="https://coreboot.org/">Coreboot</a> BIOS image for the Lenovo T530 system. There is a project called <a href="https://github.com/merge/skulls">Skulls </a>that contains pre-built Coreboot BIOS images, more here: <a href="https://github.com/merge/skulls">https://github.com/merge/skulls</a>. Some progress:</span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj7IIPHM63YK-wFR74-8gUYYGPkeA1_ozCgdKu16fza04s44pHPET06Hj2I89oRztCGikR_3obNKDq4X2eZNiH33yzJnc1ZxxPCeyt2Zq5EJI3CNYLjhWZ17PnAPaGufd-ArIeosfwJvAm50v0PqfAoCUafbp7ySc1R2wfCuLnO6wmfw9DcRPb1" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="331" data-original-width="559" height="236" src="https://blogger.googleusercontent.com/img/a/AVvXsEj7IIPHM63YK-wFR74-8gUYYGPkeA1_ozCgdKu16fza04s44pHPET06Hj2I89oRztCGikR_3obNKDq4X2eZNiH33yzJnc1ZxxPCeyt2Zq5EJI3CNYLjhWZ17PnAPaGufd-ArIeosfwJvAm50v0PqfAoCUafbp7ySc1R2wfCuLnO6wmfw9DcRPb1=w400-h236" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgL6DmkyRKg-synPHE_re5OEFPDnj82fiM_Q3Y-hAHHXemgtL8n_nKr-5dcYXSw7bX_Hpr3tsYQxbHD5P7amp3atiIEsDl_N5XDYzez_Qtf0S8CdRXqXWH4U0a5UV9Cwz1a3ag9hiV37v94Kn5ERf5437SV7cMaiVkAdm_6TQYN5RLaWfI3yHOR" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="759" data-original-width="1352" height="360" src="https://blogger.googleusercontent.com/img/a/AVvXsEgL6DmkyRKg-synPHE_re5OEFPDnj82fiM_Q3Y-hAHHXemgtL8n_nKr-5dcYXSw7bX_Hpr3tsYQxbHD5P7amp3atiIEsDl_N5XDYzez_Qtf0S8CdRXqXWH4U0a5UV9Cwz1a3ag9hiV37v94Kn5ERf5437SV7cMaiVkAdm_6TQYN5RLaWfI3yHOR=w640-h360" width="640" /></a></div><br />Now we're getting somewhere! Pretty neat!</span></span></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;"><br /></span></span></div><h3 style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">SWID Tags</span></span></h3><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">The NIST web page for <b>SWID Tag tools</b> is: <a href="https://pages.nist.gov/swid-tools/">https://pages.nist.gov/swid-tools/</a>. These are great for incorporating SBOM data into your build process, but they do not have the ability to scan pre-built firmware images, which is what I was looking to try out here. Also, they are Java-based, which is not helpful for BIOS folk.</span></span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">More promising is </span><b>python-uswid</b>: <a href="https://github.com/hughsie/python-uswid">https://github.com/hughsie/python-uswid</a></span><span style="color: #0a2458;">. This tool is:</span></div><div style="text-align: left;"><ul style="text-align: left;"><li><span style="color: #0a2458;">specific to EFI firmware</span></li><li><span style="color: #0a2458;">Python-based, therefore compatible with EDK2</span></li><li><span style="color: #0a2458;">maintained by <a href="https://twitter.com/hughsient">Richard Hughes</a>, creator of <a href="https://en.wikipedia.org/wiki/Fwupd">LVFS/fwupd</a> and all-around great guy</span></li></ul><div><span style="color: #0a2458;">So, while not a tool for scanning pre-built firmware images, this looks like promising scaffolding for integrating into a EDK2 build process to embed SBOM data into firmware images.</span></div><div><span style="color: #0a2458;"><br /></span></div><h3 style="text-align: left;"><span style="color: #0a2458;">SPDX SBOM Generator</span></h3><div><span style="color: #0a2458;">On the SPDX side of things, I did locate a good tool, but it is not specific to firmware:</span></div><div><span style="color: #0a2458;"><a href="https://github.com/opensbom-generator/spdx-sbom-generator">SPDX Software Bill of Materials (SBOM) Generator</a></span></div><div><span style="color: #0a2458;"><br /></span></div><div><span style="color: #0a2458;">This might be a good option, but requires further analysis of how, if possible, to incorporate it into an EDK2-style build process.</span></div><div><span style="color: #0a2458;"><br /></span></div></div><h2 style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">Takeaway</span></span></h2><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">Suffice it to say that SBOM generation is still immature. My takeaway at this point in time is that the industry is still sorting out how best to satisfy the need for an SBOM. Questions still being debated:</span></span></div><div style="text-align: left;"><ul style="text-align: left;"><li><span style="color: #0a2458;"><span style="background-color: white;">do we put the SBOM in the binary, or</span></span> put the SBOM reference in the binary?</li><li>what data fields to include?</li><li>how deep through the dependency tree should we go, and what if information is missing from a deeply nested dependency?</li></ul></div><div style="text-align: left;"><span style="color: #0a2458;"><span style="background-color: white;">We'll have to keep our eyes on this space to see how things develop from here on out, but hopefully this article demonstrated how some existing tools might be used to create SBOMs.</span></span></div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-12904787.post-18094168011505599782023-05-16T07:00:00.252-05:002023-05-16T07:39:20.043-05:00Will it run DOOM?<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjLXdp5cWl1-5GaSNdjFqrz7fLCMfJRCU8f6BzeE1hQKfz1Yg52FpPXeQw-IRZNYvD8w9qwmp9oIaAgTt2HbQTPl4scxQcx-21_I9-MmqeiMbYwPsgCZthYbyaCkri1TG-2fq8eXAdwf5W58OyE-0r42Lb4CMZYqScf2cysSWs1n-_MjHxtBQ" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="706" data-original-width="1368" height="165" src="https://blogger.googleusercontent.com/img/a/AVvXsEjLXdp5cWl1-5GaSNdjFqrz7fLCMfJRCU8f6BzeE1hQKfz1Yg52FpPXeQw-IRZNYvD8w9qwmp9oIaAgTt2HbQTPl4scxQcx-21_I9-MmqeiMbYwPsgCZthYbyaCkri1TG-2fq8eXAdwf5W58OyE-0r42Lb4CMZYqScf2cysSWs1n-_MjHxtBQ" width="320" /></a></div><br />One of the most fun pastimes coming out of the hacker/hobbyist scene is the <i>Will It Run DOOM?</i> meme. If you're not familiar with it, this is the informal challenge where people try to get DOOM (the original, ©1993) to run on all manner of computing devices, microcontrollers, etc. Pretty much the sky is the limit. There's a great subreddit <a href="https://www.reddit.com/r/itrunsdoom/">Will it run DOOM?</a> where people document all the various compute devices, kitchen appliances, and electronic gadgets that have been made to run DOOM. The craziest is probably <a href="https://www.popularmechanics.com/science/a33957256/this-programmer-figured-out-how-to-play-doom-on-a-pregnancy-test/">this one</a>.<p></p><p>Lucky for us BIOS engineers, GitHub user <a href="https://github.com/Cacodemon345/uefidoom">Cacodemon345</a> created a DOOM that runs in the UEFI Shell! In this article, I'll try to get that to work and document the steps I took to get there. Fun times ahead!</p><h2 style="text-align: left;">Building DOOM</h2><div>The <a href="https://github.com/Cacodemon345/uefidoom">GitHub page</a> has instructions for building, but they are imprecise and leave some details out. I've put together the following list of things you need to do in order to build DOOM, and tried to be as explicit as possible.</div><p></p><ol style="text-align: left;"><li>install VisualStudio 2015</li><ul><li>I installed VS2015 Enterprise</li><li>I only selected "Visual C++" at install; I unchecked all the other components</li></ul><li>git clone EDK2</li><ul><li>git@github.com:tianocore/edk2.git</li><li>I checked out the latest stable tag, <span style="font-family: courier;">edk2-stable202302</span></li></ul><li>git clone EDK2 LibC</li><ul><li>git@github.com:tianocore/edk2-libc.git</li><li>copy the directories (AppPkg, StdLib, etc.) into the edk2 source tree</li></ul><li>git clone the UEFI DOOM project</li><ul><li>git@github.com:Cacodemon345/uefidoom.git</li><li>I checked out tag 1.4</li></ul><li>install NASM</li><ul><li><a href="https://www.nasm.us/">https://www.nasm.us/</a></li><li>must use the latest, otherwise you risk errors</li><li>set <span style="font-family: courier;">NASM_PREFIX</span> env variable to point to path to nasm.exe, <b>including a trailing slash</b></li></ul><li>edit the AppPkg.dsc (AppPkg came from step #3 above)</li><ul><li>add the following line at the end of the <span style="font-family: courier;">[LibraryClasses]</span> list: SerialPortLib|PcAtChipsetPkg/Library/SerialIoLib/SerialIoLib.inf</li><li>add the path to the .inf file of the DOOM project in the <span style="font-family: courier;">[Components]</span> list like this: AppPkg/Applications/uefidoom/doom.inf</li></ul><li>move the "uefidoom" directory from step #4 to AppPkg\Applications</li><li>edit Conf/target.txt like:</li><ul><li><span style="font-family: courier;">ACTIVE_PLATFORM = AppPkg/AppPkg.dsc</span></li><li><span style="font-family: courier;">TARGET = DEBUG</span></li><li><span style="font-family: courier;">TARGET_ARCH = X64</span></li><li><span style="font-family: courier;">TOOL_CHAIN_TAG = VS2015x86</span></li></ul><li>open a cmd.exe prompt</li><li style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; margin: 0px 0px 0.25em; padding: 0px;">run <span style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; font-family: "courier new", courier, monospace;">edksetup.bat Rebuild</span></li><li>run <span style="font-family: courier;">build.exe</span></li><ul><li>if successful, you'll find doom.efi in edk2\Build\AppPkg\DEBUG_VS2015x86\X64</li></ul></ol><h2 style="text-align: left;">Running DOOM</h2><div>If building the file wasn't tricky enough, now there's the issue of getting it to run...</div><div><br /></div><h3 style="text-align: left;">get the DOOM WAD file</h3><div>I'm not 100% sure which DOOM WAD files will work, and which won't work, but I can tell you I tried the one that I play all the time, and it didn't work. I found this <a href="https://archive.org/download/2020_03_22_DOOM/DOOM%20WADs/Doom%20%28v1.9%29.zip">DOOM 1.9 WAD on archive.org</a>, tried it, and it worked great.</div><div><br /></div><h3 style="text-align: left;">Environments</h3><div>To run, you launch a UEFI shell, making sure to have <span style="font-family: courier;">doom.efi</span> and <span style="font-family: courier;">doom.wad</span> in the same directory. I didn't attempt to get audio working. Cacodemon345's GitHub repo mentions a possible way to get audio, but that will have to wait for another article. Anyway, simply run <span style="font-family: courier;">doom.efi</span> to start your battle against evil!</div><div><br /></div><div>This was my experience:</div><div><ul style="text-align: left;"><li>UEFI shell run from VMWare Workstation 17 — FAIL</li><ul><li>got error message launching DOOM.efi</li></ul></ul><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgkFUlARaeqO9NrZOR2ARIqIddj8r9A7rBYDUsJ_BO9QeF58_n3k4RFPa3E-WSANbQfFwY7V86ItIuolHOjXoZdGUsebzojw8-XsB1k54Rsmc3GMr5VNrye5lCjDuRUnRYBlVOVMaz_9EoLNq5Sdp6AB8UMOJ7ipQ0JGjuhotFlkT2zav0TZA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="129" data-original-width="320" height="129" src="https://blogger.googleusercontent.com/img/a/AVvXsEgkFUlARaeqO9NrZOR2ARIqIddj8r9A7rBYDUsJ_BO9QeF58_n3k4RFPa3E-WSANbQfFwY7V86ItIuolHOjXoZdGUsebzojw8-XsB1k54Rsmc3GMr5VNrye5lCjDuRUnRYBlVOVMaz_9EoLNq5Sdp6AB8UMOJ7ipQ0JGjuhotFlkT2zav0TZA" width="320" /></a></div><ul style="text-align: left;"><li>UEFI shell run from a Dell Precision workstation — PASS</li><li>UEFI shell run from QEMU emulator — PASS</li></ul><br /></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/C8yWW6HWuY8" width="320" youtube-src-id="C8yWW6HWuY8"></iframe></div><p>So, there we have it! The UEFI Shell also runs DOOM. In fact, we could probably add DOOM direct to the boot menu — boot to DOOM! Anyway, I hope you enjoyed this demonstration of getting DOOM up and running in the UEFI Shell.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-39978674772515127232023-04-25T07:00:00.004-05:002023-04-25T10:45:00.535-05:00EDID and DisplayID<p>In <i><b>"</b></i><b><i>The Before Times"</i></b> (think: 1980s), there was no way for graphics adapters and monitors to negotiate a common set of supported resolutions. While there were some vendor-specific schemes to utilize four of the unused pins in the VGA connector to kludge together a monitor identification method, these schemes were never standardized and couldn't be relied upon. In practice, the graphics adapter just sent out whatever resolution the user selected, for better or worse. This led to the possibility that setting your graphics card's output to too high of a frequency could overdrive the CRT and physically damage it.</p><p>So, monitor manufacturers started implementing protection circuits that sensed this condition, rejected the signal to protect themselves, and popped up an "Out of Scan Range" message to the user, something like:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhwlVKzJDBU_IpcheiEYjMX1KRz1DRsW8yDCYNTumxR4k6g-wqpu7ZLADoTGKaaNW-mGrDwimQlTcyVftWmtMrCaoTANM4WLKIQcaNvt06OY2taQ3tesiTeuhEMVFYkunKXfm76ydYVvDf1z0hVhiKBsDnxkxI4LwJpR5-lbCGbp0TeQ5wvPg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="503" data-original-width="807" height="199" src="https://blogger.googleusercontent.com/img/a/AVvXsEhwlVKzJDBU_IpcheiEYjMX1KRz1DRsW8yDCYNTumxR4k6g-wqpu7ZLADoTGKaaNW-mGrDwimQlTcyVftWmtMrCaoTANM4WLKIQcaNvt06OY2taQ3tesiTeuhEMVFYkunKXfm76ydYVvDf1z0hVhiKBsDnxkxI4LwJpR5-lbCGbp0TeQ5wvPg" width="320" /></a></div><br />Seeing this issue and wanting to craft a better solution, the people at the <a href="https://vesa.org/">Video Electronics Standards Association</a> (VESA) created a set of standards so that graphics adapters could query monitors to discover their capabilities, and then communicate with them at their best supported resolution and frequency. The standards are called <i>Display Data Channel, </i><i>Extended Display Identification Data, </i>and more recently, <i>DisplayID</i>. The way it works is, monitor vendors add to their products a ROM containing information describing their displays, formatted according to a specified format. Next, graphics adapters utilize a standardized protocol to read in and parse that data. The graphics adapter and OS can then offer a set of resolutions and other display parameters supported by both monitor and graphics adapter from which the user can choose. No more reading manuals or guessing whether a particular resolution is supported by both the graphics adapter and monitor!<div><br /></div><div>In this article, we'll discuss these specifications and play around with them to see how they work.</div><div><br /><div><h3 style="text-align: left;">EDID and DisplayID Revision History</h3><div>First, a little context. Here's the history of when these specifications were released to the industry.</div><div><ul style="text-align: left;"><li>1994, DDC standard version 1 – EDID v1.0 structure</li><li>1996, EDID standard version 2 – EDID v1.1 structure</li><li>1997, EDID standard version 3 – EDID structures v1.2 and v2.0</li><li>2000, E-EDID Standard Release A, v1.0 – EDID structure v1.3, EDID structure v2.0 deprecated</li><li>2006, E-EDID Standard Release A, v2.0 – EDID structure v1.4</li><li>2007, DisplayID, intended to replace all previous EDID versions</li><li>2009, DisplayID 1.1</li><li>2011, DisplayID 1.2</li><li>2013, DisplayID 1.3</li><li>2017, DisplayID 2.0, added generalized information blocks</li><li>2021, DisplayID 2.1, same structure as v2.0, but with new data blocks</li></ul><div>As you can see, these specifications have been under active development for decades, and continue to be. In the next sections, I'll describe these technologies in more detail.</div></div><p></p><h2 style="text-align: left;">Display Data Channel</h2><p>The <a href="https://en.wikipedia.org/wiki/Display_Data_Channel">Display Data Channel</a> (DDC) standard was introduced in 1994 and extended in 1999 by the <a href="https://en.wikipedia.org/wiki/Display_Data_Channel#E-DDC">Enhanced Display Data Channel</a> (E-DDC) standard, which is still in use today. Originally, DDC contained both the definition of various communications protocols by which graphics adapter and monitor could communicate, as well as the EDID description format. DDC v2 split out EDID into its own specification—more on that below.</p><p>DDC is a group of similar protocols, all based on <a href="https://en.wikipedia.org/wiki/I%C2%B2C">I2C</a>. Originally, the protocol was unidirectional: the graphics card reading from the monitor. Later protocols in the DDC suite added bidirectional support. While reading the EDID/DisplayId data is the most common use of DDC, it is noteworthy that other standards (<a href="https://en.wikipedia.org/wiki/HDMI">HDMI</a> and <a href="https://en.wikipedia.org/wiki/DisplayPort">DisplayPort</a>) make use of DDC for communications beyond the simple reading of monitor configuration data.</p><p style="text-align: left;">E-DDC is similar to DDC, but broke DDC's 256-byte addressing limitation by introducing a segment pointer. This segment pointer allows E-DDC to address up to 32KB worth of monitor configuration data. Also, E-DDC removed some of the less-popular DDC protocols, and added support for new display interfaces like HDMI and DisplayPort.</p><h2 style="text-align: left;">Extended Display Identification Data</h2><p>The <a href="https://en.wikipedia.org/wiki/Extended_Display_Identification_Data">Extended Display Identification Data</a> (EDID) standard defines a data structure, or, optionally, a set of data structures, used to carry configuration information for optimal use of a particular monitor.</p><p>EDID was updated several times in the late 1990s:</p><h4 style="text-align: left;">EDID v1.0, EDID v1.1, EDID v1.2, EDID v1.3</h4><p>These were the original versions of the stardard, and what they have in common is that they are all based on a 128-byte table used to store the configuration data. EDID also defines support for a number of 128-byte extensions that allow additional information to be conveyed.</p><h4 style="text-align: left;">EDID v2.0</h4><p>This version of the specification is an outlier. It introduced the concept of using a 256-byte table to hold the configuration data, but it never caught on in the industry and today is deprecated, replaced by E-EDID (next).</p><h4 style="text-align: left;">E-EDID v1.4</h4><div>Deciding that EDID v2.0 had taken a wrong turn, VESA released Enhanced Extended Display Identification Data (E-EDID), also called EDID v1.4. Although it came out after EDID v2.0, it is EDID v1.4 that is considered the industry standard today.</div><div><br /></div><h3 style="text-align: left;">What is in EDID?</h3><p>Let's dig a little deeper. I'm going to get the EDID information from one of my monitors. I'll follow a process specific to the Nvidia graphics adapter I have. (many apologies and much respect to the fine folks who make AMD graphics cards!):</p><p></p><ol style="text-align: left;"><li>launch Nvidia Control Panel</li><li>Select <i>View system topology</i></li><li>Click the EDID hyperlink for one of my connected displays</li><li>Click <i>Export EDID</i></li></ol><div>This gives me the EDID information in a text file:</div><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEij36lkjID1RhPphChOyWgO2bvVT9ZRou0G8O52Fryb0mxOmuB4NeL5vwvL0Y4D-0CjXKpcdOpmh3BKEsSSn1YLSwfOHFrQcUdgbKgoApFsEfWnqldNXgSxuckHk73RBcmhrN5NMBWw3Q6wjoyM2XKIHREZBKb4BCWhXSLhXswEZAUHkIgK-w" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="264" data-original-width="818" height="206" src="https://blogger.googleusercontent.com/img/a/AVvXsEij36lkjID1RhPphChOyWgO2bvVT9ZRou0G8O52Fryb0mxOmuB4NeL5vwvL0Y4D-0CjXKpcdOpmh3BKEsSSn1YLSwfOHFrQcUdgbKgoApFsEfWnqldNXgSxuckHk73RBcmhrN5NMBWw3Q6wjoyM2XKIHREZBKb4BCWhXSLhXswEZAUHkIgK-w=w640-h206" width="640" /></a></div><br />Next, I can go to the nifty website <a href="http://www.edidreader.com/">EDID Reader</a>, which is a web-based EDID parser. This website is based on an open-source project of the same name, and can be found on GitHub here:</div><div class="separator" style="clear: both; text-align: left;"><a href="https://github.com/dgallegos/edidreader">https://github.com/dgallegos/edidreader</a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">After pasting in the text of my EDID, I click <i>Parse EDID</i> and here's what I find:</div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiqwaO-z5_yMSpg53Ed2u9pCgxjjx_x5bKxOe9eAz9OfGt-5Jo50r2IdoW--WM_fCvTAXN03bNFLCB12lS0nUM38L1_ku6B_ENdez50ht3XyXkgsjwoNjz-Jpaplpz9yAT4X0XlmDOcr9uyJpzTElvelDV8byrLkZ7xHpQ4KryZqAsrbF858A" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="262" data-original-width="399" height="263" src="https://blogger.googleusercontent.com/img/a/AVvXsEiqwaO-z5_yMSpg53Ed2u9pCgxjjx_x5bKxOe9eAz9OfGt-5Jo50r2IdoW--WM_fCvTAXN03bNFLCB12lS0nUM38L1_ku6B_ENdez50ht3XyXkgsjwoNjz-Jpaplpz9yAT4X0XlmDOcr9uyJpzTElvelDV8byrLkZ7xHpQ4KryZqAsrbF858A=w400-h263" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjbdMf24L4KdJxX5YCQjwhlwvJhSn1ROdYh97X_HokmPEwoBS6WIbVtq2w2JLh7TO4wofcHHmcVpF75RFVEWf4B5JPJhZbfQ3ncFd0of7ifH4przR2tHJE_gD-TBDePgi25s3M0zSrwlcO5YzbCe07_39eLad2XfuYqeUmDcy3F_gcY3nbWvA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="390" data-original-width="458" height="340" src="https://blogger.googleusercontent.com/img/a/AVvXsEjbdMf24L4KdJxX5YCQjwhlwvJhSn1ROdYh97X_HokmPEwoBS6WIbVtq2w2JLh7TO4wofcHHmcVpF75RFVEWf4B5JPJhZbfQ3ncFd0of7ifH4przR2tHJE_gD-TBDePgi25s3M0zSrwlcO5YzbCe07_39eLad2XfuYqeUmDcy3F_gcY3nbWvA=w400-h340" width="400" /></a></div></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgWnFbA0Ott2SrlvqynrHCbK-B98BSPawFkz3uWcABSX99Cd9-1ueT42kVwE-7MzLU4LyKqspiro1EgVFTxMOYahfDfTxvZt95PhGLyMB-FVv7PVMN6keUgmrPdx6Iy-iYRhe3kQBefLSjkuVwi8c3626dj9FaI_4LUAYBH3xFG5wKDPdUlKw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="387" data-original-width="409" height="378" src="https://blogger.googleusercontent.com/img/a/AVvXsEgWnFbA0Ott2SrlvqynrHCbK-B98BSPawFkz3uWcABSX99Cd9-1ueT42kVwE-7MzLU4LyKqspiro1EgVFTxMOYahfDfTxvZt95PhGLyMB-FVv7PVMN6keUgmrPdx6Iy-iYRhe3kQBefLSjkuVwi8c3626dj9FaI_4LUAYBH3xFG5wKDPdUlKw=w400-h378" width="400" /></a></div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiJhw7-TKV5vDBggtIPFcEKB79TuXvr6xvnTozxZMm0DEPfk3bUI1_DE64nu6y1E2CECEfS8f9cLDsToG0lgO09WQquIEKHSrBY9ukz4XRYvGYFIRXnc_WV4-pxYxeYy_HQ8gVjTjwq8H4LlQLYm2nKyUCOHuV81Cl4gmliyetksqFanuT_qQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="385" data-original-width="545" height="283" src="https://blogger.googleusercontent.com/img/a/AVvXsEiJhw7-TKV5vDBggtIPFcEKB79TuXvr6xvnTozxZMm0DEPfk3bUI1_DE64nu6y1E2CECEfS8f9cLDsToG0lgO09WQquIEKHSrBY9ukz4XRYvGYFIRXnc_WV4-pxYxeYy_HQ8gVjTjwq8H4LlQLYm2nKyUCOHuV81Cl4gmliyetksqFanuT_qQ=w400-h283" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiuhLf3G8dQ9nmnTSHOdDEh8Nkh7Xu0rW_V-L8j0q7FxewglMsVheEpnp-kNav3CbEs5NVilYl4zg2CDBwIWd5rs_LWsYsOkO6WUXZ4lGKgVrTMprgJHsre7vgTtU8QdTDSaTKnoBSyFq2OvpSam-2VOK2WRld9fJAB6ppUES_A_UwDozyYWg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="385" data-original-width="390" height="395" src="https://blogger.googleusercontent.com/img/a/AVvXsEiuhLf3G8dQ9nmnTSHOdDEh8Nkh7Xu0rW_V-L8j0q7FxewglMsVheEpnp-kNav3CbEs5NVilYl4zg2CDBwIWd5rs_LWsYsOkO6WUXZ4lGKgVrTMprgJHsre7vgTtU8QdTDSaTKnoBSyFq2OvpSam-2VOK2WRld9fJAB6ppUES_A_UwDozyYWg=w400-h395" width="400" /></a></div><br /></div><div class="separator" style="clear: both; text-align: left;">I won't paste the entire decoded contents of my EDID, but you get the idea, and you can try this out on your own monitors. My monitor has two 128-byte data blocks, named <i>Block 0</i> and <i>Block 1</i> in the images above. Block 0 is also referred to as the "base" block, and contains basic information required of all monitors. Block 1 is an extension block and contains optional, more advanced information. Pretty neat!</div></div></div></div></div><p></p><h2 style="text-align: left;">DisplayID</h2><p>While EDID was a rousing success, eventually the industry saw a need to replace EDID with a new standard better suited to describing the capability of new classes of display devices. That new standard is <a href="https://en.wikipedia.org/wiki/DisplayID">DisplayID</a>. DisplayID introduces several new features that better allow its use in a wide range of applications, including PC monitors, consumer television products, embedded displays (think eDP-connected displays), AR/VR headsets, HDR displays, and others.</p><p>DisplayID uses variable-length structures of up to 256 bytes each, which encompass all existing EDID extensions, but which are not backwards compatible to EDID. However, DisplayId is intended to eventually supplant EDID in the industry, and so having both an EDID structure and DisplayId structure in a monitor is supported, and is a popular thing for monitor manufacturers to do.</p><p>Just to give you an idea, one of the required blocks is <i>0x20 Product Identification</i>. It looks like:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgm61HgVkfMMlvFvj-STXNSzzN-Ej_deAdoUER_Qlhwv5jyXLrh5jIjRZOPNf7F8BUv1M2n5zi6XezEsIQ3LM2WXf92n1K4RcF5Y0NwJyv1usIgpj3KjFDyTI1F0EItUxxvxAaRzPt8eBYWs8omE5wdIN3-BNtgNmTRukEv6D2l6JRwKroD7g" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="370" data-original-width="748" height="198" src="https://blogger.googleusercontent.com/img/a/AVvXsEgm61HgVkfMMlvFvj-STXNSzzN-Ej_deAdoUER_Qlhwv5jyXLrh5jIjRZOPNf7F8BUv1M2n5zi6XezEsIQ3LM2WXf92n1K4RcF5Y0NwJyv1usIgpj3KjFDyTI1F0EItUxxvxAaRzPt8eBYWs8omE5wdIN3-BNtgNmTRukEv6D2l6JRwKroD7g=w400-h198" width="400" /></a></div><br />Note that DisplayId continues to run over the E-DDC protocol, just like E-EDID.<p></p><h2 style="text-align: left;">EDID and UEFI</h2><p>Note that there is UEFI support to get EDID data, derived from the UEFI <i>Graphics Output Protocol</i>. §12.9.2.4 - §12.9.2.7 in the UEFI Spec (UEFI v2.10 numbering) contain several EDID-related protocols, for example:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhJufiP1iOPkXE_0YUjfKAQjefM02xFZ8Nh027-AlaMLhUFJC396qLoWp_pUC1-vE3OcGcItUwYsMJMP_Z7FbYzAjA4_9YvF8x17x_WbaAV1GL6QC5WVgIf9Qd6qBaXeV7yvKqN4FmHOfzr6aE6DQ79PqRQrn4AiJsUcbYgebR8niz4JPPNzA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="543" data-original-width="789" height="275" src="https://blogger.googleusercontent.com/img/a/AVvXsEhJufiP1iOPkXE_0YUjfKAQjefM02xFZ8Nh027-AlaMLhUFJC396qLoWp_pUC1-vE3OcGcItUwYsMJMP_Z7FbYzAjA4_9YvF8x17x_WbaAV1GL6QC5WVgIf9Qd6qBaXeV7yvKqN4FmHOfzr6aE6DQ79PqRQrn4AiJsUcbYgebR8niz4JPPNzA=w400-h275" width="400" /></a></div>Please refer to the UEFI specification for more information.<br /><p></p><h2 style="text-align: left;">Conclusion</h2><p>I hope you found this DDC/EDID/DisplayId overview helpful, and I encourage you to leave a comment! Thanks for reading!</p></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-24904794764927273372023-04-04T07:00:00.214-05:002023-04-04T07:00:00.163-05:00Platform Initialization (PI) Spec v1.8<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiT_kUMBeoSv3KOPxcDRoH-lUXOwpstiTcWAWCSobeC_CXycRqppa4x7n6Dke7M2_K-6MJtpY9UqREkbiajBGMEAs2jkKqN_wKDsbqKZmMpppb4ffRD3QW39sCQPOi7S0j5xiimMyaVA-SDUd0A6ELUKM7JrRhlzJozksDI3-XMi_BHzCL5rw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="352" data-original-width="787" height="286" src="https://blogger.googleusercontent.com/img/a/AVvXsEiT_kUMBeoSv3KOPxcDRoH-lUXOwpstiTcWAWCSobeC_CXycRqppa4x7n6Dke7M2_K-6MJtpY9UqREkbiajBGMEAs2jkKqN_wKDsbqKZmMpppb4ffRD3QW39sCQPOi7S0j5xiimMyaVA-SDUd0A6ELUKM7JrRhlzJozksDI3-XMi_BHzCL5rw=w640-h286" width="640" /></a></div><br />The <a href="https://uefi.org/">UEFI Forum</a> released the latest and greatest version of the beloved <i>Platform Initialization (PI) Specification</i>, v1.8. It is notable that this is the first version of the PI spec to be produced using UEFI.org's new document build system. The new build system uses a combination of the <a href="https://docutils.sourceforge.io/rst.html">reStructuredText</a> and <a href="https://www.sphinx-doc.org/">Sphinx</a> technologies, and replaces older proprietary tools like Adobe FrameMaker. The UEFI Spec v2.10 was recently updated with this same new document build system, and you can expect all future specifications to carry on with the new technology. So, if you notice a new "look and feel" to PI v1.8, that's why.<div><br /></div><div>Furthermore, a simple, but much welcomed change, is that the five different volumes that comprise the PI spec are now explicitly called out before each section number. Previously, putting all five volumes in one .PDF meant that each volume's sections were numbered consecutively, like 1,2,3,4,5... 1,2,3,4,5... 1,2,3,4,5..., such that it was tricky to know where one volume stopped and the next began. Now, Roman numerals are used to represent the volume numbers, and are prepended before each section:</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgfWDLCPeL0caL97av21s-cyW_EnMNpfyJ6PhZz45113Fdf3Vv28-SJqehcPptBUboWcaKXx0IKOxMLtwTzXeZZXM1kqkyW2vhwKaG3n39ngBwFzksUV_iEBDs0wBmF4u96UQKyFfB6rGwBpF6IpQScTMLtsL-FG3bSloQaEy_JVwyNetti4Q" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="344" data-original-width="215" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEgfWDLCPeL0caL97av21s-cyW_EnMNpfyJ6PhZz45113Fdf3Vv28-SJqehcPptBUboWcaKXx0IKOxMLtwTzXeZZXM1kqkyW2vhwKaG3n39ngBwFzksUV_iEBDs0wBmF4u96UQKyFfB6rGwBpF6IpQScTMLtsL-FG3bSloQaEy_JVwyNetti4Q=w250-h400" width="250" /></a></div><br /><p>PI v1.8 contains eight changes, summarized below. I hope you find the summary useful!</p><h3 style="text-align: left;"><a href="https://mantis.uefi.org/mantis/view.php?id=2103">2103</a> Adding <span style="font-family: courier;">EFI_DELAYED_DISPATCH_FUNCTION</span> definition and explanation</h3><div><i>PEI Delayed Dispatch </i>was a new feature introduced in PI v1.7. This change adds some missing definition and explanation to this feature.</div><div><br /></div><div><h3 style="text-align: left;"><a href="https://mantis.uefi.org/mantis/view.php?id=2119">2119</a> HOB Update for Memory Ranges Capable of Being Protected by CPU Cryptographic Capabilities</h3></div><div>UEFI Spec v2.7 introduced a new memory attribute <span style="font-family: courier;">EFI_MEMORY_CPU_CRYPTO</span> to the system memory map to designate memory ranges capable of being encrypted by the CPU. Heretofore, there was no way for PEI to notify DXE that a particular memory range was capable of encryption. This change fixes that by adding a new attribute, <span style="font-family: courier;">EFI_RESOURCE_ATTRIBUTE_ENCRYPTED</span>, which can be passed to DXE via a HOB.</div><div><br /></div><div><h3 style="text-align: left;"><a href="https://mantis.uefi.org/mantis/view.php?id=2147">2147</a> <span style="font-family: courier;">EFI_RESOURCE_ATTRIBUTE_SP</span> not defined in Resource Descriptor HOB</h3></div><div>Similar in spirit to #2119 (above). UEFI v2.7 introduced a memory attribute <span style="font-family: courier;">EFI_MEMORY_SP</span> to the system memory map. The "SP" here means "Special Purpose", and is meant to signify a memory range earmarked for specific purposes such as for specific device drivers or applications. Until now, there was no way for PEI to pass on to DXE this attribute. Now, PI has the corresponding memory attribute <span style="font-family: courier;">EFI_RESOURCE_ATTRIBUTE_SPECIAL_PURPOSE</span> for this need.</div><div><br /></div><h3 style="text-align: left;"><a href="https://mantis.uefi.org/mantis/view.php?id=2160">2160</a> MP Services 2 PPI</h3><div><span style="font-family: courier;">PEI_MP_SERVICES_PPI</span> has existed since PI v1.4. This change adds a new function to the protocol named <span style="font-family: courier;">StartupAllCPUs()</span>, and increments the protocol version number to 2, i.e., <span style="font-family: courier;">PEI_MP_SERVICES2_PPI</span>. The <span style="font-family: courier;">StartupAllCPUs()</span> function executes a caller-provided function on all enabled CPUs.</div><div><br /></div><h3 style="text-align: left;"><a href="https://mantis.uefi.org/mantis/view.php?id=2161">2161</a> Introduce unaccepted memory type</h3><div>This change, and its <a href="https://mantis.uefi.org/mantis/view.php?id=2134">associated change to UEFI</a>, introduce the concept of "unaccepted memory". Server-class CPUs from AMD (<a href="https://www.amd.com/system/files/TechDocs/SEV-SNP-strengthening-vm-isolation-with-integrity-protection-and-more.pdf">AMD SEV-SNP</a>) and Intel (<a href="https://software.intel.com/content/www/us/en/develop/articles/intel-trust-domain-extensions.html">Intel TDX</a>) use this concept as a way for a guest virtual machine to accept or reject being allocated to certain memory ranges on the host.</div><div><br /></div><div><h3 style="text-align: left;"><a href="https://mantis.uefi.org/mantis/view.php?id=2340">2340</a> Introduction of <span style="font-family: courier;">EFI_SW_EC_FRAGMENTED_MEMORY_MAP</span> Status Code</h3></div><div>This change introduced a new error code to <a href="http://PiStatusCode.h">PiStatusCode.h</a> in order to catch instances of instances of inconsistent memory maps between S4/resume cycles. The new code to represent such cases is <span style="font-family: courier;">EFI_SW_EC_FRAGMENTED_MEMORY_MAP</span>.</div><div><br /></div><h3 style="text-align: left;"><a href="https://mantis.uefi.org/mantis/view.php?id=2341">2341</a> Introduction of <span style="font-family: courier;">EFI_PERIPHERAL_TPM</span> Peripheral Subclass Definition</h3><div>This change adds a new status code subclass for TPMs. The new subclass allows grouping errors related to TPMs for easier troubleshooting and to avoid TPM status codes conflicting with codes from other peripheral subsystems.</div><div><br /></div><h3 style="text-align: left;">2351 update PI spec revision</h3><div>This is simply a note that the version number of the spec text is updated. You can safely ignore this.</div><p></p></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-90236418159975709382023-03-28T07:00:00.124-05:002023-03-28T07:00:00.170-05:00Introduction to Zephyr
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj7baA7fTJIW7pw88uvr7MHIpol3oIzgiblRUgwueok0y_5qFYVO4-mO8ETwaJEYvuujK6uOW7orGgYcde9RFcalP8sn4tIv5MRDjpXOgOah2LS1sWcDnN5yUV-V410n2MB66MNpQOUqEx4rBNhsHmMcjorVk1Nv5xnMIlRUES1PUpqzuqCsA" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="211" data-original-width="397" height="170" src="https://blogger.googleusercontent.com/img/a/AVvXsEj7baA7fTJIW7pw88uvr7MHIpol3oIzgiblRUgwueok0y_5qFYVO4-mO8ETwaJEYvuujK6uOW7orGgYcde9RFcalP8sn4tIv5MRDjpXOgOah2LS1sWcDnN5yUV-V410n2MB66MNpQOUqEx4rBNhsHmMcjorVk1Nv5xnMIlRUES1PUpqzuqCsA" width="320" /></a></div><br />You may have heard of <a href="https://www.zephyrproject.org/">Zephyr</a>, the open-source <a href="https://en.wikipedia.org/wiki/Real-time_operating_system">RTOS </a>hosted on <a href="https://github.com/zephyrproject-rtos/zephyr">GitHub</a>. In fact, Zephyr claims to be the most popular open-source RTOS, with the highest commit traffic of any of its peers.<div><br /></div><div>Zephyr's history is a bit complex, traversing several different companies and name changes before maturing to its current state. In a nutshell, Zephyr was a product of Wind River. During the time in which Wind River was a subsidiary of <a href="https://intel.com/">Intel</a>, Zephyr was spun out as an independent open-source project and soon thereafter became a hosted project of the <a href="https://www.linuxfoundation.org/">Linux Foundation</a>. This is a simplification, so if you want the detailed historical twists and turns the product has taken, you can read about it <a href="https://en.wikipedia.org/wiki/Zephyr_(operating_system)#History">on Wikipedia</a>.</div><div><br /></div><div>Zephyr is supported by a wealth of partners, including Intel, Google, NXP, Texas Instruments, and others. The technology is found in many different devices, everything from wearables, like hearing aids and smart watches, to IoT wireless devices and embedded applications of all types.</div><div><br /></div><div>Zephyr supports many popular microcontroller instruction-set architectures, for example x86, ARM, ARC, RISC-V, Xtensa, and MIPS. The kernel supports multi-threading, interrupt services, memory allocation, and power management, and can run in as little as 2KB memory. There are several possible scheduling algorithms from which to choose. Hardware is described by <a href="https://www.basicinputoutput.com/2021/10/introduction-to-devicetree.html">DeviceTree</a>. Support for <a href="https://github.com/zephyrproject-rtos/zephyr/tree/main/drivers/sensor">hundreds of sensors</a> is already integrated. Finally, Zephyr makes safety and security a priority:</div><div><ul style="text-align: left;"><li><a href="https://docs.zephyrproject.org/latest/security/secure-coding.html">Secure Coding Practices</a></li><li>CVE Numbering Authority</li><li><a href="https://bestpractices.coreinfrastructure.org/en/projects/74">OpenSSF "Gold" Best Practices</a></li><li>Coding practices based on <a href="https://www.misra.org.uk/">MISRAC:2021</a></li></ul><div><br /></div></div><h1 style="text-align: left;">Intersection with ECs</h1><div>Zephyr is a fully-featured RTOS with many use cases. However, the use case I'd like to focus on here is its role running embedded controllers (ECs). The EC is, and has been for many years, a key component in PC system architecture. The EC's role is typically to handle tasks related to power sequencing, thermal control, keyboard support, and battery management, among other duties.</div><div><br /></div><div>Several industry titans, Intel and Google first among them, envision a future where the PC EC design is standardized around Zephyr, as opposed to either a) a bunch of competing RTOS implementations, or b) a vendor-specific "round robin" scheduler. The benefits of standardizing on Zephyr include:</div><div><ul style="text-align: left;"><li>agnostic to EC vendor</li><ul><li>Zephyr supports all the major EC vendors, like Nuvoton, Microchip, ITE, etc. PC manufacturers can therefore switch between EC vendors while keeping their same source code. Zephyr acts like an abstraction layer.</li></ul><li>modular architecture: only compile in the components you need</li><ul><li>If you need Wi-Fi support, it's there. If not, you don't need to include it. Same for many other modules, for example Bluetooth, USB, and CAN bus.</li></ul></ul><div><br /></div><h2 style="text-align: left;">Zephyr at Google</h2><div>Google has already transitioned their Chromebook designs away from their proprietary EC design to Zephyr. Here are a couple good resources if you want to explore that further:</div><div><ul style="text-align: left;"><li><a href="https://www.youtube.com/watch?v=ni2xUaVaQv8">Keynote: Towards an Industry-Standard EC, Simon Glass, Software Engineer, Google</a></li><li><a href="https://www.youtube.com/watch?v=n1NRV0SjnQE">Using Zephyr for Embedded Controllers - Keith Short, Google</a></li></ul></div><div style="text-align: left;"><br /></div><h2 style="text-align: left;">Zephyr at Intel</h2><div>Intel has started an initiative they're calling <i><a href="https://intel.github.io/ecfw-zephyr/index.html">Zephyr-based Embedded controller firmware</a></i>.</div></div><div><br /></div><div>Let's attempt a build in Ubuntu 22.04. The process is quite involved, especially since the Intel documentation needs some updating. The problem is that the Intel instructions reference the Zephyr <i>Getting Started Guide</i>, but the <i>Getting Started Guide </i>has significantly changed and Intel's instructions have not kept up. For example, the Intel instructions refer to numbered steps in the Zephyr <i>Getting Started Guide</i>, but the <i>Guide </i>has removed all those numbers. Anyway, in the end I did get it to work, more or less. 😀 Here's how:</div><div><br /></div><div><b>Step 1: install some prereqs</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;">sudo apt install --no-install-recommends git cmake ninja-build gperf <span class="se" style="box-sizing: border-box; color: #4070a0; font-weight: bold;">\</span>
ccache dfu-util device-tree-compiler wget <span class="se" style="box-sizing: border-box; color: #4070a0; font-weight: bold;">\</span>
python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file <span class="se" style="box-sizing: border-box; color: #4070a0; font-weight: bold;">\</span>
make gcc gcc-multilib g++-multilib libsdl2-dev</pre></div><div><b><br /></b></div><div><b>Step 2: install west, make sure PATH is set</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;">pip3 install --user -U west
<span class="nb" style="box-sizing: border-box; color: #007020;">echo</span> <span class="s1" style="box-sizing: border-box; color: #4070a0;">'export PATH=~/.local/bin:"$PATH"'</span> >> ~/.bashrc
<span class="nb" style="box-sizing: border-box; color: #007020;">source</span> ~/.bashrc</pre></pre></div><div><b>Step 3: get Zephyr source</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;">west init ~/zephyrproject
<span class="nb" style="box-sizing: border-box; color: #007020;">cd</span> ~/zephyrproject
west update</pre></div><div><b>Step 4: Export a Zephyr CMake package</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><span class="go" style="box-sizing: border-box; color: #333333;">west zephyr-export</span></pre></div><div><b>Step 5: install Python dependencies</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;">pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt</pre></div><div><b>Step 6: download the SDK installer</b></div><div><pre style="box-sizing: border-box; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><span face="SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, Courier, monospace" style="color: #007020;"><span style="font-size: 12px;">cd ~
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.0/zephyr-sdk-0.16.0_linux-x86_64.tar.xz
wget -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.0/sha256.sum | shasum --check --ignore-missing</span></span></pre></div><div><br /></div><div><b>Step 7: install the SDK</b></div><div><pre style="box-sizing: border-box; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><span face="SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, Courier, monospace" style="color: #404040;"><span style="font-size: 12px;">tar xvf zephyr-sdk-0.16.0_linux-x86_64.tar.xz</span></span></pre><pre style="box-sizing: border-box; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><span face="SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, Courier, monospace" style="color: #404040;"><span style="font-size: 12px;">cd zephyr-sdk-0.16.0
./setup.sh</span></span></pre></div><div><b>Step 8: get some SPI tools</b></div><span style="font-size: x-small;"><span style="font-family: courier;">wget https://github.com/MicrochipTech/CPGZephyrDocs/tree/master/MEC152x/SPI_image_gen/spi_cfg.txt</span><br /><span style="font-family: courier;"><br /></span><span style="font-family: courier;">wget https://github.com/MicrochipTech/CPGZephyrDocs/tree/master/MEC152x/SPI_image_gen/everglades_spi_gen_RomE</span></span><br /><span style="font-family: courier; font-size: x-small;"><br /></span><div style="text-align: left;"><span style="font-family: courier; font-size: x-small;">export EVERGLADES_SPI_GEN=~/SPI_image_gen/everglades_spi_gen_RomE</span></div><div><br /></div><div><b>Step 9: get the EC FW framework code</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;">mkdir ~/sandbox
<span class="nb" style="box-sizing: border-box; color: #007020;">cd</span> ~/sandbox
git clone https://github.com/intel/ecfw-zephyr</pre></div><div><b>Step 10: obtain dependencies and reinitialize</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><span class="nb" style="box-sizing: border-box; color: #007020;">cd</span> ecfw-zephyr
west init -l</pre></div><div><b>Step 11: retrieve external dependencies</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;">west update</pre></div><div><b>Step 12: update active path</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><span class="nb" style="box-sizing: border-box; color: #007020;">cd</span> ~/sandbox/zephyr_fork
<span class="nb" style="box-sizing: border-box; color: #007020;">source</span> zephyr-env.sh</pre></pre></div><div><b>Step 13: build</b></div><div><pre style="box-sizing: border-box; color: #404040; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; line-height: 1.4; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 12px;"><span class="nb" style="box-sizing: border-box; color: #007020;">cd</span> ~/sandbox/ecfw-zephyr
<span class="c1" style="box-sizing: border-box; color: #408090; font-style: italic;"># Building for ADL-S (on-board EC)</span>
west build -c -p auto -b mec1501_adl</pre></div><div><br /></div><div>After all that, and some debugging of the build process, I did manage to get a <b>zephyr.bin</b> file:</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjlvNf5cIHcsdCupT-lYpJM5WqDxAKpngn9TMCa6MjA31mWPJicZFwYCN14f0jyoHEuaj5Wp4ddyMPlYHTL6AVTt1WBMkaE36SooiNuviOJGcYua5x_xlC0Ro4sfk0aU1wuSEow8OcWlEgkWMM3Boid1Xe2AVbr4QeqyMMtsyH3JZWUWIVMA/s587/build%20end.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="185" data-original-width="587" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjlvNf5cIHcsdCupT-lYpJM5WqDxAKpngn9TMCa6MjA31mWPJicZFwYCN14f0jyoHEuaj5Wp4ddyMPlYHTL6AVTt1WBMkaE36SooiNuviOJGcYua5x_xlC0Ro4sfk0aU1wuSEow8OcWlEgkWMM3Boid1Xe2AVbr4QeqyMMtsyH3JZWUWIVMA/s16000/build%20end.png" /></a></div><br /><div>The .bin files: (I am missing the ksc.bin file)</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBtegVHRx3vVRYuSZ-Q3P4PtY4Fvo_iJP6fqXpY-UN5sTj-f3u4fdAqHw_CIi9H3Xz4xGgLRm0tfDYMAquQOYwhsYreOL2MZl4Wl_YcCPrGNDUlRM21bDACSVhl-RDdyIrhfi1yqCs3Bu5zugxfNdPrlkhuyJfcawSsGTC_oYRN4N8m549aQ/s915/bin%20files.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="58" data-original-width="915" height="40" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBtegVHRx3vVRYuSZ-Q3P4PtY4Fvo_iJP6fqXpY-UN5sTj-f3u4fdAqHw_CIi9H3Xz4xGgLRm0tfDYMAquQOYwhsYreOL2MZl4Wl_YcCPrGNDUlRM21bDACSVhl-RDdyIrhfi1yqCs3Bu5zugxfNdPrlkhuyJfcawSsGTC_oYRN4N8m549aQ/w640-h40/bin%20files.png" width="640" /></a></div><div><br /></div><h1 style="text-align: left;">More Resources</h1><div>Intel has announced that their <a href="https://intel.github.io/ecfw-zephyr/reference/supported_hw.html">Raptor Lake and Meteor Lake reference boards will have support</a> for Zephyr-based EC FW. So, we'll have to wait and see how plans for Zephyr to standardize ECs ultimately plays itself out. Either way, I hope you'll agree that staying on top of industry developments such as this is important.</div><div><br /></div><div>A good high-level introduction to the Zephyr project can be found: <a href="https://www.youtube.com/watch?v=g4QR0IU5q5Y">Introduction to Zephyr (June 2021)</a>. Not only that, but <a href="https://www.youtube.com/@ZephyrProject/videos">Zephyr's YouTube channel</a> has over 100 videos on various aspects of the project. Also: <a href="https://docs.zephyrproject.org/latest/index.html">Zephyr Project Documentation</a>.</div><div><br /></div><div>Follow the Zephyr project on Twitter: <a href="https://twitter.com/ZephyrIoT">https://twitter.com/ZephyrIoT</a>. Zephyr also has a <a href="https://discord.com/invite/Ck7jw53nU2">Discord you can join</a>.</div><div><br /></div><div>My intent here was to raise awareness of the initiative to migrate ECs to Zephyr, and provide some resources where you can deepen your knowledge. I hope you found this worthwhile!</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-44494336266156166912022-09-27T07:00:00.122-05:002022-09-27T07:00:00.157-05:00Running Zork in the UEFI Shell<div>The first piece of software I ever purchased was: <a href="https://en.wikipedia.org/wiki/Zork">Zork I</a>. I bought it at <a href="https://en.wikipedia.org/wiki/Kmart">K-Mart</a>, in the early 1980s, for my Commodore 64. So, this game has always had, and still has today, a special place in my heart. I still have it today, and it still works fine. I have memorized the solutions to the twenty treasures, and enjoy racing myself to see how quickly I can find them all and solve the game—this comes in handy when having to suffer through boring meetings during the workday. 😀</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj_N1wlD1dF_n_mvMtLYxxo2-ugJJAUdU9rgPFvVFwwp1UUksI5Vxwti1gWS-MAUGmmS6cyFYt5WYD7lcT0UL_DKuZZLvP9sE9XDw2HtB299vB-M8Gujne-vpqH9eyM5PZQdA2wvnl9EVBWCu_eKmdhzl-LnwML1gKpEX8nWQntpehzi06Z6g" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="395" data-original-width="652" height="194" src="https://blogger.googleusercontent.com/img/a/AVvXsEj_N1wlD1dF_n_mvMtLYxxo2-ugJJAUdU9rgPFvVFwwp1UUksI5Vxwti1gWS-MAUGmmS6cyFYt5WYD7lcT0UL_DKuZZLvP9sE9XDw2HtB299vB-M8Gujne-vpqH9eyM5PZQdA2wvnl9EVBWCu_eKmdhzl-LnwML1gKpEX8nWQntpehzi06Z6g=w320-h194" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgKgJ91za62Lnzs9enRmi9DSKZfF_2hy-h80hnaTLm2TtXz2IWwhnk6fL3-9LHqFSoloiTjTjGbl7C_l-IaixnlvdZSPr88a48VqZYmaHvXYuVk4izW-Syvf1b9f3yVUaAttenSf8qpZ1RXkMTqRw8rLOQNXFeYWBeK1_phtx90xAEB2FBxnw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="605" data-original-width="467" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEgKgJ91za62Lnzs9enRmi9DSKZfF_2hy-h80hnaTLm2TtXz2IWwhnk6fL3-9LHqFSoloiTjTjGbl7C_l-IaixnlvdZSPr88a48VqZYmaHvXYuVk4izW-Syvf1b9f3yVUaAttenSf8qpZ1RXkMTqRw8rLOQNXFeYWBeK1_phtx90xAEB2FBxnw=w247-h320" width="247" /></a></div><br />Zork was a product of <a href="https://en.wikipedia.org/wiki/Infocom">Infocom</a>, the originator of the "text-based adventure" game, a.k.a. "interactive fiction". Zork was written in a domain-specific language called the Zork Implementation Language (ZIL), which got compiled to a binary output format called z-code, which then ran in a virtual machine called a <a href="https://en.wikipedia.org/wiki/Z-machine">Z-machine</a>. The Z-machine interpreted Zork's z-code, and, thanks to this abstracted architecture, Infocom was able to port Zork and the rest of their text-based adventure games to all the various 8-bit platforms of the 1980s by simply porting the Z-machine interpreter. The ZIL-based game source code did not have to be modified for every system. Anyway, there are whole <a href="https://www.youtube.com/watch?v=LRhbcDzbGSU">documentaries</a> on <a href="https://www.youtube.com/watch?v=OXNLWy7rwH4">Infocom</a> and <a href="https://www.youtube.com/watch?v=ToEllOW2r1Y">Zork</a>, and that fascinating story is beyond the scope of this article.</div><div><br /></div><div>What is the scope of this article you may ask? Well, in much the same way that people try to get <a href="https://en.wikipedia.org/wiki/Doom_(1993_video_game)">DOOM</a> to run on <a href="https://www.popularmechanics.com/science/a33957256/this-programmer-figured-out-how-to-play-doom-on-a-pregnancy-test/">anything</a>, there is also a race to make Zork run on anything. So, in support of that noble and worthwhile goal, I humbly present to you this post which explains how to do just that—run Zork from BIOS!</div><div><br /></div><h2 style="text-align: left;">Getting Started</h2><div>We need two things to run Zork:</div><div><ol style="text-align: left;"><li>a Z-machine implementation, to interpret the z-code</li><li>the compiled z-code for Zork</li></ol><h4 style="text-align: left;">Frotz</h4></div><div><a href="https://davidgriffith.gitlab.io/frotz/">Frotz</a> is a portable, open source, Z-Machine interpreter that has been under development for over 25 years. Thankfully, Github user <a href="https://github.com/go2tom42">go2tom42</a> has ported Frotz to the UEFI Shell! That project can be found here:</div><div><a href="https://github.com/go2tom42/Frotz-UEFI">https://github.com/go2tom42/Frotz-UEFI</a></div><div><br /></div><div>To build Frotz.efi, I followed the instructions on the Github site, and they worked without trouble:</div><div>1. <span style="font-family: courier;">sudo wget -qO - https://raw.githubusercontent.com/go2tom42/Frotz-UEFI/v2.0.0-FROTZ-UEFI-V2.54-on-Ubuntu-22.04-LTS/installme.sh | bash</span></div><div>2. found the binary at: <span style="font-family: courier;">edk2/Build/AppPkg/DEBUG_GCC5/X64/AppPkg/Applications/frotz/Frotz/OUTPUT/Frotz.efi</span></div><div><br /></div><div>(I did this running Ubuntu 22.04)</div><div><br /></div><div>I put Frotz.efi on a drive containing the UEFI shell.</div><div><br /></div><h4 style="text-align: left;">Zork z-code</h4><div>ZIL/z-code files, representing text-based adventure games, can be found all over the Internet. I recommend the best place to be the <a href="https://ifdb.org/">Interactive Fiction Database</a>. Note that while Frotz can run any z-code file, we're focusing here on Zork, so here is the direct link:</div><div><i>Zork I page on the IFD</i>: <a href="https://ifdb.org/viewgame?id=0dbnusxunq7fw5ro">https://ifdb.org/viewgame?id=0dbnusxunq7fw5ro</a></div><div><i>Zork I z-code file direct link</i>: <a href="https://eblong.com/infocom/gamefiles/zork1-r119-s880429.z3">https://eblong.com/infocom/gamefiles/zork1-r119-s880429.z3</a></div><div><br /></div><h2 style="text-align: left;">Conclusion</h2><div>So, having put the Frotz.efi and the zork1-r119-s880429.z3 z-code file on the same UEFI Shell image, I booted it and got:</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgzs-R-9YH-mTpaaC7MIvlIgeLVj45wQNZBtsujRsvRR9SeNfAtggqbonz77JQpWZKHIkIoMLNeJOKSzfTqUwDkeqCShW5S8P1k4H1nwBzEuwjhfBDoYTeUdFc70i94kqpaRg4bDQHyQ2uMsDMUsn3RT7JJyJMTjKixzvBYUnzL7qUjR6EGmg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="600" data-original-width="800" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEgzs-R-9YH-mTpaaC7MIvlIgeLVj45wQNZBtsujRsvRR9SeNfAtggqbonz77JQpWZKHIkIoMLNeJOKSzfTqUwDkeqCShW5S8P1k4H1nwBzEuwjhfBDoYTeUdFc70i94kqpaRg4bDQHyQ2uMsDMUsn3RT7JJyJMTjKixzvBYUnzL7qUjR6EGmg=w640-h480" width="640" /></a></div><br />There you have it! Thanks to <a href="https://github.com/go2tom42">go2tom42</a> for making Frotz run in the UEFI shell, and of course thanks to Tim Anderson, Marc Blank, Bruce Daniels, and Dave Lebling at Infocom for creating the fantastic Zork game! Have fun playing Zork!</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>
<!--Global site tag (gtag.js) - Google Analytics-->
<script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-27581650-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-27581650-2');
</script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-83649496556731173712022-06-28T07:00:00.190-05:002022-06-28T08:24:32.700-05:00SMBIOS v3.6.0 Now Released<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj76_GufnASnxffm2UnQlGoRl5-eDu5ty8HM7ef9Cpvx2vREwydverQLPhi0Fj8UBSERkxITe0mn8SixlnDA2JvW_yZ10Ea9d_VBFjbAGOwQ7mPI7t75oVwSMvSRU_wO07eh_VrlJYcKvJTDT2bn7uDjqTn62QEJKlg2aXRGjBRbBMtBL97Fw" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="314" data-original-width="487" height="206" src="https://blogger.googleusercontent.com/img/a/AVvXsEj76_GufnASnxffm2UnQlGoRl5-eDu5ty8HM7ef9Cpvx2vREwydverQLPhi0Fj8UBSERkxITe0mn8SixlnDA2JvW_yZ10Ea9d_VBFjbAGOwQ7mPI7t75oVwSMvSRU_wO07eh_VrlJYcKvJTDT2bn7uDjqTn62QEJKlg2aXRGjBRbBMtBL97Fw" width="320" /></a></div><br />On June 21, 2022, the <a href="https://www.dmtf.org/">DMTF</a> released <a href="https://www.dmtf.org/standards/smbios">SMBIOS </a>Spec version 3.6.0.<div><br /></div><div>The new SMBIOS Spec is available for download here:</div><div><a href="https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.6.0.pdf">https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.6.0.pdf</a></div><div><br /></div><h2 style="text-align: left;">Brief Background</h2><div>Recall that the SMBIOS specification defines data structures, and associated access methods, that can be used by the BIOS to publish system management information for consumption by other software, most notably the operating system. This eliminates the need for the operating system to probe hardware directly to discover what devices are present in the computer. The SMBIOS specification is produced by the Distributed Management Task Force (DMTF) and has been the standard management information format since 1995.</div><div><br /></div><h2 style="text-align: left;">New in v3.6.0</h2><div>Here's a brief summary of the change requests (CR) that went into v3.6.0:</div><div><ul style="text-align: left;"><li>Processor Information (Type 4):</li><ul><li>SMBIOSCR00214: Added new processor sockets</li><li>SMBIOSCR00215: Added processor family ID for ARMv9</li><li>SMBIOSCR00218: Added new processor socket types</li><li>SMBIOSCR00219: Added “thread enabled” field</li></ul><li>Memory Device (Type 17):</li><ul><li>SMBIOSCR00220: Added HBM3</li></ul><li>Various:</li><ul><li>SMBIOSCR00217: Added LoongArch processor architecture</li></ul></ul>Following are the changes in more detail:</div><div><br /></div><h3 style="text-align: left;">SMBIOSCR00214: Added new processor sockets</h3><div>This CR added three new socket types to the <i>Type 4 Processor Information </i>table to represent CPU products made by <a href="https://www.intel.com/">Intel</a>. Specifically, the <i>Processor Information — Processor Upgrade </i>field was updated.</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg98YO7R20Flqernt6mvavpSK_HzzBXwFdyi3dR4Izgtg0gRZfSQzgTA5YdeY2-olHy2J_qRPQ4rRmNB9xOjcwNUwO_l1vqyuwMzJrA2m5AgZFLsPrJFHbTZY7VMbjWcPGK6a3PN0NucBy8OUdwm2qdT-lBQBZBfhVqVRwusS0hEL7-NClJ9w" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="405" data-original-width="388" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEg98YO7R20Flqernt6mvavpSK_HzzBXwFdyi3dR4Izgtg0gRZfSQzgTA5YdeY2-olHy2J_qRPQ4rRmNB9xOjcwNUwO_l1vqyuwMzJrA2m5AgZFLsPrJFHbTZY7VMbjWcPGK6a3PN0NucBy8OUdwm2qdT-lBQBZBfhVqVRwusS0hEL7-NClJ9w=w307-h320" width="307" /></a></div></div><div class="separator" style="clear: both; text-align: center;"><br /></div><h3 style="text-align: left;">SMBIOSCR00215: Added processor family ID for ARMv9</h3><div>ARM has a new processor family called ARMv9. This CR added ARMv9 to the <i>Type 4 – Processor Information</i> table, in the <i>Processor Family</i> field:</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgGsiMtW0EMFesAE8xwgBEf60GiqEbFUtrJ5Q87Zi-FuEnBJ2OziMGxgoXHnzGgFj3W1u3WpPzFcMKWE_SGiXrutbEUY2h9NKNQAOA4JuQQIGHcJDK_Wvfu6mkjiUELOMXC3OJ0_H1uaLK8GAzWQCwGe4lV2cBYW8aSJkVtSOwdBvCIBk3_5Q" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="379" data-original-width="1071" height="226" src="https://blogger.googleusercontent.com/img/a/AVvXsEgGsiMtW0EMFesAE8xwgBEf60GiqEbFUtrJ5Q87Zi-FuEnBJ2OziMGxgoXHnzGgFj3W1u3WpPzFcMKWE_SGiXrutbEUY2h9NKNQAOA4JuQQIGHcJDK_Wvfu6mkjiUELOMXC3OJ0_H1uaLK8GAzWQCwGe4lV2cBYW8aSJkVtSOwdBvCIBk3_5Q=w640-h226" width="640" /></a></div></div><div class="separator" style="clear: both; text-align: center;"><br /></div><h3 style="text-align: left;">SMBIOSCR00218: Added new processor socket types</h3><div>This CR added two new socket types to the <i>Type 4 Processor Information </i>table to represent CPU products made by Alibaba Inc. Specifically, the <i>Processor Information — Processor Upgrade </i>field was updated.</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjsKaHrhJH1lsZeEg-yeDSPP_MsmFok-h512JwZZ5IJA_lTnBychkqfT3xdNHhlzc9czgHXBcvVlMfLFkI5SHuLdHBZ4WVZZdZDZ_WAvOEvdHhF7X2xUYkAefIs_FDFUtlXAHqC4NJDynDHNeCqw6ZmJzPIv1l5oLZbf0jU6SHOeBTbTwZNuw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="313" data-original-width="388" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEjsKaHrhJH1lsZeEg-yeDSPP_MsmFok-h512JwZZ5IJA_lTnBychkqfT3xdNHhlzc9czgHXBcvVlMfLFkI5SHuLdHBZ4WVZZdZDZ_WAvOEvdHhF7X2xUYkAefIs_FDFUtlXAHqC4NJDynDHNeCqw6ZmJzPIv1l5oLZbf0jU6SHOeBTbTwZNuw" width="298" /></a></div></div><div class="separator" style="clear: both; text-align: center;"><br /></div><h3 style="text-align: left;">SMBIOSCR00219: Added “thread enabled” field</h3><div>This CR was requested by <a href="https://www.intel.com/">Intel</a>, and its purpose is to add a new field, "Thread Enabled", to distinguish between number of threads supported by the CPU hardware versus number of threads the BIOS has enabled. The Type 4 table has long had fields to represent the number of CPU threads: <i>Thread Count </i>and <i>Thread Count 2</i>. However, there is ambiguity regarding whether those are meant to represent the threads supported in the CPU hardware? Or how many threads BIOS has enabled, assuming the BIOS gives the user the ability to disable some number of threads. Adding <i>Thread Enabled</i> to represent the number of threads enabled by BIOS makes the distinction clear.</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhobKMXYIk9rbWZhzIj4m-RVsUNXKZdfdrMO82M5YcXWcccxcAGYtNQN7LiFNinCeTH7VF_h-GGqJhCql6pTHx4zSi70U8LVtI2uUaPDH78PJctxsCLv8K9YbCoo2ibCvSHfqOIFeZxAMphr3nrU3_AoywB-5qE6OjuqN-F0zJ0mjqEz3Yt8w" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="216" data-original-width="1048" height="133" src="https://blogger.googleusercontent.com/img/a/AVvXsEhobKMXYIk9rbWZhzIj4m-RVsUNXKZdfdrMO82M5YcXWcccxcAGYtNQN7LiFNinCeTH7VF_h-GGqJhCql6pTHx4zSi70U8LVtI2uUaPDH78PJctxsCLv8K9YbCoo2ibCvSHfqOIFeZxAMphr3nrU3_AoywB-5qE6OjuqN-F0zJ0mjqEz3Yt8w=w640-h133" width="640" /></a></div></div><div class="separator" style="clear: both; text-align: center;"><br /></div><h3 style="text-align: left;">SMBIOSCR00220: Added HBM3</h3><div>This CR was requested by <a href="https://www.amd.com/">AMD </a>with the goal of adding the <i>High Bandwidth Memory Generation 3</i> (<a href="https://www.nextplatform.com/2021/07/21/what-faster-and-smarter-hbm-memory-means-for-systems/">HBM3</a>) memory type to the Memory Device (Type 17) table.</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgv9SkTLFr4MVi01o-rXGDiZcf0UfNH0NVnr4d0sm67s4Y0CBEsAuFzYHGmJjq-7GUHf1zbj2OIFXbe9xFnc63hA6EXt2EssH3k47e_Pn9XJMPUsCMpP9A325zaDRlnDNJHIo3ZTEFl2RD9lY7rLvTO99h1K5UX6SdYYyJ57N_ARboFKWRAbQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="293" data-original-width="704" height="166" src="https://blogger.googleusercontent.com/img/a/AVvXsEgv9SkTLFr4MVi01o-rXGDiZcf0UfNH0NVnr4d0sm67s4Y0CBEsAuFzYHGmJjq-7GUHf1zbj2OIFXbe9xFnc63hA6EXt2EssH3k47e_Pn9XJMPUsCMpP9A325zaDRlnDNJHIo3ZTEFl2RD9lY7rLvTO99h1K5UX6SdYYyJ57N_ARboFKWRAbQ=w400-h166" width="400" /></a></div></div><div class="separator" style="clear: both; text-align: center;"><br /></div><h3 style="text-align: left;">SMBIOSCR00217: Added LoongArch processor architecture</h3><div><a href="https://loongson.github.io/LoongArch-Documentation/README-EN.html">LoongArch </a>is a new processor Instruction Set Architecture (ISA) developed by the <a href="http://www.loongson.cn/">Loongson Technology</a> company. LoongArch is a <a href="https://en.wikipedia.org/wiki/Reduced_instruction_set_computer">RISC</a>-style ISA descended from <a href="https://en.wikipedia.org/wiki/MIPS_architecture">MIPS</a>, and shares some similarity with <a href="https://en.wikipedia.org/wiki/RISC-V">RISC-V</a>.</div><div><br /></div><div>LoongArch changes were made throughout the specification in those tables wherever CPU information is described.</div>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-27581650-2');
</script>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-12904787.post-48111202030924973482022-04-19T07:24:00.008-05:002022-04-19T07:24:00.154-05:00OsIndications, OsIndicationsSupportedIn my last article, I discussed an old, but still active, mechanism for Windows and BIOS to communicate with each other regarding boot configuration: the <a href="https://www.basicinputoutput.com/2022/04/introduction-to-simple-boot-flag.html">Simple Boot Flag</a>.<div><br /></div><div>There is, however, another, more modern and industry-standard mechanism for OS to BIOS boot configuration communication, and that is the subject of this article: the <span style="font-family: courier;">OsIndications</span>—<span style="font-family: courier;">OsIndicationsSupported </span>variable pair.</div><div><br /></div><h2 style="text-align: left;">Summary</h2><div>This mechanism is defined in the UEFI Specification. BIOS and the OS exchange boot configuration parameters through these two UINT64 variables: <span style="font-family: courier;">OsIndications </span>and <span style="font-family: courier;">OsIndicationsSupported</span>. The UEFI Specification considers these two variables to have an architecturally-defined meaning, and so are defined in the <i>§3.3 Globally Defined Variables</i> section of the specification, part of the <span style="font-family: courier;">EFI_GLOBAL_VARIABLE</span> namespace.</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiyyNaSBA1Q3HqJCH3NLi4GHlj03zZNnyC_Ii22yP2QpvTa8jf4Qt2v23HxgpT0JM3-lo5rltd5sEl8fYqzOpquzz_gIDgfSELkEsik5qCUOHVhxXpULYN8UR_71rePQRvilXYN3zuVhuHlaoYEDRGxKjAo_B5-lV7ta_wUH2nNobkVT0WXdg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="87" data-original-width="719" height="78" src="https://blogger.googleusercontent.com/img/a/AVvXsEiyyNaSBA1Q3HqJCH3NLi4GHlj03zZNnyC_Ii22yP2QpvTa8jf4Qt2v23HxgpT0JM3-lo5rltd5sEl8fYqzOpquzz_gIDgfSELkEsik5qCUOHVhxXpULYN8UR_71rePQRvilXYN3zuVhuHlaoYEDRGxKjAo_B5-lV7ta_wUH2nNobkVT0WXdg=w640-h78" width="640" /></a></div><br />The variable attributes (middle column) denote that these variables are available both in the pre-boot/boot services (BS) and run-time (RT) phases. Furthermore, <span style="font-family: courier;">OsIndications </span>is non-volatile (NV) so it persists across power-off cycles.</div><div><br /></div><h2 style="text-align: left;">Details</h2><div>The central location for documentation on <span style="font-family: courier;">OsIndications </span>is §8.5.4 of the UEFI Specification.</div><div><ul style="text-align: left;"><li>The <span style="font-family: courier;">OsIndications </span>variable returns a UINT64 bitmask <b>owned by the OS</b> and is used to indicate which features the OS wants firmware to enable or which actions the OS wants the firmware to take.</li><li>The <span style="font-family: courier;">OsIndicationsSupported </span>variable returns a UINT64 bitmask <b>owned by the firmware</b> and indicates which of the OS indication features and actions that the firmware supports. This variable is recreated by firmware every boot, and cannot be modified by the OS.</li></ul></div><div>In the EDK2 reference implementation, these variables are defined in GlobalVariable.h:</div><div><!--StartFragment-->
<div style="background-color: #1e1e1e; color: #abb2bf; font-family: Consolas; font-style: normal; font-weight: normal;">
<pre><u><span style="font-size: x-small;">edk2\MdePkg\Include\Guid\GlobalVariable.h</span></u></pre><pre style="text-decoration-line: none;"><div style="font-family: Consolas;"><pre><span style="font-size: x-small;"><span style="color: #717a8a; font-style: italic;">///</span>
<span style="color: #717a8a; font-style: italic;">/// Allows the firmware to indicate supported features and actions to the OS.</span>
<span style="color: #717a8a; font-style: italic;">/// Its attribute is BS+RT.</span>
<span style="color: #717a8a; font-style: italic;">///</span>
<span style="color: #61afef;">#define</span> EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME L<span style="color: #98c379;">"OsIndicationsSupported"</span>
<span style="color: #717a8a; font-style: italic;">///</span>
<span style="color: #717a8a; font-style: italic;">/// Allows the OS to request the firmware to enable certain features and to take certain actions.</span>
<span style="color: #717a8a; font-style: italic;">/// Its attribute is NV+BS+RT.</span>
<span style="color: #717a8a; font-style: italic;">///</span>
<span style="color: #61afef;">#define</span> EFI_OS_INDICATIONS_VARIABLE_NAME L<span style="color: #98c379;">"OsIndications"</span></span></pre></div></pre></div><div><br /></div>What are the "actions" that the OS might want BIOS to take? These are best described by listing the #defines from the EDK2. Both of the variables are bitfields and share a common definition, defined in UefiSpec.h:</div><div><br /></div><div><span style="font-size: x-small;"><!--StartFragment-->
</span><div style="background-color: #1e1e1e;"><pre><div style="color: #abb2bf; font-family: Consolas;"><pre><u><span style="font-size: x-small;">edk2\MdePkg\Include\Uefi\UefiSpec.h</span></u></pre></div></pre><pre><span style="font-size: x-small;"><span style="color: #717a8a; font-family: Consolas; font-style: italic;">//</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #717a8a; font-family: Consolas; font-style: italic;">// Firmware should stop at a firmware user interface on next boot</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #717a8a; font-family: Consolas; font-style: italic;">//</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #61afef; font-family: Consolas;">#define</span><span style="color: #abb2bf; font-family: Consolas;"><span> EFI_OS_INDICATIONS_BOOT_TO_FW_UI </span></span><span style="color: #d19a56; font-family: Consolas;">0x0000000000000001</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #61afef; font-family: Consolas;">#define</span><span style="color: #abb2bf; font-family: Consolas;"><span> EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION </span></span><span style="color: #d19a56; font-family: Consolas;">0x0000000000000002</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #61afef; font-family: Consolas;">#define</span><span style="color: #abb2bf; font-family: Consolas;"><span> EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED </span></span><span style="color: #d19a56; font-family: Consolas;">0x0000000000000004</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #61afef; font-family: Consolas;">#define</span><span style="color: #abb2bf; font-family: Consolas;"><span> EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED </span></span><span style="color: #d19a56; font-family: Consolas;">0x0000000000000008</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #61afef; font-family: Consolas;">#define</span><span style="color: #abb2bf; font-family: Consolas;"><span> EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED </span></span><span style="color: #d19a56; font-family: Consolas;">0x0000000000000010</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #61afef; font-family: Consolas;">#define</span><span style="color: #abb2bf; font-family: Consolas;"><span> EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY </span></span><span style="color: #d19a56; font-family: Consolas;">0x0000000000000040</span><span style="color: #abb2bf; font-family: Consolas;"><span>
</span></span><span style="color: #61afef; font-family: Consolas;">#define</span><span style="color: #abb2bf; font-family: Consolas;"><span> EFI_OS_INDICATIONS_JSON_CONFIG_DATA_REFRESH </span></span><span style="color: #d19a56; font-family: Consolas;">0x0000000000000080</span></span></pre></div></div><div style="text-align: left;"><br /></div><div style="text-align: left;">I won't waste space by cutting and pasting the entire §8.5.4 from the specification, but here's an example of how the <span style="font-family: courier;">EFI_OS_INDICATIONS_BOOT_TO_FW_UI </span>bit is defined:</div><div style="text-align: left;"><blockquote>The <span style="font-family: courier;">EFI_OS_INDICATIONS_BOOT_TO_FW_UI </span>bit can be set in the <span style="font-family: courier;">OsIndicationsSupported </span>variable by the firmware, if the firmware supports OS requests to stop at a firmware user interface. The <span style="font-family: courier;">EFI_OS_INDICATIONS_BOOT_TO_FW_UI </span>bit can be set by the OS in the <span style="font-family: courier;">OsIndications </span>variable, if the OS desires for the firmware to stop at a firmware user interface on the next boot. Once the firmware consumes this bit in the <span style="font-family: courier;">OsIndications </span>variable and stops at the firmware user interface, the firmware should clear the bit from the <span style="font-family: courier;">OsIndications </span>variable in order to acknowledge to the OS that the information was consumed and, more importantly, to prevent the firmware user interface from showing again on subsequent boots.</blockquote></div><div style="text-align: left;">For definition of the rest of the bits, please see §8.5.4 in the UEFI Specification.</div><div style="text-align: left;"><br /></div><h2 style="text-align: left;">Example</h2><div style="text-align: left;">Here is a quick example of how the EDK2 uses <span style="font-family: courier;">OsIndications </span>in practice, specifically, how the UEFI Shell function <span style="font-family: courier;">ShellCommandRunReset()</span> supports the "-fwui" parameter so the user can request that the next boot enter the BIOS setup.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><!--StartFragment-->
<div style="background-color: #1e1e1e; color: #abb2bf; font-family: Consolas;">
<pre><u><span style="font-size: x-small;">edk2\ShellPkg\Library\UefiShellLevel2CommandsLib\Reset.c</span></u></pre><pre><span style="font-size: x-small;">...</span></pre><pre><div style="font-family: Consolas;"><pre><span style="font-size: x-small;"><span style="color: #61afef;">if</span> (<span style="color: #c678dd;">ShellCommandLineGetFlag</span> (Package, L<span style="color: #98c379;">"-fwui"</span>)) <span style="color: #a2a9b5;">{</span>
DataSize <span style="color: #a2a9b5;">=</span> <span style="color: #61afef;">sizeof</span> (OsIndications)<span style="color: #a2a9b5;">;</span>
Status <span style="color: #a2a9b5;">=</span> gRT<span style="color: #a2a9b5;">-></span><span style="color: #c678dd;">GetVariable</span> (
EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME, <span style="color: #a2a9b5;">&</span>gEfiGlobalVariableGuid,
<span style="color: #a2a9b5;">&</span>Attr, <span style="color: #a2a9b5;">&</span>DataSize, <span style="color: #a2a9b5;">&</span>OsIndications
)<span style="color: #a2a9b5;">;</span>
<span style="color: #61afef;">if</span> (<span style="color: #a2a9b5;">!</span><span style="color: #c678dd;">EFI_ERROR</span> (Status)) <span style="color: #a2a9b5;">{</span>
<span style="color: #61afef;">if</span> ((OsIndications <span style="color: #a2a9b5;">&</span> EFI_OS_INDICATIONS_BOOT_TO_FW_UI) <span style="color: #a2a9b5;">!=</span> <span style="color: #d19a56;">0</span>) <span style="color: #a2a9b5;">{</span>
DataSize <span style="color: #a2a9b5;">=</span> <span style="color: #61afef;">sizeof</span> (OsIndications)<span style="color: #a2a9b5;">;</span>
Status <span style="color: #a2a9b5;">=</span> gRT<span style="color: #a2a9b5;">-></span><span style="color: #c678dd;">GetVariable</span> (
EFI_OS_INDICATIONS_VARIABLE_NAME, <span style="color: #a2a9b5;">&</span>gEfiGlobalVariableGuid,
<span style="color: #a2a9b5;">&</span>Attr, <span style="color: #a2a9b5;">&</span>DataSize, <span style="color: #a2a9b5;">&</span>OsIndications
)<span style="color: #a2a9b5;">;</span>
<span style="color: #61afef;">if</span> (<span style="color: #a2a9b5;">!</span><span style="color: #c678dd;">EFI_ERROR</span> (Status)) <span style="color: #a2a9b5;">{</span>
OsIndications <span style="color: #a2a9b5;">|=</span> EFI_OS_INDICATIONS_BOOT_TO_FW_UI<span style="color: #a2a9b5;">;</span>
<span style="color: #a2a9b5;">}</span> <span style="color: #61afef;">else</span> <span style="color: #a2a9b5;">{</span>
OsIndications <span style="color: #a2a9b5;">=</span> EFI_OS_INDICATIONS_BOOT_TO_FW_UI<span style="color: #a2a9b5;">;</span>
<span style="color: #a2a9b5;">}</span>
Status <span style="color: #a2a9b5;">=</span> gRT<span style="color: #a2a9b5;">-></span><span style="color: #c678dd;">SetVariable</span> (
EFI_OS_INDICATIONS_VARIABLE_NAME, <span style="color: #a2a9b5;">&</span>gEfiGlobalVariableGuid,
EFI_VARIABLE_NON_VOLATILE <span style="color: #a2a9b5;">|</span> EFI_VARIABLE_BOOTSERVICE_ACCESS <span style="color: #a2a9b5;">|</span> EFI_VARIABLE_RUNTIME_ACCESS,
<span style="color: #61afef;">sizeof</span> (OsIndications), <span style="color: #a2a9b5;">&</span>OsIndications
)<span style="color: #a2a9b5;">;</span>
<span style="color: #a2a9b5;">}</span>
<span style="color: #a2a9b5;">}</span>
<span style="color: #61afef;">if</span> (<span style="color: #c678dd;">EFI_ERROR</span> (Status)) <span style="color: #a2a9b5;">{</span>
ShellStatus <span style="color: #a2a9b5;">=</span> SHELL_UNSUPPORTED<span style="color: #a2a9b5;">;</span>
<span style="color: #61afef;">goto</span> Error<span style="color: #a2a9b5;">;</span>
<span style="color: #a2a9b5;">}</span>
<span style="color: #a2a9b5;">}</span></span></pre></div></pre></div></div><div style="text-align: left;">What the code is doing is:</div><div style="text-align: left;"><ol style="text-align: left;"><li>check to see if user passed the "-fwui" parameter</li><li>get <span style="font-family: courier;">OsIndicationsSupport </span>variable</li><li>if <span style="font-family: courier;">EFI_OS_INDICATIONS_BOOT_TO_FW_UI</span> is set (i.e., BIOS supports the Setup feature), then get <span style="font-family: courier;">OsIndications</span></li><li>set the <span style="font-family: courier;">EFI_OS_INDICATIONS_BOOT_TO_FW_UI </span>bit in <span style="font-family: courier;">OsIndications</span></li></ol></div><div style="text-align: left;">Now, the next boot will be to the BIOS Setup UI.</div><div style="text-align: left;"><br /></div><h2 style="text-align: left;">Conclusion</h2><div style="text-align: left;">Note that unlike the Simple Boot Flag, <span style="font-family: courier;">OsIndications </span>is industry-standard, supported by both Windows and Linux. Moreover, it is not x86-specific, but is supported by ARM's EBBR specification. See more about the EBBR in <a href="https://www.basicinputoutput.com/2021/08/arms-systemready-specifications.html">ARM's SystemReady Specifications</a>. For example:</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEge2mXJ4pgFXlIPDwaJd7Xcfb6iGG4IvKkKutjvu2SE55rI4KLtaboXdBtss_OaGaH37yYV0GBNNHghh__qrXBniAgxzfrG_Pg68GRN4E_fJTy5kw590eXrbYeSro7HzlE1AOMvCEBrTFxV9PXvB4S1zgPXXaZqitgqv0mCTO7FaPT0r792RA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="259" data-original-width="725" height="229" src="https://blogger.googleusercontent.com/img/a/AVvXsEge2mXJ4pgFXlIPDwaJd7Xcfb6iGG4IvKkKutjvu2SE55rI4KLtaboXdBtss_OaGaH37yYV0GBNNHghh__qrXBniAgxzfrG_Pg68GRN4E_fJTy5kw590eXrbYeSro7HzlE1AOMvCEBrTFxV9PXvB4S1zgPXXaZqitgqv0mCTO7FaPT0r792RA=w640-h229" width="640" /></a></div><br />I hope this article has brought to light the workings of the <span style="font-family: courier;">OsIndications—OsIndicationsSupported</span> variable pair, and helps you leverage this technique in your work.</div><script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-27581650-2');
</script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-64775957996966040442022-04-06T12:14:00.004-05:002022-04-06T12:15:26.782-05:00Introduction to the Simple Boot Flag<div style="text-align: left;">The <i>Simple Boot Flag</i>, it turns out, is a bit of a mystery. Trying to find information about this flag, and/or its associated specification, is quite challenging! Perhaps that is why it is easy to find people complaining, both Windows users and Linux users alike, about the Simple Boot Flag changing their machine's boot process in ways they don't like. My goal in this post is to provide an overview of this technology and a link to the specification.</div><div><br /></div><h1 style="text-align: left;">Background</h1><div>Microsoft introduced the Simple Boot Flag Specification around 2001, and the latest version is v2.1, from 2005. The goal of this initiative is to coordinate characteristics of the boot process between BIOS and the OS Loader. Specifically:</div><div><ul style="text-align: left;"><li>Determining when to run diagnostic tests during boot</li><li>Determining whether to configure hardware resources for devices</li></ul></div><div>For example, in the early days of the PC industry, the hardware was unreliable to the point that it was good practice to run a self-test at every boot. Modern hardware is much more reliable, and so spending time at boot running self-tests is a waste of time. Moreover, in the old days BIOS was required to setup hardware resources (e.g. interrupts, MMIO, I/O ports). Today, modern OSes do this themselves, and so having BIOS spend time sorting out resources, which then get reassigned once the OS loads anyway, makes no sense. The Simple Boot Flag is the means of communication between BIOS and the OS Loader to make a decision on what needs to be done from boot to boot in terms of diagnostic tests and hardware configuration.</div><div><br /></div><div>The Simple Boot Flag is a one byte bitfield, implemented as either a CMOS register location or as an NVRAM variable. Sample implementation:</div><div><!--StartFragment-->
<div style="background-color: #1e1e1e; color: #abb2bf; font-family: Consolas; font-size: 11pt;">
<pre><span style="color: #61afef;">struct</span>
<span style="color: #a2a9b5;">{</span>
<span style="color: #61afef;">UINT8</span> PnpOs <span style="color: #a2a9b5;">:</span> <span style="color: #d19a56;">1</span><span style="color: #a2a9b5;">;</span>
<span style="color: #61afef;">UINT8</span> Booting <span style="color: #a2a9b5;">:</span> <span style="color: #d19a56;">1</span><span style="color: #a2a9b5;">;</span>
<span style="color: #61afef;">UINT8</span> Diag <span style="color: #a2a9b5;">:</span> <span style="color: #d19a56;">1</span><span style="color: #a2a9b5;">;</span>
<span style="color: #61afef;">UINT8</span> SuppressBootDisplay <span style="color: #a2a9b5;">:</span> <span style="color: #d19a56;">1</span><span style="color: #a2a9b5;">;</span>
<span style="color: #61afef;">UINT8</span> Reserved <span style="color: #a2a9b5;">:</span> <span style="color: #d19a56;">3</span><span style="color: #a2a9b5;">;</span>
<span style="color: #61afef;">UINT8</span> Parity <span style="color: #a2a9b5;">:</span> <span style="color: #d19a56;">1</span><span style="color: #a2a9b5;">;</span>
<span style="color: #a2a9b5;">}</span> SIMPLE_BOOT_FLAG<span style="color: #a2a9b5;">;</span></pre></div></div><div>The flag provides a mechanism for the operating system to communicate back to the firmware what actions need to be taken on the next boot. For example:</div><div><ul style="text-align: left;"><li>should the BIOS configure the hardware resources for installed devices, or leave it up to the OS?</li><li>was the previous boot successful? if not, perhaps diagnostics should be run to fix the issue?</li><li>should BIOS maintain control of the display, or is it okay for the OS Loader to take control?</li></ul></div><div>The best way to summarize the goal of this flag is to define the bitfield communicated between BIOS and the OS Loader via this table:</div><div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjq41NFNEZKlGUvWJrMftu6EasF_U3nGzN_fiIF5160B2NqRlnjFaIkaE0y2npK1an221ZpTj1yMLXIDSeDATKlFvIpBossJvIPRgG_BkFqqITp79uq0rztviCvJBLjlsOXx9I6-qE_BC530R6_t_hC0Djq1IN7R1W_rvXpCH3aaycP0Y3fYg" style="clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img alt="" data-original-height="1348" data-original-width="830" src="https://blogger.googleusercontent.com/img/a/AVvXsEjq41NFNEZKlGUvWJrMftu6EasF_U3nGzN_fiIF5160B2NqRlnjFaIkaE0y2npK1an221ZpTj1yMLXIDSeDATKlFvIpBossJvIPRgG_BkFqqITp79uq0rztviCvJBLjlsOXx9I6-qE_BC530R6_t_hC0Djq1IN7R1W_rvXpCH3aaycP0Y3fYg=s16000" /></a></div><h1 style="text-align: left;">BOOT Table</h1><div>Microsoft also specifies an ACPI table to assist Windows in finding the location of the Simple Boot Flag. Note that this is Windows-specific, and so you won't find it in the ACPI Specification. The Linux kernel <a href="https://www.kernel.org/doc/html/latest/arm64/acpi_object_usage.html#:~:text=BOOT%20flag%20table-,Microsoft%20only%20table%2C%20will%20not%20be%20supported.,-BGRT">does not support</a> this table. For reference:</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEikWoK1iBk5nPV4Vm86GofaKMhPe7tgdMbMTMKzkLKxzaETNwwWwaKx8SVM2wtNx6PJmSe2g78qlEnrAFx7eksRP_iye_YtC3S8BNBkllxiUuCzoaCmeWK1O8eP2NzME70eswlJAw3vGQ8LO8_6wwE1E-pmO2j9tFnEZ14NNhmO4TfCmtz4Sw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="425" data-original-width="826" height="330" src="https://blogger.googleusercontent.com/img/a/AVvXsEikWoK1iBk5nPV4Vm86GofaKMhPe7tgdMbMTMKzkLKxzaETNwwWwaKx8SVM2wtNx6PJmSe2g78qlEnrAFx7eksRP_iye_YtC3S8BNBkllxiUuCzoaCmeWK1O8eP2NzME70eswlJAw3vGQ8LO8_6wwE1E-pmO2j9tFnEZ14NNhmO4TfCmtz4Sw=w640-h330" width="640" /></a></div></div><div><h1 style="text-align: left;">Downloading the Spec</h1></div><div>Trying to find the spec is challenging, mainly because the <a href="http://www.microsoft.com/whdc/resources/respec/specs/simp_boot.mspx">official Microsoft link</a> is no longer working. I've put v2.1, which I believe is the latest, <a href="https://github.com/WilliamLeara/BasicInputOutput/raw/master/specifications/SBF21.doc">here for reference</a>.</div><div><br /></div><div>Please take a look at this (small) spec for complete information—it's only 6 pages long.<br /></div><div><br /></div><div>If there's something I missed regarding the Simple Boot Flag, please leave a comment. Thanks for reading!</div><div><br /></div>
<!--Global site tag (gtag.js) - Google Analytics-->
<script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-27581650-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-27581650-2');
</script>Unknownnoreply@blogger.com5tag:blogger.com,1999:blog-12904787.post-53833025733424955402021-10-26T07:00:00.009-05:002021-10-26T09:45:34.946-05:00Introduction to DeviceTree<div><div class="separator" style="clear: both; text-align: right;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUQakEIYEPEUx57Mue_MV99dwOQxrXMeaA1HY61Jjc2eoTzzaa52Xb2TeZyF-X2sBRvbpVfXUsnUGmP3lmi68JBVS-Xpg5rv3As0MA4w87Oh5TU-_EJt7Gtgu3toPTycaq5lLi//" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="413" data-original-width="430" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUQakEIYEPEUx57Mue_MV99dwOQxrXMeaA1HY61Jjc2eoTzzaa52Xb2TeZyF-X2sBRvbpVfXUsnUGmP3lmi68JBVS-Xpg5rv3As0MA4w87Oh5TU-_EJt7Gtgu3toPTycaq5lLi//" width="250" /></a></div><br /><a href="https://www.devicetree.org/">Devicetree</a> is a representation of a hardware configuration, most especially non-discoverable hardware devices, passed from a bootstrap firmware to an OS . It is formatted as a series of nodes containing name:value pairs (think: JSON-like) that get compiled into a binary blob. This binary blob is incorporated into a bootloader which hands it off to the OS. The OS can then parse the blob to figure out how the hardware is connected, electrically, before addressing said hardware. The advantage here is to free the OS from needing to know, a priori, the hardware implementation details of every supported computer or embedded system design.</div><div><br /></div><h2 style="text-align: left;">History</h2><div>The seed that grew into what we know today as Devicetree began at <a href="https://en.wikipedia.org/wiki/Sun_Microsystems">Sun Microsystems</a> in 1988 as the <a href="https://en.wikipedia.org/wiki/Open_Firmware">Open Firmware</a> initiative. Trademarked by Sun as <i>OpenBoot, </i>Open Firmware eventually became an IEEE standard in 1994. (<a href="https://standards.ieee.org/standard/1275-1994.html">IEEE-1275</a>)</div><div><br /></div><div>Open Firmware was used in many Sun <span style="font-family: times;">SPARC </span>and Apple Power PC-based Macintosh designs, but with the market failure of those architectures, Open Firmware also went by the wayside. IEEE withdrew IEEE-1275 in January 2000. (I know I am oversimplifying a bit, but bear with me)</div><div><br /></div><div>However, several reference platform architectures were derived from IEEE-1275, namely Power PC's <a href="https://en.wikipedia.org/wiki/Common_Hardware_Reference_Platform">Common Hardware Reference Platform</a> (CHRP) and <a href="https://en.wikipedia.org/wiki/Power_Architecture_Platform_Reference">Power Architecture Platform Reference</a> (PAPR), which specified the use of Open Firmware.</div><div><br /></div><div>The component of Open Firmware that survived the fate of the larger project is the subject of this article, <b>Devicetree</b>. Embedded systems designers needed a way to describe their hardware to Linux without hardcoding hardware implementation details into the kernel and compiling custom kernels for every device running Linux. A seminal paper coming out of IBM, <i><a href="http://ozlabs.org/~dgibson/home/papers/dtc-paper.pdf">Device Trees Everywhere</a>,</i> proposed in 2006 a solution using Open Firmware's "device tree" concept, and this idea later was formalized into the <a href="https://web.archive.org/web/20120419173345/https://www.power.org/resources/downloads/Power_ePAPR_APPROVED_v1.1.pdf">Embedded Power Architecture Platform Requirements</a> (ePAPR) specification.</div><div><br /></div><div>ePAPR was focused on the Power ISA, but the "device tree" concept was too good to keep Power-specific, and so from ePAPR was derived the ISA-agnostic Devicetree specification, currently v0.3 at time of writing. Today, the Linux kernel supports Devicetree in ARM, MIPS, Power, SPARC, and x86, among other supported architectures.</div><div><br /></div><h2 style="text-align: left;">How Does it Work?</h2><div>First, the problem: some buses support device enumeration, like USB and PCIe, whereby the host can interrogate the bus to discover what devices are present and how they're configured. Other buses do not support enumeration, like <span style="font-family: "Times New Roman",serif; font-size: 11pt; line-height: 107%; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">I<sup>2</sup>C</span> and SPI. So, how can an OS talk to <span style="font-family: "Times New Roman",serif; font-size: 11pt; line-height: 107%; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">I<sup>2</sup>C</span> devices, for example, if it has no way to know their address, or even if they're present? One might be tempted to try the brute-force method of hard-coding the system's implementation of <span style="font-family: "Times New Roman",serif; font-size: 11pt; line-height: 107%; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">I<sup>2</sup>C</span> devices directly into the Linux kernel. That approach has been tried, and unfortunately, for obvious reasons, is not scalable. What Devicetree provides is a way to describe these non-discoverable devices so the kernel can use them without a priori knowledge. Furthermore, even for a bus like PCIe, while connected devices can be discovered, the kernel must first know something about the host bridge before it can attempt an enumeration of the bus beneath the host bridge—again, Devicetree provides the solution by describing the host bridge to the kernel. A Devicetree illustration:</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG223rDsC43PRcjzpuJmfSiA7U7KKME2dh1vBpTu7zssCXPNUocud5IIUq8iQjWQbJ-FAkdSoxsXx439DGqBwkrfbqbhvoQLkzRw8LHpQLfyWLwAzY-PNxp3WBrYHPsHygzfRC//" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="614" data-original-width="798" height="493" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG223rDsC43PRcjzpuJmfSiA7U7KKME2dh1vBpTu7zssCXPNUocud5IIUq8iQjWQbJ-FAkdSoxsXx439DGqBwkrfbqbhvoQLkzRw8LHpQLfyWLwAzY-PNxp3WBrYHPsHygzfRC/w640-h493/image.png" width="640" /></a></div><br /><div style="text-align: left;"><br /></div><h3 style="text-align: left;">Source File</h3></div><div>The hardware is represented in a source file, per convention with the extension .dts. The file is a kind of tree data structure, (acyclic graph with named nodes) where each node consists of name:value pairs. An example:</div><div><!--StartFragment-->
<div style="background-color: #1e1e1e;">
<pre><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">i2c@</span></span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">3000</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">{</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
#address</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">-</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">cells </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;"><</span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">1</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">>;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
#size</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">-</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">cells </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;"><</span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">0</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">>;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
cell</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">-</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">index </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;"><</span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">0</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">>;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
compatible </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #98c379; font-family: Consolas; font-size: 11pt;">"fsl-i2c"</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
reg </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;"><</span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">0x3000</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">0x100</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">>;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
interrupts </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;"><</span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">43</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">2</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">>;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
interrupt</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">-</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">parent </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;"><&</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">mpic</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">>;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
dfsrr</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
dtt@</span></span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">48</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">{</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
compatible </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #98c379; font-family: Consolas; font-size: 11pt;">"national,lm75"</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
reg </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;"><</span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">0x48</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">>;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">}</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
rtc@</span></span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">68</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">{</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
compatible </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #98c379; font-family: Consolas; font-size: 11pt;">"dallas,ds1337"</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
reg </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">=</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;"> </span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;"><</span><span style="color: #d19a56; font-family: Consolas; font-size: 11pt;">0x68</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">>;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">}</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">;</span><span style="color: #abb2bf; font-family: Consolas;"><span style="font-size: 11pt;">
</span></span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">}</span><span style="color: #a2a9b5; font-family: Consolas; font-size: 11pt;">;</span><span style="font-family: Times New Roman;"><span style="white-space: normal;">
</span></span></pre></div></div><div><div>Using the syntax described above, we can make the following observations about this example node:</div><div>• The <span style="font-family: "Times New Roman", serif; font-size: 14.6667px;">I</span><sup style="font-family: "Times New Roman", serif;">2</sup><span style="font-family: "Times New Roman", serif; font-size: 14.6667px;">C</span> controller is located at offset 0x3000 from its parent</div><div>• The driver for the <span style="font-family: "Times New Roman", serif; font-size: 14.6667px;">I</span><sup style="font-family: "Times New Roman", serif;">2</sup><span style="font-family: "Times New Roman", serif; font-size: 14.6667px;">C</span> controller is fsl-i2c</div><div>• The first child is named dtt, at offset 0x48 from its parent; the driver is national lm75</div><div>• The second child is named rtc, at offset 0x68 from its parent; the driver is Dallas ds1337</div><div>• The interrupt parent is the mpic, and interrupt number 0x43 is used. Because this is OpenPIC, an offset of 16 is added to the interrupt number for internal interrupts. 43 - 16 = 27, so this is actually SoC interrupt 0x27</div></div><div><br /></div><h3 style="text-align: left;">Binary Blob</h3><div>The .dts source gets turned into a binary blob with a .dtb extension via the Devicetree compiler, <i>dtc</i>. Here's how you can get it:</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6NPR2oc8V8XKQaci0keLgnWmbvg7xT2hxRsM3w9wFkxz9CTo9D-qgmJ9s481YoRa2z849KWz9w7JwWusEvMhI7phjN_wpbsg_5xT7OQEADBUd0wzDNZ3bbor2ZIVDPGFnKwXb//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="83" data-original-width="412" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6NPR2oc8V8XKQaci0keLgnWmbvg7xT2hxRsM3w9wFkxz9CTo9D-qgmJ9s481YoRa2z849KWz9w7JwWusEvMhI7phjN_wpbsg_5xT7OQEADBUd0wzDNZ3bbor2ZIVDPGFnKwXb/w400-h80/image.png" width="400" /></a></div><br /><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div>The .dtb file gets loaded by the bootloader and parsed by the kernel at boot. The compiler has a variety of options I won't detail here, but I'll just mention briefly that the compiler can output to several different formats, and can disassemble binary .dtb blobs back into .dts source.</div><div><br /></div><h3 style="text-align: left;">Devicetree Includes</h3><div>It is oftentimes advantageous to represent a device tree with not one, monolithic, .dst source file, but with a collection of sub-.dst source files. This allows building a top-level device tree made up of independent files describing the system subcomponents. Like the C programming language preprocessor #include directive, Devicetree has a compiler directive called <i>include</i>, used in the format:</div><div><br /></div><div><span style="font-family: courier;">/include/ "FILE"</span></div><div><br /></div><div>With this directive, the compiler will include sub-.dst files, named with the extension .dsti, into a main .dst file.</div><div><br /></div><h3 style="text-align: left;">Devicetree Bindings</h3><div>Devicetree bindings remind me of "schemas" as that concept is defined in XML or JSON. A binding's job is to make sure, for any particular device, that a required set of properties/values for the device are supplied by a device tree. For example, a serial device is an extremely well-known quantity—we've been doing serial ports, as an industry, for longer than most people in the industry have been alive. Therefore, with all the knowledge we have about how serial ports work, Devicetree has a binding that specifies which properties are required or not required for serial ports. This helps to ensure valid device trees that the kernel can understand. There exists a plethora of bindings for a wide array of devices and buses.</div><div><br /></div><h3 style="text-align: left;">Devicetree Overlays</h3><div>An issue that arose was how best to support single board computers (SBCs) with configurable components. It would be sub-optimal to have to create a collection of binary .dtb files to represent all possible peripheral configurations for the SBC and swap them out as necessary. What was needed was to maintain one foundational binary blob with a way to modify the binary blob, at run-time, and from user-mode. This is accomplished via a Devicetree overlay. Overlays act like applying a "patch" to a device tree. See <a href="https://twitter.com/glikely">Mr. Grant Likely's</a> proposal <a href="https://lkml.org/lkml/2012/11/5/615">here</a> that helped to jumpstart the overlay feature.</div><div><br /></div><h2 style="text-align: left;">Conclusion</h2><div>My goal here was to give you a high-level description of where Devicetree came from and the problem it solves so that you can make a decision on whether or not to use it. Here are some pointers to more information:</div><div><ul style="text-align: left;"><li><a href="https://www.devicetree.org/">Devicetree homepage</a></li><li><a href="https://github.com/devicetree-org/devicetree-specification">Devicetree Spec</a></li><li><a href="https://www.kernel.org/doc/html/latest/devicetree/usage-model.html">Linux and the Devicetree</a></li><li>video: <a href="https://www.youtube.com/watch?v=Nz6aBffv-Ek&ab_channel=Bootlin">Device Tree: hardware description for everybody !</a></li></ul></div><div>Did I miss anything obvious? If so, please leave a comment, thanks!</div>
<!--Global site tag (gtag.js) - Google Analytics-->
<script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-27581650-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-27581650-2');
</script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-1519043864732762062021-09-28T07:00:00.031-05:002021-09-28T07:00:00.225-05:00UEFI Forum Switch to Causeway<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-MoR7C15y15DwOJUhS7bBLmxH9bCimkQDUwjJkkqsDuSOvRrZeIOXoNhOkdSqAW3LWjoQM8fFcn_GCSX1k6R4V7lM6OUWZ1EM1Apj8JgFPkiYiejVUARojmvDfSDgD0aWqm2j//" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="114" data-original-width="211" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-MoR7C15y15DwOJUhS7bBLmxH9bCimkQDUwjJkkqsDuSOvRrZeIOXoNhOkdSqAW3LWjoQM8fFcn_GCSX1k6R4V7lM6OUWZ1EM1Apj8JgFPkiYiejVUARojmvDfSDgD0aWqm2j//" width="320" /></a></div>For many years, the <a href="https://members.uefi.org/site/login">Members Area</a> of <a href="https://uefi.org/">UEFI.org</a> has been managed by the <a href="https://www.higherlogic.com/solutions/online-community/">Kavi Workspace/Higher Logic</a> community management tool. Recently (September 2021) this application was changed to the <a href="https://www.causewaynow.com/">Causeway</a> product.<div><br /></div><div>Causeway is a popular community management tool used by other standards organizations such as <a href="https://pcisig.com/">PCI-SIG</a> and the <a href="https://www.dmtf.org/">DMTF</a>. Causeway offers document management, calendaring, and discussion forums capabilities. The change from Kavi to Causeway will require changes on your part to maintain login capability for your account.</div><div><br /></div><div>Note that this transition does <b>not </b>affect the <a href="https://mantis.uefi.org/">Mantis</a> application that UEFI.org uses for ticket management.</div><div><br /></div><div>Here is the official press release from the UEFI Forum describing how to update your account:</div><div><br /></div><div><div></div><blockquote><div>Hello UEFI Members, </div><div> </div><div>UEFI has completed the changes to the Members area of <i>members.uefi.org</i>. As announced previously, we have moved from the KAVI/Higher Logic Platform to the Causeway Platform. Please note that, effective immediately, you will need to reactivate your account on members.uefi.org. </div><div> </div><div>Here are a few other things to note: </div><div> </div><div>• <b>New Credentials</b>: You must establish your new credentials at <a href="https://members.uefi.org/user/reset">https://members.uefi.org/user/reset</a> [members.uefi.org]. Your user name will be your email address registered with UEFI. </div><div>• <b>Member Groups</b>: Member Groups will not change. You will still be a member of your same groups. </div><div>• <b>Calendars</b>: When you log into Causeway for the first time, please confirm that you are subscribed to your group calendars, so you will continue to receive meeting notifications and changes, <a href="https://members.uefi.org/calendar/subscribe">https://members.uefi.org/calendar/subscribe</a>. </div><div> </div><div>After [members.uefi.org] you have reestablished your new credentials at <a href="https://members.uefi.org/user/reset">https://members.uefi.org/user/reset</a> [members.uefi.org], please take the time to login to the new Members area and look at your various groups, including group calendars, documents, etc. Please also take this time to update your profile to ensure it is up to date. </div><div> </div><div>If you have any issues or need assistance, please notify us immediately at <a href="mailto:support@uefi.org">support@uefi.org</a>.<br /><br />Thank you for your patience during this migration, and thanks for your support of UEFI!</div><div><br /></div><div>Best Regards,</div><div><br /></div><div>UEFI Administration</div><div>3855 SW 153rd Drive</div><div>Beaverton, OR 97003</div><div>Phone: (503) 619-0864</div><div>Fax: (503) 644-6708</div><div>admin@uefi.org</div><div><a href="http://www.uefi.org">www.uefi.org</a> [uefi.org]</div></blockquote><div></div></div><div>I followed the procedures here, and everything worked fine for me. If you don't have access to the UEFI Member Pages today, but are interested in gaining access, I did a write-up of how to request access here: <a href="https://www.basicinputoutput.com/2019/05/uefiorg-members-pages.html">https://www.basicinputoutput.com/2019/05/uefiorg-members-pages.html</a></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-83041281635205461452021-09-15T07:00:00.243-05:002021-09-15T10:28:58.502-05:00Microsoft Project Mu — A Quick Start<div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqT4KU9nlBFHoFHkqwVjwAXRcf7JWpHotZh-ClWZyQ6knJUAgpLF4SkygmR5pxkTPgwXwArgTTZnvdGUXhELUVHxVntEAcGEpeHrN75vmF1tGTy9he-QuvT7NqNP4XK60MI13c//" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="48" data-original-width="173" height="89" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqT4KU9nlBFHoFHkqwVjwAXRcf7JWpHotZh-ClWZyQ6knJUAgpLF4SkygmR5pxkTPgwXwArgTTZnvdGUXhELUVHxVntEAcGEpeHrN75vmF1tGTy9he-QuvT7NqNP4XK60MI13c//" width="320" /></a></div><br /><a href="https://microsoft.github.io/mu/">Project Mu</a> is a Microsoft-sponsored open-source UEFI BIOS implementation, complementing the original <a href="https://www.tianocore.org/">Tianocore</a> open-source implementation. Tianocore is considered an "upstream remote" as far as Project Mu is concerned.</div><div><div></div><blockquote><div>Project Mu is a modular adaptation of TianoCore's edk2 tuned for building modern devices using a scalable, maintainable, and reusable pattern. Mu is built around the idea that shipping and maintaining a UEFI product is an ongoing collaboration between numerous partners. For too long, the industry has built products using a "forking" model combined with copy/paste/rename and with each new product, the maintenance burden grows to such a level that updates are near impossible due to cost and risk.</div><div><br /></div><div>Project Mu also tries to address the complex business relationships and legal challenges facing partners today. To build most products, it often requires both closed-source, proprietary assets as well as open-source and industry-standard code. The distributed build system and multi-repository design allow product teams to keep code separate and connected to their original source while respecting legal and business boundaries.</div><div><br /></div><div>Project Mu originated from building modern Windows PCs but its patterns and design allow it to be scaled down or up for whatever the final product's intent. IoT, Server, PC, or any other form factor should be able to leverage the content.</div></blockquote><div></div></div><div><div>I won't delve into the details of Project Mu, since it's been around for almost three years already. If you'd like more background, please see:</div><div><ul style="text-align: left;"><li><a href="https://blogs.windows.com/windowsdeveloper/2018/12/19/%E2%80%AFintroducing-project-mu/">Microsoft's introductory blog post</a></li><li><a href="https://microsoft.github.io/mu/">Project Mu documentation home</a></li></ul><div>What I'd like to do in this article is to describe how you can get Project Mu downloaded, compiled, and running quickly.</div><div><br /></div><h1 style="text-align: left;">Prerequisites</h1><div>Project Mu lists the prerequisites for building the code at: <span style="font-family: courier;"><a href="https://microsoft.github.io/mu/CodeDevelopment/prerequisites/">https://microsoft.github.io/mu/CodeDevelopment/prerequisites/</a></span></div><div><br /></div><div>I installed the following (Windows-based) prerequisites:</div><div><ol style="text-align: left;"><li><b>QEMU </b>(https://www.qemu.org/download/#windows)</li><li><b>Python </b>(https://www.python.org/ftp/python/3.8.2/python-3.8.2-amd64.exe)</li><li><b>git </b>(https://github.com/git-for-windows/git/releases/download/v2.25.1.windows.1/Git-2.25.1-64-bit.exe)</li><li><b>VisualStudio 2019</b> (https://aka.ms/vs/16/release/vs_buildtools.exe)</li></ol><div>I installed the VS2019 package with the command-line provided by the wiki:</div></div><div><div><span style="font-family: courier; font-size: x-small;">vs_buildtools.exe --quiet --wait --norestart --nocache --installPath C:\BuildTools \</span></div><div><span style="font-family: courier; font-size: x-small;">--add Microsoft.VisualStudio.Component.VC.CoreBuildTools --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 \</span></div><div><span style="font-family: courier; font-size: x-small;">--add Microsoft.VisualStudio.Component.Windows10SDK.17763 --add Microsoft.VisualStudio.Component.VC.Tools.ARM \</span></div><div><span style="font-family: courier; font-size: x-small;">--add Microsoft.VisualStudio.Component.VC.Tools.ARM64</span></div></div><div><br /></div><div>Next, I did a git clone of <b><a href="https://github.com/microsoft/mu_tiano_platforms">mu_tiano_platforms</a></b>:</div><div><br /></div><div><span style="font-family: courier;">https://github.com/microsoft/mu_tiano_platforms.git</span></div><div><span style="font-family: courier;"><br /></span></div><h1 style="text-align: left;">Building</h1><script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-27581650-2');
</script><div>Microsoft Project Mu maintains <a href="https://github.com/topics/projectmu">fourteen git repositories</a> on Github. The build instructions for each repository varies, and are described in each repository. So, for <b>mu_tiano_platforms</b>, I used these instructions:</div><div><br /></div><div><a href="https://github.com/microsoft/mu_tiano_platforms/blob/release/202102/Platforms/QemuQ35Pkg/Docs/Development/building.md"><span style="font-family: courier;">https://github.com/microsoft/mu_tiano_platforms/blob/release/202102/Platforms/QemuQ35Pkg/Docs/Development/building.md</span></a></div><div><br /></div><div>I'll walk through, step-by-step, what I did, and highlight mistakes I made in hopes you can avoid them and get started more quickly.</div><div><br /></div><h3 style="text-align: left;">Step 1: Create a Python Virtual Environment</h3><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqmb8MHeCKZUEv0MqSAPc6w4GKqh2ZMAb93_hqpTFYwmlkU1MImtQbmpYOZoM3a9tCq7JdDmYgkQR-uYY8Dx7S50i_nRcMZyOxEJ_NMnEwWUGV523NeKN9KA-qs0rHqRwJiQar//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="27" data-original-width="228" height="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqmb8MHeCKZUEv0MqSAPc6w4GKqh2ZMAb93_hqpTFYwmlkU1MImtQbmpYOZoM3a9tCq7JdDmYgkQR-uYY8Dx7S50i_nRcMZyOxEJ_NMnEwWUGV523NeKN9KA-qs0rHqRwJiQar/w200-h24/image.png" width="200" /></a></div><br /><br /></div><div><br /></div><h3 style="text-align: left;">Step 2: Activate Virtual Environment</h3><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAsfkd1YtKw-lMCSnMzGGn31p0EJ5JayhOiyC64KMRpKVXt8p23bbxNI-fyBm-ryz6gha5m1zm3M2lQmMcSrCbrI8zAM5ueAmjighElKHFxryIO_-q3bLHpvNSOPSxHcFQ0SCN//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="101" data-original-width="490" height="83" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAsfkd1YtKw-lMCSnMzGGn31p0EJ5JayhOiyC64KMRpKVXt8p23bbxNI-fyBm-ryz6gha5m1zm3M2lQmMcSrCbrI8zAM5ueAmjighElKHFxryIO_-q3bLHpvNSOPSxHcFQ0SCN/w400-h83/image.png" width="400" /></a></div><br /><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Step 3: Install Pytools</h3><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJB-OE4dLe_debcktQJVwz4V4oRpIkRPFSnguMHtRHbz8ae4z0nQ_9DaPRXkC5TxDRd1jRtoqMk_nvQquriEgAyPDzk8ysDiAHLvMzrQVbqIQxphSer9kT3lkXpw936D2w97D//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="765" data-original-width="725" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJB-OE4dLe_debcktQJVwz4V4oRpIkRPFSnguMHtRHbz8ae4z0nQ_9DaPRXkC5TxDRd1jRtoqMk_nvQquriEgAyPDzk8ysDiAHLvMzrQVbqIQxphSer9kT3lkXpw936D2w97D/w607-h640/image.png" width="607" /></a></div></div><div><div class="separator" style="clear: both; text-align: left;"><br /></div><h3 style="clear: both; text-align: left;">Step 4: Initialize & Update Submodules (using VS2019)</h3><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvYOUANmxecsmCqYVv3kp3HDtYgdpMDuKWPufdYg9se6UnVPD_IPinrcxadUfRVJ9HT1xFbiYTlawHnH6LsL7W1Y3izxy0Bw5EJA1pr4l_nw7R8xGLqxtuU81ih0nCFFdn3A84//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="481" data-original-width="890" height="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvYOUANmxecsmCqYVv3kp3HDtYgdpMDuKWPufdYg9se6UnVPD_IPinrcxadUfRVJ9HT1xFbiYTlawHnH6LsL7W1Y3izxy0Bw5EJA1pr4l_nw7R8xGLqxtuU81ih0nCFFdn3A84/w640-h346/image.png" width="640" /></a></div><br /><br /></div><div><div class="separator" style="clear: both; text-align: center;"><br /></div><h3 style="clear: both; text-align: left;">Step 5: Initialize & Update Dependencies</h3><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcAu8vTkfFG3x7qK8Xg3VhdRRpx3WTYJTEqeea97WbXAA3lIw6zXm-Tnc0_Cl1v6CiM_Pd4sur1wOSQ1GrseOKLIYWc5hJTmrcklWiXMPADP8bEfou0Ai7gH-6tGVveQ0Ex1Up//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="244" data-original-width="630" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcAu8vTkfFG3x7qK8Xg3VhdRRpx3WTYJTEqeea97WbXAA3lIw6zXm-Tnc0_Cl1v6CiM_Pd4sur1wOSQ1GrseOKLIYWc5hJTmrcklWiXMPADP8bEfou0Ai7gH-6tGVveQ0Ex1Up/w640-h248/image.png" width="640" /></a></div><br /></div><div><br /></div><div><br /></div><div><h3 style="clear: both; text-align: left;">Step 6: Compile — SUCCESS!</h3><div class="separator" style="clear: both; text-align: left;"><span style="font-family: courier;">stuart_build -c Platforms/QemuQ35Pkg/PlatformBuild.py TOOL_CHAIN_TAG=2019</span></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBxMWf1M3WzQ35_gkpAWOG-1ziGufoA_tSbcKq4C5EfuzRGkoKyWHF9B6e1-3UAjYF7w49kODHO5DTtQK8pO9UkLmxm4Uf3NzrHRsNDRSJA-121dCy7F0WolgqbNBJPjwUYz0U//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"><img alt="" data-original-height="360" data-original-width="706" height="326" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBxMWf1M3WzQ35_gkpAWOG-1ziGufoA_tSbcKq4C5EfuzRGkoKyWHF9B6e1-3UAjYF7w49kODHO5DTtQK8pO9UkLmxm4Uf3NzrHRsNDRSJA-121dCy7F0WolgqbNBJPjwUYz0U/w640-h326/image.png" width="640" /></a></div><div><br /></div><h3 style="text-align: left;">Step 7: Launch QEMU</h3><div>Finally, now that the prerequisites have been met, the code is cloned and built, we can launch the QEMU emulator and actually boot the firmware image we built to a UEFI shell. Make sure you manually add the QEMU install directory (i.e. <i>C:\Program Files\qemu</i>) to your path. Run this command:</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFWfdwmqYWC5WgKmV7a6Xxbq0sT2CACVcBOZ6lc1OjENo4ob0xm4haW6j4yZXPsTCtD3_kRd5C_BJHwZDRl4wCU9llC4Zat7VPE7Pgsr1FxiKFGCS5SLwzghrRUTLcbQToSEn4//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="23" data-original-width="721" height="20" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFWfdwmqYWC5WgKmV7a6Xxbq0sT2CACVcBOZ6lc1OjENo4ob0xm4haW6j4yZXPsTCtD3_kRd5C_BJHwZDRl4wCU9llC4Zat7VPE7Pgsr1FxiKFGCS5SLwzghrRUTLcbQToSEn4/w640-h20/image.png" width="640" /></a></div><div><br /></div><div><br /></div></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmS2MdofaMmnwik3ts0kJiSblXcpYvWjFZmVAm-Y2KEul9pONuI10ozlC36vi0y0CK-Hrm7IsAl7OwsMY4XHz-lCmHwubcylbhkoAENiXEpILUAJFyE68HZwUW9XTKuFNUTLmR//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="881" data-original-width="1076" height="524" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmS2MdofaMmnwik3ts0kJiSblXcpYvWjFZmVAm-Y2KEul9pONuI10ozlC36vi0y0CK-Hrm7IsAl7OwsMY4XHz-lCmHwubcylbhkoAENiXEpILUAJFyE68HZwUW9XTKuFNUTLmR/w640-h524/image.png" width="640" /></a></div><br /><br /></div><div><h3 style="clear: both; text-align: left;">An Error: Name Too Long</h3></div><div class="separator" style="clear: both; text-align: left;">Note that I did run into a path-length issue. I didn't think my path was excessive (47 characters), but I got the following error:</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWMKYLILGma1PX9L1mOpbDOAR3318dk-kRoW9TDzisk8JPYPCUKM0IW7-aMRgp_elYvB3_Woz0rjaj0wvZTMKxvuMwnbaOKGkgBmCgGB435X4jutqC-A9QYKgGsGTIdVq2ZDc5//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="338" data-original-width="524" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWMKYLILGma1PX9L1mOpbDOAR3318dk-kRoW9TDzisk8JPYPCUKM0IW7-aMRgp_elYvB3_Woz0rjaj0wvZTMKxvuMwnbaOKGkgBmCgGB435X4jutqC-A9QYKgGsGTIdVq2ZDc5/w640-h412/image.png" width="640" /></a></div><br /><br /></div><div><br /></div><div><br /></div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><div style="text-align: left;">To get around it, I did:</div><div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWcoIYHDay63cH72xWkjXsmTl0GtnBCmT-u9-fvMi58e1ls2fdAD9PpgS_JYYEPodk952irDRfuCpSJr_lC4mW6iA1rjSgPu4oV-73RQFn2C6pApUBu72UQmZCcIdUt4-LwMes//" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" data-original-height="21" data-original-width="464" height="18" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWcoIYHDay63cH72xWkjXsmTl0GtnBCmT-u9-fvMi58e1ls2fdAD9PpgS_JYYEPodk952irDRfuCpSJr_lC4mW6iA1rjSgPu4oV-73RQFn2C6pApUBu72UQmZCcIdUt4-LwMes/w400-h18/image.png" width="400" /></a></div><div style="text-align: left;"><br /></div><br /><br /></div><div style="text-align: left;">Then I ran the commands from the M: drive, and everything worked.</div><div style="text-align: left;"><br /></div><h1 style="text-align: left;">Conclusion</h1><div style="text-align: left;">So, there you have it. As I mentioned, there are ~fourteen git repositories related to Project Mu, and they can be combined in various ways, depending on your needs. They all have various features and options, which are documented on the documentation site and in the repositories themselves. My goal was just to introduce the concept, and get you building and running a platform; I think <b>mu_tiano_platforms</b> is a good candidate for that. You can expand from here, for example by running the unit tests or adding optional features.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Leave a comment and let me know what you're doing with Project Mu!</div></div></div></div></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-61378035223812868492021-08-24T23:53:00.002-05:002023-12-20T12:34:11.508-06:00ARM's SystemReady Specifications<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdn5wrehaW3KK31WtYl2FqJ9wgEr9Jz_TAfKCwnYlsHajr1MH1BW3DP7thyoRFzt0crXHZNIEZcN7lSnj67uM5ZkRwD0hig3pKIWellwtmL4Tio_XrdSI0uP-Pa7zz-bPK_wr//" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><br /></a></div>The folks at <a href="https://www.arm.com/">ARM</a> offer a certification program based on a set of hardware and firmware standards: the Base System Architecture (BSA), and Base Boot Requirements (BBR) specifications, plus a selection of supplemental standards. Termed <i><b><a href="https://www.arm.com/why-arm/architecture/systems/systemready-certification-program">Arm SystemReady</a></b></i>, these standards ensure Arm-based computer systems of all types and form-factors are designed to specific requirements, enabling operating systems to boot and "just work" right out of the box, no customization required.<div><br /></div><div>Some context: in earlier times in the history of ARM processor architecture, there was a great proliferation of implementations, each unique, and therefore requiring a unique firmware image and OS image. A Linux image built for a Raspberry Pi computer, for example, would not boot on a BeagleBone. With the great proliferation of single-board computers (SBCs), it is crazy-inefficient for the Linux distros to have to create a unique OS image (including a custom kernel) for every SBC on the market. Add to that the need to securely update and otherwise maintain an ever-growing collection of board-unique firmware/OS images—such a situation is not scalable.</div><div><br /></div><div>ARM has been rectifying the situation over the last ~seven years by creating a series of specification documents that aim to define hardware requirements and a common firmware/OS interface. The initiative began with ARM-based servers, and recently has been extended to include ARM-based embedded systems.</div><div><br /></div><h1 style="text-align: left;">Arm SystemReady</h1><div>Arm SystemReady is defined by four different "bands":</div><div><ol style="text-align: left;"><li><a href="https://developer.arm.com/architectures/system-architectures/arm-systemready/sr">Arm SystemReady SR (ServerReady)</a></li><ul><li>ensures that ARM-based servers work out of the box, offering seamless interoperability with standard operating systems, hypervisors, and software</li></ul><li><a href="https://developer.arm.com/architectures/system-architectures/arm-systemready/ls">Arm SystemReady LS (LinuxBoot Server)</a></li><ul><li>ensures that a server platform is suitable for deployment on the LinuxBoot firmware stack</li></ul><li><a href="https://developer.arm.com/architectures/system-architectures/arm-systemready/es">Arm SystemReady ES - Embedded Server</a></li><ul><li>ensures interoperability with standard operating systems and hypervisors</li></ul><li><a href="https://developer.arm.com/architectures/system-architectures/arm-systemready/ir">Arm SystemReady IR - IoT</a></li><ul><li>for devices in the IoT edge sector that are built around SoCs based on the ARM A-profile architecture; ensures interoperability with embedded Linux and other embedded operating systems.</li></ul></ol><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1fTZtcKmwLzohjS2xKyzIyC-7r7KiL0KgCswgmTTEEbeV14LcJ8FVOC9ahRqo_ylBcJ8612kb9p7b94k5zcCkA3CKGm0ydkotLLkswD5wxkgSzdk_hHLJajSdW7RYutsO0Yoa//" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="500" data-original-width="968" height="331" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1fTZtcKmwLzohjS2xKyzIyC-7r7KiL0KgCswgmTTEEbeV14LcJ8FVOC9ahRqo_ylBcJ8612kb9p7b94k5zcCkA3CKGm0ydkotLLkswD5wxkgSzdk_hHLJajSdW7RYutsO0Yoa/w640-h331/image.png" width="640" /></a></div><br />The preceding chart defines the bands and the specifications applicable to each. As you can see, each band combines a set of required specifications, each set applicable to a particular application/form-factor.</div></div><div><br /></div><h1 style="text-align: left;">The Inventory of Specifications</h1><div>There are quite a few—here they are:</div><div><ul style="text-align: left;"><li><a href="https://developer.arm.com/documentation/den0109/latest">Arm SystemReady Requirements specification</a></li><li><a href="https://developer.arm.com/documentation/den0094/latest">Arm Base System Architecture specification</a> (BSA)</li><li><a href="https://developer.arm.com/documentation/den0044/latest">Arm Base Boot Requirements specification</a> (BBR)</li><li><a href="https://developer.arm.com/documentation/den0029/latest">Arm Server Base System Architecture supplement specification</a> (SBSA)</li><li><a href="https://github.com/ARM-software/ebbr">Arm Embedded Base Boot Requirements specification</a> (EBBR)</li><li><a href="https://developer.arm.com/documentation/den0107/latest/">Arm Base Boot Security Requirements specification</a> (BBSR)</li></ul></div><div>Rather than inventing new technologies, the goal of specifications like BBR/EBBR is to encourage ARM customers to craft ARM-based products that embrace popular industry standards (e.g. UEFI, ACPI, DeviceTree, U-Boot) in an agreed-upon way. For example, EBBR requires that hardware/firmware provide a method of self-description for consumption by the OS; but rather than define a new method, EBBR says that implementations should choose either <a href="https://uefi.org/specifications">ACPI</a> or <a href="https://www.devicetree.org/">DeviceTree</a>.</div><div><br /></div><div>Once implemented in EBBR-compliant bootloaders like <a href="https://www.denx.de/wiki/U-Boot/">U-boot</a> or <a href="https://www.tianocore.org/">Tianocore/EDK2</a>, this initiative should allow a single version of an OS image (e.g. RHEL/Fedora, Debian/Ubuntu, et. al.) to boot on any ARM-based SBC without the per-platform customization traditionally required.</div><div><br /></div><div>There is also a compliance test suite, called <i>Arm SystemReady ACS</i>, where "ACS" stands for Architecture Compliance Suite. More information here: <a href="https://github.com/ARM-software/bbr-acs">BBR-ACS</a>.</div><div><br /></div><div><h1 style="text-align: left;">References</h1></div><div>Hopefully this article serves as a comprehensive overview of what Arm SystemReady is all about. Please dig into the various specifications (linked above) for more information. Also, following are some references I've found helpful:</div><div><br /></div><h4 style="text-align: left;">Arm SystemReady and the UEFI Firmware Ecosystem</h4><div>A UEFI Plugfest presentation by Dong Wei and Samer El-Haj-Mahmoud of ARM: <a href="https://www.brighttalk.com/webcast/18206/460753">https://www.brighttalk.com/webcast/18206/460753</a></div><div><br /></div><h4 style="text-align: left;">A real ARM customer (NXP) making Arm SystemReady-compliant devices:</h4><div><a href="https://www.nxp.com/video/arm-systemready:ARM-SYSTEMREADY">https://www.nxp.com/video/arm-systemready:ARM-SYSTEMREADY</a></div><div><br /></div><h4 style="text-align: left;">Grant Likely (ARM Ltd.) discussing EBBR at the Embedded Linux Conference in 2018:</h4><div><br /></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/Zz5wGjY9VpU" width="320" youtube-src-id="Zz5wGjY9VpU"></iframe></div><div><br /></div><h4 style="text-align: left;">Dong Wei discussing SystemReady at the UEFI Fall 2023 Developer's Conference:</h4><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/jpud1ahomdc" width="320" youtube-src-id="jpud1ahomdc"></iframe></div><br /><div><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-23262596884503529442021-08-10T07:00:00.048-05:002021-08-24T23:55:06.148-05:00The UEFI 2.9 Specification<div class="separator" style="clear: both; text-align: right;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqm_Z7Kb3ss26p7bZs9ZKG5fkUph0Bsn78bx42xbuFPpeF4vApSXO3-QFEQnhXjYmdRTs81xodKl_SY_bMq-ed7BRcmN45aK6gMqZHTjK-isgDjAy1SKiYCioeC8k9XB0tBQLm//" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="269" data-original-width="745" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqm_Z7Kb3ss26p7bZs9ZKG5fkUph0Bsn78bx42xbuFPpeF4vApSXO3-QFEQnhXjYmdRTs81xodKl_SY_bMq-ed7BRcmN45aK6gMqZHTjK-isgDjAy1SKiYCioeC8k9XB0tBQLm//" width="320" /></a></div><br />Forgive the delay in publishing, but I've been taking a paternity leave from work recently, and just now getting back into the swing of things.<div><br /></div><div>UEFI Spec v2.9 was released recently, and I didn't want that to go by without me mentioning it. From the UEFI Forum:</div><div><br /></div><div><div class="field field-name-field-date field-type-datetime field-label-hidden" style="background: rgb(255, 255, 255); border: 0px; color: #727272; font-family: Arial, Helvetica, sans-serif; font-size: 13px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><div class="field-items" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><div class="field-item even" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><span class="date-display-single" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"></span></div></div></div><blockquote><div class="field field-name-field-date field-type-datetime field-label-hidden" style="background: rgb(255, 255, 255); border: 0px; color: #727272; font-family: Arial, Helvetica, sans-serif; font-size: 13px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><div class="field-items" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><div class="field-item even" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><span class="date-display-single" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">Monday, March 22, 2021</span></div></div></div><div class="field field-name-body field-type-text-with-summary field-label-hidden" style="background: rgb(255, 255, 255); border: 0px; color: #727272; font-family: Arial, Helvetica, sans-serif; font-size: 13px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><div class="field-items" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><div class="field-item even" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><p style="background: transparent; border: 0px; margin: 0px 0px 18px; outline: 0px; padding: 0px; vertical-align: baseline;"><span style="background: transparent; border: 0px; font-size: 13.008px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">The new specification offers direct implications for many computing platforms, from IoT devices to high-end servers.</span></p><p style="background: transparent; border: 0px; margin: 0px 0px 18px; outline: 0px; padding: 0px; vertical-align: baseline;"><strong style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">Beaverton, Ore.—March 22, 2021</strong>—<a href="https://uefi.org/" style="-webkit-tap-highlight-color: rgb(70, 167, 226); color: #eb2227; outline: none; text-decoration-line: none;">The UEFI Forum</a> today announced the release of the Unified Extensible Firmware Interface (UEFI) 2.9 specification. The next iteration of firmware specification innovation defines a model for the interface between personal-computer operating systems and platform firmware.</p><p style="background: transparent; border: 0px; margin: 0px 0px 18px; outline: 0px; padding: 0px; vertical-align: baseline;">“The UEFI Forum is focused on aiding the evolving technology and open source ecosystems,” said Mark Doran, UEFI Forum President. “The UEFI 2.9 specification illustrates our commitment to the industry with added support of newer hardware types like CXL and NVDIMMs, as well as increased support for Arm and RISC-V processors.”</p><p style="background: transparent; border: 0px; margin: 0px 0px 18px; outline: 0px; padding: 0px; vertical-align: baseline;"><strong style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">UEFI 2.9 Specification Highlights</strong></p><ul style="background: transparent; border: 0px; list-style-image: initial; list-style-position: initial; margin: 0px; outline: 0px; padding: 0px 0px 0px 20px; vertical-align: baseline;"><li style="background: transparent; border: 0px; list-style-type: disc; margin: 0px 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline;">Support for discovering and describing CXL devices</li><li style="background: transparent; border: 0px; list-style-type: disc; margin: 0px 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline;">Support for publishing DTB in UEFI Configuration Table</li><li style="background: transparent; border: 0px; list-style-type: disc; margin: 0px 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline;">Clarification of Update Capsule runtime call on some architectures like Arm AArch64</li><li style="background: transparent; border: 0px; list-style-type: disc; margin: 0px 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline;">Introduction of unaccepted memory type</li></ul><p style="background: transparent; border: 0px; margin: 0px 0px 18px; outline: 0px; padding: 0px; vertical-align: baseline;">Download the specifications <a href="https://uefi.org/specifications" style="-webkit-tap-highlight-color: rgb(70, 167, 226); color: #eb2227; outline: none; text-decoration-line: none;">here</a> to learn more about these and other updates. The specification is available in PDF format and will soon be available in searchable HTML format.</p></div></div></div></blockquote><div class="field field-name-body field-type-text-with-summary field-label-hidden" style="background: rgb(255, 255, 255); border: 0px; color: #727272; font-family: Arial, Helvetica, sans-serif; font-size: 13px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><div class="field-items" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><div class="field-item even" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><p style="background: transparent; border: 0px; margin: 0px 0px 18px; outline: 0px; padding: 0px; vertical-align: baseline;"></p></div></div></div></div><div>Here is a list of the changes, proceeded by their Mantis numbers:</div><div><ul style="text-align: left;"><li>1866 GetInfo() of Adapter Information Protocol should have a provision for IHV to return no data</li><li>1982 Clarify the PKCS#7 SignedData structure of EFI_VARIABLE_AUTHENTICATION</li><li>1986 Need a mechanism using which browser to exit out of IHV formset silently without any popup</li><li>1989 NVDIMM SPA Location Cookie</li><li>2024 CXL CPER Records</li><li>2042 New Event Group EFI_EVENT_GROUP_AFTER_READY_TO_BOOT</li><li>2043 New Event Group EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES</li><li>2046 Add support for Key 14 & 56 for Japanese keyboard layout</li><li>2053 Figure/Table Numbers are Duplicated in Appendices</li><li>2062 Table numbering to restart for each chapter</li><li>2065 CXL proposal for CDAT table extraction from devices</li><li>2093 UpdateCapsule ScatterGatherList cache maintenance</li><li>2129 Add DTB Configuration Table standard GUID</li><li>2131 Clarify Console requirements</li><li>2134 Introduce unaccepted memory type</li><li>2155 Typo in Arm Processor CPER Error Section</li><li>2167 CPER for CXL Component Events</li><li>2185 Declaration for UEFI 2.9 specification in the System Table</li><li>2190 Misc. spec review feedback</li><li>2199 EFI_IMAGE_EXECUTION_INFO_TABLE references</li><li>2200 Config tables references from section 4.6</li><li>2204 Typo in GUID definition for EFI_MANAGED_NETWORK_SERVICE_BINDING_PROTOCOL</li><li>2212 Incorrect cross reference to User Information Table</li></ul></div><div><br /></div><div>UPDATE: <a href="https://twitter.com/NikolajSchlej">Nikolaj Schlej</a> has a tradition of publishing a tweet thread commenting on spec changes, such as UEFI spec changes. He has done a great job, so I'm re-publishing his summary below. You can follow Nikolaj at: <a href="https://twitter.com/NikolajSchlej">https://twitter.com/NikolajSchlej</a>. Thanks Nikolaj!</div><div></div><div><br /></div>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] The absolutely most interesting change to the 2.9 spec (actually, it was added in 2.8 Errata B already) is that now changes since the previous version are all highlighted, so there's no need to diff 3k pages of PDFs to find them. A very welcome addition indeed!</p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411712310003990528?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] EFI Adapter Information Protocol got a new CXL-related information type - "Coherent Device Attribute Table (CDAT)". <a href="https://t.co/N8akzYATLk">pic.twitter.com/N8akzYATLk</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411713153419792387?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] Appendix N - Common Platform Error Record got a new CXL-related notification type - "Compute Express Link (CXL) Component". <a href="https://t.co/PNxv6nuDNL">pic.twitter.com/PNxv6nuDNL</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411714220907909121?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] The case of missing information of given type got clarified for EFI_ADAPTER_INFORMATION_PROTOCOL.GetInfo(). <a href="https://t.co/lZVr8scuix">pic.twitter.com/lZVr8scuix</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411715902001750026?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] Usage of PKCS#7 in SignedData structure got clarified for SetVariable() with EFI_VARIABLE_AUTHENTICATION_3 descriptor. <a href="https://t.co/bvckb1eW36">pic.twitter.com/bvckb1eW36</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411717184137547777?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] New FormBrowser ActionRequest return type - "EFI_BROWSER_ACTION_REQUEST_QUESTION_APPLY". <a href="https://t.co/81iBhSQKob">pic.twitter.com/81iBhSQKob</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411718227835588609?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] New event group - EFI_EVENT_GROUP_AFTER_READY_TO_BOOT. <a href="https://t.co/7ODejNUvx6">pic.twitter.com/7ODejNUvx6</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411719650514149380?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] New event group - EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES. <a href="https://t.co/OM2Sweqo1w">pic.twitter.com/OM2Sweqo1w</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411720015468851201?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] UpdateCapsule's ScatterGatherList memory caching requirements got a clarification. <a href="https://t.co/MpqMTPFHEz">pic.twitter.com/MpqMTPFHEz</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411721092838817792?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] Sections related to RISC-V architecture support updated to reflect RISC-V specification changes. <a href="https://t.co/sZjZvcJ2LP">pic.twitter.com/sZjZvcJ2LP</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411722409086832647?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">[UEFI 2.9] New EFI configuration table type defined outside of the UEFI specification - 'DTB', aka "Device Tree Table". Described and defined here: <a href="https://t.co/KDHPAybV6i">https://t.co/KDHPAybV6i</a> <a href="https://t.co/yjJ0Qj87th">pic.twitter.com/yjJ0Qj87th</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411723517985398788?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="und">[UEFI 2.9] New memory type - EfiUnacceptedMemoryType. <a href="https://t.co/997erhba8j">pic.twitter.com/997erhba8j</a></p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411724476048318471?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<blockquote class="twitter-tweet"><p dir="ltr" lang="en">That'll be all for UEFI 2.9, folks. Fairly small update with the major thing (CXL 2.0) defined outside of UEFI spec itself. AfterReadyToBoot and BeforeExitBootServices event group are nice additions, RISC-V changes are expected, but still welcome, bugfixes are fine too. <br />🧵🔚</p>— Nikolaj Schlej (@NikolajSchlej) <a href="https://twitter.com/NikolajSchlej/status/1411727500061728769?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-27581650-2');
</script>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-12904787.post-13376135327098027852021-07-26T21:05:00.001-05:002021-07-26T21:05:38.914-05:00Switching Email Subscriptions to Follow.It<p>Dear basicinputoutput.com readers:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidQiojZUkN6Wj-ErXRgg1aGvbjEDQFNH0kA8kbz9sLh2yRWmT1ZJoE50cFnJIvn8eyoMvdP7Z3GFyv2ekv3h5zxCF3z6_YuAHmgJ68I64X09fqNzxzoAW1bYIHWg_N_TUoXa0D//" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="44" data-original-width="175" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidQiojZUkN6Wj-ErXRgg1aGvbjEDQFNH0kA8kbz9sLh2yRWmT1ZJoE50cFnJIvn8eyoMvdP7Z3GFyv2ekv3h5zxCF3z6_YuAHmgJ68I64X09fqNzxzoAW1bYIHWg_N_TUoXa0D//" width="320" /></a></div><br /><p></p><p>Just a brief administrative note to let my email subscribers know that I’ve switched from Feedburner to <a href="https://follow.it/">Follow It</a> to manage email subscriptions.</p><p>Google is deprecating Feedburner, and so this forced me (and the rest of the Internet community) to make a switch.</p><p>Anyway, no action required on your part—look for exciting BIOS development news coming soon to your inbox from <u><span lang="EN-GB" style="color: #1155cc; font-family: "Arial",sans-serif; font-size: 10.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;"><a href="https://follow.it/" target="_blank">https://follow.it</a></span></u>!</p><p>—William</p><!--Global site tag (gtag.js) - Google Analytics-->
<script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-27581650-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-27581650-2');
</script>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-12904787.post-1315087380789426542020-04-23T22:50:00.000-05:002020-04-24T12:16:08.664-05:00Demystifying M.2 Card Types<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjawgXcb6vIlPHw9u1z9TUSQL3_h2weU5S3Ejod9hW_XTFCIbH_BxYYOYdiubnujRZzBvGhC5HZKWLW7IUB2ZAq4xOzeyPvdjYwhxq61-PfXezFfvUdIjtDM_O9pF5-VRHSLfA/s1600/samsung.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="409" data-original-width="728" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjawgXcb6vIlPHw9u1z9TUSQL3_h2weU5S3Ejod9hW_XTFCIbH_BxYYOYdiubnujRZzBvGhC5HZKWLW7IUB2ZAq4xOzeyPvdjYwhxq61-PfXezFfvUdIjtDM_O9pF5-VRHSLfA/s320/samsung.jpg" width="320" /></a></div>
Understanding M.2 cards means deciphering an alphabet soup of sockets (types 1, 2, and 3), keys, (A-M), numbers (e.g. 2230), and thicknesses (S1-S5, D1-D5). I'm always brushing up on these concepts, then forgetting them, and then needing to relearn them. That means it's a good opportunity to put all this down in a blog post!<br />
<div>
<br /></div>
<div>
I will confine this post to the M.2 add-in cards, not the kind that get soldered down to a motherboard. Both types are defined in the M.2 spec, but I think the M.2 add-in cards have a much broader reach and lead to all the confusion.</div>
<div>
<br /></div>
<h2>
Quick Background</h2>
<div>
The M.2 specification is a joint effort between <a href="https://pcisig.com/">PCI-SIG</a>, the industry standards group behind PCI Express, and <a href="https://sata-io.org/">SATA-IO</a>, the group behind all things SATA. Today, M.2 cards are used in all laptops, and nearly all (if not all) desktop computers. M.2 cards provide features like Bluetooth, Wi-Fi, WWAN broadband cards, and NVMe storage devices, among others.</div>
<div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-27581650-2', 'auto');
ga('send', 'pageview');
</script><br />
<h2>
Conceptual Hierarchy</h2>
<div>
There are three <b>sockets </b>defined in M.2, aptly named Socket 1, Socket 2, and Socket 3.</div>
<div>
<br /></div>
<div>
Each socket accepts a card that is <b>keyed </b>in a particular way. The keys are represented by a capital letter, A-M. Some M.2 cards are keyed in more than one way so they can work in more than one type of socket, for example, both Key B and Key M. The keying is meant to prevent the insertion of incompatible cards.</div>
<div>
<br /></div>
<div>
Cards can be either "S" <b>single-sided</b> (S1-S5), or "D" <b>double-sided</b>, (D1-D5). The higher the number, the taller the card. (i.e. the greater the Z-height) Connectors on the motherboard also have assigned heights, and can only accept cards thin enough to fit.</div>
<div>
<br /></div>
<div>
Finally, there are a variety of adapter <b>sizes </b>which are designated by a number representing the card's physical width and length. For example, a card that is 22mm wide and 30mm long is called "2230". Other popular sizes are 3042 and 2280, but there are a total of sixteen different width-by-length form factors defined in the M.2 spec.</div>
<div>
<br /></div>
<div>
<i>Important Note</i>: no matter what socket/key/height/size we're talking about, M.2 cards use a 75-position edge connector connection with a total of 67 pins. The socket/key/height/size is just a unique configuration of those different positions and pins. Exact signal descriptions, i.e. what each pin in the connector does for each possible configuration, is defined in the M.2 spec, available from PCI-SIG.</div>
<div>
<br /></div>
<h2>
Sockets</h2>
<h3>
Socket 1 - "Connectivity"</h3>
<div>
Socket 1 can be keyed in one of two ways: Key E or Key A.</div>
<div>
Socket 1 can support devices through either PCIe or USB interfaces.</div>
<div>
Typical functions implemented in Socket 1 are Wi-Fi, Bluetooth, WiGig, and NFC.</div>
<div>
Typical adapter size is 2230, but 1630 and 3030 are also supported.</div>
<div>
<br /></div>
<h3>
Socket 2 - "WWAN/SSD/Other"</h3>
<div>
Socket 2 can be keyed in one of two ways: Key B or Key C.</div>
<div>
Socket 2 can support devices through either PCIe, USB, or SATA.</div>
<div>
Typical functions implemented in Socket 2 are WWAN and SSDs.</div>
<div>
<br /></div>
<h3>
Socket 3 - "SSD Drive"</h3>
<div>
Socket 3 is keyed with Key M.</div>
<div>
Socket 3 can support storage devices through either PCIe or SATA.</div>
<div>
Socket 3 is dedicated to storage devices (a.k.a. SSDs)</div>
</div>
<div>
<br /></div>
<h2>
Keys</h2>
<div>
Keying is a popular mechanical technique for preventing incompatible cards being inserted where they won't work. DDR <a href="https://www.jedec.org/">DRAM</a> uses a similar technique. M.2 supports twelve possible keys, lettered A-M. From <a href="https://en.wikipedia.org/wiki/M.2">Wikipedia</a>:</div>
<div>
<table class="wikitable" style="background-color: #f8f9fa; border-collapse: collapse; border: 1px solid rgb(162, 169, 177); color: #222222; font-family: sans-serif; font-size: 12.7px; margin: 0.75em 2em 0.9em 0.5em;"><tbody>
<tr><th style="background-color: #eaecf0; border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">Key<br />
ID</th><th style="background-color: #eaecf0; border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">Notched<br />
pins</th><th style="background-color: #eaecf0; border: 1px solid rgb(162, 169, 177); min-width: 27em; padding: 0.2em 0.4em; text-align: center;">Provided interfaces</th></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">A</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">8–15</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em;"><a class="mw-redirect" href="https://en.wikipedia.org/wiki/PCIe" style="background: none; color: #0b0080; text-decoration-line: none;" title="PCIe">PCIe</a> ×2, USB 2.0, <a class="mw-redirect" href="https://en.wikipedia.org/wiki/I2C" style="background: none; color: #0b0080; text-decoration-line: none;" title="I2C">I<sup style="font-size: 10.16px; line-height: 1;">2</sup>C</a> and <a href="https://en.wikipedia.org/wiki/DisplayPort" style="background: none; color: #0b0080; text-decoration-line: none;" title="DisplayPort">DP</a> ×4</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">B</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">12–19</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em;">PCIe ×2, SATA, USB 2.0 and 3.0, audio, <a class="mw-redirect" href="https://en.wikipedia.org/wiki/User_identity_module" style="background: none; color: #0b0080; text-decoration-line: none;" title="User identity module">UIM</a>, <a class="mw-redirect" href="https://en.wikipedia.org/wiki/HSIC" style="background: none; color: #0b0080; text-decoration-line: none;" title="HSIC">HSIC</a>, <a class="mw-redirect" href="https://en.wikipedia.org/wiki/SSIC" style="background: none; color: #0b0080; text-decoration-line: none;" title="SSIC">SSIC</a>, I<sup style="font-size: 10.16px; line-height: 1;">2</sup>C and <a class="mw-redirect" href="https://en.wikipedia.org/wiki/SMBus" style="background: none; color: #0b0080; text-decoration-line: none;" title="SMBus">SMBus</a></td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">C</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">16–23</td><td rowspan="2" style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em;">Reserved for future use</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">D</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">20–27</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">E</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">24–31</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em;">PCIe ×2, USB 2.0, <a class="mw-redirect" href="https://en.wikipedia.org/wiki/I2C" style="background: none; color: #0b0080; text-decoration-line: none;" title="I2C">I<sup style="font-size: 10.16px; line-height: 1;">2</sup>C</a>, <a class="mw-redirect" href="https://en.wikipedia.org/wiki/Secure_Digital_Input_Output" style="background: none; color: #0b0080; text-decoration-line: none;" title="Secure Digital Input Output">SDIO</a>, <a class="mw-redirect" href="https://en.wikipedia.org/wiki/UART" style="background: none; color: #0b0080; text-decoration-line: none;" title="UART">UART</a> and <a class="mw-redirect" href="https://en.wikipedia.org/wiki/PCM" style="background: none; color: #0b0080; text-decoration-line: none;" title="PCM">PCM</a></td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">F</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">28–35</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em;">Future Memory Interface (FMI)</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">G</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">39–46</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em;">Reserved for custom use (unused in the M.2 specification)</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">H</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">43–50</td><td rowspan="4" style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em;">Reserved for future use</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">J</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">47–54</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">K</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">51–58</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">L</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">55–62</td></tr>
<tr><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">M</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em; text-align: center;">59–66</td><td style="border: 1px solid rgb(162, 169, 177); padding: 0.2em 0.4em;">PCIe ×4, SATA and SMBus</td></tr>
</tbody></table>
</div>
<h2>
Single vs. Double Sided</h2>
<div>
M.2 cards can have logic on one side or both sides, designated by "S" or "D", followed by a number 1-5, where the higher the number, the taller (greater Z-height) the card. Single-sided cards can be up to 2mm tall. Double-sided cards can be up to 1.5mm tall per side, or 3mm total in height. From <a href="https://en.wikipedia.org/wiki/M.2">Wikipedia</a>:</div>
<div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="background: #F8F9FA; border-collapse: collapse; border: none; mso-border-alt: solid #A2A9B1 .75pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="background: #EAECF0; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<b><span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">Type<o:p></o:p></span></b></div>
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<b><span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">ID<o:p></o:p></span></b></div>
</td>
<td style="background: #EAECF0; border-left: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<b><span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">Top side<o:p></o:p></span></b></div>
</td>
<td style="background: #EAECF0; border-left: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<b><span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">Bottom side<o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">S1<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.20 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">—<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">S2<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.35 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">—<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">S3<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.50 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">—<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">S4<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.75 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">—<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">S5<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">2.00 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">—<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">D1<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.20 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.35 mm<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">D2<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.35 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.35 mm<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">D3<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.50 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.35 mm<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">D4<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.50 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">0.70 mm<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #A2A9B1 1.0pt; mso-border-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">D5<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.50 mm<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid #A2A9B1 1.0pt; border-left: none; border-right: solid #A2A9B1 1.0pt; border-top: none; mso-border-alt: solid #A2A9B1 .75pt; mso-border-left-alt: solid #A2A9B1 .75pt; mso-border-top-alt: solid #A2A9B1 .75pt; padding: 2.4pt 4.8pt 2.4pt 4.8pt;">
<div align="center" class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: center;">
<span style="color: #222222; font-family: "Arial",sans-serif; font-size: 9.5pt; mso-fareast-font-family: "Times New Roman";">1.50 mm<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
</div>
<h2>
Sizes</h2>
<div>
Sizes are specified in millimeters (mm). So, the size description is pretty straightforward: 2280 is 22mm wide, 80mm long. Possible sizes supported: 1113, 1216, 1620, 1630, 2024, 2226, 2228, 2230, 2242, 2260, 2280, 2828, 3026, 3030, 3042, 22110.</div>
<div>
<br /></div>
<h2>
Naming Convention</h2>
<div>
Putting all these variables together, we come up with the following naming convention:</div>
<div>
<b>Type AA BB - CC - D - E</b></div>
<div>
<br /></div>
<div>
where:</div>
<div>
<ul>
<li>AA - width, in mm</li>
<li>BB - length, in mm</li>
<li>CC - sided-ness/height, S1-S5 or D1-D5</li>
<li>D - key ID (primary)</li>
<li>E - key ID (secondary, only if supported)</li>
</ul>
</div>
<div>
<br /></div>
<div>
An example: <b>Type 2242-D2-B-M</b></div>
<div>
<b><br /></b></div>
<h2>
Conclusion</h2>
<div>
I hope this post acts like a "cheat-sheet" for refreshing your memory when you need to discuss M.2 card form factors. Everything I've said here, though it might sound detailed and technical, is really a simplification of what's in the M.2 spec. However, once you understand the basics, you can turn to the spec to find the implementation details.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-12904787.post-7236262008120329072020-01-21T07:00:00.000-06:002020-04-23T20:07:35.645-05:00UPDATED: Spring 2020 UEFI Plugfest<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ3XgkQbiahjU3VLU15WRB2CBB6ZdHLf7KgOIx_uyQQmHh9Trc1DvAKNE6kmWzPcMAoo0F-daJBt3vj8k-laLAF_cGc1aqrwCUr2umJa_i-beDE8qQ7HJKCOCsXugoD1ITYaPf/s1600/Clipboarder.2020.04.14.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="241" data-original-width="481" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ3XgkQbiahjU3VLU15WRB2CBB6ZdHLf7KgOIx_uyQQmHh9Trc1DvAKNE6kmWzPcMAoo0F-daJBt3vj8k-laLAF_cGc1aqrwCUr2umJa_i-beDE8qQ7HJKCOCsXugoD1ITYaPf/s320/Clipboarder.2020.04.14.jpg" width="320" /></a></div>
Due to COVID-19, the Spring 2020 UEFI Plugfest has moved to a virtual meeting. Details below.</div>
<h2>
<i>From the UEFI Forum:</i></h2>
<div>
<h3>
<div class="MsoNormal">
<span style="font-size: 12.0pt; line-height: 105%;">Hello UEFI
Forum Members, <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt; line-height: 105%;">We would like
to invite you to register for the upcoming Industry Ecosystem themed webinars
apart of the </span><a href="https://uefi.org/node/4051"><span style="font-size: 12.0pt; line-height: 105%;">2020 UEFI Virtual Plugfest</span></a><span style="font-size: 12.0pt; line-height: 105%;">. Attendees will also have the chance
to participate in a live Q&A with our firmware technology experts. Register
for the free, public webinars: <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in;">
<a href="https://www.brighttalk.com/webcast/18206/399018"><b><span style="font-size: 14.0pt; line-height: 105%;">Is your Pi “ServerReady”? Embracing
UEFI and ACPI at the Edge</span></b></a><b><span style="font-size: 14.0pt; line-height: 105%;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<i><span style="font-size: 14.0pt; line-height: 105%;">Wednesday,
April 29, 2020 from 8:00 am – 8:45 am PT<o:p></o:p></span></i></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt; line-height: 105%;">Firmware
standards such as UEFI and ACPI are one of the foundational pillars for Arm
servers, and a major reason for the continued growth of this
horizontally-integrated ecosystem. Non-server "Edge" systems,
however, are still an embedded-style vertically-integrated market, which is
preventing at-scale adoption and proliferation of Arm-based Edge/IoT Compute.<b><o:p></o:p></b></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt; line-height: 105%;">Thus, let's
make "Arm Edge" as boring as "Arm Servers" and start with
the iconic Raspberry Pi.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt; line-height: 105%;">This is a
presentation and demo of VMware's and Arm's joint open effort to bring Arm
ServerReady experiences to the Raspberry Pi 4 via community-developed SBBR
(UEFI + ACPI) firmware. The session covers the history of the Pi UEFI port,
current status and technical challenges that remain to be solved. <o:p></o:p></span></div>
<div class="MsoNormal">
<b><span style="font-size: 12.0pt; line-height: 105%;">Register
for the webinar: </span></b><a href="https://www.brighttalk.com/webcast/18206/399018"><b><span style="font-size: 12.0pt; line-height: 105%;">https://www.brighttalk.com/webcast/18206/399018</span></b></a><b><u><span style="color: #0563c1; font-size: 12.0pt; line-height: 105%;"><o:p></o:p></span></u></b></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in;">
<a href="https://www.brighttalk.com/webcast/18206/401857"><b><span style="font-size: 14.0pt; line-height: 105%;">Compute Express Link (CXL): Proposed
Enhancements to UEFI and ACPI Specifications</span></b></a><b><span style="font-size: 14.0pt; line-height: 105%;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<i><span style="font-size: 14.0pt; line-height: 105%;">Tuesday, May 19, 2020 from 8:00 am –
8:45 am PT<o:p></o:p></span></i></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt; line-height: 105%;">Compute Express Link (CXL) is a new
high-speed CPU-to-Device and CPU-to-Memory interconnect designed to accelerate
next-generation data center performance. CXL is designed to be an industry open
standard interface for high-speed communications, as accelerators and memory
expanders are increasingly used to complement CPUs in support of emerging
applications. The CXL 1.1 specification is already available, with work on
future versions underway. CXL reinforces the need for standardization, with
focus on technologies such as UEFI, ACPI and PCIe to provide the necessary
interfaces between the firmware and the operating systems to support CXL new
use cases of accelerators and memory expansion across different
implementations. This presentation will first briefly introduce CXL 1.1
standard. It will then delve into the technical details of the proposed
enhancements to the UEFI and ACPI specifications required for operating systems
to manage CXL devices and ports in a system.<o:p></o:p></span></div>
<div class="MsoNormal">
<b><span style="font-size: 12.0pt; line-height: 105%;">Register for the webinar: </span></b><a href="https://www.brighttalk.com/webcast/18206/401857"><b><span style="font-size: 12.0pt; line-height: 105%;">https://www.brighttalk.com/webcast/18206/401857</span></b></a><b><span style="font-size: 12.0pt; line-height: 105%;">. <o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0in;">
<a href="https://www.brighttalk.com/webcast/18206/401859"><b><span style="font-size: 14.0pt; line-height: 105%;">Building a
System That “Just Works” – Arm Firmware Ecosystem</span></b></a><b><span style="font-size: 14.0pt; line-height: 105%;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<i><span style="font-size: 14.0pt; line-height: 105%;">Wednesday, May 20, 2020 from 8:00 am
– 9:00 am PT<o:p></o:p></span></i></div>
<div class="MsoNormal">
<span style="font-size: 12.0pt; line-height: 105%;">This webinar will provide an overview
of the market reality of the boot system firmware on Arm systems, from servers
to edge devices. It covers the range of firmware standards available for those
systems, including Arm Trusted Firmware, SBBR (UEFI/ACPI), EBBR (UEFI on top of
uboot), as well as LinuxBoot. The session also covers the evolution of the Arm
firmware standards and the ServerReady program around UEFI and ACPI to design
systems that “just work”, regardless of the segment.<o:p></o:p></span></div>
<div class="MsoNormal">
<b><span style="font-size: 12.0pt; line-height: 105%;">Register
for the webinar: </span></b><a href="https://www.brighttalk.com/webcast/18206/401859"><b><span style="font-size: 12.0pt; line-height: 105%;">https://www.brighttalk.com/webcast/18206/401859</span></b></a><b><span style="font-size: 12.0pt; line-height: 105%;">. <o:p></o:p></span></b></div>
</h3>
</div>
<div>
<div class="field field-name-body field-type-text-with-summary field-label-hidden" style="background: rgb(255, 255, 255); border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">
<div class="field-items" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">
<div class="field-item even" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">
<div style="background: transparent; border: 0px; margin-bottom: 18px; outline: 0px; padding: 0px; vertical-align: baseline;">
<span style="color: #727272; font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: 13px;"><br /></span></span>
<span style="color: #727272; font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: 13px;">If you have any questions, please contact the UEFI Forum public relations team at press@uefi.org. </span></span><br />
<span style="color: #727272; font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: 13px;"><br /></span></span>
<span style="color: #727272; font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: 13px;">Best Regards,</span></span><br />
<span style="color: #727272; font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: 13px;"><br /></span></span>
<span style="color: #727272; font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: 13px;">The UEFI Forum PR Team</span></span></div>
</div>
</div>
</div>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-27581650-2', 'auto');
ga('send', 'pageview');
</script>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-12904787.post-45952155689370993752019-11-21T12:35:00.000-06:002019-11-21T12:36:19.265-06:00UEFI "Related Documents" Library<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3wMigro2Vy3jEW_bn6mPMV8SBUwHKAPeDsxz_PvPJBBS9FUTsnokQRVw6-vh2LiHZs5iXeRrRsO-iXzcMYZUDlcyr7rL8KZlVk-1VIFLq5h2tDALoydnxvMkSxRxI4WDpUa0s/s1600/Clipboarder.2019.11.21.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="269" data-original-width="545" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3wMigro2Vy3jEW_bn6mPMV8SBUwHKAPeDsxz_PvPJBBS9FUTsnokQRVw6-vh2LiHZs5iXeRrRsO-iXzcMYZUDlcyr7rL8KZlVk-1VIFLq5h2tDALoydnxvMkSxRxI4WDpUa0s/s320/Clipboarder.2019.11.21.jpg" width="320" /></a></div>A quick note: as BIOS engineers, we know that success comes from knowing and navigating through many different industry standards.<br />
<div>We are regularly writing code to comply with a particular specification, or else trying to grok how two specifications might interact with one another.</div><div><br />
</div><div>Imagine my enthusiasm, then, when I discovered a neat page on <a href="http://uefi.org/">UEFI.org</a> dedicated to cataloging many valuable specifications. It's called "<a href="https://uefi.org/uefi">LINKS TO UEFI SPECIFICATION - RELATED DOCUMENTS</a>", and you can find it here:</div><div><a href="https://uefi.org/uefi">https://uefi.org/uefi</a></div><script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-27581650-2', 'auto');
ga('send', 'pageview');
</script>Unknownnoreply@blogger.com0