Commit aaac3733 authored by Ard Biesheuvel's avatar Ard Biesheuvel

ARM: kvm: replace open coded VA->PA calculations with adr_l call

Replace the open coded calculations of the actual physical address
of the KVM stub vector table with a single adr_l invocation.
Reviewed-by: default avatarNicolas Pitre <nico@fluxnic.net>
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 3bcf906b
...@@ -468,15 +468,10 @@ dtb_check_done: ...@@ -468,15 +468,10 @@ dtb_check_done:
/* /*
* Compute the address of the hyp vectors after relocation. * Compute the address of the hyp vectors after relocation.
* This requires some arithmetic since we cannot directly
* reference __hyp_stub_vectors in a PC-relative way.
* Call __hyp_set_vectors with the new address so that we * Call __hyp_set_vectors with the new address so that we
* can HVC again after the copy. * can HVC again after the copy.
*/ */
0: adr r0, 0b adr_l r0, __hyp_stub_vectors
movw r1, #:lower16:__hyp_stub_vectors - 0b
movt r1, #:upper16:__hyp_stub_vectors - 0b
add r0, r0, r1
sub r0, r0, r5 sub r0, r0, r5
add r0, r0, r10 add r0, r0, r10
bl __hyp_set_vectors bl __hyp_set_vectors
...@@ -627,17 +622,11 @@ not_relocated: mov r0, #0 ...@@ -627,17 +622,11 @@ not_relocated: mov r0, #0
cmp r0, #HYP_MODE @ if not booted in HYP mode... cmp r0, #HYP_MODE @ if not booted in HYP mode...
bne __enter_kernel @ boot kernel directly bne __enter_kernel @ boot kernel directly
adr r12, .L__hyp_reentry_vectors_offset adr_l r0, __hyp_reentry_vectors
ldr r0, [r12]
add r0, r0, r12
bl __hyp_set_vectors bl __hyp_set_vectors
__HVC(0) @ otherwise bounce to hyp mode __HVC(0) @ otherwise bounce to hyp mode
b . @ should never be reached b . @ should never be reached
.align 2
.L__hyp_reentry_vectors_offset: .long __hyp_reentry_vectors - .
#else #else
b __enter_kernel b __enter_kernel
#endif #endif
......
...@@ -24,41 +24,38 @@ ENTRY(__boot_cpu_mode) ...@@ -24,41 +24,38 @@ ENTRY(__boot_cpu_mode)
.text .text
/* /*
* Save the primary CPU boot mode. Requires 3 scratch registers. * Save the primary CPU boot mode. Requires 2 scratch registers.
*/ */
.macro store_primary_cpu_mode reg1, reg2, reg3 .macro store_primary_cpu_mode reg1, reg2
mrs \reg1, cpsr mrs \reg1, cpsr
and \reg1, \reg1, #MODE_MASK and \reg1, \reg1, #MODE_MASK
adr \reg2, .L__boot_cpu_mode_offset str_l \reg1, __boot_cpu_mode, \reg2
ldr \reg3, [\reg2]
str \reg1, [\reg2, \reg3]
.endm .endm
/* /*
* Compare the current mode with the one saved on the primary CPU. * Compare the current mode with the one saved on the primary CPU.
* If they don't match, record that fact. The Z bit indicates * If they don't match, record that fact. The Z bit indicates
* if there's a match or not. * if there's a match or not.
* Requires 3 additionnal scratch registers. * Requires 2 additional scratch registers.
*/ */
.macro compare_cpu_mode_with_primary mode, reg1, reg2, reg3 .macro compare_cpu_mode_with_primary mode, reg1, reg2
adr \reg2, .L__boot_cpu_mode_offset adr_l \reg2, __boot_cpu_mode
ldr \reg3, [\reg2] ldr \reg1, [\reg2]
ldr \reg1, [\reg2, \reg3]
cmp \mode, \reg1 @ matches primary CPU boot mode? cmp \mode, \reg1 @ matches primary CPU boot mode?
orrne \reg1, \reg1, #BOOT_CPU_MODE_MISMATCH orrne \reg1, \reg1, #BOOT_CPU_MODE_MISMATCH
strne \reg1, [\reg2, \reg3] @ record what happened and give up strne \reg1, [\reg2] @ record what happened and give up
.endm .endm
#else /* ZIMAGE */ #else /* ZIMAGE */
.macro store_primary_cpu_mode reg1:req, reg2:req, reg3:req .macro store_primary_cpu_mode reg1:req, reg2:req
.endm .endm
/* /*
* The zImage loader only runs on one CPU, so we don't bother with mult-CPU * The zImage loader only runs on one CPU, so we don't bother with mult-CPU
* consistency checking: * consistency checking:
*/ */
.macro compare_cpu_mode_with_primary mode, reg1, reg2, reg3 .macro compare_cpu_mode_with_primary mode, reg1, reg2
cmp \mode, \mode cmp \mode, \mode
.endm .endm
...@@ -73,7 +70,7 @@ ENTRY(__boot_cpu_mode) ...@@ -73,7 +70,7 @@ ENTRY(__boot_cpu_mode)
*/ */
@ Call this from the primary CPU @ Call this from the primary CPU
ENTRY(__hyp_stub_install) ENTRY(__hyp_stub_install)
store_primary_cpu_mode r4, r5, r6 store_primary_cpu_mode r4, r5
ENDPROC(__hyp_stub_install) ENDPROC(__hyp_stub_install)
@ fall through... @ fall through...
...@@ -87,7 +84,7 @@ ENTRY(__hyp_stub_install_secondary) ...@@ -87,7 +84,7 @@ ENTRY(__hyp_stub_install_secondary)
* If the secondary has booted with a different mode, give up * If the secondary has booted with a different mode, give up
* immediately. * immediately.
*/ */
compare_cpu_mode_with_primary r4, r5, r6, r7 compare_cpu_mode_with_primary r4, r5, r6
retne lr retne lr
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment