|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] xen/arm64: entry: Don't jump outside of an alternative
commit ef62b34aeb6ad152d9f5a94592814ca23b2dfab0
Author: Julien Grall <jgrall@xxxxxxxxxx>
AuthorDate: Thu Jun 29 20:55:18 2023 +0100
Commit: Julien Grall <jgrall@xxxxxxxxxx>
CommitDate: Thu Jun 29 20:58:09 2023 +0100
xen/arm64: entry: Don't jump outside of an alternative
The instruction CBNZ can only jump to a pc-relative that is in the
range +/- 1MB.
Alternative instructions replacement are living in a separate
subsection of the init section. This is usually placed towards
the end of the linker. Whereas text is towards the beginning.
While today Xen is quite small (~1MB), it could grow up to
2MB in the current setup. So there is no guarantee that the
target address in the text section will be within the range +/-
1MB of the CBNZ in alternative section.
The easiest solution is to have the target address within the
same section of the alternative. This means that we need to
duplicate a couple of instructions.
Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx>
----
I couldn't come up with a solution that would not change the number
of instructions executed in the entry path.
---
xen/arch/arm/arm64/entry.S | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/xen/arch/arm/arm64/entry.S b/xen/arch/arm/arm64/entry.S
index 95f1a92684..523c6d23d9 100644
--- a/xen/arch/arm/arm64/entry.S
+++ b/xen/arch/arm/arm64/entry.S
@@ -242,13 +242,24 @@
msr daifclr, \iflags
bl enter_hypervisor_from_guest
+ /*
+ * CBNZ can only address an offset of +/- 1MB. This means, it is
+ * not possible to jump outside of an alternative because
+ * the .text section and .altinstr_replacement may be further
+ * apart. The easiest way is to duplicate the few instructions
+ * that need to be skipped.
+ */
alternative_if SKIP_SYNCHRONIZE_SERROR_ENTRY_EXIT
- cbnz x19, 1f
- alternative_else_nop_endif
-
- mov x0, sp
- bl do_trap_\trap
+ cbnz x19, 1f
+ mov x0, sp
+ bl do_trap_\trap
1:
+ alternative_else
+ nop
+ mov x0, sp
+ bl do_trap_\trap
+ alternative_endif
+
exit hyp=0, compat=\compat
.endm
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |