On 25/06/2023 22:49, Julien Grall wrote:
>
>
> From: Julien Grall <jgr...@amazon.com>
>
> 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 <jgr...@amazon.com>
>
> ----
>
> I couldn't come up with a solution that would not change the number
> of instructions executed in the entry path.
It looks like the max offset is indeed 1MB for conditional branches and I cannot
think of any better way of doing this, so:
Reviewed-by: Michal Orzel <michal.or...@amd.com>
> ---
> 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 95f1a9268419..492591fdef54 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
> + * appart. The easiest way is to duplicate the few instructions
s/appart/apart
~Michal