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: Nicolas Pitre <nico@fluxnic.net> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
parent
3bcf906b19
commit
aaac373317
2 changed files with 14 additions and 28 deletions
|
@ -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
|
||||||
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)
|
||||||
.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)
|
||||||
*/
|
*/
|
||||||
@ 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)
|
||||||
* 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
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue