@@ -182,10 +182,7 @@ map_prepare:
182182 // map_data.paging_init_relo = setup_preset.paging_init_offset ;
183183 ldr x11 , [ x10 , #setup_paging_init_offset_offset ]
184184 str x11 , [ x9 , #map_paging_init_relo_offset ]
185-
186- ldr x15 , [ x10 , #setup_paging_init_bl_offset_offset ]
187- // uint64_t paging_init_bl_pa = paging_init_bl_offset + kernel_pa ;
188- add x13 , x15 , x19
185+ mov x15 , x11
189186
190187 // map_data.map_symbol = setup_preset.map_symbol
191188 add x0 , x9 , #map_map_symbol_offset
@@ -221,6 +218,37 @@ map_prepare:
221218 add x11 , x11 , #MEMORY_RW_SIZE
222219 str x11 , [ x9 , #map_alloc_size_offset ]
223220
221+ // backup and hook paging_init
222+ // uint64_t paging_init_pa = paging_init_offset + kernel_pa ;
223+ add x13 , x15 , x19
224+ // map_data.paging_init_backup = * (uint32_t * )(paging_init_pa) ;
225+ ldr w12 , [ x13 ]
226+
227+ mov w3 , # 0x201F
228+ movk w3 , # 0xD503 , lsl # 16
229+ orr w1 , w3 , # 0x100
230+ mov w2 , # 0xFFFFFD1F
231+ and w0 , w12 , w2
232+ // if ((map_data.paging_init_backup & 0xFFFFFD1F ) == 0xD503211F )
233+ cmp w0 , w1
234+ b.ne .backup
235+ // map_data.paging_init_backup = NOP
236+ mov w12 , w3
237+ // uint32_t * p = (uint32_t * )paging_init_pa + 1 ;
238+ add x11 , x13 , # 4
239+ .cmp_auti:
240+ // while (( * p & 0xFFFFFD1F ) != 0xD503211F ) ++ p ;
241+ ldr w0 , [ x11 ], # 4
242+ and w0 , w0 , w2
243+ cmp w0 , w1
244+ b.ne .cmp_auti
245+ // * p = NOP
246+ stur w3 , [ x11 , # - 4 ]
247+
248+ .backup:
249+ str w12 , [ x9 , #map_paging_init_backup_offset ]
250+ dsb ish
251+
224252 // uint64_t replace_offset = (uint64_t)(_paging_init - _map_start) + map_offset ;
225253 adrp x11 , _paging_init
226254 add x11 , x11 , :lo12:_paging_init
@@ -229,11 +257,11 @@ map_prepare:
229257 sub x11 , x11 , x12
230258 add x11 , x11 , x14
231259
232- // * (uint32_t * )paging_init_bl_pa = B_REL(paging_init_bl_offset , replace_offset) ;
233- // #define BL_REL (src , dst) (0x94000000u | (((dst - src) & 0x0FFFFFFFu) >> 2u))
260+ // * (uint32_t * )paging_init_pa = B_REL(paging_init_offset , replace_offset) ;
261+ // #define B_REL (src , dst) (0x14000000u | (((dst - src) & 0x0FFFFFFFu) >> 2u))
234262 sub x15 , x11 , x15
235263 ubfx w15 , w15 , # 2 , # 26
236- mov w12 , # 0x94000000
264+ mov w12 , # 0x14000000
237265 orr w15 , w15 , w12
238266 str w15 , [ x13 ]
239267
0 commit comments