* [PATCH] ARM, arm64: kvm: get rid of the bounce page
@ 2015-02-24 17:16 Ard Biesheuvel
0 siblings, 0 replies; 6+ messages in thread
From: Ard Biesheuvel @ 2015-02-24 17:16 UTC (permalink / raw)
To: linux-arm-kernel
The HYP init bounce page is a runtime construct that ensures that the
HYP init code does not cross a page boundary. However, this is something
we can do perfectly well at build time, by aligning the code appropriately.
For arm64, we just align to PAGE_SIZE, the rationale being that you are
either running with 4k page size, in which case the 2k vector table plus
the code size don't leave much of the page unused, or you are running with
64k page size, and you don't care about wasting memory anyway.
For ARM, the whole code is less than 256 bytes, so we tweak the linker
script to align at a power of 2 upper bound of the code size
Note that this also fixes a benign off-by-one error in the original bounce
page code, where a bounce page would be allocated unnecessarily if the code
was exactly 1 page in size.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm/kernel/vmlinux.lds.S | 12 +++++++++---
arch/arm/kvm/init.S | 11 +++++++++++
arch/arm/kvm/mmu.c | 42 +++++------------------------------------
arch/arm64/kernel/vmlinux.lds.S | 18 ++++++++++++------
4 files changed, 37 insertions(+), 46 deletions(-)
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index b31aa73e8076..8179d3903dee 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -23,7 +23,7 @@
VMLINUX_SYMBOL(__idmap_text_start) = .; \
*(.idmap.text) \
VMLINUX_SYMBOL(__idmap_text_end) = .; \
- . = ALIGN(32); \
+ . = ALIGN(1 << __hyp_idmap_align_order); \
VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
*(.hyp.idmap.text) \
VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
@@ -346,8 +346,14 @@ SECTIONS
*/
ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
+
/*
- * The HYP init code can't be more than a page long.
+ * The HYP init code can't be more than a page long,
+ * and should not cross a page boundary.
* The above comment applies as well.
*/
-ASSERT(((__hyp_idmap_text_end - __hyp_idmap_text_start) <= PAGE_SIZE), "HYP init code too big")
+ASSERT(((__hyp_idmap_text_end - 1) & PAGE_MASK) -
+ (__hyp_idmap_text_start & PAGE_MASK) == 0,
+ "HYP init code too big or unaligned")
+ASSERT(__hyp_idmap_size <= (1 << __hyp_idmap_align_order),
+ "__hyp_idmap_size should be <= (1 << __hyp_idmap_align_order)")
diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S
index 3988e72d16ff..7a279bc8e0e1 100644
--- a/arch/arm/kvm/init.S
+++ b/arch/arm/kvm/init.S
@@ -157,3 +157,14 @@ target: @ We're now in the trampoline code, switch page tables
__kvm_hyp_init_end:
.popsection
+
+ /*
+ * When making changes to this file, make sure that the value of
+ * __hyp_idmap_align_order is updated if the size of the code ends up
+ * exceeding (1 << __hyp_idmap_align_order). This helps ensure that the
+ * code never crosses a page boundary, without wasting too much memory
+ * on aligning to PAGE_SIZE.
+ */
+ .global __hyp_idmap_size, __hyp_idmap_align_order
+ .set __hyp_idmap_size, __kvm_hyp_init_end - __kvm_hyp_init
+ .set __hyp_idmap_align_order, 8
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 3e6859bc3e11..42a24d6b003b 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -37,7 +37,6 @@ static pgd_t *boot_hyp_pgd;
static pgd_t *hyp_pgd;
static DEFINE_MUTEX(kvm_hyp_pgd_mutex);
-static void *init_bounce_page;
static unsigned long hyp_idmap_start;
static unsigned long hyp_idmap_end;
static phys_addr_t hyp_idmap_vector;
@@ -405,9 +404,6 @@ void free_boot_hyp_pgd(void)
if (hyp_pgd)
unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
- free_page((unsigned long)init_bounce_page);
- init_bounce_page = NULL;
-
mutex_unlock(&kvm_hyp_pgd_mutex);
}
@@ -1498,39 +1494,11 @@ int kvm_mmu_init(void)
hyp_idmap_end = kvm_virt_to_phys(__hyp_idmap_text_end);
hyp_idmap_vector = kvm_virt_to_phys(__kvm_hyp_init);
- if ((hyp_idmap_start ^ hyp_idmap_end) & PAGE_MASK) {
- /*
- * Our init code is crossing a page boundary. Allocate
- * a bounce page, copy the code over and use that.
- */
- size_t len = __hyp_idmap_text_end - __hyp_idmap_text_start;
- phys_addr_t phys_base;
-
- init_bounce_page = (void *)__get_free_page(GFP_KERNEL);
- if (!init_bounce_page) {
- kvm_err("Couldn't allocate HYP init bounce page\n");
- err = -ENOMEM;
- goto out;
- }
-
- memcpy(init_bounce_page, __hyp_idmap_text_start, len);
- /*
- * Warning: the code we just copied to the bounce page
- * must be flushed to the point of coherency.
- * Otherwise, the data may be sitting in L2, and HYP
- * mode won't be able to observe it as it runs with
- * caches off at that point.
- */
- kvm_flush_dcache_to_poc(init_bounce_page, len);
-
- phys_base = kvm_virt_to_phys(init_bounce_page);
- hyp_idmap_vector += phys_base - hyp_idmap_start;
- hyp_idmap_start = phys_base;
- hyp_idmap_end = phys_base + len;
-
- kvm_info("Using HYP init bounce page @%lx\n",
- (unsigned long)phys_base);
- }
+ /*
+ * We rely on the linker script to ensure at build time that the HYP
+ * init code does not cross a page boundary.
+ */
+ BUG_ON((hyp_idmap_start ^ (hyp_idmap_end - 1)) & PAGE_MASK);
hyp_pgd = (pgd_t *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, hyp_pgd_order);
boot_hyp_pgd = (pgd_t *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, hyp_pgd_order);
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index 5d9d2dca530d..a01eedbe59eb 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -23,10 +23,14 @@ jiffies = jiffies_64;
#define HYPERVISOR_TEXT \
/* \
- * Force the alignment to be compatible with \
- * the vectors requirements \
+ * Align to PAGE_SIZE so that \
+ * a) the HYP vector table is@its minimum \
+ * alignment of 2048 bytes \
+ * b) the HYP init code will not cross a page \
+ * boundary if its size does not exceed \
+ * PAGE_SIZE (see related ASSERT() below) \
*/ \
- . = ALIGN(2048); \
+ . = ALIGN(PAGE_SIZE); \
VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
*(.hyp.idmap.text) \
VMLINUX_SYMBOL(__hyp_idmap_text_end) = .; \
@@ -163,10 +167,12 @@ SECTIONS
}
/*
- * The HYP init code can't be more than a page long.
+ * The HYP init code can't be more than a page long,
+ * and should not cross a page boundary.
*/
-ASSERT(((__hyp_idmap_text_start + PAGE_SIZE) > __hyp_idmap_text_end),
- "HYP init code too big")
+ASSERT(((__hyp_idmap_text_end - 1) & PAGE_MASK) -
+ (__hyp_idmap_text_start & PAGE_MASK) == 0,
+ "HYP init code too big or unaligned")
/*
* If padding is applied before .head.text, virt<->phys conversions will fail.
--
1.8.3.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] ARM, arm64: kvm: get rid of the bounce page
@ 2015-03-27 10:18 Ard Biesheuvel
2015-03-27 10:18 ` [PATCH] ARM: kvm: round HYP section to page size instead of log2 upper bound Ard Biesheuvel
0 siblings, 1 reply; 6+ messages in thread
From: Ard Biesheuvel @ 2015-03-27 10:18 UTC (permalink / raw)
To: linux-arm-kernel
The HYP init bounce page is a runtime construct that ensures that the
HYP init code does not cross a page boundary. However, this is something
we can do perfectly well at build time, by aligning the code appropriately.
For both ARM and arm64, we just align to 4 KB, and enforce that the code
size is less than 4 KB, regardless of the chosen page size.
Note that this also fixes a benign off-by-one error in the original bounce
page code, where a bounce page would be allocated unnecessarily if the code
was exactly 1 page in size.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm/kernel/vmlinux.lds.S | 11 +++++++----
arch/arm/kvm/mmu.c | 42 +++++------------------------------------
arch/arm64/kernel/vmlinux.lds.S | 17 +++++++++++------
3 files changed, 23 insertions(+), 47 deletions(-)
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index b31aa73e8076..f2db429ea75d 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -23,7 +23,7 @@
VMLINUX_SYMBOL(__idmap_text_start) = .; \
*(.idmap.text) \
VMLINUX_SYMBOL(__idmap_text_end) = .; \
- . = ALIGN(32); \
+ . = ALIGN(PAGE_SIZE); \
VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
*(.hyp.idmap.text) \
VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
@@ -346,8 +346,11 @@ SECTIONS
*/
ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
+
/*
- * The HYP init code can't be more than a page long.
+ * The HYP init code can't be more than a page long,
+ * and should not cross a page boundary.
* The above comment applies as well.
*/
-ASSERT(((__hyp_idmap_text_end - __hyp_idmap_text_start) <= PAGE_SIZE), "HYP init code too big")
+ASSERT(__hyp_idmap_text_end - (__hyp_idmap_text_start & PAGE_MASK) <= PAGE_SIZE,
+ "HYP init code too big or misaligned")
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 3e6859bc3e11..42a24d6b003b 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -37,7 +37,6 @@ static pgd_t *boot_hyp_pgd;
static pgd_t *hyp_pgd;
static DEFINE_MUTEX(kvm_hyp_pgd_mutex);
-static void *init_bounce_page;
static unsigned long hyp_idmap_start;
static unsigned long hyp_idmap_end;
static phys_addr_t hyp_idmap_vector;
@@ -405,9 +404,6 @@ void free_boot_hyp_pgd(void)
if (hyp_pgd)
unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
- free_page((unsigned long)init_bounce_page);
- init_bounce_page = NULL;
-
mutex_unlock(&kvm_hyp_pgd_mutex);
}
@@ -1498,39 +1494,11 @@ int kvm_mmu_init(void)
hyp_idmap_end = kvm_virt_to_phys(__hyp_idmap_text_end);
hyp_idmap_vector = kvm_virt_to_phys(__kvm_hyp_init);
- if ((hyp_idmap_start ^ hyp_idmap_end) & PAGE_MASK) {
- /*
- * Our init code is crossing a page boundary. Allocate
- * a bounce page, copy the code over and use that.
- */
- size_t len = __hyp_idmap_text_end - __hyp_idmap_text_start;
- phys_addr_t phys_base;
-
- init_bounce_page = (void *)__get_free_page(GFP_KERNEL);
- if (!init_bounce_page) {
- kvm_err("Couldn't allocate HYP init bounce page\n");
- err = -ENOMEM;
- goto out;
- }
-
- memcpy(init_bounce_page, __hyp_idmap_text_start, len);
- /*
- * Warning: the code we just copied to the bounce page
- * must be flushed to the point of coherency.
- * Otherwise, the data may be sitting in L2, and HYP
- * mode won't be able to observe it as it runs with
- * caches off at that point.
- */
- kvm_flush_dcache_to_poc(init_bounce_page, len);
-
- phys_base = kvm_virt_to_phys(init_bounce_page);
- hyp_idmap_vector += phys_base - hyp_idmap_start;
- hyp_idmap_start = phys_base;
- hyp_idmap_end = phys_base + len;
-
- kvm_info("Using HYP init bounce page @%lx\n",
- (unsigned long)phys_base);
- }
+ /*
+ * We rely on the linker script to ensure at build time that the HYP
+ * init code does not cross a page boundary.
+ */
+ BUG_ON((hyp_idmap_start ^ (hyp_idmap_end - 1)) & PAGE_MASK);
hyp_pgd = (pgd_t *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, hyp_pgd_order);
boot_hyp_pgd = (pgd_t *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, hyp_pgd_order);
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index 5d9d2dca530d..a2c29865c3fe 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -23,10 +23,14 @@ jiffies = jiffies_64;
#define HYPERVISOR_TEXT \
/* \
- * Force the alignment to be compatible with \
- * the vectors requirements \
+ * Align to 4 KB so that \
+ * a) the HYP vector table is@its minimum \
+ * alignment of 2048 bytes \
+ * b) the HYP init code will not cross a page \
+ * boundary if its size does not exceed \
+ * 4 KB (see related ASSERT() below) \
*/ \
- . = ALIGN(2048); \
+ . = ALIGN(SZ_4K); \
VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
*(.hyp.idmap.text) \
VMLINUX_SYMBOL(__hyp_idmap_text_end) = .; \
@@ -163,10 +167,11 @@ SECTIONS
}
/*
- * The HYP init code can't be more than a page long.
+ * The HYP init code can't be more than a page long,
+ * and should not cross a page boundary.
*/
-ASSERT(((__hyp_idmap_text_start + PAGE_SIZE) > __hyp_idmap_text_end),
- "HYP init code too big")
+ASSERT(__hyp_idmap_text_end - (__hyp_idmap_text_start & ~(SZ_4K - 1)) <= SZ_4K,
+ "HYP init code too big or misaligned")
/*
* If padding is applied before .head.text, virt<->phys conversions will fail.
--
1.8.3.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] ARM: kvm: round HYP section to page size instead of log2 upper bound
2015-03-27 10:18 [PATCH] ARM, arm64: kvm: get rid of the bounce page Ard Biesheuvel
@ 2015-03-27 10:18 ` Ard Biesheuvel
2015-03-27 11:09 ` Will Deacon
0 siblings, 1 reply; 6+ messages in thread
From: Ard Biesheuvel @ 2015-03-27 10:18 UTC (permalink / raw)
To: linux-arm-kernel
Older binutils do not support expressions involving the values of
external symbols so just round up the HYP region to the page size.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm/kernel/vmlinux.lds.S | 31 +------------------------------
arch/arm/kvm/init.S | 3 ---
2 files changed, 1 insertion(+), 33 deletions(-)
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 808398ec024e..f2db429ea75d 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -12,26 +12,6 @@
#include <asm/pgtable.h>
#endif
-/*
- * Poor man's version of LOG2CEIL(), which is
- * not available in binutils before v2.24.
- */
-#define LOG2_ROUNDUP(size) ( \
- __LOG2_ROUNDUP(size, 2) \
- __LOG2_ROUNDUP(size, 3) \
- __LOG2_ROUNDUP(size, 4) \
- __LOG2_ROUNDUP(size, 5) \
- __LOG2_ROUNDUP(size, 6) \
- __LOG2_ROUNDUP(size, 7) \
- __LOG2_ROUNDUP(size, 8) \
- __LOG2_ROUNDUP(size, 9) \
- __LOG2_ROUNDUP(size, 10) \
- __LOG2_ROUNDUP(size, 11) \
- 12)
-
-#define __LOG2_ROUNDUP(size, order) \
- (size) <= (1 << order) ? order :
-
#define PROC_INFO \
. = ALIGN(4); \
VMLINUX_SYMBOL(__proc_info_begin) = .; \
@@ -43,20 +23,11 @@
VMLINUX_SYMBOL(__idmap_text_start) = .; \
*(.idmap.text) \
VMLINUX_SYMBOL(__idmap_text_end) = .; \
- . = ALIGN(1 << LOG2_ROUNDUP(__hyp_idmap_size)); \
+ . = ALIGN(PAGE_SIZE); \
VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
*(.hyp.idmap.text) \
VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
-/*
- * If the HYP idmap .text section is populated, it needs to be positioned
- * such that it will not cross a page boundary in the final output image.
- * So align it to the section size rounded up to the next power of 2.
- * If __hyp_idmap_size is undefined, the section will be empty so define
- * it as 0 in that case.
- */
-PROVIDE(__hyp_idmap_size = 0);
-
#ifdef CONFIG_HOTPLUG_CPU
#define ARM_CPU_DISCARD(x)
#define ARM_CPU_KEEP(x) x
diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S
index 11fb1d56f449..3988e72d16ff 100644
--- a/arch/arm/kvm/init.S
+++ b/arch/arm/kvm/init.S
@@ -157,6 +157,3 @@ target: @ We're now in the trampoline code, switch page tables
__kvm_hyp_init_end:
.popsection
-
- .global __hyp_idmap_size
- .set __hyp_idmap_size, __kvm_hyp_init_end - __kvm_hyp_init
--
1.8.3.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] ARM: kvm: round HYP section to page size instead of log2 upper bound
2015-03-27 10:18 ` [PATCH] ARM: kvm: round HYP section to page size instead of log2 upper bound Ard Biesheuvel
@ 2015-03-27 11:09 ` Will Deacon
2015-03-27 11:12 ` Ard Biesheuvel
0 siblings, 1 reply; 6+ messages in thread
From: Will Deacon @ 2015-03-27 11:09 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Mar 27, 2015 at 10:18:01AM +0000, Ard Biesheuvel wrote:
> Older binutils do not support expressions involving the values of
> external symbols so just round up the HYP region to the page size.
>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Thanks Ard. I managed to reproduce the failures in -next, and this solves
the problem for me (the only toolchain that chokes seems to be the one on
kernel.org, unfortunately).
I'll push an updated branch after a bit more testing. Let's not touch this
file ever again :)
Will
> ---
> arch/arm/kernel/vmlinux.lds.S | 31 +------------------------------
> arch/arm/kvm/init.S | 3 ---
> 2 files changed, 1 insertion(+), 33 deletions(-)
>
> diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
> index 808398ec024e..f2db429ea75d 100644
> --- a/arch/arm/kernel/vmlinux.lds.S
> +++ b/arch/arm/kernel/vmlinux.lds.S
> @@ -12,26 +12,6 @@
> #include <asm/pgtable.h>
> #endif
>
> -/*
> - * Poor man's version of LOG2CEIL(), which is
> - * not available in binutils before v2.24.
> - */
> -#define LOG2_ROUNDUP(size) ( \
> - __LOG2_ROUNDUP(size, 2) \
> - __LOG2_ROUNDUP(size, 3) \
> - __LOG2_ROUNDUP(size, 4) \
> - __LOG2_ROUNDUP(size, 5) \
> - __LOG2_ROUNDUP(size, 6) \
> - __LOG2_ROUNDUP(size, 7) \
> - __LOG2_ROUNDUP(size, 8) \
> - __LOG2_ROUNDUP(size, 9) \
> - __LOG2_ROUNDUP(size, 10) \
> - __LOG2_ROUNDUP(size, 11) \
> - 12)
> -
> -#define __LOG2_ROUNDUP(size, order) \
> - (size) <= (1 << order) ? order :
> -
> #define PROC_INFO \
> . = ALIGN(4); \
> VMLINUX_SYMBOL(__proc_info_begin) = .; \
> @@ -43,20 +23,11 @@
> VMLINUX_SYMBOL(__idmap_text_start) = .; \
> *(.idmap.text) \
> VMLINUX_SYMBOL(__idmap_text_end) = .; \
> - . = ALIGN(1 << LOG2_ROUNDUP(__hyp_idmap_size)); \
> + . = ALIGN(PAGE_SIZE); \
> VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
> *(.hyp.idmap.text) \
> VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
>
> -/*
> - * If the HYP idmap .text section is populated, it needs to be positioned
> - * such that it will not cross a page boundary in the final output image.
> - * So align it to the section size rounded up to the next power of 2.
> - * If __hyp_idmap_size is undefined, the section will be empty so define
> - * it as 0 in that case.
> - */
> -PROVIDE(__hyp_idmap_size = 0);
> -
> #ifdef CONFIG_HOTPLUG_CPU
> #define ARM_CPU_DISCARD(x)
> #define ARM_CPU_KEEP(x) x
> diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S
> index 11fb1d56f449..3988e72d16ff 100644
> --- a/arch/arm/kvm/init.S
> +++ b/arch/arm/kvm/init.S
> @@ -157,6 +157,3 @@ target: @ We're now in the trampoline code, switch page tables
> __kvm_hyp_init_end:
>
> .popsection
> -
> - .global __hyp_idmap_size
> - .set __hyp_idmap_size, __kvm_hyp_init_end - __kvm_hyp_init
> --
> 1.8.3.2
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] ARM: kvm: round HYP section to page size instead of log2 upper bound
2015-03-27 11:09 ` Will Deacon
@ 2015-03-27 11:12 ` Ard Biesheuvel
2015-03-27 12:13 ` Simon Horman
0 siblings, 1 reply; 6+ messages in thread
From: Ard Biesheuvel @ 2015-03-27 11:12 UTC (permalink / raw)
To: linux-arm-kernel
On 27 March 2015 at 12:09, Will Deacon <will.deacon@arm.com> wrote:
> On Fri, Mar 27, 2015 at 10:18:01AM +0000, Ard Biesheuvel wrote:
>> Older binutils do not support expressions involving the values of
>> external symbols so just round up the HYP region to the page size.
>>
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>
> Thanks Ard. I managed to reproduce the failures in -next, and this solves
> the problem for me (the only toolchain that chokes seems to be the one on
> kernel.org, unfortunately).
>
> I'll push an updated branch after a bit more testing. Let's not touch this
> file ever again :)
>
Fingers crossed ...
>> ---
>> arch/arm/kernel/vmlinux.lds.S | 31 +------------------------------
>> arch/arm/kvm/init.S | 3 ---
>> 2 files changed, 1 insertion(+), 33 deletions(-)
>>
>> diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
>> index 808398ec024e..f2db429ea75d 100644
>> --- a/arch/arm/kernel/vmlinux.lds.S
>> +++ b/arch/arm/kernel/vmlinux.lds.S
>> @@ -12,26 +12,6 @@
>> #include <asm/pgtable.h>
>> #endif
>>
>> -/*
>> - * Poor man's version of LOG2CEIL(), which is
>> - * not available in binutils before v2.24.
>> - */
>> -#define LOG2_ROUNDUP(size) ( \
>> - __LOG2_ROUNDUP(size, 2) \
>> - __LOG2_ROUNDUP(size, 3) \
>> - __LOG2_ROUNDUP(size, 4) \
>> - __LOG2_ROUNDUP(size, 5) \
>> - __LOG2_ROUNDUP(size, 6) \
>> - __LOG2_ROUNDUP(size, 7) \
>> - __LOG2_ROUNDUP(size, 8) \
>> - __LOG2_ROUNDUP(size, 9) \
>> - __LOG2_ROUNDUP(size, 10) \
>> - __LOG2_ROUNDUP(size, 11) \
>> - 12)
>> -
>> -#define __LOG2_ROUNDUP(size, order) \
>> - (size) <= (1 << order) ? order :
>> -
>> #define PROC_INFO \
>> . = ALIGN(4); \
>> VMLINUX_SYMBOL(__proc_info_begin) = .; \
>> @@ -43,20 +23,11 @@
>> VMLINUX_SYMBOL(__idmap_text_start) = .; \
>> *(.idmap.text) \
>> VMLINUX_SYMBOL(__idmap_text_end) = .; \
>> - . = ALIGN(1 << LOG2_ROUNDUP(__hyp_idmap_size)); \
>> + . = ALIGN(PAGE_SIZE); \
>> VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
>> *(.hyp.idmap.text) \
>> VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
>>
>> -/*
>> - * If the HYP idmap .text section is populated, it needs to be positioned
>> - * such that it will not cross a page boundary in the final output image.
>> - * So align it to the section size rounded up to the next power of 2.
>> - * If __hyp_idmap_size is undefined, the section will be empty so define
>> - * it as 0 in that case.
>> - */
>> -PROVIDE(__hyp_idmap_size = 0);
>> -
>> #ifdef CONFIG_HOTPLUG_CPU
>> #define ARM_CPU_DISCARD(x)
>> #define ARM_CPU_KEEP(x) x
>> diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S
>> index 11fb1d56f449..3988e72d16ff 100644
>> --- a/arch/arm/kvm/init.S
>> +++ b/arch/arm/kvm/init.S
>> @@ -157,6 +157,3 @@ target: @ We're now in the trampoline code, switch page tables
>> __kvm_hyp_init_end:
>>
>> .popsection
>> -
>> - .global __hyp_idmap_size
>> - .set __hyp_idmap_size, __kvm_hyp_init_end - __kvm_hyp_init
>> --
>> 1.8.3.2
>>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] ARM: kvm: round HYP section to page size instead of log2 upper bound
2015-03-27 11:12 ` Ard Biesheuvel
@ 2015-03-27 12:13 ` Simon Horman
0 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2015-03-27 12:13 UTC (permalink / raw)
To: linux-arm-kernel
Hi Ard, Hi Will,
On Fri, Mar 27, 2015 at 12:12:00PM +0100, Ard Biesheuvel wrote:
> On 27 March 2015 at 12:09, Will Deacon <will.deacon@arm.com> wrote:
> > On Fri, Mar 27, 2015 at 10:18:01AM +0000, Ard Biesheuvel wrote:
> >> Older binutils do not support expressions involving the values of
> >> external symbols so just round up the HYP region to the page size.
> >>
> >> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> >
> > Thanks Ard. I managed to reproduce the failures in -next, and this solves
> > the problem for me (the only toolchain that chokes seems to be the one on
> > kernel.org, unfortunately).
For the record that is the one I am using.
> > I'll push an updated branch after a bit more testing. Let's not touch this
> > file ever again :)
:)
> Fingers crossed ...
I have tested this patch applied on top of next-20150326 and the build
problem I observed is gone. I have also tested that the resulting kernel
boots on a range of Renesas boards.
Tested-by: Simon Horman <horms+renesas@verge.net.au>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-03-27 12:13 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-27 10:18 [PATCH] ARM, arm64: kvm: get rid of the bounce page Ard Biesheuvel
2015-03-27 10:18 ` [PATCH] ARM: kvm: round HYP section to page size instead of log2 upper bound Ard Biesheuvel
2015-03-27 11:09 ` Will Deacon
2015-03-27 11:12 ` Ard Biesheuvel
2015-03-27 12:13 ` Simon Horman
-- strict thread matches above, loose matches on Subject: below --
2015-02-24 17:16 [PATCH] ARM, arm64: kvm: get rid of the bounce page Ard Biesheuvel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).