ARM: decompressor: Remove __hyp_get_vectors usage
authorMarc Zyngier <marc.zyngier@arm.com>
Mon, 3 Apr 2017 18:38:02 +0000 (19:38 +0100)
committerChristoffer Dall <cdall@linaro.org>
Sun, 9 Apr 2017 14:49:33 +0000 (07:49 -0700)
When the compressed image needs to be relocated to avoid being
overwritten by the decompression process, we need to relocate
the hyp vectors as well so that we can find them once the
decompression has taken effect.

For that, we perform the following calculation:
u32 v = __hyp_get_vectors();
v += offset;
__hyp_set_vectors(v);

But we're guaranteed that the initial value of v as returned by
__hyp_get_vectors is always __hyp_stub_vectors, because we have
just set it by calling __hyp_stub_install.

So let's remove the use of __hyp_get_vectors, and directly use
__hyp_stub_vectors instead.

Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <cdall@linaro.org>
arch/arm/boot/compressed/head.S

index 9150f9732785aaec77d069f8d92ba6d65e941e2c..7c711ba614173d91d8c2fd6ff4ccb13980bb3109 100644 (file)
@@ -422,7 +422,17 @@ dtb_check_done:
                cmp     r0, #HYP_MODE
                bne     1f
 
-               bl      __hyp_get_vectors
+               /*
+                * 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
+                * can HVC again after the copy.
+                */
+0:             adr     r0, 0b
+               movw    r1, #:lower16:__hyp_stub_vectors - 0b
+               movt    r1, #:upper16:__hyp_stub_vectors - 0b
+               add     r0, r0, r1
                sub     r0, r0, r5
                add     r0, r0, r10
                bl      __hyp_set_vectors