arm64: Clean up finding our load address

Use the linker to pre-calculate the offset of a known symbol from
KERNBASE, and use this to find the physical address KERNBASE should
map to.

Sponsored by:	Arm Ltd
Differential Revision:	https://reviews.freebsd.org/D42568
This commit is contained in:
Andrew Turner 2023-11-13 15:39:06 +00:00
parent ba31362694
commit 61f14f1da3

View file

@ -359,21 +359,13 @@ LEND(drop_to_el1)
* Get the physical address the kernel was loaded at.
*/
LENTRY(get_load_phys_addr)
/* Load the offset of get_load_phys_addr from KERNBASE */
ldr x28, =(get_load_phys_addr - KERNBASE)
/* Load the physical address of virt_map */
adrp x29, virt_map
add x29, x29, :lo12:virt_map
/* Load the virtual address of virt_map stored in virt_map */
ldr x28, [x29]
/* Find PA - VA as PA' = VA' - VA + PA = VA' + (PA - VA) = VA' + x29 */
sub x29, x29, x28
/* Find the load address for the kernel */
mov x28, #(KERNBASE)
add x28, x28, x29
adr x29, get_load_phys_addr
/* Find the physical address of KERNBASE, i.e. our load address */
sub x28, x29, x28
ret
.align 3
virt_map:
.quad virt_map
LEND(get_load_phys_addr)
/*