Message ID | 1445895753-2095-1-git-send-email-mark.rutland@arm.com |
---|---|
State | Accepted |
Commit | cb083816ab5ac3d10a9417527f07fc5962cc3808 |
Headers | show |
On 27 October 2015 at 06:42, Mark Rutland <mark.rutland@arm.com> wrote: > A kernel built with DEBUG_RO_DATA && !CONFIG_DEBUG_ALIGN_RODATA doesn't > have .text aligned to a page boundary, though fixup_executable works at > page-granularity thanks to its use of create_mapping. If .text is not > page-aligned, the first page it exists in may be marked non-executable, > leading to failures when an attempt is made to execute code in said > page. > > This patch upgrades ALIGN_DEBUG_RO and ALIGN_DEBUG_RO_MIN to force page > alignment for DEBUG_RO_DATA && !CONFIG_DEBUG_ALIGN_RODATA kernels, > ensuring that all sections with specific RWX permission requirements are > mapped with the correct permissions. > > Signed-off-by: Mark Rutland <mark.rutland@arm.com> > Reported-by: Jeremy Linton <jeremy.linton@arm.com> > Reviewed-by: Laura Abbott <laura@labbott.name> > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Suzuki Poulose <suzuki.poulose@arm.com> > Cc: Will Deacon <will.deacon@arm.com> > --- > arch/arm64/kernel/vmlinux.lds.S | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > Note: this is intended to supercede [1,2]. > > [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-October/380486.html > [2] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-October/380999.html > > diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S > index 9807333..4d77757 100644 > --- a/arch/arm64/kernel/vmlinux.lds.S > +++ b/arch/arm64/kernel/vmlinux.lds.S > @@ -60,9 +60,12 @@ PECOFF_FILE_ALIGNMENT = 0x200; > #define PECOFF_EDATA_PADDING > #endif > > -#ifdef CONFIG_DEBUG_ALIGN_RODATA > +#if defined(CONFIG_DEBUG_ALIGN_RODATA) > #define ALIGN_DEBUG_RO . = ALIGN(1<<SECTION_SHIFT); > #define ALIGN_DEBUG_RO_MIN(min) ALIGN_DEBUG_RO > +#elif defined(CONFIG_DEBUG_RODATA) > +#define ALIGN_DEBUG_RO . = ALIGN(1<<PAGE_SHIFT); > +#define ALIGN_DEBUG_RO_MIN(min) ALIGN_DEBUG_RO > #else > #define ALIGN_DEBUG_RO > #define ALIGN_DEBUG_RO_MIN(min) . = ALIGN(min); Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
On Tue, Oct 27, 2015 at 11:37:04AM +0900, Ard Biesheuvel wrote: > On 27 October 2015 at 06:42, Mark Rutland <mark.rutland@arm.com> wrote: > > A kernel built with DEBUG_RO_DATA && !CONFIG_DEBUG_ALIGN_RODATA doesn't > > have .text aligned to a page boundary, though fixup_executable works at > > page-granularity thanks to its use of create_mapping. If .text is not > > page-aligned, the first page it exists in may be marked non-executable, > > leading to failures when an attempt is made to execute code in said > > page. > > > > This patch upgrades ALIGN_DEBUG_RO and ALIGN_DEBUG_RO_MIN to force page > > alignment for DEBUG_RO_DATA && !CONFIG_DEBUG_ALIGN_RODATA kernels, > > ensuring that all sections with specific RWX permission requirements are > > mapped with the correct permissions. > > > > Signed-off-by: Mark Rutland <mark.rutland@arm.com> > > Reported-by: Jeremy Linton <jeremy.linton@arm.com> > > Reviewed-by: Laura Abbott <laura@labbott.name> > > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > Cc: Catalin Marinas <catalin.marinas@arm.com> > > Cc: Suzuki Poulose <suzuki.poulose@arm.com> > > Cc: Will Deacon <will.deacon@arm.com> > > --- > > arch/arm64/kernel/vmlinux.lds.S | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > Note: this is intended to supercede [1,2]. > > > > [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-October/380486.html > > [2] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-October/380999.html > > > > diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S > > index 9807333..4d77757 100644 > > --- a/arch/arm64/kernel/vmlinux.lds.S > > +++ b/arch/arm64/kernel/vmlinux.lds.S > > @@ -60,9 +60,12 @@ PECOFF_FILE_ALIGNMENT = 0x200; > > #define PECOFF_EDATA_PADDING > > #endif > > > > -#ifdef CONFIG_DEBUG_ALIGN_RODATA > > +#if defined(CONFIG_DEBUG_ALIGN_RODATA) > > #define ALIGN_DEBUG_RO . = ALIGN(1<<SECTION_SHIFT); > > #define ALIGN_DEBUG_RO_MIN(min) ALIGN_DEBUG_RO > > +#elif defined(CONFIG_DEBUG_RODATA) > > +#define ALIGN_DEBUG_RO . = ALIGN(1<<PAGE_SHIFT); > > +#define ALIGN_DEBUG_RO_MIN(min) ALIGN_DEBUG_RO > > #else > > #define ALIGN_DEBUG_RO > > #define ALIGN_DEBUG_RO_MIN(min) . = ALIGN(min); > > Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cheers, Ard. Jeremy, does this work for you? If so, I expect Catalin will take this for 4.4, with the addition of any Acks and: Fixes: da141706aea52c1a ("arm64: add better page protections to arm64") Cc: <stable@vger.kernel.org> Thanks, Mark. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
On Tue, Oct 27, 2015 at 10:56:33AM +0000, Mark Rutland wrote: > On Tue, Oct 27, 2015 at 11:37:04AM +0900, Ard Biesheuvel wrote: > > On 27 October 2015 at 06:42, Mark Rutland <mark.rutland@arm.com> wrote: > > > A kernel built with DEBUG_RO_DATA && !CONFIG_DEBUG_ALIGN_RODATA doesn't > > > have .text aligned to a page boundary, though fixup_executable works at > > > page-granularity thanks to its use of create_mapping. If .text is not > > > page-aligned, the first page it exists in may be marked non-executable, > > > leading to failures when an attempt is made to execute code in said > > > page. > > > > > > This patch upgrades ALIGN_DEBUG_RO and ALIGN_DEBUG_RO_MIN to force page > > > alignment for DEBUG_RO_DATA && !CONFIG_DEBUG_ALIGN_RODATA kernels, > > > ensuring that all sections with specific RWX permission requirements are > > > mapped with the correct permissions. > > > > > > Signed-off-by: Mark Rutland <mark.rutland@arm.com> > > > Reported-by: Jeremy Linton <jeremy.linton@arm.com> > > > Reviewed-by: Laura Abbott <laura@labbott.name> > > > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > > Cc: Catalin Marinas <catalin.marinas@arm.com> > > > Cc: Suzuki Poulose <suzuki.poulose@arm.com> > > > Cc: Will Deacon <will.deacon@arm.com> [...] > Jeremy, does this work for you? > > If so, I expect Catalin will take this for 4.4, with the addition of any > Acks and: > > Fixes: da141706aea52c1a ("arm64: add better page protections to arm64") > Cc: <stable@vger.kernel.org> I applied this patch. I haven't pushed it out yet, in case Jeremy wants to add any acked/tested-by tags. Thanks. -- Catalin _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S index 9807333..4d77757 100644 --- a/arch/arm64/kernel/vmlinux.lds.S +++ b/arch/arm64/kernel/vmlinux.lds.S @@ -60,9 +60,12 @@ PECOFF_FILE_ALIGNMENT = 0x200; #define PECOFF_EDATA_PADDING #endif -#ifdef CONFIG_DEBUG_ALIGN_RODATA +#if defined(CONFIG_DEBUG_ALIGN_RODATA) #define ALIGN_DEBUG_RO . = ALIGN(1<<SECTION_SHIFT); #define ALIGN_DEBUG_RO_MIN(min) ALIGN_DEBUG_RO +#elif defined(CONFIG_DEBUG_RODATA) +#define ALIGN_DEBUG_RO . = ALIGN(1<<PAGE_SHIFT); +#define ALIGN_DEBUG_RO_MIN(min) ALIGN_DEBUG_RO #else #define ALIGN_DEBUG_RO #define ALIGN_DEBUG_RO_MIN(min) . = ALIGN(min);