This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Translation error in armv8 a72

Hello experts,

I am trying to enable MMU on LS1046ARDB Board and have generated MMU translation table . I am able to write entries into translation table  . I am running my code from flash memory and translation table base address is in DRAM . As soon as MMU bit is enabled in sctlr register I am getting Translation at level 1 error. Please can anyone help me where/what can be the mistake?

Any help would be appreciated.

Below is the assembly code .

Thanks.

/*
 * This file was automatically generated using arm64-pgtable-tool.
 * See: https://github.com/ashwio/arm64-pgtable-tool
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * This code programs the following translation table structure:
 *
 *         level 1 table @ 0x80000000
 *         [#   1]---------------------------\
 *                 level 2 table @ 0x80001000
 *                 [#   0]---------------------------\
 *                         level 3 table @ 0x80002000
 *                         [# 256] 0x000040100000-0x000040100fff, Code, CODE
 *                         [# 257] 0x000040101000-0x000040101fff, Code, CODE
 *                         [# 258] 0x000040102000-0x000040102fff, Code, CODE
 *                         [# 259] 0x000040103000-0x000040103fff, Code, CODE
 *                         [# 260] 0x000040104000-0x000040104fff, Code, CODE
 *                         [# 261] 0x000040105000-0x000040105fff, Code, CODE
 *                         [# 262] 0x000040106000-0x000040106fff, Code, CODE
 *                         [# 263] 0x000040107000-0x000040107fff, Code, CODE
 *                         [# 264] 0x000040108000-0x000040108fff, Code, CODE
 *                         [# 265] 0x000040109000-0x000040109fff, Code, CODE
 *                         [# 266] 0x00004010a000-0x00004010afff, Code, CODE
 *                         [# 267] 0x00004010b000-0x00004010bfff, Code, CODE
 *                         [# 268] 0x00004010c000-0x00004010cfff, Code, CODE
 *                         [# 269] 0x00004010d000-0x00004010dfff, Code, CODE
 *                         [# 270] 0x00004010e000-0x00004010efff, Code, CODE
 *                         [# 271] 0x00004010f000-0x00004010ffff, Code, CODE
 *                         [# 272] 0x000040110000-0x000040110fff, Code, CODE
 *                         [# 273] 0x000040111000-0x000040111fff, Code, CODE
 *                         [# 274] 0x000040112000-0x000040112fff, Code, CODE
 *                         [# 275] 0x000040113000-0x000040113fff, Code, CODE
 *                         [# 276] 0x000040114000-0x000040114fff, Code, CODE
 *                         [# 277] 0x000040115000-0x000040115fff, Code, CODE
 *                         [# 278] 0x000040116000-0x000040116fff, Code, CODE
 *                         [# 279] 0x000040117000-0x000040117fff, Code, CODE
 *                         [# 280] 0x000040118000-0x000040118fff, Code, CODE
 *                         [# 281] 0x000040119000-0x000040119fff, Code, CODE
 *                         [# 282] 0x00004011a000-0x00004011afff, Code, CODE
 *                         [# 283] 0x00004011b000-0x00004011bfff, Code, CODE
 *                         [# 284] 0x00004011c000-0x00004011cfff, Code, CODE
 *                         [# 285] 0x00004011d000-0x00004011dfff, Code, CODE
 *                         [# 286] 0x00004011e000-0x00004011efff, Code, CODE
 *                         [# 287] 0x00004011f000-0x00004011ffff, Code, CODE
 *                         [# 288] 0x000040120000-0x000040120fff, Code, CODE
 *                         [# 289] 0x000040121000-0x000040121fff, Code, CODE
 *                         [# 290] 0x000040122000-0x000040122fff, Code, CODE
 *                         [# 291] 0x000040123000-0x000040123fff, Code, CODE
 *                         [# 292] 0x000040124000-0x000040124fff, Code, CODE
 *                         [# 293] 0x000040125000-0x000040125fff, Code, CODE
 *                         [# 294] 0x000040126000-0x000040126fff, Code, CODE
 *                         [# 295] 0x000040127000-0x000040127fff, Code, CODE
 *                         [# 296] 0x000040128000-0x000040128fff, Code, CODE
 *                         [# 297] 0x000040129000-0x000040129fff, Code, CODE
 *                         [# 298] 0x00004012a000-0x00004012afff, Code, CODE
 *                         [# 299] 0x00004012b000-0x00004012bfff, Code, CODE
 *                         [# 300] 0x00004012c000-0x00004012cfff, Code, CODE
 *                         [# 301] 0x00004012d000-0x00004012dfff, Code, CODE
 *                         [# 302] 0x00004012e000-0x00004012efff, Code, CODE
 *                         [# 303] 0x00004012f000-0x00004012ffff, Code, CODE
 *                         [# 304] 0x000040130000-0x000040130fff, Code, CODE
 *                         [# 305] 0x000040131000-0x000040131fff, Code, CODE
 *                         [# 306] 0x000040132000-0x000040132fff, Code, CODE
 *                         [# 307] 0x000040133000-0x000040133fff, Code, CODE
 *                         [# 308] 0x000040134000-0x000040134fff, Code, CODE
 *                         [# 309] 0x000040135000-0x000040135fff, Code, CODE
 *                         [# 310] 0x000040136000-0x000040136fff, Code, CODE
 *                         [# 311] 0x000040137000-0x000040137fff, Code, CODE
 *                         [# 312] 0x000040138000-0x000040138fff, Code, CODE
 *                         [# 313] 0x000040139000-0x000040139fff, Code, CODE
 *                         [# 314] 0x00004013a000-0x00004013afff, Code, CODE
 *                         [# 315] 0x00004013b000-0x00004013bfff, Code, CODE
 *                         [# 316] 0x00004013c000-0x00004013cfff, Code, CODE
 *                         [# 317] 0x00004013d000-0x00004013dfff, Code, CODE
 *                         [# 318] 0x00004013e000-0x00004013efff, Code, CODE
 *                         [# 319] 0x00004013f000-0x00004013ffff, Code, CODE
 *                         [# 320] 0x000040140000-0x000040140fff, Code, CODE
 *                         [# 321] 0x000040141000-0x000040141fff, Code, CODE
 *                         [# 322] 0x000040142000-0x000040142fff, Code, CODE
 *                         [# 323] 0x000040143000-0x000040143fff, Code, CODE
 *                         [# 324] 0x000040144000-0x000040144fff, Code, CODE
 *                         [# 325] 0x000040145000-0x000040145fff, Code, CODE
 *                         [# 326] 0x000040146000-0x000040146fff, Code, CODE
 *                         [# 327] 0x000040147000-0x000040147fff, Code, CODE
 *                         [# 328] 0x000040148000-0x000040148fff, Code, CODE
 *                         [# 329] 0x000040149000-0x000040149fff, Code, CODE
 *                         [# 330] 0x00004014a000-0x00004014afff, Code, CODE
 *                         [# 331] 0x00004014b000-0x00004014bfff, Code, CODE
 *                         [# 332] 0x00004014c000-0x00004014cfff, Code, CODE
 *                         [# 333] 0x00004014d000-0x00004014dfff, Code, CODE
 *                         [# 334] 0x00004014e000-0x00004014efff, Code, CODE
 *                         [# 335] 0x00004014f000-0x00004014ffff, Code, CODE
 *                         [# 336] 0x000040150000-0x000040150fff, Code, CODE
 *                         [# 337] 0x000040151000-0x000040151fff, Code, CODE
 *                         [# 338] 0x000040152000-0x000040152fff, Code, CODE
 *                         [# 339] 0x000040153000-0x000040153fff, Code, CODE
 *                         [# 340] 0x000040154000-0x000040154fff, Code, CODE
 *                         [# 341] 0x000040155000-0x000040155fff, Code, CODE
 *                         [# 342] 0x000040156000-0x000040156fff, Code, CODE
 *                         [# 343] 0x000040157000-0x000040157fff, Code, CODE
 *                         [# 344] 0x000040158000-0x000040158fff, Code, CODE
 *                         [# 345] 0x000040159000-0x000040159fff, Code, CODE
 *                         [# 346] 0x00004015a000-0x00004015afff, Code, CODE
 *                         [# 347] 0x00004015b000-0x00004015bfff, Code, CODE
 *                         [# 348] 0x00004015c000-0x00004015cfff, Code, CODE
 *                         [# 349] 0x00004015d000-0x00004015dfff, Code, CODE
 *                         [# 350] 0x00004015e000-0x00004015efff, Code, CODE
 *                         [# 351] 0x00004015f000-0x00004015ffff, Code, CODE
 *                         [# 352] 0x000040160000-0x000040160fff, Code, CODE
 *                         [# 353] 0x000040161000-0x000040161fff, Code, CODE
 *                         [# 354] 0x000040162000-0x000040162fff, Code, CODE
 *         [#   2]---------------------------\
 *                 level 2 table @ 0x80003000
 *                 [# 128] 0x000090000000-0x0000901fffff, RW_Data, DRAM
 *                 [# 129] 0x000090200000-0x0000903fffff, RW_Data, DRAM
 *                 [# 130] 0x000090400000-0x0000905fffff, RW_Data, DRAM
 *                 [# 131] 0x000090600000-0x0000907fffff, RW_Data, DRAM
 *                 [# 132] 0x000090800000-0x0000909fffff, RW_Data, DRAM
 *                 [# 133] 0x000090a00000-0x000090bfffff, RW_Data, DRAM
 *                 [# 134] 0x000090c00000-0x000090dfffff, RW_Data, DRAM
 *                 [# 135] 0x000090e00000-0x000090ffffff, RW_Data, DRAM
 *                 [# 136] 0x000091000000-0x0000911fffff, RW_Data, DRAM
 *                 [# 137] 0x000091200000-0x0000913fffff, RW_Data, DRAM
 *                 [# 138] 0x000091400000-0x0000915fffff, RW_Data, DRAM
 *                 [# 139] 0x000091600000-0x0000917fffff, RW_Data, DRAM
 *                 [# 140] 0x000091800000-0x0000919fffff, RW_Data, DRAM
 *                 [# 141] 0x000091a00000-0x000091bfffff, RW_Data, DRAM
 *                 [# 142] 0x000091c00000-0x000091dfffff, RW_Data, DRAM
 *                 [# 143] 0x000091e00000-0x000091ffffff, RW_Data, DRAM
 *                 [# 144] 0x000092000000-0x0000921fffff, RW_Data, DRAM
 *                 [# 145] 0x000092200000-0x0000923fffff, RW_Data, DRAM
 *                 [# 146] 0x000092400000-0x0000925fffff, RW_Data, DRAM
 *                 [# 147] 0x000092600000-0x0000927fffff, RW_Data, DRAM
 *                 [# 148] 0x000092800000-0x0000929fffff, RW_Data, DRAM
 *                 [# 149] 0x000092a00000-0x000092bfffff, RW_Data, DRAM
 *                 [# 150] 0x000092c00000-0x000092dfffff, RW_Data, DRAM
 *                 [# 151] 0x000092e00000-0x000092ffffff, RW_Data, DRAM
 *                 [# 152] 0x000093000000-0x0000931fffff, RW_Data, DRAM
 *                 [# 153] 0x000093200000-0x0000933fffff, RW_Data, DRAM
 *                 [# 154] 0x000093400000-0x0000935fffff, RW_Data, DRAM
 *                 [# 155] 0x000093600000-0x0000937fffff, RW_Data, DRAM
 *                 [# 156] 0x000093800000-0x0000939fffff, RW_Data, DRAM
 *                 [# 157] 0x000093a00000-0x000093bfffff, RW_Data, DRAM
 *                 [# 158] 0x000093c00000-0x000093dfffff, RW_Data, DRAM
 *                 [# 159] 0x000093e00000-0x000093ffffff, RW_Data, DRAM
 *                 [# 160] 0x000094000000-0x0000941fffff, RW_Data, DRAM
 *                 [# 161] 0x000094200000-0x0000943fffff, RW_Data, DRAM
 *                 [# 162] 0x000094400000-0x0000945fffff, RW_Data, DRAM
 *                 [# 163] 0x000094600000-0x0000947fffff, RW_Data, DRAM
 *                 [# 164] 0x000094800000-0x0000949fffff, RW_Data, DRAM
 *                 [# 165] 0x000094a00000-0x000094bfffff, RW_Data, DRAM
 *                 [# 166] 0x000094c00000-0x000094dfffff, RW_Data, DRAM
 *                 [# 167] 0x000094e00000-0x000094ffffff, RW_Data, DRAM
 *                 [# 168] 0x000095000000-0x0000951fffff, RW_Data, DRAM
 *                 [# 169] 0x000095200000-0x0000953fffff, RW_Data, DRAM
 *                 [# 170] 0x000095400000-0x0000955fffff, RW_Data, DRAM
 *                 [# 171] 0x000095600000-0x0000957fffff, RW_Data, DRAM
 *                 [# 172] 0x000095800000-0x0000959fffff, RW_Data, DRAM
 *                 [# 173] 0x000095a00000-0x000095bfffff, RW_Data, DRAM
 *                 [# 174] 0x000095c00000-0x000095dfffff, RW_Data, DRAM
 *                 [# 175] 0x000095e00000-0x000095ffffff, RW_Data, DRAM
 *                 [# 176] 0x000096000000-0x0000961fffff, RW_Data, DRAM
 *                 [# 177] 0x000096200000-0x0000963fffff, RW_Data, DRAM
 *                 [# 178] 0x000096400000-0x0000965fffff, RW_Data, DRAM
 *                 [# 179] 0x000096600000-0x0000967fffff, RW_Data, DRAM
 *                 [# 180] 0x000096800000-0x0000969fffff, RW_Data, DRAM
 *                 [# 181] 0x000096a00000-0x000096bfffff, RW_Data, DRAM
 *                 [# 182] 0x000096c00000-0x000096dfffff, RW_Data, DRAM
 *                 [# 183] 0x000096e00000-0x000096ffffff, RW_Data, DRAM
 *                 [# 184] 0x000097000000-0x0000971fffff, RW_Data, DRAM
 *                 [# 185] 0x000097200000-0x0000973fffff, RW_Data, DRAM
 *                 [# 186] 0x000097400000-0x0000975fffff, RW_Data, DRAM
 *                 [# 187] 0x000097600000-0x0000977fffff, RW_Data, DRAM
 *                 [# 188] 0x000097800000-0x0000979fffff, RW_Data, DRAM
 *                 [# 189] 0x000097a00000-0x000097bfffff, RW_Data, DRAM
 *                 [# 190] 0x000097c00000-0x000097dfffff, RW_Data, DRAM
 *                 [# 191] 0x000097e00000-0x000097ffffff, RW_Data, DRAM
 *                 [# 192] 0x000098000000-0x0000981fffff, RW_Data, DRAM
 *                 [# 193] 0x000098200000-0x0000983fffff, RW_Data, DRAM
 *                 [# 194] 0x000098400000-0x0000985fffff, RW_Data, DRAM
 *                 [# 195] 0x000098600000-0x0000987fffff, RW_Data, DRAM
 *                 [# 196] 0x000098800000-0x0000989fffff, RW_Data, DRAM
 *                 [# 197] 0x000098a00000-0x000098bfffff, RW_Data, DRAM
 *                 [# 198] 0x000098c00000-0x000098dfffff, RW_Data, DRAM
 *                 [# 199] 0x000098e00000-0x000098ffffff, RW_Data, DRAM
 *                 [# 200] 0x000099000000-0x0000991fffff, RW_Data, DRAM
 *                 [# 201] 0x000099200000-0x0000993fffff, RW_Data, DRAM
 *                 [# 202] 0x000099400000-0x0000995fffff, RW_Data, DRAM
 *                 [# 203] 0x000099600000-0x0000997fffff, RW_Data, DRAM
 *                 [# 204] 0x000099800000-0x0000999fffff, RW_Data, DRAM
 *                 [# 205] 0x000099a00000-0x000099bfffff, RW_Data, DRAM
 *                 [# 206] 0x000099c00000-0x000099dfffff, RW_Data, DRAM
 *                 [# 207] 0x000099e00000-0x000099ffffff, RW_Data, DRAM
 *                 [# 208] 0x00009a000000-0x00009a1fffff, RW_Data, DRAM
 *                 [# 209] 0x00009a200000-0x00009a3fffff, RW_Data, DRAM
 *                 [# 210] 0x00009a400000-0x00009a5fffff, RW_Data, DRAM
 *                 [# 211] 0x00009a600000-0x00009a7fffff, RW_Data, DRAM
 *                 [# 212] 0x00009a800000-0x00009a9fffff, RW_Data, DRAM
 *                 [# 213] 0x00009aa00000-0x00009abfffff, RW_Data, DRAM
 *                 [# 214] 0x00009ac00000-0x00009adfffff, RW_Data, DRAM
 *                 [# 215] 0x00009ae00000-0x00009affffff, RW_Data, DRAM
 *                 [# 216] 0x00009b000000-0x00009b1fffff, RW_Data, DRAM
 *                 [# 217] 0x00009b200000-0x00009b3fffff, RW_Data, DRAM
 *                 [# 218] 0x00009b400000-0x00009b5fffff, RW_Data, DRAM
 *                 [# 219] 0x00009b600000-0x00009b7fffff, RW_Data, DRAM
 *                 [# 220] 0x00009b800000-0x00009b9fffff, RW_Data, DRAM
 *                 [# 221] 0x00009ba00000-0x00009bbfffff, RW_Data, DRAM
 *                 [# 222] 0x00009bc00000-0x00009bdfffff, RW_Data, DRAM
 *                 [# 223] 0x00009be00000-0x00009bffffff, RW_Data, DRAM
 *                 [# 224] 0x00009c000000-0x00009c1fffff, RW_Data, DRAM
 *                 [# 225] 0x00009c200000-0x00009c3fffff, RW_Data, DRAM
 *                 [# 226] 0x00009c400000-0x00009c5fffff, RW_Data, DRAM
 *                 [# 227] 0x00009c600000-0x00009c7fffff, RW_Data, DRAM
 *                 [# 228] 0x00009c800000-0x00009c9fffff, RW_Data, DRAM
 *                 [# 229] 0x00009ca00000-0x00009cbfffff, RW_Data, DRAM
 *                 [# 230] 0x00009cc00000-0x00009cdfffff, RW_Data, DRAM
 *                 [# 231] 0x00009ce00000-0x00009cffffff, RW_Data, DRAM
 *                 [# 232] 0x00009d000000-0x00009d1fffff, RW_Data, DRAM
 *                 [# 233] 0x00009d200000-0x00009d3fffff, RW_Data, DRAM
 *                 [# 234] 0x00009d400000-0x00009d5fffff, RW_Data, DRAM
 *                 [# 235] 0x00009d600000-0x00009d7fffff, RW_Data, DRAM
 *                 [# 236] 0x00009d800000-0x00009d9fffff, RW_Data, DRAM
 *                 [# 237] 0x00009da00000-0x00009dbfffff, RW_Data, DRAM
 *                 [# 238] 0x00009dc00000-0x00009ddfffff, RW_Data, DRAM
 *                 [# 239] 0x00009de00000-0x00009dffffff, RW_Data, DRAM
 *                 [# 240] 0x00009e000000-0x00009e1fffff, RW_Data, DRAM
 *                 [# 241] 0x00009e200000-0x00009e3fffff, RW_Data, DRAM
 *                 [# 242] 0x00009e400000-0x00009e5fffff, RW_Data, DRAM
 *                 [# 243] 0x00009e600000-0x00009e7fffff, RW_Data, DRAM
 *                 [# 244] 0x00009e800000-0x00009e9fffff, RW_Data, DRAM
 *                 [# 245] 0x00009ea00000-0x00009ebfffff, RW_Data, DRAM
 *                 [# 246] 0x00009ec00000-0x00009edfffff, RW_Data, DRAM
 *                 [# 247] 0x00009ee00000-0x00009effffff, RW_Data, DRAM
 *                 [# 248] 0x00009f000000-0x00009f1fffff, RW_Data, DRAM
 *                 [# 249] 0x00009f200000-0x00009f3fffff, RW_Data, DRAM
 *                 [# 250] 0x00009f400000-0x00009f5fffff, RW_Data, DRAM
 *                 [# 251] 0x00009f600000-0x00009f7fffff, RW_Data, DRAM
 *                 [# 252] 0x00009f800000-0x00009f9fffff, RW_Data, DRAM
 *                 [# 253] 0x00009fa00000-0x00009fbfffff, RW_Data, DRAM
 *                 [# 254] 0x00009fc00000-0x00009fdfffff, RW_Data, DRAM
 *                 [# 255] 0x00009fe00000-0x00009fffffff, RW_Data, DRAM
 *                 [# 256] 0x0000a0000000-0x0000a01fffff, RW_Data, DRAM
 *                 [# 257] 0x0000a0200000-0x0000a03fffff, RW_Data, DRAM
 *                 [# 258] 0x0000a0400000-0x0000a05fffff, RW_Data, DRAM
 *                 [# 259] 0x0000a0600000-0x0000a07fffff, RW_Data, DRAM
 *                 [# 260] 0x0000a0800000-0x0000a09fffff, RW_Data, DRAM
 *                 [# 261] 0x0000a0a00000-0x0000a0bfffff, RW_Data, DRAM
 *                 [# 262] 0x0000a0c00000-0x0000a0dfffff, RW_Data, DRAM
 *                 [# 263] 0x0000a0e00000-0x0000a0ffffff, RW_Data, DRAM
 *                 [# 264] 0x0000a1000000-0x0000a11fffff, RW_Data, DRAM
 *                 [# 265] 0x0000a1200000-0x0000a13fffff, RW_Data, DRAM
 *                 [# 266] 0x0000a1400000-0x0000a15fffff, RW_Data, DRAM
 *                 [# 267] 0x0000a1600000-0x0000a17fffff, RW_Data, DRAM
 *                 [# 268] 0x0000a1800000-0x0000a19fffff, RW_Data, DRAM
 *                 [# 269] 0x0000a1a00000-0x0000a1bfffff, RW_Data, DRAM
 *                 [# 270] 0x0000a1c00000-0x0000a1dfffff, RW_Data, DRAM
 *                 [# 271] 0x0000a1e00000-0x0000a1ffffff, RW_Data, DRAM
 *                 [# 272] 0x0000a2000000-0x0000a21fffff, RW_Data, DRAM
 *                 [# 273] 0x0000a2200000-0x0000a23fffff, RW_Data, DRAM
 *                 [# 274] 0x0000a2400000-0x0000a25fffff, RW_Data, DRAM
 *                 [# 275] 0x0000a2600000-0x0000a27fffff, RW_Data, DRAM
 *                 [# 276] 0x0000a2800000-0x0000a29fffff, RW_Data, DRAM
 *                 [# 277] 0x0000a2a00000-0x0000a2bfffff, RW_Data, DRAM
 *                 [# 278] 0x0000a2c00000-0x0000a2dfffff, RW_Data, DRAM
 *                 [# 279] 0x0000a2e00000-0x0000a2ffffff, RW_Data, DRAM
 *                 [# 280] 0x0000a3000000-0x0000a31fffff, RW_Data, DRAM
 *                 [# 281] 0x0000a3200000-0x0000a33fffff, RW_Data, DRAM
 *                 [# 282] 0x0000a3400000-0x0000a35fffff, RW_Data, DRAM
 *                 [# 283] 0x0000a3600000-0x0000a37fffff, RW_Data, DRAM
 *                 [# 284] 0x0000a3800000-0x0000a39fffff, RW_Data, DRAM
 *                 [# 285] 0x0000a3a00000-0x0000a3bfffff, RW_Data, DRAM
 *                 [# 286] 0x0000a3c00000-0x0000a3dfffff, RW_Data, DRAM
 *                 [# 287] 0x0000a3e00000-0x0000a3ffffff, RW_Data, DRAM
 *                 [# 288] 0x0000a4000000-0x0000a41fffff, RW_Data, DRAM
 *                 [# 289] 0x0000a4200000-0x0000a43fffff, RW_Data, DRAM
 *                 [# 290] 0x0000a4400000-0x0000a45fffff, RW_Data, DRAM
 *                 [# 291] 0x0000a4600000-0x0000a47fffff, RW_Data, DRAM
 *                 [# 292] 0x0000a4800000-0x0000a49fffff, RW_Data, DRAM
 *                 [# 293] 0x0000a4a00000-0x0000a4bfffff, RW_Data, DRAM
 *                 [# 294] 0x0000a4c00000-0x0000a4dfffff, RW_Data, DRAM
 *                 [# 295] 0x0000a4e00000-0x0000a4ffffff, RW_Data, DRAM
 *                 [# 296] 0x0000a5000000-0x0000a51fffff, RW_Data, DRAM
 *                 [# 297] 0x0000a5200000-0x0000a53fffff, RW_Data, DRAM
 *                 [# 298] 0x0000a5400000-0x0000a55fffff, RW_Data, DRAM
 *                 [# 299] 0x0000a5600000-0x0000a57fffff, RW_Data, DRAM
 *                 [# 300] 0x0000a5800000-0x0000a59fffff, RW_Data, DRAM
 *                 [# 301] 0x0000a5a00000-0x0000a5bfffff, RW_Data, DRAM
 *                 [# 302] 0x0000a5c00000-0x0000a5dfffff, RW_Data, DRAM
 *                 [# 303] 0x0000a5e00000-0x0000a5ffffff, RW_Data, DRAM
 *                 [# 304] 0x0000a6000000-0x0000a61fffff, RW_Data, DRAM
 *                 [# 305] 0x0000a6200000-0x0000a63fffff, RW_Data, DRAM
 *                 [# 306] 0x0000a6400000-0x0000a65fffff, RW_Data, DRAM
 *                 [# 307] 0x0000a6600000-0x0000a67fffff, RW_Data, DRAM
 *                 [# 308] 0x0000a6800000-0x0000a69fffff, RW_Data, DRAM
 *                 [# 309] 0x0000a6a00000-0x0000a6bfffff, RW_Data, DRAM
 *                 [# 310] 0x0000a6c00000-0x0000a6dfffff, RW_Data, DRAM
 *                 [# 311] 0x0000a6e00000-0x0000a6ffffff, RW_Data, DRAM
 *                 [# 312] 0x0000a7000000-0x0000a71fffff, RW_Data, DRAM
 *                 [# 313] 0x0000a7200000-0x0000a73fffff, RW_Data, DRAM
 *                 [# 314] 0x0000a7400000-0x0000a75fffff, RW_Data, DRAM
 *                 [# 315] 0x0000a7600000-0x0000a77fffff, RW_Data, DRAM
 *                 [# 316] 0x0000a7800000-0x0000a79fffff, RW_Data, DRAM
 *                 [# 317] 0x0000a7a00000-0x0000a7bfffff, RW_Data, DRAM
 *                 [# 318] 0x0000a7c00000-0x0000a7dfffff, RW_Data, DRAM
 *                 [# 319] 0x0000a7e00000-0x0000a7ffffff, RW_Data, DRAM
 *                 [# 320] 0x0000a8000000-0x0000a81fffff, RW_Data, DRAM
 *                 [# 321] 0x0000a8200000-0x0000a83fffff, RW_Data, DRAM
 *                 [# 322] 0x0000a8400000-0x0000a85fffff, RW_Data, DRAM
 *                 [# 323] 0x0000a8600000-0x0000a87fffff, RW_Data, DRAM
 *                 [# 324] 0x0000a8800000-0x0000a89fffff, RW_Data, DRAM
 *                 [# 325] 0x0000a8a00000-0x0000a8bfffff, RW_Data, DRAM
 *                 [# 326] 0x0000a8c00000-0x0000a8dfffff, RW_Data, DRAM
 *                 [# 327] 0x0000a8e00000-0x0000a8ffffff, RW_Data, DRAM
 *                 [# 328] 0x0000a9000000-0x0000a91fffff, RW_Data, DRAM
 *                 [# 329] 0x0000a9200000-0x0000a93fffff, RW_Data, DRAM
 *                 [# 330] 0x0000a9400000-0x0000a95fffff, RW_Data, DRAM
 *                 [# 331] 0x0000a9600000-0x0000a97fffff, RW_Data, DRAM
 *                 [# 332] 0x0000a9800000-0x0000a99fffff, RW_Data, DRAM
 *                 [# 333] 0x0000a9a00000-0x0000a9bfffff, RW_Data, DRAM
 *                 [# 334] 0x0000a9c00000-0x0000a9dfffff, RW_Data, DRAM
 *                 [# 335] 0x0000a9e00000-0x0000a9ffffff, RW_Data, DRAM
 *                 [# 336] 0x0000aa000000-0x0000aa1fffff, RW_Data, DRAM
 *                 [# 337] 0x0000aa200000-0x0000aa3fffff, RW_Data, DRAM
 *                 [# 338] 0x0000aa400000-0x0000aa5fffff, RW_Data, DRAM
 *                 [# 339] 0x0000aa600000-0x0000aa7fffff, RW_Data, DRAM
 *                 [# 340] 0x0000aa800000-0x0000aa9fffff, RW_Data, DRAM
 *                 [# 341] 0x0000aaa00000-0x0000aabfffff, RW_Data, DRAM
 *                 [# 342] 0x0000aac00000-0x0000aadfffff, RW_Data, DRAM
 *                 [# 343] 0x0000aae00000-0x0000aaffffff, RW_Data, DRAM
 *                 [# 344] 0x0000ab000000-0x0000ab1fffff, RW_Data, DRAM
 *                 [# 345] 0x0000ab200000-0x0000ab3fffff, RW_Data, DRAM
 *                 [# 346] 0x0000ab400000-0x0000ab5fffff, RW_Data, DRAM
 *                 [# 347] 0x0000ab600000-0x0000ab7fffff, RW_Data, DRAM
 *                 [# 348] 0x0000ab800000-0x0000ab9fffff, RW_Data, DRAM
 *                 [# 349] 0x0000aba00000-0x0000abbfffff, RW_Data, DRAM
 *                 [# 350] 0x0000abc00000-0x0000abdfffff, RW_Data, DRAM
 *                 [# 351] 0x0000abe00000-0x0000abffffff, RW_Data, DRAM
 *                 [# 352] 0x0000ac000000-0x0000ac1fffff, RW_Data, DRAM
 *                 [# 353] 0x0000ac200000-0x0000ac3fffff, RW_Data, DRAM
 *                 [# 354] 0x0000ac400000-0x0000ac5fffff, RW_Data, DRAM
 *                 [# 355] 0x0000ac600000-0x0000ac7fffff, RW_Data, DRAM
 *                 [# 356] 0x0000ac800000-0x0000ac9fffff, RW_Data, DRAM
 *                 [# 357] 0x0000aca00000-0x0000acbfffff, RW_Data, DRAM
 *                 [# 358] 0x0000acc00000-0x0000acdfffff, RW_Data, DRAM
 *                 [# 359] 0x0000ace00000-0x0000acffffff, RW_Data, DRAM
 *                 [# 360] 0x0000ad000000-0x0000ad1fffff, RW_Data, DRAM
 *                 [# 361] 0x0000ad200000-0x0000ad3fffff, RW_Data, DRAM
 *                 [# 362] 0x0000ad400000-0x0000ad5fffff, RW_Data, DRAM
 *                 [# 363] 0x0000ad600000-0x0000ad7fffff, RW_Data, DRAM
 *                 [# 364] 0x0000ad800000-0x0000ad9fffff, RW_Data, DRAM
 *                 [# 365] 0x0000ada00000-0x0000adbfffff, RW_Data, DRAM
 *                 [# 366] 0x0000adc00000-0x0000addfffff, RW_Data, DRAM
 *                 [# 367] 0x0000ade00000-0x0000adffffff, RW_Data, DRAM
 *                 [# 368] 0x0000ae000000-0x0000ae1fffff, RW_Data, DRAM
 *                 [# 369] 0x0000ae200000-0x0000ae3fffff, RW_Data, DRAM
 *                 [# 370] 0x0000ae400000-0x0000ae5fffff, RW_Data, DRAM
 *                 [# 371] 0x0000ae600000-0x0000ae7fffff, RW_Data, DRAM
 *                 [# 372] 0x0000ae800000-0x0000ae9fffff, RW_Data, DRAM
 *                 [# 373] 0x0000aea00000-0x0000aebfffff, RW_Data, DRAM
 *                 [# 374] 0x0000aec00000-0x0000aedfffff, RW_Data, DRAM
 *                 [# 375] 0x0000aee00000-0x0000aeffffff, RW_Data, DRAM
 *                 [# 376] 0x0000af000000-0x0000af1fffff, RW_Data, DRAM
 *                 [# 377] 0x0000af200000-0x0000af3fffff, RW_Data, DRAM
 *                 [# 378] 0x0000af400000-0x0000af5fffff, RW_Data, DRAM
 *                 [# 379] 0x0000af600000-0x0000af7fffff, RW_Data, DRAM
 *                 [# 380] 0x0000af800000-0x0000af9fffff, RW_Data, DRAM
 *                 [# 381] 0x0000afa00000-0x0000afbfffff, RW_Data, DRAM
 *                 [# 382] 0x0000afc00000-0x0000afdfffff, RW_Data, DRAM
 *                 [# 383] 0x0000afe00000-0x0000afffffff, RW_Data, DRAM
 *                 [# 384] 0x0000b0000000-0x0000b01fffff, RW_Data, DRAM
 *                 [# 385] 0x0000b0200000-0x0000b03fffff, RW_Data, DRAM
 *                 [# 386] 0x0000b0400000-0x0000b05fffff, RW_Data, DRAM
 *                 [# 387] 0x0000b0600000-0x0000b07fffff, RW_Data, DRAM
 *                 [# 388] 0x0000b0800000-0x0000b09fffff, RW_Data, DRAM
 *                 [# 389] 0x0000b0a00000-0x0000b0bfffff, RW_Data, DRAM
 *                 [# 390] 0x0000b0c00000-0x0000b0dfffff, RW_Data, DRAM
 *                 [# 391] 0x0000b0e00000-0x0000b0ffffff, RW_Data, DRAM
 *                 [# 392] 0x0000b1000000-0x0000b11fffff, RW_Data, DRAM
 *                 [# 393] 0x0000b1200000-0x0000b13fffff, RW_Data, DRAM
 *                 [# 394] 0x0000b1400000-0x0000b15fffff, RW_Data, DRAM
 *                 [# 395] 0x0000b1600000-0x0000b17fffff, RW_Data, DRAM
 *                 [# 396] 0x0000b1800000-0x0000b19fffff, RW_Data, DRAM
 *                 [# 397] 0x0000b1a00000-0x0000b1bfffff, RW_Data, DRAM
 *                 [# 398] 0x0000b1c00000-0x0000b1dfffff, RW_Data, DRAM
 *                 [# 399] 0x0000b1e00000-0x0000b1ffffff, RW_Data, DRAM
 *                 [# 400] 0x0000b2000000-0x0000b21fffff, RW_Data, DRAM
 *                 [# 401] 0x0000b2200000-0x0000b23fffff, RW_Data, DRAM
 *                 [# 402] 0x0000b2400000-0x0000b25fffff, RW_Data, DRAM
 *                 [# 403] 0x0000b2600000-0x0000b27fffff, RW_Data, DRAM
 *                 [# 404] 0x0000b2800000-0x0000b29fffff, RW_Data, DRAM
 *                 [# 405] 0x0000b2a00000-0x0000b2bfffff, RW_Data, DRAM
 *                 [# 406] 0x0000b2c00000-0x0000b2dfffff, RW_Data, DRAM
 *                 [# 407] 0x0000b2e00000-0x0000b2ffffff, RW_Data, DRAM
 *                 [# 408] 0x0000b3000000-0x0000b31fffff, RW_Data, DRAM
 *                 [# 409] 0x0000b3200000-0x0000b33fffff, RW_Data, DRAM
 *                 [# 410] 0x0000b3400000-0x0000b35fffff, RW_Data, DRAM
 *                 [# 411] 0x0000b3600000-0x0000b37fffff, RW_Data, DRAM
 *                 [# 412] 0x0000b3800000-0x0000b39fffff, RW_Data, DRAM
 *                 [# 413] 0x0000b3a00000-0x0000b3bfffff, RW_Data, DRAM
 *                 [# 414] 0x0000b3c00000-0x0000b3dfffff, RW_Data, DRAM
 *                 [# 415] 0x0000b3e00000-0x0000b3ffffff, RW_Data, DRAM
 *                 [# 416] 0x0000b4000000-0x0000b41fffff, RW_Data, DRAM
 *                 [# 417] 0x0000b4200000-0x0000b43fffff, RW_Data, DRAM
 *                 [# 418] 0x0000b4400000-0x0000b45fffff, RW_Data, DRAM
 *                 [# 419] 0x0000b4600000-0x0000b47fffff, RW_Data, DRAM
 *                 [# 420] 0x0000b4800000-0x0000b49fffff, RW_Data, DRAM
 *                 [# 421] 0x0000b4a00000-0x0000b4bfffff, RW_Data, DRAM
 *                 [# 422] 0x0000b4c00000-0x0000b4dfffff, RW_Data, DRAM
 *                 [# 423] 0x0000b4e00000-0x0000b4ffffff, RW_Data, DRAM
 *                 [# 424] 0x0000b5000000-0x0000b51fffff, RW_Data, DRAM
 *                 [# 425] 0x0000b5200000-0x0000b53fffff, RW_Data, DRAM
 *                 [# 426] 0x0000b5400000-0x0000b55fffff, RW_Data, DRAM
 *                 [# 427] 0x0000b5600000-0x0000b57fffff, RW_Data, DRAM
 *                 [# 428] 0x0000b5800000-0x0000b59fffff, RW_Data, DRAM
 *                 [# 429] 0x0000b5a00000-0x0000b5bfffff, RW_Data, DRAM
 *                 [# 430] 0x0000b5c00000-0x0000b5dfffff, RW_Data, DRAM
 *                 [# 431] 0x0000b5e00000-0x0000b5ffffff, RW_Data, DRAM
 *                 [# 432] 0x0000b6000000-0x0000b61fffff, RW_Data, DRAM
 *                 [# 433] 0x0000b6200000-0x0000b63fffff, RW_Data, DRAM
 *                 [# 434] 0x0000b6400000-0x0000b65fffff, RW_Data, DRAM
 *                 [# 435] 0x0000b6600000-0x0000b67fffff, RW_Data, DRAM
 *                 [# 436] 0x0000b6800000-0x0000b69fffff, RW_Data, DRAM
 *                 [# 437] 0x0000b6a00000-0x0000b6bfffff, RW_Data, DRAM
 *                 [# 438] 0x0000b6c00000-0x0000b6dfffff, RW_Data, DRAM
 *                 [# 439] 0x0000b6e00000-0x0000b6ffffff, RW_Data, DRAM
 *                 [# 440] 0x0000b7000000-0x0000b71fffff, RW_Data, DRAM
 *                 [# 441] 0x0000b7200000-0x0000b73fffff, RW_Data, DRAM
 *                 [# 442] 0x0000b7400000-0x0000b75fffff, RW_Data, DRAM
 *                 [# 443] 0x0000b7600000-0x0000b77fffff, RW_Data, DRAM
 *                 [# 444] 0x0000b7800000-0x0000b79fffff, RW_Data, DRAM
 *                 [# 445] 0x0000b7a00000-0x0000b7bfffff, RW_Data, DRAM
 *                 [# 446] 0x0000b7c00000-0x0000b7dfffff, RW_Data, DRAM
 *                 [# 447] 0x0000b7e00000-0x0000b7ffffff, RW_Data, DRAM
 *                 [# 448] 0x0000b8000000-0x0000b81fffff, RW_Data, DRAM
 *                 [# 449] 0x0000b8200000-0x0000b83fffff, RW_Data, DRAM
 *                 [# 450] 0x0000b8400000-0x0000b85fffff, RW_Data, DRAM
 *                 [# 451] 0x0000b8600000-0x0000b87fffff, RW_Data, DRAM
 *                 [# 452] 0x0000b8800000-0x0000b89fffff, RW_Data, DRAM
 *                 [# 453] 0x0000b8a00000-0x0000b8bfffff, RW_Data, DRAM
 *                 [# 454] 0x0000b8c00000-0x0000b8dfffff, RW_Data, DRAM
 *                 [# 455] 0x0000b8e00000-0x0000b8ffffff, RW_Data, DRAM
 *                 [# 456] 0x0000b9000000-0x0000b91fffff, RW_Data, DRAM
 *                 [# 457] 0x0000b9200000-0x0000b93fffff, RW_Data, DRAM
 *                 [# 458] 0x0000b9400000-0x0000b95fffff, RW_Data, DRAM
 *                 [# 459] 0x0000b9600000-0x0000b97fffff, RW_Data, DRAM
 *                 [# 460] 0x0000b9800000-0x0000b99fffff, RW_Data, DRAM
 *                 [# 461] 0x0000b9a00000-0x0000b9bfffff, RW_Data, DRAM
 *                 [# 462] 0x0000b9c00000-0x0000b9dfffff, RW_Data, DRAM
 *                 [# 463] 0x0000b9e00000-0x0000b9ffffff, RW_Data, DRAM
 *                 [# 464] 0x0000ba000000-0x0000ba1fffff, RW_Data, DRAM
 *                 [# 465] 0x0000ba200000-0x0000ba3fffff, RW_Data, DRAM
 *                 [# 466] 0x0000ba400000-0x0000ba5fffff, RW_Data, DRAM
 *                 [# 467] 0x0000ba600000-0x0000ba7fffff, RW_Data, DRAM
 *                 [# 468] 0x0000ba800000-0x0000ba9fffff, RW_Data, DRAM
 *                 [# 469] 0x0000baa00000-0x0000babfffff, RW_Data, DRAM
 *                 [# 470] 0x0000bac00000-0x0000badfffff, RW_Data, DRAM
 *                 [# 471] 0x0000bae00000-0x0000baffffff, RW_Data, DRAM
 *                 [# 472] 0x0000bb000000-0x0000bb1fffff, RW_Data, DRAM
 *                 [# 473] 0x0000bb200000-0x0000bb3fffff, RW_Data, DRAM
 *                 [# 474] 0x0000bb400000-0x0000bb5fffff, RW_Data, DRAM
 *                 [# 475] 0x0000bb600000-0x0000bb7fffff, RW_Data, DRAM
 *                 [# 476] 0x0000bb800000-0x0000bb9fffff, RW_Data, DRAM
 *                 [# 477] 0x0000bba00000-0x0000bbbfffff, RW_Data, DRAM
 *                 [# 478] 0x0000bbc00000-0x0000bbdfffff, RW_Data, DRAM
 *                 [# 479] 0x0000bbe00000-0x0000bbffffff, RW_Data, DRAM
 *                 [# 480] 0x0000bc000000-0x0000bc1fffff, RW_Data, DRAM
 *                 [# 481] 0x0000bc200000-0x0000bc3fffff, RW_Data, DRAM
 *                 [# 482] 0x0000bc400000-0x0000bc5fffff, RW_Data, DRAM
 *                 [# 483] 0x0000bc600000-0x0000bc7fffff, RW_Data, DRAM
 *                 [# 484] 0x0000bc800000-0x0000bc9fffff, RW_Data, DRAM
 *                 [# 485] 0x0000bca00000-0x0000bcbfffff, RW_Data, DRAM
 *                 [# 486] 0x0000bcc00000-0x0000bcdfffff, RW_Data, DRAM
 *                 [# 487] 0x0000bce00000-0x0000bcffffff, RW_Data, DRAM
 *                 [# 488] 0x0000bd000000-0x0000bd1fffff, RW_Data, DRAM
 *                 [# 489] 0x0000bd200000-0x0000bd3fffff, RW_Data, DRAM
 *                 [# 490] 0x0000bd400000-0x0000bd5fffff, RW_Data, DRAM
 *                 [# 491] 0x0000bd600000-0x0000bd7fffff, RW_Data, DRAM
 *                 [# 492] 0x0000bd800000-0x0000bd9fffff, RW_Data, DRAM
 *                 [# 493] 0x0000bda00000-0x0000bdbfffff, RW_Data, DRAM
 *                 [# 494] 0x0000bdc00000-0x0000bddfffff, RW_Data, DRAM
 *                 [# 495] 0x0000bde00000-0x0000bdffffff, RW_Data, DRAM
 *                 [# 496] 0x0000be000000-0x0000be1fffff, RW_Data, DRAM
 *                 [# 497] 0x0000be200000-0x0000be3fffff, RW_Data, DRAM
 *                 [# 498] 0x0000be400000-0x0000be5fffff, RW_Data, DRAM
 *                 [# 499] 0x0000be600000-0x0000be7fffff, RW_Data, DRAM
 *                 [# 500] 0x0000be800000-0x0000be9fffff, RW_Data, DRAM
 *                 [# 501] 0x0000bea00000-0x0000bebfffff, RW_Data, DRAM
 *                 [# 502] 0x0000bec00000-0x0000bedfffff, RW_Data, DRAM
 *                 [# 503] 0x0000bee00000-0x0000beffffff, RW_Data, DRAM
 *                 [# 504] 0x0000bf000000-0x0000bf1fffff, RW_Data, DRAM
 *                 [# 505] 0x0000bf200000-0x0000bf3fffff, RW_Data, DRAM
 *                 [# 506] 0x0000bf400000-0x0000bf5fffff, RW_Data, DRAM
 *                 [# 507] 0x0000bf600000-0x0000bf7fffff, RW_Data, DRAM
 *                 [# 508] 0x0000bf800000-0x0000bf9fffff, RW_Data, DRAM
 *                 [# 509] 0x0000bfa00000-0x0000bfbfffff, RW_Data, DRAM
 *                 [# 510] 0x0000bfc00000-0x0000bfdfffff, RW_Data, DRAM
 *                 [# 511] 0x0000bfe00000-0x0000bfffffff, RW_Data, DRAM
 *         [#   3] 0x0000c0000000-0x0000ffffffff, RW_Data, DRAM
 *
 * The following command line arguments were passed to arm64-pgtable-tool:
 *
 *      -i examples/dram.txt
 *      -ttb 0x80000000
 *      -el 3
 *      -tg 4K
 *      -tsz 32
 *
 * This memory map requires a total of 5 translation tables.
 * Each table occupies 4K of memory (0x1000 bytes).
 * The buffer pointed to by 0x80000000 must therefore be 5x 4K = 0x5000 bytes long.
 * It is the programmer's responsibility to guarantee this.
 *
 * The programmer must also ensure that the virtual memory region containing the
 * translation tables is itself marked as NORMAL in the memory map file.
 */

    .section .data.mmu
    .balign 2

    mmu_lock: .4byte 0                   // lock to ensure only 1 CPU runs init
    #define LOCKED 1

    mmu_init: .4byte 0                   // whether init has been run
    #define INITIALISED 1

    .section .text.mmu_on
    .balign 2
    .global mmu_on
    .type mmu_on, @function

mmu_on:

    ADRP    x0, mmu_lock                 // get 4KB page containing mmu_lock
    ADD     x0, x0, :lo12:mmu_lock       // restore low 12 bits lost by ADRP
    MOV     w1, #LOCKED
    SEVL                                 // first pass won't sleep
1:
    WFE                                  // sleep on retry
    LDAXR   w2, [x0]                     // read mmu_lock
    CBNZ    w2, 1b                       // not available, go back to sleep
    STXR    w3, w1, [x0]                 // try to acquire mmu_lock
    CBNZ    w3, 1b                       // failed, go back to sleep

check_already_initialised:

    ADRP    x1, mmu_init                 // get 4KB page containing mmu_init
    ADD     x1, x1, :lo12:mmu_init       // restore low 12 bits lost by ADRP
    LDR     w2, [x1]                     // read mmu_init
    CBNZ    w2, end                      // init already done, skip to the end

zero_out_tables:

    LDR     x2, =0x80000000              // address of first table
    LDR     x3, =0x5000                  // combined length of all tables
    LSR     x3, x3, #5                   // number of required STP instructions
    FMOV    d0, xzr                      // clear q0
1:
    STP     q0, q0, [x2], #32            // zero out 4 table entries at a time
    SUBS    x3, x3, #1
    B.NE    1b

load_descriptor_templates:

    LDR     x2, =0x40000000000705        // Device block
    LDR     x3, =0x40000000000707        // Device page
    LDR     x4, =0x40000000000701        // RW data block
    LDR     x5, =0x40000000000703        // RW data page
    LDR     x20, =0x781                  // code block
    LDR     x21, =0x783                  // code page
    

program_table_0:

    LDR     x8, =0x80000000              // base address of this table
    LDR     x9, =0x40000000              // chunk size

program_table_0_entry_1:

    LDR     x10, =1                      // idx
    LDR     x11, =0x80001000             // next-level table address
    ORR     x11, x11, #0x3               // next-level table descriptor
    STR     x11, [x8, x10, lsl #3]       // write entry into table

program_table_0_entry_2:

    LDR     x10, =2                      // idx
    LDR     x11, =0x80003000             // next-level table address
    ORR     x11, x11, #0x3               // next-level table descriptor
    STR     x11, [x8, x10, lsl #3]       // write entry into table

program_table_0_entry_3:

    LDR     x10, =3                      // idx
    LDR     x11, =1                      // number of contiguous entries
    LDR     x12, =0xc0000000             // output address of entry[idx]
1:
    ORR     x12, x12, x4                 // merge output address with template
    STR     X12, [x8, x10, lsl #3]       // write entry into table
    ADD     x10, x10, #1                 // prepare for next entry idx+1
    ADD     x12, x12, x9                 // add chunk to address
    SUBS    x11, x11, #1                 // loop as required
    B.NE    1b
program_table_1:

    LDR     x8, =0x80001000              // base address of this table
    LDR     x9, =0x200000                // chunk size

program_table_1_entry_0:

    LDR     x10, =0                      // idx
    LDR     x11, =0x80002000             // next-level table address
    ORR     x11, x11, #0x3               // next-level table descriptor
    STR     x11, [x8, x10, lsl #3]       // write entry into table
program_table_2:

    LDR     x8, =0x80002000              // base address of this table
    LDR     x9, =0x1000                  // chunk size

program_table_2_entry_256_to_354:

    LDR     x10, =256                    // idx
    LDR     x11, =99                     // number of contiguous entries
    LDR     x12, =0x40100000             // output address of entry[idx]
1:
    ORR     x12, x12, x21                // merge output address with template
    STR     X12, [x8, x10, lsl #3]       // write entry into table
    ADD     x10, x10, #1                 // prepare for next entry idx+1
    ADD     x12, x12, x9                 // add chunk to address
    SUBS    x11, x11, #1                 // loop as required
    B.NE    1b
program_table_3:

    LDR     x8, =0x80003000              // base address of this table
    LDR     x9, =0x200000                // chunk size

program_table_3_entry_128_to_511:

    LDR     x10, =128                    // idx
    LDR     x11, =384                    // number of contiguous entries
    LDR     x12, =0x90000000             // output address of entry[idx]
1:
    ORR     x12, x12, x4                 // merge output address with template
    STR     X12, [x8, x10, lsl #3]       // write entry into table
    ADD     x10, x10, #1                 // prepare for next entry idx+1
    ADD     x12, x12, x9                 // add chunk to address
    SUBS    x11, x11, #1                 // loop as required
    B.NE    1b
program_table_4:

    LDR     x8, =0x80004000              // base address of this table
    LDR     x9, =0x200000                // chunk size

program_table_4_entry_0_to_127:

    LDR     x10, =0                      // idx
    LDR     x11, =128                    // number of contiguous entries
    LDR     x12, =0xc0000000             // output address of entry[idx]
1:
    ORR     x12, x12, x4                 // merge output address with template
    STR     X12, [x8, x10, lsl #3]       // write entry into table
    ADD     x10, x10, #1                 // prepare for next entry idx+1
    ADD     x12, x12, x9                 // add chunk to address
    SUBS    x11, x11, #1                 // loop as required
    B.NE    1b

init_done:

    MOV     w2, #INITIALISED
    STR     w2, [x1]

end:

    LDR     x1, =0x80000000              // program ttbr0 on this CPU
    MSR     ttbr0_el3, x1
    LDR     x1, =0xff                    // program mair on this CPU
    MSR     mair_el3, x1
    LDR     x1, =0x80803520              // program tcr on this CPU
    MSR     tcr_el3, x1
    ISB
    MRS     x2, tcr_el3                  // verify CPU supports desired config
    CMP     x2, x1
    B.NE    .
    LDR     x1, =0x1005                  // program sctlr on this CPU
    MSR     sctlr_el3, x1
    ISB                                  // synchronize context on this CPU
    STLR    wzr, [x0]                    // release mmu_lock
    RET                                  // done!