summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2020-12-23 07:24:07 +0000
committerAndrew Turner <andrew@FreeBSD.org>2020-12-23 07:54:59 +0000
commit659f1a6aad04adf0a0d27415f7a967d231ce4cfb (patch)
tree9850e724225851ea97972e7ba41caccf31dad852 /sys
parent906a73e791a005e228c1e3c9f8cb1e581359c786 (diff)
downloadsrc-test-659f1a6aad04adf0a0d27415f7a967d231ce4cfb.tar.gz
src-test-659f1a6aad04adf0a0d27415f7a967d231ce4cfb.zip
Improve address generation in the early arm64 boot
The adr instruction allows for an address of +-1M from the instruction. If we replace these with an adrp and an add instruction we can generate an address +-4G. The adrp will get an address of the 4k page the label is within, and the add uses the :lo12: prefix to add just the low bits to this address. This will allow us to move things around with fewer issues than if we needed to keep them within the +-1MB range. Sponsored by: Innovate UK
Diffstat (limited to 'sys')
-rw-r--r--sys/arm64/arm64/locore.S33
1 files changed, 22 insertions, 11 deletions
diff --git a/sys/arm64/arm64/locore.S b/sys/arm64/arm64/locore.S
index f438865a961a8..6f8d007b2efad 100644
--- a/sys/arm64/arm64/locore.S
+++ b/sys/arm64/arm64/locore.S
@@ -127,7 +127,8 @@ _start:
bl start_mmu
/* Load the new ttbr0 pagetable */
- adr x27, pagetable_l0_ttbr0
+ adrp x27, pagetable_l0_ttbr0
+ add x27, x27, :lo12:pagetable_l0_ttbr0
/* Jump to the virtual address space */
ldr x15, .Lvirtdone
@@ -135,7 +136,8 @@ _start:
virtdone:
/* Set up the stack */
- adr x25, initstack_end
+ adrp x25, initstack_end
+ add x25, x25, :lo12:initstack_end
mov sp, x25
sub sp, sp, #PCB_SIZE
@@ -163,7 +165,8 @@ virtdone:
str x1, [x0, #BP_MODULEP]
str x26, [x0, #BP_KERN_L1PT]
str x29, [x0, #BP_KERN_DELTA]
- adr x25, initstack
+ adrp x25, initstack
+ add x25, x25, :lo12:initstack
str x25, [x0, #BP_KERN_STACK]
str x24, [x0, #BP_KERN_L0PT]
str x27, [x0, #BP_KERN_TTBR0]
@@ -206,15 +209,18 @@ ENTRY(mpentry)
msr contextidr_el1, xzr
/* Load the kernel page table */
- adr x24, pagetable_l0_ttbr1
+ adrp x24, pagetable_l0_ttbr1
+ add x24, x24, :lo12:pagetable_l0_ttbr1
/* Load the identity page table */
- adr x27, pagetable_l0_ttbr0_boostrap
+ adrp x27, pagetable_l0_ttbr0_boostrap
+ add x27, x27, :lo12:pagetable_l0_ttbr0_boostrap
/* Enable the mmu */
bl start_mmu
/* Load the new ttbr0 pagetable */
- adr x27, pagetable_l0_ttbr0
+ adrp x27, pagetable_l0_ttbr0
+ add x27, x27, :lo12:pagetable_l0_ttbr0
/* Jump to the virtual address space */
ldr x15, =mp_virtdone
@@ -282,7 +288,8 @@ drop_to_el1:
msr cntvoff_el2, xzr
/* Hypervisor trap functions */
- adr x2, hyp_vectors
+ adrp x2, hyp_vectors
+ add x2, x2, :lo12:hyp_vectors
msr vbar_el2, x2
mov x2, #(PSR_F | PSR_I | PSR_A | PSR_D | PSR_M_EL1h)
@@ -345,7 +352,8 @@ hyp_vectors:
*/
get_virt_delta:
/* Load the physical address of virt_map */
- adr x29, 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 */
@@ -383,9 +391,11 @@ create_pagetables:
mov x5, x30
/* Clean the page table */
- adr x6, pagetable
+ adrp x6, pagetable
+ add x6, x6, :lo12:pagetable
mov x26, x6
- adr x27, pagetable_end
+ adrp x27, pagetable_end
+ add x27, x27, :lo12:pagetable_end
1:
stp xzr, xzr, [x6], #16
stp xzr, xzr, [x6], #16
@@ -474,7 +484,8 @@ common:
/* Link the DMAP tables */
ldr x8, =DMAP_MIN_ADDRESS
- adr x9, pagetable_dmap;
+ adrp x9, pagetable_dmap
+ add x9, x9, :lo12:pagetable_dmap
mov x10, #DMAP_TABLES
bl link_l0_pagetable