<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://switchbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Balika011</id>
	<title>Nintendo Switch Brew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://switchbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Balika011"/>
	<link rel="alternate" type="text/html" href="https://switchbrew.org/wiki/Special:Contributions/Balika011"/>
	<updated>2026-04-24T18:46:12Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Dock&amp;diff=6363</id>
		<title>Dock</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Dock&amp;diff=6363"/>
		<updated>2019-03-14T07:51:22Z</updated>

		<summary type="html">&lt;p&gt;Balika011: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Dock is internally called &amp;quot;Cradle&amp;quot;(strings/symbols in system-titles).&lt;br /&gt;
&lt;br /&gt;
The original dock was the HAC-CDH-MAIN-01.&lt;br /&gt;
&lt;br /&gt;
There is an updated, costs down version of the dock out in the wild labeled as HAC-CDH-MAIN-10.&lt;br /&gt;
The release date is unknown. The guess is it came along with the patched 4.1 units.&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function || Component on HAC-CDH-MAIN-01 || on HAC-CDH-MAIN-10 || Notes&lt;br /&gt;
|-&lt;br /&gt;
| MyDP -&amp;gt; HDMI Converter || colspan=&amp;quot;2&amp;quot; | MegaChips STDP2550 &amp;quot;Mystique&amp;quot; || 2Mb flash contains firmware &amp;lt;br&amp;gt; Based on STMicroelectronics Mystique family of DP converters.&lt;br /&gt;
|-&lt;br /&gt;
| USB Hub || VIA Labs VL210 USB 3.0 Hub Controller || Genesys Logic GL3510 || 512Kb flash is configuration storage&lt;br /&gt;
|-&lt;br /&gt;
| USB Device || colspan=&amp;quot;2&amp;quot; | Cortex-M0 based (STM32F0-ish)&amp;lt;br&amp;gt;&amp;quot;32P048&amp;quot;&lt;br /&gt;
| SWD clearly labelled and enabled&amp;lt;br&amp;gt;Provides control of the Mystique&amp;lt;br&amp;gt;Dumps (fw-1.0.0):&amp;lt;br&amp;gt;[[:File:Dock.stm.08000000-08008000.bin|flash]]&amp;lt;br&amp;gt;[[:File:Dock.stm.1fffc400-1ffffc00.bin|sysmem]]&amp;lt;br&amp;gt;[[:File:Dock.stm.20000000-20001800.bin|SRAM]]&amp;lt;br&amp;gt;[http://www.st.com/content/ccc/resource/technical/document/reference_manual/c2/f8/8a/f2/18/e6/43/96/DM00031936.pdf/files/DM00031936.pdf/jcr:content/translations/en.DM00031936.pdf Relevant manual]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Flash &lt;br /&gt;
| Macronix MX25L512E 512Kb CMOS || Unpopulated || [[:File:Dock.512K.bin|dump (fw-1.0.0)]]&lt;br /&gt;
|-&lt;br /&gt;
| Macronix MX25V2006E 2Mb CMOS || Windbond 25X20CLL04 || [[:File:Dock.2M.bin|dump (fw-1.0.0)]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | USB-PD&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | ROHM BM92T17 || rowspan=&amp;quot;2&amp;quot; | One at i2c addr 0x18, the other at 0x1a&amp;lt;br&amp;gt;[http://www.rohm.com/web/global/datasheet/BM92T10MWV/bm92t10mwv-e bm92t1x datasheet]&amp;lt;br&amp;gt;[http://www.rohm.com/web/global/datasheet/BM92T50MWV/bm92t50mwv-e bm92t5x datasheet]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | ROHM BM92T55&lt;br /&gt;
|}&lt;br /&gt;
All 1.0.0 dumps were collected from a HAC-CDH-MAIN-01.&lt;br /&gt;
&lt;br /&gt;
==Other Resources==&lt;br /&gt;
# [[List of compatible USB devices]]&lt;br /&gt;
# [https://www.ifixit.com/Teardown/Nintendo+Switch+Teardown/78263 iFixit&#039;s Nintendo Switch teardown]&lt;br /&gt;
# [https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering dekuNukem&#039;s Reverse Engineering]&lt;/div&gt;</summary>
		<author><name>Balika011</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Dock&amp;diff=6362</id>
		<title>Dock</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Dock&amp;diff=6362"/>
		<updated>2019-03-14T00:21:33Z</updated>

		<summary type="html">&lt;p&gt;Balika011: Add chips found on a mid 2017 dock (HAC-CDH-MAIN-10)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Dock is internally called &amp;quot;Cradle&amp;quot;(strings/symbols in system-titles).&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function || Component || Notes&lt;br /&gt;
|-&lt;br /&gt;
| MyDP -&amp;gt; HDMI Converter || MegaChips STDP2550 &amp;quot;Mystique&amp;quot; || 2Mb flash contains firmware &amp;lt;br&amp;gt; Based on STMicroelectronics Mystique family of DP converters.&lt;br /&gt;
|-&lt;br /&gt;
| USB Hub || VIA Labs VL210 USB 3.0 Hub Controller / Genesys Logic GL3510 || 512Kb flash is configuration storage&lt;br /&gt;
|-&lt;br /&gt;
| USB Device || Cortex-M0 based (STM32F0-ish)&amp;lt;br&amp;gt;&amp;quot;32P048&amp;quot;&lt;br /&gt;
| SWD clearly labelled and enabled&amp;lt;br&amp;gt;Provides control of the Mystique&amp;lt;br&amp;gt;Dumps (fw-1.0.0):&amp;lt;br&amp;gt;[[:File:Dock.stm.08000000-08008000.bin|flash]]&amp;lt;br&amp;gt;[[:File:Dock.stm.1fffc400-1ffffc00.bin|sysmem]]&amp;lt;br&amp;gt;[[:File:Dock.stm.20000000-20001800.bin|SRAM]]&amp;lt;br&amp;gt;[http://www.st.com/content/ccc/resource/technical/document/reference_manual/c2/f8/8a/f2/18/e6/43/96/DM00031936.pdf/files/DM00031936.pdf/jcr:content/translations/en.DM00031936.pdf Relevant manual]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Flash &lt;br /&gt;
| Macronix MX25L512E 512Kb CMOS / Nothing || [[:File:Dock.512K.bin|dump (fw-1.0.0)]]&lt;br /&gt;
|-&lt;br /&gt;
| Macronix MX25V2006E 2Mb CMOS / Windbond 25X20CLL04|| [[:File:Dock.2M.bin|dump (fw-1.0.0)]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | USB-PD&lt;br /&gt;
| ROHM BM92T17 || rowspan=&amp;quot;2&amp;quot; | One at i2c addr 0x18, the other at 0x1a&amp;lt;br&amp;gt;[http://www.rohm.com/web/global/datasheet/BM92T10MWV/bm92t10mwv-e bm92t1x datasheet]&amp;lt;br&amp;gt;[http://www.rohm.com/web/global/datasheet/BM92T50MWV/bm92t50mwv-e bm92t5x datasheet]&lt;br /&gt;
|-&lt;br /&gt;
| ROHM BM92T55&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Other Resources==&lt;br /&gt;
# [[List of compatible USB devices]]&lt;br /&gt;
# [https://www.ifixit.com/Teardown/Nintendo+Switch+Teardown/78263 iFixit&#039;s Nintendo Switch teardown]&lt;br /&gt;
# [https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering dekuNukem&#039;s Reverse Engineering]&lt;/div&gt;</summary>
		<author><name>Balika011</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Testpads&amp;diff=6339</id>
		<title>Testpads</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Testpads&amp;diff=6339"/>
		<updated>2019-03-04T23:08:11Z</updated>

		<summary type="html">&lt;p&gt;Balika011: Correct UART-A rx ad tx&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Nintendo Switch mainboard has a series of testpads on the front and back, presumably used in factory test, diagnostics, and early board bringup procedures.&lt;br /&gt;
&lt;br /&gt;
== Raw Logic captures ==&lt;br /&gt;
&lt;br /&gt;
These are reference materials, taken from poking at I/O on various testpads. https://github.com/hedgeberg/Switch-Logic-Captures&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
[[File:Switchre_side1.jpg|200px]]&lt;br /&gt;
[[File:Switchre_side2.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
== Pinouts ==&lt;br /&gt;
&lt;br /&gt;
=== Cluster A ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Batt GND? || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Battery pulse? || Pulse train || 0-3.3V || L-5? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Battery Vdd || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ?? || Square wave || 0-3.3V || || 329kHz? (undersampled?) || Square wave when screen on, but looks like vias to Speaker R&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ?? || Square wave || 0-3.3V || || 329kHz? (undersampled?) || Square wave when screen on, but looks like vias to Speaker R&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Weak GND? || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || SDA || I2C || 0-1.8V || || ||	&lt;br /&gt;
|-&lt;br /&gt;
| 8 || SCL || I2C || 0-1.8V  || || || &lt;br /&gt;
|-&lt;br /&gt;
| 9 || USB-PWR-WAVE? || Square wave || 0-3.3V || K-4, K-5? || ~11 Hz || &lt;br /&gt;
|-&lt;br /&gt;
| 10 || USB-PWR-WAVE? || Square wave || 0-3.3V || K-4, K-5? || ~11 Hz || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster B ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||  || DBVDD || || || || from ALC5639 pin 43&lt;br /&gt;
|-&lt;br /&gt;
| 2 || D+ || USB-C || || || || Cluster B - 3&lt;br /&gt;
|-&lt;br /&gt;
| 3 || D- || USB-C || || || || Cluster B - 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +3.3V || XRST || || || || from M92T36 pin 4&lt;br /&gt;
|-&lt;br /&gt;
| 5 || +3.3V || VSVR || || || || from M92T36 pin 6&lt;br /&gt;
|-&lt;br /&gt;
| 5(b) || VUSB || VB || || || || from M92T36 pin 9&lt;br /&gt;
|-&lt;br /&gt;
| 6 || GND ||  || || || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster C ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ?? || || 0-1.8V || || || No clue. This is definitely important, we just have no idea how. May need to interface with dock for comms.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || UART-A TX || || 0-1.8V || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || UART-A RX || || 0-1.8V || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ?? || || 0-1.8V || || || &lt;br /&gt;
|-&lt;br /&gt;
| 5 || ?? || || 0-1.8V || || || &lt;br /&gt;
|-&lt;br /&gt;
| 6 || ?? || || 0-1.8V || || || &lt;br /&gt;
|-&lt;br /&gt;
| 7 || ?? || || 0-1.8V || || || &lt;br /&gt;
|-&lt;br /&gt;
| 8 || ?? || || 0-1.8V || || || &lt;br /&gt;
|-&lt;br /&gt;
| 9 || ?? || || 0-1.8V || || || &lt;br /&gt;
|-&lt;br /&gt;
| 10 || ?? || || 0-1.8V || || || &lt;br /&gt;
|-&lt;br /&gt;
| 11 || ?? || || 0-1.8V || || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster D ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Seaker L + || || || || || Speaker Left +&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Seaker L - || || || || || Speaker Left - &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster E ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Vol (-)  || || || || || Button Vol (-)&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Reset || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Vdd Referance|| || || || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster G ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Vol(+) || || || || || Button Vol (+)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Li-Ion Batt Vdd Mirror || || || || || Power Supply&lt;br /&gt;
|-&lt;br /&gt;
| 9 || BUTTON_HOME || || || || || RCM strap&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster I ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Screen_on || On/Off || 0-1.8V || || || Screen power state, active high&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || UART || 0-1.8V || || 1.5MBaud? || &lt;br /&gt;
|-&lt;br /&gt;
| 4 || || UART || 0-1.8V || || 1.5MBaud? || &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || Flow control || 0-1.8V || || || Flow control for pad I-4?&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || || 0-1.8V || || || Needs testing with chip/touch screen interface board plugged in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster J ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ? || Edge || 0-1.8V || || || Turns on around same time as pad J-3&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ? || Edge || 0-1.8V || || || Turns on around same time as pad J-1, slightly after&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power button || Pushbutton || 4V-0V || || || Active low&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ? || Constant? || 0V || Ground?-NT || ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ? || Edge || 0-1.8V || || || Turns on with pad J-6, ~1s after J-1/J-3&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ? || Edge || 0-1.8V || || || Turns on with pad J-5, ~1s after J-1/J-3&lt;br /&gt;
|-&lt;br /&gt;
| 8 || ? || Edge? || 0-1.8V || || || Turns on ~1s after J-6/J-7, turns off at unknown point&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster K ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || D- || USB-C || || || || Cluster B - 3&lt;br /&gt;
|-&lt;br /&gt;
| 3 || D+ || USB-C || || || || Cluster B - 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || USB-PWR-WAVE? || Square wave || 0V-3.3V || A-9, A-10? || ~11 Hz ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || USB-PWR-WAVE? || Square wave || 0V-3.3V || A-9, A-10? || ~11 Hz || Appears to mirror K4. Duty cycle 66.67%. Low on screen lock. Off until first interaction.&lt;br /&gt;
|-&lt;br /&gt;
| 6 || USB-C V+ || Supply power || || || || support fast charger : &amp;quot;normal mode = 5V+&amp;quot;  &amp;quot;Fast changer = 12V+&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| 7 || Unknown || Power supply? || ~3V-0V || None known || N/A || 0 when usb-c not plugged in, falls slowly on first interaction if USB-C plugged in. Power draw related?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cluster L ===&lt;br /&gt;
&lt;br /&gt;
TODO: Update diagram&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Pad # || Name || Type || Levels || Continuity || Frequency || Comment&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Li-Ion Batt Vdd Mirror || Power Supply || Std. Li-Ion || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Li-Ion Batt Vdd || Battery Input || Std. Li-Ion || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Mirrored Ground? || || || || || Holds steady @ 0, looks like a decoupled isolated ground&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Battery pulse? ||  || || || &amp;lt;1 Hz || Duty cycle ~0%&lt;br /&gt;
|-&lt;br /&gt;
| 6 || GND || || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Balika011</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Switch_System_Flaws&amp;diff=6250</id>
		<title>Switch System Flaws</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Switch_System_Flaws&amp;diff=6250"/>
		<updated>2019-02-19T13:24:22Z</updated>

		<summary type="html">&lt;p&gt;Balika011: Fix broken changes...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exploits are used to execute unofficial code (homebrew) on the Nintendo Switch. This page is a list of publicly known Switch system flaws.&lt;br /&gt;
&lt;br /&gt;
For userland applications/applets flaws see [[Switch_Userland_Flaws|here]]. &lt;br /&gt;
&lt;br /&gt;
= System flaws =&lt;br /&gt;
== Hardware == &lt;br /&gt;
Flaws in this category pertain to the underlying hardware that powers the Switch.&lt;br /&gt;
&lt;br /&gt;
This includes components shared across Tegra based devices such as the [[TSEC]], the [[Security_Engine|Security Engine]], the [[GPU]] and so on.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Fixed with hardware model/revision&lt;br /&gt;
!  Newest hardware model/revision this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Public disclosure timeframe&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| CVE-2018-6242 (leveraged by the ShofEL2 and Fusée Gelée exploits)&lt;br /&gt;
| The USB software stack provided inside the boot instruction rom (IROM/bootROM) contains a copy operation whose length can be controlled by an attacker. By carefully constructing a USB control request, an attacker can leverage this vulnerability to copy the contents of an attacker-controlled buffer over the active execution stack, gaining control of the Boot and Power Management processor (BPMP) before any lock-outs or privilege reductions occur. This execution can then be used to exfiltrate secrets and to load arbitrary code onto the main CPU Complex (CCPLEX) &amp;quot;application processors&amp;quot; at the highest possible level of privilege (typically as the TrustZone Secure Monitor at PL3/EL3).&lt;br /&gt;
| Unknown (Tegra186 and Tegra214)&lt;br /&gt;
| HAC-001 (Tegra210)&lt;br /&gt;
| January 2018&lt;br /&gt;
| April 23, 2018&lt;br /&gt;
| [[User:Shuffle2|shuffle2]] and fail0verflow (originally),&amp;lt;br&amp;gt; [[User:Ktemkin|ktemkin]] and ReSwitched Team (independently),&amp;lt;br&amp;gt; [[User:Naehrwert|naehrwert]] (independently),&amp;lt;br&amp;gt; [[User:Hexkyz|hexkyz]] (independently),&amp;lt;br&amp;gt; st4rk with [[User:Shinyquagsire23|Shiny Quagsire]] and Dazzozo (independently),&amp;lt;br&amp;gt; and many others (independently).&lt;br /&gt;
|-&lt;br /&gt;
| GMMU DMA attack&lt;br /&gt;
| The Switch&#039;s GPU includes a separate MMU (GMMU) that is allowed to bypass the system&#039;s IOMMU (SMMU). By accessing the GPU&#039;s MMIO region and manipulating the page table entries in the GMMU, an attacker can read/write any portion of the DRAM (except memory carveouts).&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Works around this hardware flaw by using memory pool partitioning. You can no longer escalate into sysmodules with GPU DMA because all their memory is allocated using heap that&#039;s carved out.&lt;br /&gt;
| None&lt;br /&gt;
| HAC-001 (Tegra210)&lt;br /&gt;
| Summer 2017&lt;br /&gt;
| December 28, 2017&lt;br /&gt;
| [[User:hexkyz|hexkyz]], [[User:SciresM|SciresM]] and [[User:qlutoo|qlutoo]]&lt;br /&gt;
|-&lt;br /&gt;
| Weak Security Engine context validation&lt;br /&gt;
| The Tegra X1 supports a &amp;quot;deep sleep&amp;quot; feature, where everything but DRAM and the PMC registers lose their content (and the SoC loses power). Upon awaking, the bootrom re-executes, restoring system state. Among these stored states is the Security Engine&#039;s saved state, which uses AES-128-CBC with a random key and all-zeroes IV. However, the bootrom doesn&#039;t perform a MAC on this data, and only validates the last block. This allows one to control most of security engine&#039;s state upon wakeup, if one has a way to modify the encrypted state buffer.&lt;br /&gt;
&lt;br /&gt;
With a way to modify the encrypted state buffer, one can thus dump keys from &amp;quot;write-only&amp;quot; keyslots, etc.&lt;br /&gt;
&lt;br /&gt;
This also bypasses the SBK protection of the bootROM: indeed, at warmboot, bootROM will always clear keyslot 0xE to prevent malicious code from saving the SBK. Moving the SBK to another keyslot in the saved context renders this protection moot.&lt;br /&gt;
| None&lt;br /&gt;
| HAC-001 (Tegra210)&lt;br /&gt;
| December 2017&lt;br /&gt;
| January 20, 2018&lt;br /&gt;
| [[User:SciresM|SciresM]] and [[User:motezazer|motezazer]]&lt;br /&gt;
|-&lt;br /&gt;
| Security Engine keyslots vulnerable to partial overwrite attack&lt;br /&gt;
| &lt;br /&gt;
The Tegra X1 security engine supports writing keyslot data to the engine with syntax as follows: &lt;br /&gt;
&lt;br /&gt;
SECURITY_ENGINE-&amp;gt;AES_KEYTABLE_ADDR = (keyslot &amp;lt;&amp;lt; 4) | (dword_index_in_keyslot); &lt;br /&gt;
&lt;br /&gt;
SECURITY_ENGINE-&amp;gt;AES_KEYTABLE_DATA = readle32(key, dword_index_in_keyslot * 4); &lt;br /&gt;
&lt;br /&gt;
However, the Security Engine flushes writes to the internal key tables immediately when AES_KEYTABLE_DATA is written -- this allows one to overwrite a single dword of a key at a time, and thus brute force the contents of keyslots in time (2^32 * 8) = 2^35 instead of 2^256.&lt;br /&gt;
| None&lt;br /&gt;
| HAC-001 (Tegra210)&lt;br /&gt;
| Theorized Summer 2017 due to suggestive syntax, confirmed April 9, 2018&lt;br /&gt;
| April 9, 2018&lt;br /&gt;
| [[User:SciresM|SciresM]], almost surely others (independently).&lt;br /&gt;
|-&lt;br /&gt;
| Poor validation of bootrom SDRAM configuration parameters leads to arbitrary writes in bootrom&lt;br /&gt;
| &lt;br /&gt;
The Tegra X1 bootrom supports saving SDRAM parameters to scratch registers, and using the saved configuration to enable DRAM during warmboot.&lt;br /&gt;
&lt;br /&gt;
The code that parses these parameters does if (params-&amp;gt;EmcBctSpareN) *params-&amp;gt;EmcBctSpareN = params-&amp;gt;EmcBctSpareNPlusOne for most N, without validating either the address or value written to it.&lt;br /&gt;
There are other arbitrary writes in this code, as well (e.g. BootromPatch parameters intended for patching MISC registers do not check a relative offset to 0x7000000, etc).&lt;br /&gt;
&lt;br /&gt;
This allows a user with access to the PMC registers (via pre-sleep bpmp execution, or otherwise) to gain arbitrary bootrom code execution.&lt;br /&gt;
| None&lt;br /&gt;
| HAC-001 (Tegra210)&lt;br /&gt;
| 2017&lt;br /&gt;
| December 16, 2018&lt;br /&gt;
| Everyone (independently).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Bootloader ===&lt;br /&gt;
Flaws in this category pertain to any bootloader component such as the [[Package1#Package1ldr|package1ldr]], the [[Package1#Section_1|NX bootloader]] or the [[Package1#Section_0|warmboot binary]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Fixed in system version&lt;br /&gt;
!  Last system version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Public disclosure timeframe&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
|  Null-dereference in panic()&lt;br /&gt;
|  The Switch&#039;s stage 1 bootloader, on panic(), clears the stack and then attempts to clear the Security Engine. However, it does so by dereferencing a pointer to the SE in .bss (initially NULL), and this pointer doesn&#039;t get initialized until partway into the bootloader&#039;s main() after several functions that might panic() are called. Thus, a panic() caused prior to SE initialization would result in the SE pointer still being NULL when dereferenced. &lt;br /&gt;
The BPMP doesn&#039;t have an active MPU and the bus won&#039;t data abort on an invalid address, so no exception will be entered: it&#039;ll end up overwriting some exception vectors with NULL before halting.&lt;br /&gt;
&lt;br /&gt;
In 3.0.0, this was fixed by moving the security engine initialization earlier in main(), before the first function that could potentially panic().&lt;br /&gt;
|  Some exception vectors overwritten with NULL, before SBK/other keyslots are cleared. Probably useless for anything more interesting.&lt;br /&gt;
|  [[3.0.0]]&lt;br /&gt;
|  [[3.0.0]]&lt;br /&gt;
|  Early July, 2017&lt;br /&gt;
|  July 30, 2017&lt;br /&gt;
|  Everyone who diff&#039;d 2.3.0 and 3.0.0 Package1&lt;br /&gt;
|-&lt;br /&gt;
|  FUSE_DIS_PGM not written by package1 &lt;br /&gt;
|  The switch&#039;s hardware fuse driver contains a write-once bit in a register called &amp;quot;FUSE_DIS_PGM&amp;quot;, which disables burning fuses until the next reboot. While Nintendo&#039;s bootloader code for waking up from sleep writes this on all firmware, the actual package1 initial bootloader forgets to write to it on cold reboot. &lt;br /&gt;
&lt;br /&gt;
This isn&#039;t too big of a problem because another fuse is burnt on retail devices (production mode), which prevents burning *all* fuses other than ODM_RESERVED ones in hardware.&lt;br /&gt;
&lt;br /&gt;
This was fixed in 3.0.0 by writing to the register on cold boot (although the write happens in TZ instead of package1 where it should take place, possibly to obfuscate the fact that they made this mistake).&lt;br /&gt;
|  Burning arbitrary ODM reserved fuses with TZ code execution, which should never be possible for non-bootloader code.&lt;br /&gt;
&lt;br /&gt;
Warning: one could irreparably brick one&#039;s console by playing with this.&lt;br /&gt;
|  [[3.0.0]]&lt;br /&gt;
|  [[3.0.0]]&lt;br /&gt;
|  Late summer/early fall 2017&lt;br /&gt;
|  December 31, 2017&lt;br /&gt;
|  [[User:SciresM|SciresM]], [[User:motezazer|motezazer]]&lt;br /&gt;
|-&lt;br /&gt;
|  TSEC firmware compromises itself&lt;br /&gt;
|  Package1ldr loads a firmware blob into TSEC early on boot. This piece of code runs on the TSEC in Authenticated Mode and has the sole purpose of generating the per-console TSEC key (see [[Cryptosystem]]).&lt;br /&gt;
&lt;br /&gt;
As a way to mitigate attacks, the TSEC firmware blob is split into 3 stages: [[TSEC#Stage_0|Stage 0]] which is unencrypted and unsigned, [[TSEC#Stage_1|Stage 1]] which is unencrypted but signed and [[TSEC#Stage_2|Stage 2]] which is encrypted and signed.&lt;br /&gt;
Stage 0 loads a static pre-generated signature into the Falcon&#039;s CPU crypto registers, loads Stage 1 into the Falcon&#039;s CODE region and jumps to it. Execution will proceed into Stage 1 in Authenticated Mode if, and only if, the loaded signature matches the one Falcon calculates internally for Stage 1.&lt;br /&gt;
&lt;br /&gt;
Among various things, Stage 1 will attempt to do a &amp;quot;backwards&amp;quot; security check by calculating a CMAC over Stage 0 and comparing it with a known hash stored in the TSEC firmware&#039;s key data (a small buffer stored after Stage 0&#039;s code). If the hashes don&#039;t match, execution aborts.&lt;br /&gt;
&lt;br /&gt;
Stage 1 stores the calculated Stage 0&#039;s CMAC in the stack, but forgets to clear it. Since the stack is located in Falcon&#039;s DATA region, loading the TSEC firmware blob and dumping the DATA region afterwards (via MMIO) will reveal the calculated hash.&lt;br /&gt;
This allows using Stage 1 as an oracle to generate a valid CMAC for arbitrary Stage 0 code. Replacing the CMAC in the TSEC firmware&#039;s key data region results in Stage 1 accepting any Stage 0 code, thus rendering this security measure useless.&lt;br /&gt;
&lt;br /&gt;
Additionally, since signed Falcon code can&#039;t be revoked without an hardware revision, an attacker can always reuse the flawed Stage 1 code even if a fix is issued.&lt;br /&gt;
|  Running TSEC firmware&#039;s Stage 1 in a user controlled environment. Mostly useless, but may aid in side-channel attacks.&lt;br /&gt;
|  None&lt;br /&gt;
|  [[5.0.2]]&lt;br /&gt;
|  January 2018&lt;br /&gt;
|  April 29, 2018&lt;br /&gt;
|  [[User:Hexkyz|hexkyz]], probably others.&lt;br /&gt;
|-&lt;br /&gt;
|  pk1ldrhax&lt;br /&gt;
|  Package1ldr decrypts and verifies the keyblob inside of the current BCT in order to get the package1 key, and then uses the package1 key to decrypt package1. It then validates package1 before jumping to it by checking the PK11 magic number, and that the section sizes sum to the expected size (and are individually less than the expected size). &lt;br /&gt;
&lt;br /&gt;
However, package1ldr does not actually validate the package1 key against a fixed vector (much like kernel9loader forgot to do so on the 3ds). This would normally not matter, as keyblobs are validated -- however, with bootrom code execution one can dump SBK and forge keyblobs, and thus control the package1 key. &lt;br /&gt;
&lt;br /&gt;
Thus (&#039;&#039;&#039;in theory, but not in practice due to the size of the brute force required&#039;&#039;&#039;) one can replace the package1 key with garbage, causing package1 to decrypt into garbage, and hope that this garbage passes validation checks and that package1ldr jumping into the garbage will do something useful.&lt;br /&gt;
&lt;br /&gt;
This was fixed incidentally in [[6.2.0]], as pk1ldr does not use keyblob data to decrypt package1 any more.&lt;br /&gt;
&lt;br /&gt;
|  With a large enough brute force: arbitrary package1 code execution from coldboot.&lt;br /&gt;
&lt;br /&gt;
However, a usable brute force is on the order of &amp;gt;= ~2^80, so &#039;&#039;&#039;this is almost certainly not actually usable in any meaningful context&#039;&#039;&#039;.&lt;br /&gt;
|  [[6.2.0]]&lt;br /&gt;
|  [[6.2.0]]&lt;br /&gt;
|  Early 2017 (as soon as plaintext package1ldr was first dumped)&lt;br /&gt;
|  November 20, 2018&lt;br /&gt;
|  Everyone&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TrustZone ===&lt;br /&gt;
Flaws in this category pertain exclusively to the [[Package1#Section_2|Secure Monitor]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Fixed in system version&lt;br /&gt;
!  Last system version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Public disclosure timeframe&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
|  Non-atomic mutexes&lt;br /&gt;
|  When an [[SMC]] is called, TrustZone sets a global variable to mark that an SMC is in progress, so that two SMCs using shared resources (like the security engine) do not trample on one another. On 1.0.0, this global variable was written using non-atomic writes, and thus a race condition is possible.&lt;br /&gt;
&lt;br /&gt;
However, the SMC handler enforces that all SMCs must be called from core #3, unless the top-level handler ID is 1 (SMCs internal to the kernel). Thus, the only SMCs that can be run side-by-side are [any userland smc] and smcGetRandomBytesForKernel, and this turns out to not really be abusable.&lt;br /&gt;
| Mostly useless. Maybe some oob-write into unused (and thus useless) memory if running smcGetRandomBytesForKernel and smcGetRandomBytesForUser at the same time.&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| December 2017 (Probably earlier by others)&lt;br /&gt;
| January 18, 2018&lt;br /&gt;
| [[User:SciresM|SciresM]], probably others.&lt;br /&gt;
|-&lt;br /&gt;
|  jamais vu (non-secure world access to PMC MMIO and pre-deep sleep firmware)&lt;br /&gt;
|  On [[1.0.0]], one could map in the PMC registers in userland. In addition, [[AM_services|am]] ran a little-kernel based firmware on the BPMP at runtime. With code execution under am, one could modify the BPMP&#039;s little-kernel firmware to hook deep sleep entry, and modify TrustZone/Security engine state. &lt;br /&gt;
&lt;br /&gt;
This was fixed in [[2.0.0]] by making the PMC secure-world only, blacklisting the BPMP&#039;s exception vectors from being mapped, and thoroughly checking for malicious behavior on deep sleep entry.&lt;br /&gt;
|  Arbitrary TrustZone code execution.&lt;br /&gt;
|  [[2.0.0]]&lt;br /&gt;
|  [[2.0.0]]&lt;br /&gt;
|  December, 2017&lt;br /&gt;
|  January 20, 2018&lt;br /&gt;
|  [[User:SciresM|SciresM]] and [[User:motezazer|motezazer]]&lt;br /&gt;
|-&lt;br /&gt;
|  Missed BPMP Exception Vector Writes&lt;br /&gt;
|  Starting in [[2.0.0]], the BPMP is asleep at runtime, and is turned on by TrustZone during [[SMC|smcCpuSuspend]] in order to initiate the deep sleep process. When it does so, it is held in RESET, and TrustZone attempts to write to the BPMP exception vectors at 0x6000F200 to register EVP_RESET = lp0_entry_fw_crt0, and all other EVPs to a function that simply reboots. However, while they successfully write EVP_RESET, they miss all the other vectors, accidentally writing to the 0x6000F004-0x6000F020 region instead of the 0x6000F204-0x6000F220 region they want to write to. This results in all the exception vectors for the BPMP other than RESET being &amp;quot;undefined&amp;quot; (attacker controlled).&lt;br /&gt;
&lt;br /&gt;
With some way of causing an exception vector to be taken at the right time, this would give pre-sleep code execution (and thus arbitrary TrustZone code execution, via the security engine flaw). However, none of the abort vectors are really triggerable, and interrupts are disabled for the BPMP when it is taken out of reset. Thus, this is useless in practice.&lt;br /&gt;
&lt;br /&gt;
This was fixed in [[4.0.0]] by writing to the correct registers.&lt;br /&gt;
|  Theoretically: Arbitrary TrustZone code execution. In practice: Useless.&lt;br /&gt;
|  [[4.0.0]]&lt;br /&gt;
|  [[4.0.0]]&lt;br /&gt;
|  January, 2018&lt;br /&gt;
|  February 23, 2018&lt;br /&gt;
|  [[User:SciresM|SciresM]] and [[User:motezazer|motezazer]], [[User:Naehrwert|naehrwert]], [[User:Hexkyz|hexkyz]], probably others, independently.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Kernel ===&lt;br /&gt;
Flaws in this category pertain exclusively to the [[Package2#Section_0|HorizonOS Kernel]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Fixed in system version&lt;br /&gt;
!  Last system version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Public disclosure timeframe&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Syscall Infoleaks&lt;br /&gt;
| Many syscalls leaked kernel pointers on sad paths (for example svcSetHeapSize and svcQueryMemory), until they landed a bunch of fixes in 2.0.0.&lt;br /&gt;
| Nothing really.&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| svcWaitSynchronization/svcReplyAndReceive bad cleanup on error&lt;br /&gt;
| If there is a page fault when fetching handles from the userspace array, it cleans up by dereferencing all objects despite having only loaded first N. Allows the attacker to make arbitrary decrefs on any kernel synchronization object, and thus can be used to get UAF. Haven&#039;t actually been tried on real HW though, but should work (tm).&lt;br /&gt;
| Kernel code execution&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| &lt;br /&gt;
| 24 April&lt;br /&gt;
| [[User:qlutoo|qlutoo]]&lt;br /&gt;
|-&lt;br /&gt;
| Bad irq_id check in CreateInterruptEvent&lt;br /&gt;
| CreateInterruptEvent syscall is designed to work only for irq_id &amp;gt;= 32. All irq_ids &amp;lt; 32 are &amp;quot;per-core&amp;quot; and reserved for kernel use (watchdog/scheduling/core communications).&lt;br /&gt;
On 1.0.0 you could supply irq_id &amp;lt; 32 and it would write outside the SharedIrqs table.&lt;br /&gt;
| You can register irq&#039;s in the Core3Irqs table, and thus register per-core irqs for core3, that are normally reserved for kernel. Useless.&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| ~October&lt;br /&gt;
| 17 October&lt;br /&gt;
| [[User:qlutoo|qlutoo]]&lt;br /&gt;
|-&lt;br /&gt;
| Kernel .text mapped executable in usermode&lt;br /&gt;
| Prior to [[3.0.2]] the kernel .text was [[Memory_layout|mapped]] in usermode as executable. This can be used for usermode ROP for bypassing ASLR, but SVCs/IPC are not usable by running kernel .text in usermode.&lt;br /&gt;
| Executing kernel .text in usermode&lt;br /&gt;
| [[3.0.2]]&lt;br /&gt;
| [[3.0.2]]&lt;br /&gt;
| &lt;br /&gt;
| 34c3 (December 28, 2017)&lt;br /&gt;
| [[User:qlutoo|qlutoo]]&lt;br /&gt;
|-&lt;br /&gt;
| Memory Controller not properly secured&lt;br /&gt;
| The Switch OS originally had the memory controller not set to be accessible only by the secure-world, which was problematic because insecure access can compromise the kernel.&lt;br /&gt;
&lt;br /&gt;
This was fixed partially in [[2.0.0]] by blacklisting the memory controller from being mapped by user-processes, and was fixed entirely in [[4.0.0]] by making the memory controller TZ-only and making all kernel accesses go through [[SMC|smcReadWriteRegister]].&lt;br /&gt;
| With some way to access the memory controller MMIO, arbitrary kernel code execution.&lt;br /&gt;
| [[4.0.0]]&lt;br /&gt;
| [[4.0.0]]&lt;br /&gt;
| January 2018&lt;br /&gt;
| January 2018&lt;br /&gt;
| [[User:SciresM|SciresM]], [[User:Yellows8|yellows8]]&lt;br /&gt;
|-&lt;br /&gt;
| Potential [[SVC|svcWaitForAddress]] thread use-after-free&lt;br /&gt;
| Between [[4.0.0]], where svcWaitForAddress was introduced, and [[7.0.0]], there was a second intrusive rbtree node in KThread for the WaitForAddress tree (the key being (address, priority), sorted lexicographically). Unlike the WaitProcessWideKeyAtomic tree, the kernel forgot to reinsert the WaitForAddress node when the thread&#039;s priority changed (priority inheritance and/or SetPriority), breaking the rbtree invariants; and since the kernel walks through the entire tree to remove intrusive nodes, you could cause threads to stay in the tree even after their deletion.&lt;br /&gt;
&lt;br /&gt;
[[7.0.0]] fixed the issue by using the same intrusive node for both trees. The thread/node knows which tree it is in, and the latter is correctly updated when thread priority changes.&lt;br /&gt;
| It unluckily didn&#039;t look exploitable&lt;br /&gt;
| [[7.0.0]]&lt;br /&gt;
| [[7.0.0]]&lt;br /&gt;
| July 2018&lt;br /&gt;
| February 2019&lt;br /&gt;
| [[User:TuxSH|TuxSH]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FIRM-package System Modules ===&lt;br /&gt;
Flaws in this category pertain to any of the [[Package2#Section_1|built-in system modules]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Fixed in system version&lt;br /&gt;
!  Last system version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Public disclosure timeframe&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Service access control bypass (sm:h, smhax, probably other names)&lt;br /&gt;
| Prior to [[3.0.1]], the &#039;&#039;service manager&#039;&#039; (sm) built-in system module treats a user as though it has full permissions if the user creates a new &amp;quot;sm:&amp;quot; port session but bypasses [[Services_API#Initialize|initialization]]. This is due to the other sm commands skipping the service ACL check for Pids &amp;lt;= 7 (i.e. all kernel bundled modules) and that skipping the initialization command leaves the Pid field uninitialized.&lt;br /&gt;
In [[3.0.1]], sm returns error code 0x415 if [[Services_API#Initialize|Initialize]] has not been called yet.&lt;br /&gt;
| Acquiring, registering, and unregistering arbitrary services&lt;br /&gt;
| [[3.0.1]]&lt;br /&gt;
| [[3.0.1]]&lt;br /&gt;
| May 2017&lt;br /&gt;
| August 17, 2017&lt;br /&gt;
| Everyone&lt;br /&gt;
|-&lt;br /&gt;
| Overly permissive SPL service&lt;br /&gt;
| The concept behind the switch&#039;s [[SMC|Secure Monitor]] is that all cryptographic keydata is located in userspace, but stored as &amp;quot;access keys&amp;quot; encrypted with &amp;quot;keks&amp;quot; that never leave TrustZone. The [[SPL services|spl]] (&amp;quot;security processor liaison&amp;quot;?) service serves as an interface between the rest of the system and the secure monitor. Prior to [[4.0.0]], spl exposed only a single service &amp;quot;spl:&amp;quot;, which provided all TrustZone wrapper functions to all sysmodules with access to it. Thus anyone with access to the spl: service (via smhax or by pwning a sysmodule with access) could do crypto with any access keys they knew. &lt;br /&gt;
&lt;br /&gt;
This was fixed in [[4.0.0]] by splitting spl: into spl:, spl:mig, spl:ssl, spl:es, and spl:fs.&lt;br /&gt;
| Arbitrary spl: crypto with any access keys one knows. For example, one could use the SSL module&#039;s access keys to decrypt their console&#039;s SSL certificate private key without having to pwn the SSL sysmodule.&lt;br /&gt;
| [[4.0.0]]&lt;br /&gt;
| [[4.0.0]]&lt;br /&gt;
| Summer 2017 (after smhax was discovered).&lt;br /&gt;
| December 23, 2017&lt;br /&gt;
| Everyone&lt;br /&gt;
|-&lt;br /&gt;
| Single session services not really single session&lt;br /&gt;
| Several &amp;quot;critical&amp;quot; services (like fsp-ldr, fsp-pr, sm:m, etc) are meant to only ever hold a single session with a specific sysmodule. However, when a sysmodule dies, all its service session handles are released -- and thus killing the holder of a single session handle would allow one (via sm:hax etc) to get access to that service. &lt;br /&gt;
&lt;br /&gt;
This was fixed in [[4.0.0]] by adding a semaphore to these critical single-session services, so that even if one gets access to them an error code will be returned when attempting to use any of their commands.&lt;br /&gt;
| With some way to access these services and kill their session holders (like expLDR): dumping sysmodule code, arbitrary service access, elevated filesystem permissions, etc.&lt;br /&gt;
| [[4.0.0]]&lt;br /&gt;
| [[4.0.0]]&lt;br /&gt;
| May/June 2017 (basically immediately after smhax was discovered)&lt;br /&gt;
| December 30, 2017&lt;br /&gt;
| Everyone&lt;br /&gt;
|-&lt;br /&gt;
| nspwn&lt;br /&gt;
| fsp-ldr command 0 &amp;quot;MountCode&amp;quot; takes in a Content Path (retrieved from NCM by Loader), and returns an IFileSystem for the resulting ExeFS. These content paths, are normally NCAs, but MountCode also supports a number of other formats, including &amp;quot;.nsp&amp;quot; -- which is just a PFS0.&lt;br /&gt;
&lt;br /&gt;
When a path ending in &amp;quot;.nsp&amp;quot; is parsed by MountCode, the PFS0 is treated as a raw ExeFS. Because there is no NCA header, the ACID signatures are not validated -- and because there are no other signatures in a PFS0, this results in no signature checking happening at all.&lt;br /&gt;
&lt;br /&gt;
The actual .nsp handling is eventually done by {content mounting function} called by MountCode and other FS commands.&lt;br /&gt;
&lt;br /&gt;
Thus, by placing an ExeFS (NSOs + &amp;quot;main.npdm&amp;quot;) and setting one&#039;s desired title ID to &amp;quot;@Sdcard:/some_title.nsp&amp;quot; or &amp;quot;@User:/some_title.nsp&amp;quot; etc one can launch arbitrary unsigned code, with arbitrary unsigned NPDMs.&lt;br /&gt;
&lt;br /&gt;
This appears to have been fixed by only allowing .nsp when the input fstype==7 for the internal content-mounting function, returning 0x2EE202 otherwise.&lt;br /&gt;
| With access to &amp;quot;lr&amp;quot;: Arbitrary code execution with full system privileges.&lt;br /&gt;
| [[5.0.0]]&lt;br /&gt;
| [[5.0.0]]&lt;br /&gt;
| Late 2017&lt;br /&gt;
| April 23, 2018&lt;br /&gt;
| Everyone&lt;br /&gt;
|-&lt;br /&gt;
| Single null-byte stack overflow in Loader ContentPath parsing&lt;br /&gt;
| Previously, loader content path parsing looked like this, where path_from_lr was up to 0x300 bytes and not necessarily null-terminated:&lt;br /&gt;
&lt;br /&gt;
  char nca_path[0x300] = {0};&lt;br /&gt;
  strcat(nca_path, path_from_lr);&lt;br /&gt;
  for (int i = 0; nca_path[i]; i++) {&lt;br /&gt;
      if (nca_path[i] == &#039;\\&#039;) { nca_path[i] = &#039;/&#039;); }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Thus, a content path of the maximum length (0x300 bytes) would result in strcat writing a NULL terminator past the end of the nca_path buffer.&lt;br /&gt;
&lt;br /&gt;
This was fixed in [[6.0.0]], the new code looks like this:&lt;br /&gt;
&lt;br /&gt;
  char nca_path[0x300];&lt;br /&gt;
  strncpy(nca_path, path_from_lr, sizeof(nca_path));&lt;br /&gt;
  for (int i = 0; i  &amp;lt; sizeof(nca_path) &amp;amp;&amp;amp; nca_path[i]; i++) {&lt;br /&gt;
      if (nca_path[i] == &#039;\\&#039;) { nca_path[i] = &#039;/&#039;); }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| With access to &amp;quot;lr&amp;quot;: single null-byte stack overflow in Loader. Maybe (but probably not) loader code execution.&lt;br /&gt;
| [[6.0.0]]&lt;br /&gt;
| [[6.0.0]]&lt;br /&gt;
| September 2, 2018&lt;br /&gt;
| September 19, 2018&lt;br /&gt;
| SciresM&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== System Modules ===&lt;br /&gt;
Flaws in this category pertain to any non-built-in system module.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Fixed in system version&lt;br /&gt;
!  Last system version this flaw was checked for&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Public disclosure timeframe&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| Out-of-bounds array read for [[BCAT_Content_Container]] secret-data index&lt;br /&gt;
| The [[BCAT_Content_Container]] secret-data index is not validated at all. This is handled before the RSA-signature(?) is ever used. Since the field is an u8, a total of 0x800-bytes relative to the array start can be accessed.&lt;br /&gt;
This is not useful since the string loaded from this array is only involved with key-generation.&lt;br /&gt;
| &lt;br /&gt;
| Unknown&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| August 4, 2017&lt;br /&gt;
| August 6, 2017&lt;br /&gt;
| [[User: shinyquagsire23|Shiny Quagsire]], [[User:Yellows8|yellows8]] (independently)&lt;br /&gt;
|-&lt;br /&gt;
|  OOB Read in NS system module (pl:utoohax, pl:utonium, maybe other names)&lt;br /&gt;
|  Prior to [[3.0.0]], pl:u (Shared Font services implemented in the NS sysmodule) service commands 1,2,3 took in a signed 32-bit index and returned that index of an array but did not check that index at all. This allowed for an arbitrary read within a 34-bit range (33-bit signed) from NS .bss. In [[3.0.0]], sending out of range indexes causes error code 0x60A to be returned.&lt;br /&gt;
|  Dumping full NS .text, .rodata and .data, infoleak, etc&lt;br /&gt;
|  [[3.0.0]]&lt;br /&gt;
|  [[3.0.0]]&lt;br /&gt;
|  April 2017&lt;br /&gt;
|  On exploit&#039;s fix in [[3.0.0]]&lt;br /&gt;
|  [[User:qlutoo|qlutoo]], ReSwitched Team (independently)&lt;br /&gt;
|-&lt;br /&gt;
| Unchecked domain ID in common IPC code&lt;br /&gt;
| Prior to [[2.0.0]], object IDs in [[IPC_Marshalling#Domain_message|domain messages]] are not bounds checked. This out-of-bounds read could be exploited to brute-force ASLR and get PC control in some services that support domain messages.&lt;br /&gt;
|&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| ~July 2017&lt;br /&gt;
| 20 July 2017‎&lt;br /&gt;
| [[User:hthh|hthh]]&lt;br /&gt;
|-&lt;br /&gt;
| expLDR (sysmodule handle table exhaustion)&lt;br /&gt;
| Most sysmodules share common template code to handle IPC control messages. The command DuplicateSession (type 5 command 2)&#039;s template code will abort() if it fails to duplicate a session&#039;s handle for the requester. Because many sysmodules have limited handle table size (smaller than the browser/other entrypoints), repeatedly requesting to duplicate one&#039;s session will cause the sysmodule to run out of handle table space and abort, causing the service to release all its handles cleanly.&lt;br /&gt;
| Sysmodule crashes.  Most usefully, crashing ldr allows access to fsp-ldr and crashing pm allows access to fsp-pr. Useless after [[4.0.0]], which mitigated a number of single-session service access issues.&lt;br /&gt;
| Unfixed&lt;br /&gt;
| [[4.1.0]]&lt;br /&gt;
| 24 June 2017&lt;br /&gt;
| 8 March 2018&lt;br /&gt;
| [[User:daeken|daeken]]&lt;br /&gt;
|-&lt;br /&gt;
| Transfer Memory leak in nvservices system module&lt;br /&gt;
| The nvservices sysmodule does not clear most of its transfer memory prior to release.&lt;br /&gt;
| The calling process can read key bits of memory, including breaking ASLR (by revealing the image base) and exposing the address of other transfer memory to set up attacks. More details here: [https://daeken.svbtle.com/nintendo-switch-nvservices-info-leak transfermeme (nvservices info leak)] by [[User:daeken|daeken]]&lt;br /&gt;
| [[6.0.0]]&lt;br /&gt;
| [[6.0.0]]&lt;br /&gt;
| June 2017&lt;br /&gt;
| 16 October 2018&lt;br /&gt;
| [[User:qlutoo|qlutoo]] and [[User:hexkyz|hexkyz]],&lt;br /&gt;
[[User:daeken|daeken]] (independently)&lt;br /&gt;
|-&lt;br /&gt;
| OOB write in audio system module&lt;br /&gt;
| Prior to [[2.0.0]], the [[Audio_services#audout:u|AppendAudioOutBuffer]] and [[Audio_services#audin:u|AppendAudioInBuffer]] IPC commands would blindly increment the appended buffers&#039; count while using said count value as an index to where the user data should be copied into. This resulted in an 0x28 bytes, user controlled, out-of-bounds memory write into the [[Audio_services|audio]] sysmodule&#039;s memory space.&lt;br /&gt;
Combined with the [[Audio_services#audout:u|GetReleasedAudioOutBuffer]] or [[Audio_services#audin:u|GetReleasedAudioInBuffer]] commands, this could also be used as an 8 byte infoleak.&lt;br /&gt;
&lt;br /&gt;
In [[2.0.0]], the commands now return error code 0x1099 if the number of unreleased buffers exceeds 0x1F.&lt;br /&gt;
| Code execution under audio sysmodule&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| [[2.0.0]]&lt;br /&gt;
| &lt;br /&gt;
| November 2, 2018&lt;br /&gt;
| [[User:hexkyz|hexkyz]], probably others.&lt;br /&gt;
|-&lt;br /&gt;
| nvhax (memory corruption in nvservices system module)&lt;br /&gt;
| Prior to [[6.2.0]], the [[NV_services|nvservices]] ioctl [[NV_services#.2Fdev.2Fnvhost-ctrl-gpu|NVGPU_GPU_IOCTL_WAIT_FOR_PAUSE]] would take a single &amp;quot;pwarpstate&amp;quot; argument which would be interpreted by nvservices as a memory pointer for writing 2 &amp;quot;warpstate&amp;quot; structs (one for each Streaming Multiprocessor).&lt;br /&gt;
This resulted in nvservices attempting to blindly memcpy into this user supplied address and trigger a crash. However, if paired with an infoleak, this could be used to arbitrarily write 0x30 bytes anywhere in nvservices&#039; memory space.&lt;br /&gt;
Additionally, the &amp;quot;warpstate&amp;quot; struct itself was never initialized, which means nvservices would leak the 0x30 bytes from the stack. By invoking other ioctls it was also possible to partially control the stack contents and achieve a usable arbitrary memory write primitive.&lt;br /&gt;
&lt;br /&gt;
In [[6.2.0]], [[NV_services#.2Fdev.2Fnvhost-ctrl-gpu|NVGPU_GPU_IOCTL_WAIT_FOR_PAUSE]] now takes 2 inline &amp;quot;warpstate&amp;quot; structs instead of a &amp;quot;pwarpstate&amp;quot; pointer, thus effectively avoiding the bad memcpy.&lt;br /&gt;
| Code execution under nvservices sysmodule&lt;br /&gt;
| [[6.2.0]]&lt;br /&gt;
| [[6.2.0]]&lt;br /&gt;
| April 5, 2017&lt;br /&gt;
| November 24, 2018&lt;br /&gt;
| [[User:hexkyz|hexkyz]]&lt;br /&gt;
|-&lt;br /&gt;
| Infoleak in nvservices system module&lt;br /&gt;
| The [[NV_services|nvservices]] ioctl [[NV_services#NVMAP_IOC_ALLOC|NVMAP_IOC_ALLOC]] takes an optional argument &amp;quot;addr&amp;quot; which allows the calling process to pass a pointer to user allocated memory for backing a nvmap object. If &amp;quot;addr&amp;quot; is left as 0, nvservices uses the transfer memory region (donated by the user during initialization) instead, when allocating memory for the nvmap object.&lt;br /&gt;
By design, freeing the nvmap object by calling the ioctl [[NV_services#NVMAP_IOC_FREE|NVMAP_IOC_FREE]] returns, in its &amp;quot;refcount&amp;quot; argument, the user address previously supplied if the reference count reaches 0.&lt;br /&gt;
However, prior to [[6.2.0]], the case where the transfer memory region is used to allocate the nvmap object was not taken into account, thus resulting in [[NV_services#NVMAP_IOC_FREE|NVMAP_IOC_FREE]] leaking back an address from within the transfer memory region mapped in nvservices&#039; memory space.&lt;br /&gt;
&lt;br /&gt;
In [[6.2.0]], [[NV_services#NVMAP_IOC_FREE|NVMAP_IOC_FREE]] no longer returns the address when the transfer memory region is used instead of user supplied memory.&lt;br /&gt;
| Combined with other vulnerabilities: Defeating ASLR in nvservices sysmodule.&lt;br /&gt;
| [[6.2.0]]&lt;br /&gt;
| [[6.2.0]]&lt;br /&gt;
| April 2017&lt;br /&gt;
| November 24, 2018&lt;br /&gt;
| Everyone&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Balika011</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Memory_layout&amp;diff=4985</id>
		<title>Memory layout</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Memory_layout&amp;diff=4985"/>
		<updated>2018-09-09T21:59:57Z</updated>

		<summary type="html">&lt;p&gt;Balika011: /* BIT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Userspace =&lt;br /&gt;
The userspace virtual address space can be either 32 or 36 bits. [2.0.0+] introduced support for 38 bit address spaces.&lt;br /&gt;
&lt;br /&gt;
There are two regions randomized and enforced by the kernel, each one with upper bits random and 2MB-aligned:&lt;br /&gt;
* ReservedHeapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* ReservedMapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* [2.0.0+] NewReservedMapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* [2.0.0+] TlsIoRegion, not available to userspace.&lt;br /&gt;
&lt;br /&gt;
The main binary is placed at an address that is provided to the kernel by Loader via [[SVC#svcCreateProcess]].&lt;br /&gt;
&lt;br /&gt;
Typically on 2.0.0+ systems, the main binary region has randomness in bits 37-21.&lt;br /&gt;
&lt;br /&gt;
For the stack mapping region, the userland randomizes a page-offset where to start inside the region. This adds some additional entropy.&lt;br /&gt;
&lt;br /&gt;
Binaries mapped by RO are mapped randomly everywhere in the entire address space. The base address for each NRO has all bits randomized and are 4K-aligned. This means that typically, on 2.0.0+ systems, bits 37-12 of the NRO base address are random.&lt;br /&gt;
&lt;br /&gt;
For all binaries(main area / NROs), the R-- section is always located immediately after R-X. The RW- section is always located immediately after the R-- section. Hence, there&#039;s no extra randomization / guard-pages for these sections.&lt;br /&gt;
&lt;br /&gt;
On version [[1.0.0]], the initial binaries loaded into memory by the kernel always have the upper 32-bits as all-zero, so there are 6 fewer bits of layout randomization. &lt;br /&gt;
&lt;br /&gt;
Binaries loaded within the main-binary-region are loaded into memory in the following order, immediately after each other, for the binaries which exist in [[ExeFS]]:&lt;br /&gt;
* rtld&lt;br /&gt;
* main&lt;br /&gt;
* subsdk*&lt;br /&gt;
* sdk&lt;br /&gt;
&lt;br /&gt;
== ASLR Implementation ==&lt;br /&gt;
The kernel uses a MT19937 random number generator, seeded by a [[SMC#GetRandomBytes|smcGetRandomBytes]]&lt;br /&gt;
=== 1.0.0 ===&lt;br /&gt;
&lt;br /&gt;
 if (AddressSpaceType == 2) {&lt;br /&gt;
   BaseAddr = 0x80000000; // 64-bit&lt;br /&gt;
   RandomMax = 0x6400;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   BaseAddr = 0x40000000; // 32-bit&lt;br /&gt;
   RandomMax = 0x200;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (AddressSpaceType == 4) {&lt;br /&gt;
   MapRegionSize = 0;&lt;br /&gt;
   HeapRegionSize = 0x80000000;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   MapRegionSize = 0x40000000;&lt;br /&gt;
   HeapRegionSize = 0x40000000;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (EnableAslr) {&lt;br /&gt;
   rnd0 = GetRandomRange(0, RandomMax) &amp;lt;&amp;lt; 21;&lt;br /&gt;
   rnd1 = GetRandomRange(0, RandomMax) &amp;lt;&amp;lt; 21;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   rnd0 = rnd1 = 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 this-&amp;gt;MapBaseAddr = BaseAddr + min(rnd0, rnd1)&lt;br /&gt;
 this-&amp;gt;HeapRegionBaseAddr = this-&amp;gt;MapBaseAddr + MapRegionSize + max(rnd0, rnd1) - min(rnd0, rnd1)&lt;br /&gt;
&lt;br /&gt;
= Kernel =&lt;br /&gt;
For more details, see [[#Notes]]. Here comes a summary.&lt;br /&gt;
&lt;br /&gt;
PXN bit is set in the MMU descriptor for userland code pages. This means that userland code pages are not executable in kernel mode (this is equivalent to SMEP on x86).&lt;br /&gt;
&lt;br /&gt;
For userland pages, the kernel has same access as userland (either both are read-only or both are read-write). It does not have SMAP. The previous rule has one exception: pages that are mapped unreadable in usermode are still forced readable from kernelmode.&lt;br /&gt;
&lt;br /&gt;
KASLR is being used since [[5.0.0]], but not before, with the following pseudocode (might contains some errors):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
DRAM crt0 mapping (ttbr1): offsets DRAM with (rand64ViaSmc() % 0x3FFF0 &amp;lt;&amp;lt; 21), allocates exactly (end - _start) + 1GB.&lt;br /&gt;
This is a &amp;quot;linear&amp;quot; mapping. Permissions are set properly.&lt;br /&gt;
&lt;br /&gt;
KERN_ADDRSPACE       := [VA(_start) : min(0xFFFFFFFFFFE00000 - VA(_start), 0x40000000)]&lt;br /&gt;
DRAM_FROM_SECTION1   := DRAM[0x808cd000:] // 0x808cd000 corresponds to start of section1 (loaded INI1) data, reused later&lt;br /&gt;
&lt;br /&gt;
/* Global Randomize range: 0xFFFFFF8000000000 to 0xFFFFFFFFFFE00000. */&lt;br /&gt;
/*&lt;br /&gt;
    Randomize picks a random integer in ranges, clears as many low bits required,&lt;br /&gt;
    then checks if the address is acceptable, if not it attempts to iterate through page table entries.&lt;br /&gt;
    &lt;br /&gt;
    If it doesn&#039;t find anything, it picks another integer. In case of general failure, the whole operation&lt;br /&gt;
    may be done from the start again (maybe ?).&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Core0 executes this big KASLR function, then powers on the other CPUs (?). */&lt;br /&gt;
MapPartially(RandomizeL1Boundary(DRAM, sizeof(DRAM)) -&amp;gt; DRAM_FROM_SECTION1: offsetof DRAM_FROM_SECTION1,&lt;br /&gt;
&lt;br /&gt;
/* Randomize */&lt;br /&gt;
KERN_ADDRSPACE {&lt;br /&gt;
    Randomize(IOAndInitialStacks, 0x2000000) {&lt;br /&gt;
        Map(Randomize(UartA, 0x1000)) -&amp;gt; UartA,&lt;br /&gt;
        GuardPage,&lt;br /&gt;
        Map(Randomize(Gicd, 0x1000)) -&amp;gt; Gicd,&lt;br /&gt;
        GuardPage,&lt;br /&gt;
        Map(Randomize(Gicc, 0x1000)) -&amp;gt; Gicc,&lt;br /&gt;
        ForEachCore {&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(EntryThreadStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(IdleSchedulerThreadStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(EL1AbortStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    Randomize(KernelStacks, 0xE00000),&lt;br /&gt;
    Map(Randomize(SlabHeaps, 0x7E9000, AFTER(VA(_end)) -&amp;gt; PA(_end)),&lt;br /&gt;
    Randomize(Kip1DecompressionBuffer, 0x8000000), /* 128 MB VA range */&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
Map(RandomizePageBoundary(GuardPage + KCoreContext * 4)) -&amp;gt; NextFreePages(4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC00000-0xFFFFFFFFBFC45FFF || 0x800A0000 || 0x46000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC46000-0xFFFFFFFFBFC48FFF || 0x800E6000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC49000-0xFFFFFFFFBFC4FFFF || 0x800E9000 || 0x7000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFD72000-0xFFFFFFFFBFD72FFF || 0x6000F000 || 0x1000 || 0x60000000000607 || RW- || Exception vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB5000-0xFFFFFFFFBFDB5FFF || 0x60007000 || 0x1000 || 0x60000000000607 || RW- || Flow controller&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB7000-0xFFFFFFFFBFDB7FFF || 0x60004000 || 0x1000 || 0x60000000000607 || RW- || Primary ICTLR&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB9000-0xFFFFFFFFBFDB9FFF || 0x60001000 || 0x1000 || 0x60000000000607 || RW- || Resource Semaphore&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDBB000-0xFFFFFFFFBFDBBFFF || 0x70016000 || 0x2000 || 0x60000000000607 || RW- || ATOMICS&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDBE000-0xFFFFFFFFBFDBEFFF || 0x7000E000 || 0x1000 || 0x60000000000607 || RW- || PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC0000-0xFFFFFFFFBFDC0FFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and reset&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC2000-0xFFFFFFFFBFDC2FFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC4000-0xFFFFFFFFBFDC4FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC6000-0xFFFFFFFFBFDC6FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC8000-0xFFFFFFFFBFDC8FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDCA000-0xFFFFFFFFBFDCBFFF || 0x80060000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDCE000-0xFFFFFFFFBFDCFFFF || 0x80068000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu0)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD2000-0xFFFFFFFFBFDD2FFF || 0x80070000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu0)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD4000-0xFFFFFFFFBFDD5FFF || 0x80062000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD8000-0xFFFFFFFFBFDD9FFF || 0x8006A000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu1)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDDC000-0xFFFFFFFFBFDDCFFF || 0x80071000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu1)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDDE000-0xFFFFFFFFBFDDFFFF || 0x80064000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE2000-0xFFFFFFFFBFDE3FFF || 0x8006C000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu2)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE6000-0xFFFFFFFFBFDE6FFF || 0x80072000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu2)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE8000-0xFFFFFFFFBFDE9FFF || 0x80066000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDEC000-0xFFFFFFFFBFDEDFFF || 0x8006E000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu3)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF0000-0xFFFFFFFFBFDF0FFF || 0x80073000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu3)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFB000-0xFFFFFFFFBFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFD000-0xFFFFFFFFBFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF2000-0xFFFFFFFFBFDF3FFF || 0x80060000+(cpuid*0x2000) || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF6000-0xFFFFFFFFBFDF7FFF || 0x80068000+(cpuid*0x2000) || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (per-core self-mirror)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFF000-0xFFFFFFFFBFDFFFFF || 0x80084000+(cpuid*0x1000) || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (per-core self-mirror)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFE00000000-... || 0x80000000 || ... || 0x60000000000709 || RW- || Raw DRAM access&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC62FFF || 0x800A0000 || 0x63000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC63000-0xFFFFFFF7FFC65FFF || 0x80103000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC66000-0xFFFFFFF7FFC6EFFF || 0x80106000 || 0x9000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC0000-0xFFFFFFF7FFDC0FFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC2000-0xFFFFFFF7FFDC2FFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC4000-0xFFFFFFF7FFDC4FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC6000-0xFFFFFFF7FFDC6FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC8000-0xFFFFFFF7FFDC8FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDCA000-0xFFFFFFF7FFDCAFFF || 0x80060000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDCE000-0xFFFFFFF7FFDCEFFF || 0x80068000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD2000-0xFFFFFFF7FFDD2FFF || 0x80070000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD4000-0xFFFFFFF7FFDD4FFF || 0x80062000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD8000-0xFFFFFFF7FFDD8FFF || 0x8006A000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDDC000-0xFFFFFFF7FFDDCFFF || 0x80071000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDDE000-0xFFFFFFF7FFDDEFFF || 0x80064000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE2000-0xFFFFFFF7FFDE2FFF || 0x8006C000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE6000-0xFFFFFFF7FFDE6FFF || 0x80072000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE8000-0xFFFFFFF7FFDE8FFF || 0x80066000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDEC000-0xFFFFFFF7FFDECFFF || 0x8006E000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDF0000-0xFFFFFFF7FFDF0FFF || 0x80073000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF800000000-... || 0x80000000 || ... || 0x60000000000709 || RW- || Raw DRAM access&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC4AFFF || 0x800A0000 || 0x4B000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC4B000-0xFFFFFFF7FFC4DFFF || 0x800EB000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC4E000-0xFFFFFFF7FFC5AFFF || 0x800EE000 || 0xD000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAC000-0xFFFFFFF7FFDACFFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAE000-0xFFFFFFF7FFDAEFFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB0000-0xFFFFFFF7FFDB0FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB2000-0xFFFFFFF7FFDB2FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB4000-0xFFFFFFF7FFDB4FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC50FFF || 0x800A0000 || 0x51000 || 0x4000000000078B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC51000-0xFFFFFFF7FFC53FFF || 0x800F1000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC54000-0xFFFFFFF7FFC61FFF || 0x800F4000 || 0xE000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAC000-0xFFFFFFF7FFDACFFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAE000-0xFFFFFFF7FFDAEFFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB0000-0xFFFFFFF7FFDB0FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB2000-0xFFFFFFF7FFDB2FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB4000-0xFFFFFFF7FFDB4FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The rest are are mapped to core-specific physaddrs, each one is 0x1000-bytes. Descriptor ORR-value = 0x6000000000070B.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF7000&lt;br /&gt;
| &amp;lt;physaddr from vmem 0xFFFFFFF7FFDF6000&amp;gt; + 0x1000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF3000&lt;br /&gt;
| &amp;lt;physaddr from vmem 0xFFFFFFF7FFDF2000&amp;gt; + 0x1000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF6000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF2000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDFF000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF9000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Secure Monitor =&lt;br /&gt;
&lt;br /&gt;
Unless otherwise mentionned, block descriptors (in our case, the one uses for the DRAM identity mapping) are all ORRed by 0x401 and page descriptors by 0x403.&lt;br /&gt;
  &lt;br /&gt;
== [[1.0.0]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Permissions&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0000000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0002000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Interrupt Controller Physical CPU Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0005000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0007000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0009000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TMR&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0012000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0014000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0016000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| FUSE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0018000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MISC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F001D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Flow controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F001F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0021000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0023000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0025000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0180000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000384&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C3000&lt;br /&gt;
| 0x80010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C2000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C013000&lt;br /&gt;
| 0xB000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F0000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor and ARMv8 init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor exception vectors)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[2.0.0]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Permissions&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| iRAM-C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TMR&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| FUSE (0x7000F800)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MISC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| iRAM-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C5 - SPI 2B-6&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| GPIO-1 - GPIO-8&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C-I2C4&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Exception vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0180000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| iRAM-C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0190000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| iRAM-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C3000&lt;br /&gt;
| 0x80010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C2000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C013000&lt;br /&gt;
| 0xB000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F0000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor and ARMv8 init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| &amp;lt;varies&amp;gt;&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000320&lt;br /&gt;
| &lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor exception vectors)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[5.0.0]] ==&lt;br /&gt;
5.0.0 modified the address map to have separate .text, .rodata, and .rwdata segments, instead of a single RWX segment.&lt;br /&gt;
&lt;br /&gt;
However, the .rodata and .rwdata segments are both (mistakenly?) mapped R-W.&lt;br /&gt;
&lt;br /&gt;
Because the same L3 page is shared for all mappings, this required modifying segment layout significantly to prevent clashes.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| IRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Interrupt Controller Physical CPU&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Timers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Security Engine&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AD000&lt;br /&gt;
| 0x70412000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Undocumented/Not Present (Security Engine for Mariko?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Memory Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Fuse Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MISC Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| BPMP Exception Vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A9000&lt;br /&gt;
| 0x7001C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AB000&lt;br /&gt;
| 0x7001D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0100000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| TZRAM (R-- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0140000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x9000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (R-X .text)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0149000&lt;br /&gt;
| 0x7C01B000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rodata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F014A000&lt;br /&gt;
| 0x7C01C000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rwdata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (RW- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01B0000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (BPMP firmware destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C7000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| DRAM (SE Context Save destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (RWX pk2ldr for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| X&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000723&lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C01D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks, warmboot crt0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L2 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L3 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[6.0.0]] ==&lt;br /&gt;
6.0.0 reduced the .rwdata segment to one page (previously 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| IRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Interrupt Controller Physical CPU&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Timers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Security Engine&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AD000&lt;br /&gt;
| 0x70412000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Undocumented/Not Present (Security Engine for Mariko?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Memory Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Fuse Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MISC Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| BPMP Exception Vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A9000&lt;br /&gt;
| 0x7001C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AB000&lt;br /&gt;
| 0x7001D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0100000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| TZRAM (R-- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0140000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x9000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (R-X .text)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0149000&lt;br /&gt;
| 0x7C01B000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rodata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F014A000&lt;br /&gt;
| 0x7C01C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rwdata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (RW- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01B0000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (BPMP firmware destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C7000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| DRAM (SE Context Save destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (RWX pk2ldr for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| X&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000723&lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C01D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks, warmboot crt0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L2 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L3 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= IRAM =&lt;br /&gt;
== BIT ==&lt;br /&gt;
During boot, the BootROM saves the BCT in IRAM at address 0x40000100. The preceding 0x100 bytes (IRAM memory range from 0x40000000 to 0x40000100) contain a structure called BIT (Boot Info Table) which encapsulates the BCT in IRAM and is initialized by the BootROM as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Field&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
|  0x00&lt;br /&gt;
|  0x04&lt;br /&gt;
|  br_version&lt;br /&gt;
|  Set to 0x00210001 (BOOTDATA_VERSION_T210). &lt;br /&gt;
|-&lt;br /&gt;
|  0x04&lt;br /&gt;
|  0x04&lt;br /&gt;
|  bd_version&lt;br /&gt;
|  Set to 0x00210001 (BOOTDATA_VERSION_T210). &lt;br /&gt;
|-&lt;br /&gt;
|  0x08&lt;br /&gt;
|  0x04&lt;br /&gt;
|  rcm_version&lt;br /&gt;
|  Set to 0x00210001 (BOOTDATA_VERSION_T210). &lt;br /&gt;
|-&lt;br /&gt;
|  0x0C&lt;br /&gt;
|  0x04&lt;br /&gt;
|  boot_type&lt;br /&gt;
|&lt;br /&gt;
 BOOT_TYPE_COLD = 1&lt;br /&gt;
 BOOT_TYPE_RECOVERY = 2&lt;br /&gt;
 BOOT_TYPE_UART = 3&lt;br /&gt;
 BOOT_TYPE_EXIT_RCM = 4&lt;br /&gt;
|-&lt;br /&gt;
|  0x10&lt;br /&gt;
|  0x04&lt;br /&gt;
|  unk0&lt;br /&gt;
|  Set to 0x05 on coldboot. &lt;br /&gt;
|-&lt;br /&gt;
|  0x14&lt;br /&gt;
|  0x04&lt;br /&gt;
|  boot_device_type&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|  0x18&lt;br /&gt;
|  0x04&lt;br /&gt;
|  boot_start_time&lt;br /&gt;
|  Value from TIMERUS_CNTR_1US when the BootROM enters its main function.&lt;br /&gt;
|-&lt;br /&gt;
|  0x1C&lt;br /&gt;
|  0x04&lt;br /&gt;
|  bootrom_lockdown_value&lt;br /&gt;
|  This is the value that gets written into SB_CSR before nvboot. (0x10)&lt;br /&gt;
|-&lt;br /&gt;
|  0x20&lt;br /&gt;
|  0x04&lt;br /&gt;
|  boot_read_bct_time&lt;br /&gt;
|  Time spent reading the BCT.&lt;br /&gt;
|-&lt;br /&gt;
|  0x24&lt;br /&gt;
|  0x04&lt;br /&gt;
|  boot_parse_bootloader_time&lt;br /&gt;
|  Time spent parsing the bootloader info from the BCT.&lt;br /&gt;
|-&lt;br /&gt;
|  0x28&lt;br /&gt;
|  0x04&lt;br /&gt;
|  osc_freq&lt;br /&gt;
|  Value from CLK_RST_CONTROLLER_OSC_CTRL. &lt;br /&gt;
|-&lt;br /&gt;
|  0x2C&lt;br /&gt;
|  0x01&lt;br /&gt;
|  is_boot_device_loaded&lt;br /&gt;
|  Set to 1 after the boot device is initialized.&lt;br /&gt;
|-&lt;br /&gt;
|  0x2D&lt;br /&gt;
|  0x01&lt;br /&gt;
|  is_sdram_configured&lt;br /&gt;
|  Set to 1 after the SDRAM parameters are parsed.&lt;br /&gt;
|-&lt;br /&gt;
|  0x2E&lt;br /&gt;
|  0x01&lt;br /&gt;
|  is_forced_rcm_pmc&lt;br /&gt;
|  Set to 1 if bit 2 was set in APBDEV_PMC_SCRATCH0.&lt;br /&gt;
|-&lt;br /&gt;
|  0x2F&lt;br /&gt;
|  0x01&lt;br /&gt;
|  is_enable_fail_back_pmc&lt;br /&gt;
|  Set to 1 if bit 4 was set in APBDEV_PMC_SCRATCH0.&lt;br /&gt;
|-&lt;br /&gt;
|  0x30&lt;br /&gt;
|  0x02&lt;br /&gt;
|  is_bootloader_version_mismatch&lt;br /&gt;
|  Set to 1 if the bootloaders have different versions in the BCT.&lt;br /&gt;
|-&lt;br /&gt;
|  0x32&lt;br /&gt;
|  0x02&lt;br /&gt;
|  is_bct_valid&lt;br /&gt;
|  Set to 1 if the BCT was parsed successfully.&lt;br /&gt;
|-&lt;br /&gt;
|  0x34&lt;br /&gt;
|  0x04&lt;br /&gt;
|  unk2&lt;br /&gt;
|  &lt;br /&gt;
|-&lt;br /&gt;
|  0x38&lt;br /&gt;
|  0x04&lt;br /&gt;
|  unk3&lt;br /&gt;
|  &lt;br /&gt;
|-&lt;br /&gt;
|  0x3C&lt;br /&gt;
|  0x04&lt;br /&gt;
|  active_bootloader_idx&lt;br /&gt;
|  Value from 0 to 3 that represents which bootloader is active.&lt;br /&gt;
|-&lt;br /&gt;
|  0x40&lt;br /&gt;
|  0x04&lt;br /&gt;
|  bct_start_block&lt;br /&gt;
|  Block number where the BCT was found.&lt;br /&gt;
|-&lt;br /&gt;
|  0x44&lt;br /&gt;
|  0x04&lt;br /&gt;
|  bct_start_page&lt;br /&gt;
|  Page number where the BCT was found.&lt;br /&gt;
|-&lt;br /&gt;
|  0x48&lt;br /&gt;
|  0x04&lt;br /&gt;
|  bct_size&lt;br /&gt;
|  Size of the BCT in IRAM (0x2800). &lt;br /&gt;
|-&lt;br /&gt;
|  0x4C&lt;br /&gt;
|  0x04&lt;br /&gt;
|  bct_ptr&lt;br /&gt;
|  Pointer to the BCT in IRAM (0x40000100). &lt;br /&gt;
|-&lt;br /&gt;
|  0x50&lt;br /&gt;
|  0x18*4&lt;br /&gt;
|  bootloader_headers[4]&lt;br /&gt;
|&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 !  Offset&lt;br /&gt;
 !  Size&lt;br /&gt;
 !  Field&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x00&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  is_active&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  bootloader_start_block&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x08&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  bootloader_start_page&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x0C&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  bootloader_length&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x10&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  bootloader_signed_start&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x14&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  bootloader_signature&lt;br /&gt;
 |}&lt;br /&gt;
|-&lt;br /&gt;
|  0xB0&lt;br /&gt;
|  0x40&lt;br /&gt;
|  boot_device_info&lt;br /&gt;
|  Structure to hold boot device parameters.&lt;br /&gt;
|-&lt;br /&gt;
|  0xF0&lt;br /&gt;
|  0x04&lt;br /&gt;
|  bct_end_ptr&lt;br /&gt;
|  Pointer to the end of the BCT in IRAM (0x40002900).&lt;br /&gt;
|-&lt;br /&gt;
|  0xF4&lt;br /&gt;
|  0x0C&lt;br /&gt;
|  padding&lt;br /&gt;
|  Must be empty.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
== 2.0.0 ==&lt;br /&gt;
  Granule size for TTBR0*_EL1 is 4KB.&lt;br /&gt;
  TTBR0_EL1 vmem starts at vaddr 0x0.&lt;br /&gt;
  vmem end-addr for TTBR1_EL1 is 0xffffffffffffffff. vmem start-addr for TTBR1_EL1 is 0xFFFFFFF000000000.&lt;br /&gt;
  T0SZ = 31. Hence, bit-size of the TTBR0*_EL1 vmem region is 33. (0x0000000200000000)&lt;br /&gt;
  T1SZ = 28. Hence, bit-size of the TTBR1*_EL1 vmem region is 36. (0x0000001000000000)&lt;br /&gt;
  &lt;br /&gt;
  Note: ARM config for TTBR0 is presumably configured for userland later.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Table D4-25 Translation table entry addresses when using the 4KB translation granule&amp;quot;.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Overview of VMSAv8-64 address translation using the 4KB translation granule&amp;quot;.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Table D4-11 TCR.TnSZ values and IA ranges, 4K granule with no concatenation of tables&amp;quot;.&lt;br /&gt;
  Both TTBR*_EL1 use &amp;quot;Initial lookup level&amp;quot; 1. Therefore, the TTBR*_EL1 tables are level1.&lt;br /&gt;
  &lt;br /&gt;
  Due to T*SZ, Stage1/Stage2 translation for the initial table(level1) are the same, except Stage2 uses hard-coded T0SZ.&lt;br /&gt;
  Basically, the table is accessed as: ((u64*)tablebase)[&amp;lt;IA[y:30]&amp;gt;], where y = (37-T*SZ)+26. That is, starting at bit &amp;quot;y&amp;quot; ending(inclusive) at bit30. For TTBR0*_EL1, y = 32, while for TTBR1_EL1 y = 35.&lt;br /&gt;
  Hence, for TTBR0, index=((vaddr&amp;gt;&amp;gt;30) &amp;amp; 0x7), and for TTBR1, index=((vaddr&amp;gt;&amp;gt;30) &amp;amp; 0x3f).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vector Base Address Register (EL1)&amp;quot; = 0xfffffff7ffc50800.&lt;br /&gt;
&lt;br /&gt;
The table for TTBR0 only contains the following:&lt;br /&gt;
* Vmem 0x80000000 is mapped to physmem 0x80000000, using a size loaded from a register. This is only done when: &amp;quot;endaddr = 0x7fffffff + size; if(endaddr &amp;gt;= 0x80000001){...}&amp;quot;&lt;br /&gt;
** The size is loaded from: &amp;quot;(u32 *0x70019050 &amp;amp; 0x3fff) &amp;lt;&amp;lt; 20;&amp;quot;&lt;br /&gt;
** The value written to the MMU-table descriptor is: &amp;quot;physaddr | val | 0x709;&amp;quot;. val is 1&amp;lt;&amp;lt;52 when &amp;quot;tmp&amp;gt;&amp;gt;34&amp;quot; is non-zero and when &amp;quot;if((physaddr &amp;amp; 0x3c0000000) == 0)&amp;quot;, otherwise val=0. tmp=size at the start and increased by 0xffffffffc0000000 each loop iteration. physaddr is increased by 0x40000000 each loop iteration.&lt;br /&gt;
&lt;br /&gt;
TTBR1:&lt;br /&gt;
* vmem 0xFFFFFFF800000000 is mapped to physmem 0x80000000. Similar to above, except tmp=0 due to wrap-around, etc. This also has usermode/kernel XN enabled in the descriptor ORR-value. The chunksize used when increasing addr is 0xfffffff840000000, with another +=0x40000000 separate from the addr cmp for the loop.&lt;br /&gt;
** &amp;quot;endaddr = 0x3fffffff + (&amp;lt;size from above&amp;gt; | 0xfffffff800000000); enaddr = (endaddr &amp;amp; 0xffffffffc0000000)-1; if(endaddr &amp;gt;= 0xfffffff800000001){&amp;lt;map mem&amp;gt;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Initializes level2 pagetable descriptor for vmem 0xFFFFFFF7C0000000. descriptor = 0x3 | physaddr. physaddr is core-specific.&lt;br /&gt;
* Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FFC00000. descriptor = 0x3 | physaddr. physaddr is core-specific.&lt;br /&gt;
* The content of the pagetable for the following level3 mmutables are not initialized in the main mmutable-init func. descriptor = 0x8007c003(0x3 | &amp;lt;physaddr tablebase&amp;gt;). tablebase=0x8007c000.&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FEE00000. physaddr = tablebase + (0x1&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF000000. physaddr = tablebase + (0x2&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF200000. physaddr = tablebase + (0x3&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FFA00000. physaddr = tablebase + (0x7&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FEC00000. physaddr = tablebase.&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF400000. physaddr = tablebase + (0x4&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF600000. physaddr = tablebase + (0x5&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF800000. physaddr = tablebase + (0x6&amp;lt;&amp;lt;12).&lt;/div&gt;</summary>
		<author><name>Balika011</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Memory_layout&amp;diff=4968</id>
		<title>Memory layout</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Memory_layout&amp;diff=4968"/>
		<updated>2018-09-03T19:19:15Z</updated>

		<summary type="html">&lt;p&gt;Balika011: /* BIT, BCT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Userspace =&lt;br /&gt;
The userspace virtual address space can be either 32 or 36 bits. [2.0.0+] introduced support for 38 bit address spaces.&lt;br /&gt;
&lt;br /&gt;
There are two regions randomized and enforced by the kernel, each one with upper bits random and 2MB-aligned:&lt;br /&gt;
* ReservedHeapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* ReservedMapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* [2.0.0+] NewReservedMapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* [2.0.0+] TlsIoRegion, not available to userspace.&lt;br /&gt;
&lt;br /&gt;
The main binary is placed at an address that is provided to the kernel by Loader via [[SVC#svcCreateProcess]].&lt;br /&gt;
&lt;br /&gt;
Typically on 2.0.0+ systems, the main binary region has randomness in bits 37-21.&lt;br /&gt;
&lt;br /&gt;
For the stack mapping region, the userland randomizes a page-offset where to start inside the region. This adds some additional entropy.&lt;br /&gt;
&lt;br /&gt;
Binaries mapped by RO are mapped randomly everywhere in the entire address space. The base address for each NRO has all bits randomized and are 4K-aligned. This means that typically, on 2.0.0+ systems, bits 37-12 of the NRO base address are random.&lt;br /&gt;
&lt;br /&gt;
For all binaries(main area / NROs), the R-- section is always located immediately after R-X. The RW- section is always located immediately after the R-- section. Hence, there&#039;s no extra randomization / guard-pages for these sections.&lt;br /&gt;
&lt;br /&gt;
On version [[1.0.0]], the initial binaries loaded into memory by the kernel always have the upper 32-bits as all-zero, so there are 6 fewer bits of layout randomization. &lt;br /&gt;
&lt;br /&gt;
Binaries loaded within the main-binary-region are loaded into memory in the following order, immediately after each other, for the binaries which exist in [[ExeFS]]:&lt;br /&gt;
* rtld&lt;br /&gt;
* main&lt;br /&gt;
* subsdk*&lt;br /&gt;
* sdk&lt;br /&gt;
&lt;br /&gt;
== ASLR Implementation ==&lt;br /&gt;
The kernel uses a MT19937 random number generator, seeded by a [[SMC#GetRandomBytes|smcGetRandomBytes]]&lt;br /&gt;
=== 1.0.0 ===&lt;br /&gt;
&lt;br /&gt;
 if (AddressSpaceType == 2) {&lt;br /&gt;
   BaseAddr = 0x80000000; // 64-bit&lt;br /&gt;
   RandomMax = 0x6400;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   BaseAddr = 0x40000000; // 32-bit&lt;br /&gt;
   RandomMax = 0x200;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (AddressSpaceType == 4) {&lt;br /&gt;
   MapRegionSize = 0;&lt;br /&gt;
   HeapRegionSize = 0x80000000;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   MapRegionSize = 0x40000000;&lt;br /&gt;
   HeapRegionSize = 0x40000000;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (EnableAslr) {&lt;br /&gt;
   rnd0 = GetRandomRange(0, RandomMax) &amp;lt;&amp;lt; 21;&lt;br /&gt;
   rnd1 = GetRandomRange(0, RandomMax) &amp;lt;&amp;lt; 21;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   rnd0 = rnd1 = 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 this-&amp;gt;MapBaseAddr = BaseAddr + min(rnd0, rnd1)&lt;br /&gt;
 this-&amp;gt;HeapRegionBaseAddr = this-&amp;gt;MapBaseAddr + MapRegionSize + max(rnd0, rnd1) - min(rnd0, rnd1)&lt;br /&gt;
&lt;br /&gt;
= Kernel =&lt;br /&gt;
For more details, see [[#Notes]]. Here comes a summary.&lt;br /&gt;
&lt;br /&gt;
PXN bit is set in the MMU descriptor for userland code pages. This means that userland code pages are not executable in kernel mode (this is equivalent to SMEP on x86).&lt;br /&gt;
&lt;br /&gt;
For userland pages, the kernel has same access as userland (either both are read-only or both are read-write). It does not have SMAP. The previous rule has one exception: pages that are mapped unreadable in usermode are still forced readable from kernelmode.&lt;br /&gt;
&lt;br /&gt;
KASLR is being used since [[5.0.0]], but not before, with the following pseudocode (might contains some errors):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
DRAM crt0 mapping (ttbr1): offsets DRAM with (rand64ViaSmc() % 0x3FFF0 &amp;lt;&amp;lt; 21), allocates exactly (end - _start) + 1GB.&lt;br /&gt;
This is a &amp;quot;linear&amp;quot; mapping. Permissions are set properly.&lt;br /&gt;
&lt;br /&gt;
KERN_ADDRSPACE       := [VA(_start) : min(0xFFFFFFFFFFE00000 - VA(_start), 0x40000000)]&lt;br /&gt;
DRAM_FROM_SECTION1   := DRAM[0x808cd000:] // 0x808cd000 corresponds to start of section1 (loaded INI1) data, reused later&lt;br /&gt;
&lt;br /&gt;
/* Global Randomize range: 0xFFFFFF8000000000 to 0xFFFFFFFFFFE00000. */&lt;br /&gt;
/*&lt;br /&gt;
    Randomize picks a random integer in ranges, clears as many low bits required,&lt;br /&gt;
    then checks if the address is acceptable, if not it attempts to iterate through page table entries.&lt;br /&gt;
    &lt;br /&gt;
    If it doesn&#039;t find anything, it picks another integer. In case of general failure, the whole operation&lt;br /&gt;
    may be done from the start again (maybe ?).&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Core0 executes this big KASLR function, then powers on the other CPUs (?). */&lt;br /&gt;
MapPartially(RandomizeL1Boundary(DRAM, sizeof(DRAM)) -&amp;gt; DRAM_FROM_SECTION1: offsetof DRAM_FROM_SECTION1,&lt;br /&gt;
&lt;br /&gt;
/* Randomize */&lt;br /&gt;
KERN_ADDRSPACE {&lt;br /&gt;
    Randomize(IOAndInitialStacks, 0x2000000) {&lt;br /&gt;
        Map(Randomize(UartA, 0x1000)) -&amp;gt; UartA,&lt;br /&gt;
        GuardPage,&lt;br /&gt;
        Map(Randomize(Gicd, 0x1000)) -&amp;gt; Gicd,&lt;br /&gt;
        GuardPage,&lt;br /&gt;
        Map(Randomize(Gicc, 0x1000)) -&amp;gt; Gicc,&lt;br /&gt;
        ForEachCore {&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(EntryThreadStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(IdleSchedulerThreadStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(EL1AbortStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    Randomize(KernelStacks, 0xE00000),&lt;br /&gt;
    Map(Randomize(SlabHeaps, 0x7E9000, AFTER(VA(_end)) -&amp;gt; PA(_end)),&lt;br /&gt;
    Randomize(Kip1DecompressionBuffer, 0x8000000), /* 128 MB VA range */&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
Map(RandomizePageBoundary(GuardPage + KCoreContext * 4)) -&amp;gt; NextFreePages(4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC00000-0xFFFFFFFFBFC45FFF || 0x800A0000 || 0x46000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC46000-0xFFFFFFFFBFC48FFF || 0x800E6000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC49000-0xFFFFFFFFBFC4FFFF || 0x800E9000 || 0x7000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFD72000-0xFFFFFFFFBFD72FFF || 0x6000F000 || 0x1000 || 0x60000000000607 || RW- || Exception vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB5000-0xFFFFFFFFBFDB5FFF || 0x60007000 || 0x1000 || 0x60000000000607 || RW- || Flow controller&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB7000-0xFFFFFFFFBFDB7FFF || 0x60004000 || 0x1000 || 0x60000000000607 || RW- || Primary ICTLR&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB9000-0xFFFFFFFFBFDB9FFF || 0x60001000 || 0x1000 || 0x60000000000607 || RW- || Resource Semaphore&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDBB000-0xFFFFFFFFBFDBBFFF || 0x70016000 || 0x2000 || 0x60000000000607 || RW- || ATOMICS&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDBE000-0xFFFFFFFFBFDBEFFF || 0x7000E000 || 0x1000 || 0x60000000000607 || RW- || PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC0000-0xFFFFFFFFBFDC0FFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and reset&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC2000-0xFFFFFFFFBFDC2FFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC4000-0xFFFFFFFFBFDC4FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC6000-0xFFFFFFFFBFDC6FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC8000-0xFFFFFFFFBFDC8FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDCA000-0xFFFFFFFFBFDCBFFF || 0x80060000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDCE000-0xFFFFFFFFBFDCFFFF || 0x80068000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu0)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD2000-0xFFFFFFFFBFDD2FFF || 0x80070000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu0)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD4000-0xFFFFFFFFBFDD5FFF || 0x80062000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD8000-0xFFFFFFFFBFDD9FFF || 0x8006A000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu1)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDDC000-0xFFFFFFFFBFDDCFFF || 0x80071000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu1)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDDE000-0xFFFFFFFFBFDDFFFF || 0x80064000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE2000-0xFFFFFFFFBFDE3FFF || 0x8006C000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu2)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE6000-0xFFFFFFFFBFDE6FFF || 0x80072000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu2)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE8000-0xFFFFFFFFBFDE9FFF || 0x80066000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDEC000-0xFFFFFFFFBFDEDFFF || 0x8006E000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu3)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF0000-0xFFFFFFFFBFDF0FFF || 0x80073000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu3)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFB000-0xFFFFFFFFBFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFD000-0xFFFFFFFFBFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF2000-0xFFFFFFFFBFDF3FFF || 0x80060000+(cpuid*0x2000) || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF6000-0xFFFFFFFFBFDF7FFF || 0x80068000+(cpuid*0x2000) || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (per-core self-mirror)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFF000-0xFFFFFFFFBFDFFFFF || 0x80084000+(cpuid*0x1000) || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (per-core self-mirror)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFE00000000-... || 0x80000000 || ... || 0x60000000000709 || RW- || Raw DRAM access&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC62FFF || 0x800A0000 || 0x63000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC63000-0xFFFFFFF7FFC65FFF || 0x80103000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC66000-0xFFFFFFF7FFC6EFFF || 0x80106000 || 0x9000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC0000-0xFFFFFFF7FFDC0FFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC2000-0xFFFFFFF7FFDC2FFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC4000-0xFFFFFFF7FFDC4FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC6000-0xFFFFFFF7FFDC6FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC8000-0xFFFFFFF7FFDC8FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDCA000-0xFFFFFFF7FFDCAFFF || 0x80060000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDCE000-0xFFFFFFF7FFDCEFFF || 0x80068000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD2000-0xFFFFFFF7FFDD2FFF || 0x80070000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD4000-0xFFFFFFF7FFDD4FFF || 0x80062000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD8000-0xFFFFFFF7FFDD8FFF || 0x8006A000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDDC000-0xFFFFFFF7FFDDCFFF || 0x80071000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDDE000-0xFFFFFFF7FFDDEFFF || 0x80064000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE2000-0xFFFFFFF7FFDE2FFF || 0x8006C000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE6000-0xFFFFFFF7FFDE6FFF || 0x80072000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE8000-0xFFFFFFF7FFDE8FFF || 0x80066000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDEC000-0xFFFFFFF7FFDECFFF || 0x8006E000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDF0000-0xFFFFFFF7FFDF0FFF || 0x80073000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF800000000-... || 0x80000000 || ... || 0x60000000000709 || RW- || Raw DRAM access&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC4AFFF || 0x800A0000 || 0x4B000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC4B000-0xFFFFFFF7FFC4DFFF || 0x800EB000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC4E000-0xFFFFFFF7FFC5AFFF || 0x800EE000 || 0xD000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAC000-0xFFFFFFF7FFDACFFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAE000-0xFFFFFFF7FFDAEFFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB0000-0xFFFFFFF7FFDB0FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB2000-0xFFFFFFF7FFDB2FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB4000-0xFFFFFFF7FFDB4FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC50FFF || 0x800A0000 || 0x51000 || 0x4000000000078B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC51000-0xFFFFFFF7FFC53FFF || 0x800F1000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC54000-0xFFFFFFF7FFC61FFF || 0x800F4000 || 0xE000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAC000-0xFFFFFFF7FFDACFFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAE000-0xFFFFFFF7FFDAEFFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB0000-0xFFFFFFF7FFDB0FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB2000-0xFFFFFFF7FFDB2FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB4000-0xFFFFFFF7FFDB4FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The rest are are mapped to core-specific physaddrs, each one is 0x1000-bytes. Descriptor ORR-value = 0x6000000000070B.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF7000&lt;br /&gt;
| &amp;lt;physaddr from vmem 0xFFFFFFF7FFDF6000&amp;gt; + 0x1000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF3000&lt;br /&gt;
| &amp;lt;physaddr from vmem 0xFFFFFFF7FFDF2000&amp;gt; + 0x1000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF6000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF2000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDFF000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF9000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Secure Monitor =&lt;br /&gt;
&lt;br /&gt;
Unless otherwise mentionned, block descriptors (in our case, the one uses for the DRAM identity mapping) are all ORRed by 0x401 and page descriptors by 0x403.&lt;br /&gt;
  &lt;br /&gt;
== [[1.0.0]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Permissions&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0000000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0002000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Interrupt Controller Physical CPU Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0005000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0007000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0009000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TMR&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0012000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0014000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0016000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| FUSE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0018000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MISC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F001D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Flow controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F001F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0021000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0023000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0025000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0180000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000384&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C3000&lt;br /&gt;
| 0x80010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C2000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C013000&lt;br /&gt;
| 0xB000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F0000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor and ARMv8 init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor exception vectors)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[2.0.0]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Permissions&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| iRAM-C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TMR&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| FUSE (0x7000F800)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MISC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| iRAM-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C5 - SPI 2B-6&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| GPIO-1 - GPIO-8&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C-I2C4&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Exception vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0180000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| iRAM-C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0190000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| iRAM-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C3000&lt;br /&gt;
| 0x80010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C2000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C013000&lt;br /&gt;
| 0xB000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F0000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor and ARMv8 init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| &amp;lt;varies&amp;gt;&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000320&lt;br /&gt;
| &lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor exception vectors)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[5.0.0]] ==&lt;br /&gt;
5.0.0 modified the address map to have separate .text, .rodata, and .rwdata segments, instead of a single RWX segment.&lt;br /&gt;
&lt;br /&gt;
However, the .rodata and .rwdata segments are both (mistakenly?) mapped R-W.&lt;br /&gt;
&lt;br /&gt;
Because the same L3 page is shared for all mappings, this required modifying segment layout significantly to prevent clashes.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| IRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Interrupt Controller Physical CPU&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Timers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Security Engine&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AD000&lt;br /&gt;
| 0x70412000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Undocumented/Not Present (Security Engine for Mariko?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Memory Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Fuse Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MISC Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| BPMP Exception Vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A9000&lt;br /&gt;
| 0x7001C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AB000&lt;br /&gt;
| 0x7001D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0100000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| TZRAM (R-- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0140000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x9000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (R-X .text)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0149000&lt;br /&gt;
| 0x7C01B000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rodata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F014A000&lt;br /&gt;
| 0x7C01C000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rwdata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (RW- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01B0000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (BPMP firmware destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C7000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| DRAM (SE Context Save destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (RWX pk2ldr for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| X&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000723&lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C01D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks, warmboot crt0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L2 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L3 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[6.0.0]] ==&lt;br /&gt;
6.0.0 reduced the .rwdata segment to one page (previously 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| IRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Interrupt Controller Physical CPU&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Timers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Security Engine&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AD000&lt;br /&gt;
| 0x70412000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Undocumented/Not Present (Security Engine for Mariko?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Memory Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Fuse Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MISC Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| BPMP Exception Vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A9000&lt;br /&gt;
| 0x7001C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AB000&lt;br /&gt;
| 0x7001D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0100000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| TZRAM (R-- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0140000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x9000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (R-X .text)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0149000&lt;br /&gt;
| 0x7C01B000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rodata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F014A000&lt;br /&gt;
| 0x7C01C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rwdata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (RW- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01B0000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (BPMP firmware destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C7000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| DRAM (SE Context Save destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (RWX pk2ldr for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| X&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000723&lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C01D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks, warmboot crt0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L2 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L3 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= IRAM =&lt;br /&gt;
== [[BIT|BIT]] ==&lt;br /&gt;
When copied to IRAM at address 0x40000000, the BCT has an additional header called Boot Info Table as follows.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Field&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
|  0x00&lt;br /&gt;
|  0x04&lt;br /&gt;
|  unk_version0 &lt;br /&gt;
|&lt;br /&gt;
 0x00210001&lt;br /&gt;
|-&lt;br /&gt;
|  0x04&lt;br /&gt;
|  0x04&lt;br /&gt;
|  unk_version1 &lt;br /&gt;
|&lt;br /&gt;
 0x00210001&lt;br /&gt;
|-&lt;br /&gt;
|  0x08&lt;br /&gt;
|  0x04&lt;br /&gt;
|  unk_version2 &lt;br /&gt;
|&lt;br /&gt;
 0x00210001&lt;br /&gt;
|-&lt;br /&gt;
|  0x0C&lt;br /&gt;
|  0x04&lt;br /&gt;
|  boot_type&lt;br /&gt;
|&lt;br /&gt;
 BOOT_TYPE_COLD = 1&lt;br /&gt;
 BOOT_TYPE_RECOVERY = 2&lt;br /&gt;
 BOOT_TYPE_UART = 3&lt;br /&gt;
 BOOT_TYPE_EXIT_RCM = 4&lt;br /&gt;
|-&lt;br /&gt;
 0x4C: bct_data_addr (address of the actual BCT)&lt;br /&gt;
|-&lt;br /&gt;
|  0x50&lt;br /&gt;
|  0x18*4&lt;br /&gt;
|  bootloader_headers[4]&lt;br /&gt;
|&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 !  Offset&lt;br /&gt;
 !  Size&lt;br /&gt;
 !  Field&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x00&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  is_active&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  start_block&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x08&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  start_page&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x0C&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  length&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x10&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  signed_start&lt;br /&gt;
 |-&lt;br /&gt;
 |  0x14&lt;br /&gt;
 |  0x04&lt;br /&gt;
 |  signature&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
|-&lt;br /&gt;
|  0xB0&lt;br /&gt;
|  0x40&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|  0xF0&lt;br /&gt;
|  0x04&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
  bct_end_addr&lt;br /&gt;
|-&lt;br /&gt;
|  0xF4&lt;br /&gt;
|  0x0C&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
bct_data_addr should pint to a bct that contains the keyblob.&lt;br /&gt;
&lt;br /&gt;
It&#039;s used in key generation in PK1.&lt;br /&gt;
&lt;br /&gt;
PK11 checks boot_type to be cold, if it&#039;s not it panics.&lt;br /&gt;
&lt;br /&gt;
bootloader_headers[0] or bootloader_headers[1] should be set to active. It is also checked by PK11.&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
== 2.0.0 ==&lt;br /&gt;
  Granule size for TTBR0*_EL1 is 4KB.&lt;br /&gt;
  TTBR0_EL1 vmem starts at vaddr 0x0.&lt;br /&gt;
  vmem end-addr for TTBR1_EL1 is 0xffffffffffffffff. vmem start-addr for TTBR1_EL1 is 0xFFFFFFF000000000.&lt;br /&gt;
  T0SZ = 31. Hence, bit-size of the TTBR0*_EL1 vmem region is 33. (0x0000000200000000)&lt;br /&gt;
  T1SZ = 28. Hence, bit-size of the TTBR1*_EL1 vmem region is 36. (0x0000001000000000)&lt;br /&gt;
  &lt;br /&gt;
  Note: ARM config for TTBR0 is presumably configured for userland later.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Table D4-25 Translation table entry addresses when using the 4KB translation granule&amp;quot;.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Overview of VMSAv8-64 address translation using the 4KB translation granule&amp;quot;.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Table D4-11 TCR.TnSZ values and IA ranges, 4K granule with no concatenation of tables&amp;quot;.&lt;br /&gt;
  Both TTBR*_EL1 use &amp;quot;Initial lookup level&amp;quot; 1. Therefore, the TTBR*_EL1 tables are level1.&lt;br /&gt;
  &lt;br /&gt;
  Due to T*SZ, Stage1/Stage2 translation for the initial table(level1) are the same, except Stage2 uses hard-coded T0SZ.&lt;br /&gt;
  Basically, the table is accessed as: ((u64*)tablebase)[&amp;lt;IA[y:30]&amp;gt;], where y = (37-T*SZ)+26. That is, starting at bit &amp;quot;y&amp;quot; ending(inclusive) at bit30. For TTBR0*_EL1, y = 32, while for TTBR1_EL1 y = 35.&lt;br /&gt;
  Hence, for TTBR0, index=((vaddr&amp;gt;&amp;gt;30) &amp;amp; 0x7), and for TTBR1, index=((vaddr&amp;gt;&amp;gt;30) &amp;amp; 0x3f).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vector Base Address Register (EL1)&amp;quot; = 0xfffffff7ffc50800.&lt;br /&gt;
&lt;br /&gt;
The table for TTBR0 only contains the following:&lt;br /&gt;
* Vmem 0x80000000 is mapped to physmem 0x80000000, using a size loaded from a register. This is only done when: &amp;quot;endaddr = 0x7fffffff + size; if(endaddr &amp;gt;= 0x80000001){...}&amp;quot;&lt;br /&gt;
** The size is loaded from: &amp;quot;(u32 *0x70019050 &amp;amp; 0x3fff) &amp;lt;&amp;lt; 20;&amp;quot;&lt;br /&gt;
** The value written to the MMU-table descriptor is: &amp;quot;physaddr | val | 0x709;&amp;quot;. val is 1&amp;lt;&amp;lt;52 when &amp;quot;tmp&amp;gt;&amp;gt;34&amp;quot; is non-zero and when &amp;quot;if((physaddr &amp;amp; 0x3c0000000) == 0)&amp;quot;, otherwise val=0. tmp=size at the start and increased by 0xffffffffc0000000 each loop iteration. physaddr is increased by 0x40000000 each loop iteration.&lt;br /&gt;
&lt;br /&gt;
TTBR1:&lt;br /&gt;
* vmem 0xFFFFFFF800000000 is mapped to physmem 0x80000000. Similar to above, except tmp=0 due to wrap-around, etc. This also has usermode/kernel XN enabled in the descriptor ORR-value. The chunksize used when increasing addr is 0xfffffff840000000, with another +=0x40000000 separate from the addr cmp for the loop.&lt;br /&gt;
** &amp;quot;endaddr = 0x3fffffff + (&amp;lt;size from above&amp;gt; | 0xfffffff800000000); enaddr = (endaddr &amp;amp; 0xffffffffc0000000)-1; if(endaddr &amp;gt;= 0xfffffff800000001){&amp;lt;map mem&amp;gt;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Initializes level2 pagetable descriptor for vmem 0xFFFFFFF7C0000000. descriptor = 0x3 | physaddr. physaddr is core-specific.&lt;br /&gt;
* Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FFC00000. descriptor = 0x3 | physaddr. physaddr is core-specific.&lt;br /&gt;
* The content of the pagetable for the following level3 mmutables are not initialized in the main mmutable-init func. descriptor = 0x8007c003(0x3 | &amp;lt;physaddr tablebase&amp;gt;). tablebase=0x8007c000.&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FEE00000. physaddr = tablebase + (0x1&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF000000. physaddr = tablebase + (0x2&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF200000. physaddr = tablebase + (0x3&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FFA00000. physaddr = tablebase + (0x7&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FEC00000. physaddr = tablebase.&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF400000. physaddr = tablebase + (0x4&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF600000. physaddr = tablebase + (0x5&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF800000. physaddr = tablebase + (0x6&amp;lt;&amp;lt;12).&lt;/div&gt;</summary>
		<author><name>Balika011</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Memory_layout&amp;diff=4967</id>
		<title>Memory layout</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Memory_layout&amp;diff=4967"/>
		<updated>2018-09-03T18:30:37Z</updated>

		<summary type="html">&lt;p&gt;Balika011: /* BCT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Userspace =&lt;br /&gt;
The userspace virtual address space can be either 32 or 36 bits. [2.0.0+] introduced support for 38 bit address spaces.&lt;br /&gt;
&lt;br /&gt;
There are two regions randomized and enforced by the kernel, each one with upper bits random and 2MB-aligned:&lt;br /&gt;
* ReservedHeapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* ReservedMapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* [2.0.0+] NewReservedMapRegion, available from [[SVC#svcGetInfo]].&lt;br /&gt;
* [2.0.0+] TlsIoRegion, not available to userspace.&lt;br /&gt;
&lt;br /&gt;
The main binary is placed at an address that is provided to the kernel by Loader via [[SVC#svcCreateProcess]].&lt;br /&gt;
&lt;br /&gt;
Typically on 2.0.0+ systems, the main binary region has randomness in bits 37-21.&lt;br /&gt;
&lt;br /&gt;
For the stack mapping region, the userland randomizes a page-offset where to start inside the region. This adds some additional entropy.&lt;br /&gt;
&lt;br /&gt;
Binaries mapped by RO are mapped randomly everywhere in the entire address space. The base address for each NRO has all bits randomized and are 4K-aligned. This means that typically, on 2.0.0+ systems, bits 37-12 of the NRO base address are random.&lt;br /&gt;
&lt;br /&gt;
For all binaries(main area / NROs), the R-- section is always located immediately after R-X. The RW- section is always located immediately after the R-- section. Hence, there&#039;s no extra randomization / guard-pages for these sections.&lt;br /&gt;
&lt;br /&gt;
On version [[1.0.0]], the initial binaries loaded into memory by the kernel always have the upper 32-bits as all-zero, so there are 6 fewer bits of layout randomization. &lt;br /&gt;
&lt;br /&gt;
Binaries loaded within the main-binary-region are loaded into memory in the following order, immediately after each other, for the binaries which exist in [[ExeFS]]:&lt;br /&gt;
* rtld&lt;br /&gt;
* main&lt;br /&gt;
* subsdk*&lt;br /&gt;
* sdk&lt;br /&gt;
&lt;br /&gt;
== ASLR Implementation ==&lt;br /&gt;
The kernel uses a MT19937 random number generator, seeded by a [[SMC#GetRandomBytes|smcGetRandomBytes]]&lt;br /&gt;
=== 1.0.0 ===&lt;br /&gt;
&lt;br /&gt;
 if (AddressSpaceType == 2) {&lt;br /&gt;
   BaseAddr = 0x80000000; // 64-bit&lt;br /&gt;
   RandomMax = 0x6400;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   BaseAddr = 0x40000000; // 32-bit&lt;br /&gt;
   RandomMax = 0x200;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (AddressSpaceType == 4) {&lt;br /&gt;
   MapRegionSize = 0;&lt;br /&gt;
   HeapRegionSize = 0x80000000;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   MapRegionSize = 0x40000000;&lt;br /&gt;
   HeapRegionSize = 0x40000000;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (EnableAslr) {&lt;br /&gt;
   rnd0 = GetRandomRange(0, RandomMax) &amp;lt;&amp;lt; 21;&lt;br /&gt;
   rnd1 = GetRandomRange(0, RandomMax) &amp;lt;&amp;lt; 21;&lt;br /&gt;
 }&lt;br /&gt;
 else {&lt;br /&gt;
   rnd0 = rnd1 = 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 this-&amp;gt;MapBaseAddr = BaseAddr + min(rnd0, rnd1)&lt;br /&gt;
 this-&amp;gt;HeapRegionBaseAddr = this-&amp;gt;MapBaseAddr + MapRegionSize + max(rnd0, rnd1) - min(rnd0, rnd1)&lt;br /&gt;
&lt;br /&gt;
= Kernel =&lt;br /&gt;
For more details, see [[#Notes]]. Here comes a summary.&lt;br /&gt;
&lt;br /&gt;
PXN bit is set in the MMU descriptor for userland code pages. This means that userland code pages are not executable in kernel mode (this is equivalent to SMEP on x86).&lt;br /&gt;
&lt;br /&gt;
For userland pages, the kernel has same access as userland (either both are read-only or both are read-write). It does not have SMAP. The previous rule has one exception: pages that are mapped unreadable in usermode are still forced readable from kernelmode.&lt;br /&gt;
&lt;br /&gt;
KASLR is being used since [[5.0.0]], but not before, with the following pseudocode (might contains some errors):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
DRAM crt0 mapping (ttbr1): offsets DRAM with (rand64ViaSmc() % 0x3FFF0 &amp;lt;&amp;lt; 21), allocates exactly (end - _start) + 1GB.&lt;br /&gt;
This is a &amp;quot;linear&amp;quot; mapping. Permissions are set properly.&lt;br /&gt;
&lt;br /&gt;
KERN_ADDRSPACE       := [VA(_start) : min(0xFFFFFFFFFFE00000 - VA(_start), 0x40000000)]&lt;br /&gt;
DRAM_FROM_SECTION1   := DRAM[0x808cd000:] // 0x808cd000 corresponds to start of section1 (loaded INI1) data, reused later&lt;br /&gt;
&lt;br /&gt;
/* Global Randomize range: 0xFFFFFF8000000000 to 0xFFFFFFFFFFE00000. */&lt;br /&gt;
/*&lt;br /&gt;
    Randomize picks a random integer in ranges, clears as many low bits required,&lt;br /&gt;
    then checks if the address is acceptable, if not it attempts to iterate through page table entries.&lt;br /&gt;
    &lt;br /&gt;
    If it doesn&#039;t find anything, it picks another integer. In case of general failure, the whole operation&lt;br /&gt;
    may be done from the start again (maybe ?).&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Core0 executes this big KASLR function, then powers on the other CPUs (?). */&lt;br /&gt;
MapPartially(RandomizeL1Boundary(DRAM, sizeof(DRAM)) -&amp;gt; DRAM_FROM_SECTION1: offsetof DRAM_FROM_SECTION1,&lt;br /&gt;
&lt;br /&gt;
/* Randomize */&lt;br /&gt;
KERN_ADDRSPACE {&lt;br /&gt;
    Randomize(IOAndInitialStacks, 0x2000000) {&lt;br /&gt;
        Map(Randomize(UartA, 0x1000)) -&amp;gt; UartA,&lt;br /&gt;
        GuardPage,&lt;br /&gt;
        Map(Randomize(Gicd, 0x1000)) -&amp;gt; Gicd,&lt;br /&gt;
        GuardPage,&lt;br /&gt;
        Map(Randomize(Gicc, 0x1000)) -&amp;gt; Gicc,&lt;br /&gt;
        ForEachCore {&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(EntryThreadStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(IdleSchedulerThreadStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
            GuardPage,&lt;br /&gt;
            Map(Randomize(EL1AbortStack, 0x1000)) -&amp;gt; NextFreePage(),&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    Randomize(KernelStacks, 0xE00000),&lt;br /&gt;
    Map(Randomize(SlabHeaps, 0x7E9000, AFTER(VA(_end)) -&amp;gt; PA(_end)),&lt;br /&gt;
    Randomize(Kip1DecompressionBuffer, 0x8000000), /* 128 MB VA range */&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
Map(RandomizePageBoundary(GuardPage + KCoreContext * 4)) -&amp;gt; NextFreePages(4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC00000-0xFFFFFFFFBFC45FFF || 0x800A0000 || 0x46000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC46000-0xFFFFFFFFBFC48FFF || 0x800E6000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFC49000-0xFFFFFFFFBFC4FFFF || 0x800E9000 || 0x7000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFD72000-0xFFFFFFFFBFD72FFF || 0x6000F000 || 0x1000 || 0x60000000000607 || RW- || Exception vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB5000-0xFFFFFFFFBFDB5FFF || 0x60007000 || 0x1000 || 0x60000000000607 || RW- || Flow controller&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB7000-0xFFFFFFFFBFDB7FFF || 0x60004000 || 0x1000 || 0x60000000000607 || RW- || Primary ICTLR&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDB9000-0xFFFFFFFFBFDB9FFF || 0x60001000 || 0x1000 || 0x60000000000607 || RW- || Resource Semaphore&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDBB000-0xFFFFFFFFBFDBBFFF || 0x70016000 || 0x2000 || 0x60000000000607 || RW- || ATOMICS&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDBE000-0xFFFFFFFFBFDBEFFF || 0x7000E000 || 0x1000 || 0x60000000000607 || RW- || PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC0000-0xFFFFFFFFBFDC0FFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and reset&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC2000-0xFFFFFFFFBFDC2FFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC4000-0xFFFFFFFFBFDC4FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC6000-0xFFFFFFFFBFDC6FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDC8000-0xFFFFFFFFBFDC8FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDCA000-0xFFFFFFFFBFDCBFFF || 0x80060000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDCE000-0xFFFFFFFFBFDCFFFF || 0x80068000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu0)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD2000-0xFFFFFFFFBFDD2FFF || 0x80070000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu0)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD4000-0xFFFFFFFFBFDD5FFF || 0x80062000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDD8000-0xFFFFFFFFBFDD9FFF || 0x8006A000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu1)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDDC000-0xFFFFFFFFBFDDCFFF || 0x80071000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu1)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDDE000-0xFFFFFFFFBFDDFFFF || 0x80064000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE2000-0xFFFFFFFFBFDE3FFF || 0x8006C000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu2)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE6000-0xFFFFFFFFBFDE6FFF || 0x80072000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu2)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDE8000-0xFFFFFFFFBFDE9FFF || 0x80066000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDEC000-0xFFFFFFFFBFDEDFFF || 0x8006E000 || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (cpu3)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF0000-0xFFFFFFFFBFDF0FFF || 0x80073000 || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (cpu3)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFB000-0xFFFFFFFFBFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFD000-0xFFFFFFFFBFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF2000-0xFFFFFFFFBFDF3FFF || 0x80060000+(cpuid*0x2000) || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDF6000-0xFFFFFFFFBFDF7FFF || 0x80068000+(cpuid*0x2000) || 0x2000 || 0x6000000000070B || RW- || Kernel main stack (per-core self-mirror)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFFBFDFF000-0xFFFFFFFFBFDFFFFF || 0x80084000+(cpuid*0x1000) || 0x1000 || 0x6000000000070B || RW- || Kernel runner stack (per-core self-mirror)&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFFE00000000-... || 0x80000000 || ... || 0x60000000000709 || RW- || Raw DRAM access&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC62FFF || 0x800A0000 || 0x63000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC63000-0xFFFFFFF7FFC65FFF || 0x80103000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC66000-0xFFFFFFF7FFC6EFFF || 0x80106000 || 0x9000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC0000-0xFFFFFFF7FFDC0FFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC2000-0xFFFFFFF7FFDC2FFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC4000-0xFFFFFFF7FFDC4FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC6000-0xFFFFFFF7FFDC6FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDC8000-0xFFFFFFF7FFDC8FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDCA000-0xFFFFFFF7FFDCAFFF || 0x80060000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDCE000-0xFFFFFFF7FFDCEFFF || 0x80068000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD2000-0xFFFFFFF7FFDD2FFF || 0x80070000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD4000-0xFFFFFFF7FFDD4FFF || 0x80062000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDD8000-0xFFFFFFF7FFDD8FFF || 0x8006A000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDDC000-0xFFFFFFF7FFDDCFFF || 0x80071000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDDE000-0xFFFFFFF7FFDDEFFF || 0x80064000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE2000-0xFFFFFFF7FFDE2FFF || 0x8006C000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE6000-0xFFFFFFF7FFDE6FFF || 0x80072000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDE8000-0xFFFFFFF7FFDE8FFF || 0x80066000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDEC000-0xFFFFFFF7FFDECFFF || 0x8006E000 || 0x2000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDF0000-0xFFFFFFF7FFDF0FFF || 0x80073000 || 0x1000 || 0x6000000000070B || RW- ||&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF800000000-... || 0x80000000 || ... || 0x60000000000709 || RW- || Raw DRAM access&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC4AFFF || 0x800A0000 || 0x4B000 || 0x78B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC4B000-0xFFFFFFF7FFC4DFFF || 0x800EB000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC4E000-0xFFFFFFF7FFC5AFFF || 0x800EE000 || 0xD000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAC000-0xFFFFFFF7FFDACFFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAE000-0xFFFFFFF7FFDAEFFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB0000-0xFFFFFFF7FFDB0FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB2000-0xFFFFFFF7FFDB2FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB4000-0xFFFFFFF7FFDB4FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4.0.0 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cores || Virtual || Physical || Size || Attributes || Permissions || Description&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC00000-0xFFFFFFF7FFC50FFF || 0x800A0000 || 0x51000 || 0x4000000000078B || R-X || Kernel .text&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC51000-0xFFFFFFF7FFC53FFF || 0x800F1000 || 0x3000 || 0x6000000000078B || R-- || Kernel .rodata&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFC54000-0xFFFFFFF7FFC61FFF || 0x800F4000 || 0xE000 || 0x6000000000070B || RW- || Kernel .data+.bss&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAC000-0xFFFFFFF7FFDACFFF || 0x60006000 || 0x1000 || 0x60000000000607 || RW- || Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDAE000-0xFFFFFFF7FFDAEFFF || 0x7001D000 || 0x1000 || 0x60000000000607 || RW- || MC1&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB0000-0xFFFFFFF7FFDB0FFF || 0x7001C000 || 0x1000 || 0x60000000000607 || RW- || MC0&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB2000-0xFFFFFFF7FFDB2FFF || 0x70019000 || 0x1000 || 0x60000000000607 || RW- || MC&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDB4000-0xFFFFFFF7FFDB4FFF || 0x70006000 || 0x1000 || 0x60000000000607 || RW- || UART-A&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFB000-0xFFFFFFF7FFDFBFFF || 0x50041000 || 0x1000 || 0x60000000000607 || RW- || ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| All || 0xFFFFFFF7FFDFD000-0xFFFFFFF7FFDFDFFF || 0x50042000 || 0x1000 || 0x60000000000607 || RW- || Interrupt Controller Physical CPU interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The rest are are mapped to core-specific physaddrs, each one is 0x1000-bytes. Descriptor ORR-value = 0x6000000000070B.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF7000&lt;br /&gt;
| &amp;lt;physaddr from vmem 0xFFFFFFF7FFDF6000&amp;gt; + 0x1000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF3000&lt;br /&gt;
| &amp;lt;physaddr from vmem 0xFFFFFFF7FFDF2000&amp;gt; + 0x1000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF6000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF2000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDFF000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFFFFF7FFDF9000&lt;br /&gt;
| 0x800XX000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Secure Monitor =&lt;br /&gt;
&lt;br /&gt;
Unless otherwise mentionned, block descriptors (in our case, the one uses for the DRAM identity mapping) are all ORRed by 0x401 and page descriptors by 0x403.&lt;br /&gt;
  &lt;br /&gt;
== [[1.0.0]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Permissions&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0000000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0002000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Interrupt Controller Physical CPU Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0005000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0007000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0009000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TMR&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0012000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0014000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0016000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| FUSE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0018000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MISC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F001D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Flow controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F001F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0021000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0023000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0025000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0180000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000384&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C3000&lt;br /&gt;
| 0x80010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C2000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C013000&lt;br /&gt;
| 0xB000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F0000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor and ARMv8 init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor exception vectors)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[2.0.0]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Permissions&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| iRAM-C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Interrupt Controller Physical CPU interface&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| TMR&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| FUSE (0x7000F800)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| MISC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| iRAM-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C5 - SPI 2B-6&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| GPIO-1 - GPIO-8&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| I2C-I2C4&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| &lt;br /&gt;
| Exception vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0180000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| iRAM-C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0190000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| iRAM-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C3000&lt;br /&gt;
| 0x80010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C2000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| &lt;br /&gt;
| EMEM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C013000&lt;br /&gt;
| 0xB000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F0000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor and ARMv8 init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| &amp;lt;varies&amp;gt;&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000320&lt;br /&gt;
| &lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM (Secure Monitor exception vectors)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| &lt;br /&gt;
| TZRAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[5.0.0]] ==&lt;br /&gt;
5.0.0 modified the address map to have separate .text, .rodata, and .rwdata segments, instead of a single RWX segment.&lt;br /&gt;
&lt;br /&gt;
However, the .rodata and .rwdata segments are both (mistakenly?) mapped R-W.&lt;br /&gt;
&lt;br /&gt;
Because the same L3 page is shared for all mappings, this required modifying segment layout significantly to prevent clashes.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| IRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Interrupt Controller Physical CPU&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Timers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Security Engine&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AD000&lt;br /&gt;
| 0x70412000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Undocumented/Not Present (Security Engine for Mariko?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Memory Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Fuse Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MISC Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| BPMP Exception Vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A9000&lt;br /&gt;
| 0x7001C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AB000&lt;br /&gt;
| 0x7001D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0100000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| TZRAM (R-- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0140000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x9000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (R-X .text)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0149000&lt;br /&gt;
| 0x7C01B000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rodata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F014A000&lt;br /&gt;
| 0x7C01C000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rwdata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (RW- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01B0000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (BPMP firmware destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C7000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| DRAM (SE Context Save destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (RWX pk2ldr for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| X&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000723&lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C01D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks, warmboot crt0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L2 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L3 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[6.0.0]] ==&lt;br /&gt;
6.0.0 reduced the .rwdata segment to one page (previously 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vmem&lt;br /&gt;
! Physmem&lt;br /&gt;
! Size&lt;br /&gt;
! Descriptor ORR-value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x20000&lt;br /&gt;
| 0x300&lt;br /&gt;
| IRAM Identity RWX (for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0080000&lt;br /&gt;
| 0x50041000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| ARM Interrupt Distributor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0082000&lt;br /&gt;
| 0x50042000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Interrupt Controller Physical CPU&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0085000&lt;br /&gt;
| 0x70006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| UART-A&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0087000&lt;br /&gt;
| 0x60006000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| Clock and Reset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0089000&lt;br /&gt;
| 0x7000E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| PMC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008B000&lt;br /&gt;
| 0x60005000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Timers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008D000&lt;br /&gt;
| 0x6000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| System Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F008F000&lt;br /&gt;
| 0x70012000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Security Engine&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AD000&lt;br /&gt;
| 0x70412000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Undocumented/Not Present (Security Engine for Mariko?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0092000&lt;br /&gt;
| 0x700F0000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| SYSCTR0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0094000&lt;br /&gt;
| 0x70019000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Memory Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0096000&lt;br /&gt;
| 0x7000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Fuse Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0098000&lt;br /&gt;
| 0x70000000&lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MISC Registers&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009D000&lt;br /&gt;
| 0x60007000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| Flow Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F009F000&lt;br /&gt;
| 0x40002000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| IRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A1000&lt;br /&gt;
| 0x7000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C-5&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A3000&lt;br /&gt;
| 0x6000D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| GPIO-1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A5000&lt;br /&gt;
| 0x7000C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| I2C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A7000&lt;br /&gt;
| 0x6000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| BPMP Exception Vectors&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00A9000&lt;br /&gt;
| 0x7001C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC0&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F00AB000&lt;br /&gt;
| 0x7001D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000304&lt;br /&gt;
| MC1&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0100000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000380&lt;br /&gt;
| TZRAM (R-- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0140000&lt;br /&gt;
| 0x7C012000&lt;br /&gt;
| 0x9000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (R-X .text)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F0149000&lt;br /&gt;
| 0x7C01B000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rodata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F014A000&lt;br /&gt;
| 0x7C01C000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (RW- .rwdata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01A0000&lt;br /&gt;
| 0x40020000&lt;br /&gt;
| 0x10000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (RW- for context save)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01B0000&lt;br /&gt;
| 0x40003000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| IRAM (BPMP firmware destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01C7000&lt;br /&gt;
| 0x8000F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000324&lt;br /&gt;
| DRAM (SE Context Save destination)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01E0000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x2000&lt;br /&gt;
| 0x300&lt;br /&gt;
| TZRAM (RWX pk2ldr for init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F4000&lt;br /&gt;
| X&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000723&lt;br /&gt;
| DRAM (SPL .bss buffer visible to the Security Engine)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F6000&lt;br /&gt;
| 0x7C010000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01F8000&lt;br /&gt;
| 0x7C011000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FA000&lt;br /&gt;
| 0x7C01D000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (stacks, warmboot crt0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FC000&lt;br /&gt;
| 0x7C01E000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L2 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F01FE000&lt;br /&gt;
| 0x7C01F000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| 0x40000000000300&lt;br /&gt;
| TZRAM (L3 Page Table)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= IRAM =&lt;br /&gt;
== [[BCT|BCT]] ==&lt;br /&gt;
When copied to IRAM at address 0x40000000, the BCT has an additional header as follows.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Field&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
|  0x00&lt;br /&gt;
|  0x50&lt;br /&gt;
|  bct_global_header&lt;br /&gt;
|&lt;br /&gt;
 0x00: unk_version0 (0x00210001)&lt;br /&gt;
 0x04: unk_version1 (0x00210001)&lt;br /&gt;
 0x08: unk_version2 (0x00210001)&lt;br /&gt;
 0x0C: boot_type (1 (COLD) PK11 panics if it&#039;s not)&lt;br /&gt;
 0x4C: bct_data_addr (address of the actual BCT)&lt;br /&gt;
|-&lt;br /&gt;
|  0x50&lt;br /&gt;
|  0x18&lt;br /&gt;
|  bootloader0_header&lt;br /&gt;
|&lt;br /&gt;
 0x00: is_active (if set to 0x01, bootloader0 is used) &lt;br /&gt;
|-&lt;br /&gt;
|  0x68&lt;br /&gt;
|  0x18&lt;br /&gt;
|  bootloader1_header&lt;br /&gt;
|&lt;br /&gt;
 0x00: is_active (if set to 0x01, bootloader1 is used) &lt;br /&gt;
|-&lt;br /&gt;
|  0x80&lt;br /&gt;
|  0x18&lt;br /&gt;
|  bootloader2_header&lt;br /&gt;
|&lt;br /&gt;
 0x00: is_active (if set to 0x01, bootloader2 is used) &lt;br /&gt;
|-&lt;br /&gt;
|  0x98&lt;br /&gt;
|  0x18&lt;br /&gt;
|  bootloader3_header&lt;br /&gt;
|&lt;br /&gt;
 0x00: is_active (if set to 0x01, bootloader3 is used) &lt;br /&gt;
|-&lt;br /&gt;
|  0xB0&lt;br /&gt;
|  0x50&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
  0x40: bct_end_addr&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
== 2.0.0 ==&lt;br /&gt;
  Granule size for TTBR0*_EL1 is 4KB.&lt;br /&gt;
  TTBR0_EL1 vmem starts at vaddr 0x0.&lt;br /&gt;
  vmem end-addr for TTBR1_EL1 is 0xffffffffffffffff. vmem start-addr for TTBR1_EL1 is 0xFFFFFFF000000000.&lt;br /&gt;
  T0SZ = 31. Hence, bit-size of the TTBR0*_EL1 vmem region is 33. (0x0000000200000000)&lt;br /&gt;
  T1SZ = 28. Hence, bit-size of the TTBR1*_EL1 vmem region is 36. (0x0000001000000000)&lt;br /&gt;
  &lt;br /&gt;
  Note: ARM config for TTBR0 is presumably configured for userland later.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Table D4-25 Translation table entry addresses when using the 4KB translation granule&amp;quot;.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Overview of VMSAv8-64 address translation using the 4KB translation granule&amp;quot;.&lt;br /&gt;
  &lt;br /&gt;
  See arm-doc for &amp;quot;Table D4-11 TCR.TnSZ values and IA ranges, 4K granule with no concatenation of tables&amp;quot;.&lt;br /&gt;
  Both TTBR*_EL1 use &amp;quot;Initial lookup level&amp;quot; 1. Therefore, the TTBR*_EL1 tables are level1.&lt;br /&gt;
  &lt;br /&gt;
  Due to T*SZ, Stage1/Stage2 translation for the initial table(level1) are the same, except Stage2 uses hard-coded T0SZ.&lt;br /&gt;
  Basically, the table is accessed as: ((u64*)tablebase)[&amp;lt;IA[y:30]&amp;gt;], where y = (37-T*SZ)+26. That is, starting at bit &amp;quot;y&amp;quot; ending(inclusive) at bit30. For TTBR0*_EL1, y = 32, while for TTBR1_EL1 y = 35.&lt;br /&gt;
  Hence, for TTBR0, index=((vaddr&amp;gt;&amp;gt;30) &amp;amp; 0x7), and for TTBR1, index=((vaddr&amp;gt;&amp;gt;30) &amp;amp; 0x3f).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vector Base Address Register (EL1)&amp;quot; = 0xfffffff7ffc50800.&lt;br /&gt;
&lt;br /&gt;
The table for TTBR0 only contains the following:&lt;br /&gt;
* Vmem 0x80000000 is mapped to physmem 0x80000000, using a size loaded from a register. This is only done when: &amp;quot;endaddr = 0x7fffffff + size; if(endaddr &amp;gt;= 0x80000001){...}&amp;quot;&lt;br /&gt;
** The size is loaded from: &amp;quot;(u32 *0x70019050 &amp;amp; 0x3fff) &amp;lt;&amp;lt; 20;&amp;quot;&lt;br /&gt;
** The value written to the MMU-table descriptor is: &amp;quot;physaddr | val | 0x709;&amp;quot;. val is 1&amp;lt;&amp;lt;52 when &amp;quot;tmp&amp;gt;&amp;gt;34&amp;quot; is non-zero and when &amp;quot;if((physaddr &amp;amp; 0x3c0000000) == 0)&amp;quot;, otherwise val=0. tmp=size at the start and increased by 0xffffffffc0000000 each loop iteration. physaddr is increased by 0x40000000 each loop iteration.&lt;br /&gt;
&lt;br /&gt;
TTBR1:&lt;br /&gt;
* vmem 0xFFFFFFF800000000 is mapped to physmem 0x80000000. Similar to above, except tmp=0 due to wrap-around, etc. This also has usermode/kernel XN enabled in the descriptor ORR-value. The chunksize used when increasing addr is 0xfffffff840000000, with another +=0x40000000 separate from the addr cmp for the loop.&lt;br /&gt;
** &amp;quot;endaddr = 0x3fffffff + (&amp;lt;size from above&amp;gt; | 0xfffffff800000000); enaddr = (endaddr &amp;amp; 0xffffffffc0000000)-1; if(endaddr &amp;gt;= 0xfffffff800000001){&amp;lt;map mem&amp;gt;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Initializes level2 pagetable descriptor for vmem 0xFFFFFFF7C0000000. descriptor = 0x3 | physaddr. physaddr is core-specific.&lt;br /&gt;
* Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FFC00000. descriptor = 0x3 | physaddr. physaddr is core-specific.&lt;br /&gt;
* The content of the pagetable for the following level3 mmutables are not initialized in the main mmutable-init func. descriptor = 0x8007c003(0x3 | &amp;lt;physaddr tablebase&amp;gt;). tablebase=0x8007c000.&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FEE00000. physaddr = tablebase + (0x1&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF000000. physaddr = tablebase + (0x2&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF200000. physaddr = tablebase + (0x3&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FFA00000. physaddr = tablebase + (0x7&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FEC00000. physaddr = tablebase.&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF400000. physaddr = tablebase + (0x4&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF600000. physaddr = tablebase + (0x5&amp;lt;&amp;lt;12).&lt;br /&gt;
** Initializes level3 pagetable descriptor for vmem 0xFFFFFFF7FF800000. physaddr = tablebase + (0x6&amp;lt;&amp;lt;12).&lt;/div&gt;</summary>
		<author><name>Balika011</name></author>
	</entry>
</feed>