* [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support
@ 2014-08-19 19:41 Laura Abbott
2014-08-19 19:41 ` [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit Laura Abbott
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: Laura Abbott @ 2014-08-19 19:41 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
This is another version of DEBUG_SET_MODULE_RONX support for arm64.
Thanks,
Laura
v4: Switch to one function to do set/clear per suggestion of Will
v3: Addressed comments by Will/Steve
Laura Abbott (2):
arm64: Introduce {set,clear}_pte_bit
arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support
arch/arm64/Kconfig.debug | 11 +++++
arch/arm64/include/asm/cacheflush.h | 4 ++
arch/arm64/include/asm/pgtable.h | 33 +++++++------
arch/arm64/mm/Makefile | 2 +-
arch/arm64/mm/pageattr.c | 96 +++++++++++++++++++++++++++++++++++++
5 files changed, 131 insertions(+), 15 deletions(-)
create mode 100644 arch/arm64/mm/pageattr.c
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
^ permalink raw reply [flat|nested] 17+ messages in thread* [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit 2014-08-19 19:41 [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support Laura Abbott @ 2014-08-19 19:41 ` Laura Abbott 2014-08-26 14:27 ` Catalin Marinas 2014-08-19 19:41 ` [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support Laura Abbott 2014-08-22 17:36 ` [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support Will Deacon 2 siblings, 1 reply; 17+ messages in thread From: Laura Abbott @ 2014-08-19 19:41 UTC (permalink / raw) To: linux-arm-kernel It's useful to be able to change individual bits in ptes at times. Introduce functions for this and update existing pte_mk* functions to use these primatives. Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Laura Abbott <lauraa@codeaurora.org> --- arch/arm64/include/asm/pgtable.h | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index ffe1ba0..ca41449 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -149,46 +149,51 @@ extern struct page *empty_zero_page; #define pte_valid_not_user(pte) \ ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) -static inline pte_t pte_wrprotect(pte_t pte) +static pte_t clear_pte_bit(pte_t pte, pgprot_t prot) { - pte_val(pte) &= ~PTE_WRITE; + pte_val(pte) &= ~pgprot_val(prot); return pte; } -static inline pte_t pte_mkwrite(pte_t pte) +static pte_t set_pte_bit(pte_t pte, pgprot_t prot) { - pte_val(pte) |= PTE_WRITE; + pte_val(pte) |= pgprot_val(prot); return pte; } +static inline pte_t pte_wrprotect(pte_t pte) +{ + return clear_pte_bit(pte, __pgprot(PTE_WRITE)); +} + +static inline pte_t pte_mkwrite(pte_t pte) +{ + return set_pte_bit(pte, __pgprot(PTE_WRITE)); +} + static inline pte_t pte_mkclean(pte_t pte) { - pte_val(pte) &= ~PTE_DIRTY; - return pte; + return clear_pte_bit(pte, __pgprot(PTE_DIRTY)); } static inline pte_t pte_mkdirty(pte_t pte) { - pte_val(pte) |= PTE_DIRTY; - return pte; + return set_pte_bit(pte, __pgprot(PTE_DIRTY)); } static inline pte_t pte_mkold(pte_t pte) { - pte_val(pte) &= ~PTE_AF; - return pte; + return clear_pte_bit(pte, __pgprot(PTE_AF)); } static inline pte_t pte_mkyoung(pte_t pte) { - pte_val(pte) |= PTE_AF; - return pte; + return set_pte_bit(pte, __pgprot(PTE_AF)); } static inline pte_t pte_mkspecial(pte_t pte) { - pte_val(pte) |= PTE_SPECIAL; - return pte; + return set_pte_bit(pte, __pgprot(PTE_SPECIAL)); } static inline void set_pte(pte_t *ptep, pte_t pte) -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit 2014-08-19 19:41 ` [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit Laura Abbott @ 2014-08-26 14:27 ` Catalin Marinas 2014-08-26 20:15 ` Laura Abbott 0 siblings, 1 reply; 17+ messages in thread From: Catalin Marinas @ 2014-08-26 14:27 UTC (permalink / raw) To: linux-arm-kernel On Tue, Aug 19, 2014 at 08:41:42PM +0100, Laura Abbott wrote: > diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > index ffe1ba0..ca41449 100644 > --- a/arch/arm64/include/asm/pgtable.h > +++ b/arch/arm64/include/asm/pgtable.h > @@ -149,46 +149,51 @@ extern struct page *empty_zero_page; > #define pte_valid_not_user(pte) \ > ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) > > -static inline pte_t pte_wrprotect(pte_t pte) > +static pte_t clear_pte_bit(pte_t pte, pgprot_t prot) > { > - pte_val(pte) &= ~PTE_WRITE; > + pte_val(pte) &= ~pgprot_val(prot); > return pte; > } > > -static inline pte_t pte_mkwrite(pte_t pte) > +static pte_t set_pte_bit(pte_t pte, pgprot_t prot) > { > - pte_val(pte) |= PTE_WRITE; > + pte_val(pte) |= pgprot_val(prot); > return pte; > } Why these two functions don't have an "inline"? -- Catalin ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit 2014-08-26 14:27 ` Catalin Marinas @ 2014-08-26 20:15 ` Laura Abbott 2014-08-27 8:07 ` Will Deacon 0 siblings, 1 reply; 17+ messages in thread From: Laura Abbott @ 2014-08-26 20:15 UTC (permalink / raw) To: linux-arm-kernel On 8/26/2014 7:27 AM, Catalin Marinas wrote: > On Tue, Aug 19, 2014 at 08:41:42PM +0100, Laura Abbott wrote: >> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h >> index ffe1ba0..ca41449 100644 >> --- a/arch/arm64/include/asm/pgtable.h >> +++ b/arch/arm64/include/asm/pgtable.h >> @@ -149,46 +149,51 @@ extern struct page *empty_zero_page; >> #define pte_valid_not_user(pte) \ >> ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) >> >> -static inline pte_t pte_wrprotect(pte_t pte) >> +static pte_t clear_pte_bit(pte_t pte, pgprot_t prot) >> { >> - pte_val(pte) &= ~PTE_WRITE; >> + pte_val(pte) &= ~pgprot_val(prot); >> return pte; >> } >> >> -static inline pte_t pte_mkwrite(pte_t pte) >> +static pte_t set_pte_bit(pte_t pte, pgprot_t prot) >> { >> - pte_val(pte) |= PTE_WRITE; >> + pte_val(pte) |= pgprot_val(prot); >> return pte; >> } > > Why these two functions don't have an "inline"? > That's an error on my part. Will, you mentioned you applied these patches already, how would you like to fix this up? Laura -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit 2014-08-26 20:15 ` Laura Abbott @ 2014-08-27 8:07 ` Will Deacon 2014-09-01 15:42 ` Laura Abbott 0 siblings, 1 reply; 17+ messages in thread From: Will Deacon @ 2014-08-27 8:07 UTC (permalink / raw) To: linux-arm-kernel On Tue, Aug 26, 2014 at 09:15:40PM +0100, Laura Abbott wrote: > On 8/26/2014 7:27 AM, Catalin Marinas wrote: > > On Tue, Aug 19, 2014 at 08:41:42PM +0100, Laura Abbott wrote: > >> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > >> index ffe1ba0..ca41449 100644 > >> --- a/arch/arm64/include/asm/pgtable.h > >> +++ b/arch/arm64/include/asm/pgtable.h > >> @@ -149,46 +149,51 @@ extern struct page *empty_zero_page; > >> #define pte_valid_not_user(pte) \ > >> ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) > >> > >> -static inline pte_t pte_wrprotect(pte_t pte) > >> +static pte_t clear_pte_bit(pte_t pte, pgprot_t prot) > >> { > >> - pte_val(pte) &= ~PTE_WRITE; > >> + pte_val(pte) &= ~pgprot_val(prot); > >> return pte; > >> } > >> > >> -static inline pte_t pte_mkwrite(pte_t pte) > >> +static pte_t set_pte_bit(pte_t pte, pgprot_t prot) > >> { > >> - pte_val(pte) |= PTE_WRITE; > >> + pte_val(pte) |= pgprot_val(prot); > >> return pte; > >> } > > > > Why these two functions don't have an "inline"? > > > > That's an error on my part. > > Will, you mentioned you applied these patches already, how > would you like to fix this up? Yup, I can easily add the missing inline keywords. Did you see Catalin's other comment? It looks like we're missing a '-1' on the end address before checking whether or not it sits in a module. If you confirm, I can add that too. Will ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit 2014-08-27 8:07 ` Will Deacon @ 2014-09-01 15:42 ` Laura Abbott 0 siblings, 0 replies; 17+ messages in thread From: Laura Abbott @ 2014-09-01 15:42 UTC (permalink / raw) To: linux-arm-kernel On 8/27/2014 1:07 AM, Will Deacon wrote: > On Tue, Aug 26, 2014 at 09:15:40PM +0100, Laura Abbott wrote: >> On 8/26/2014 7:27 AM, Catalin Marinas wrote: >>> On Tue, Aug 19, 2014 at 08:41:42PM +0100, Laura Abbott wrote: >>>> diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h >>>> index ffe1ba0..ca41449 100644 >>>> --- a/arch/arm64/include/asm/pgtable.h >>>> +++ b/arch/arm64/include/asm/pgtable.h >>>> @@ -149,46 +149,51 @@ extern struct page *empty_zero_page; >>>> #define pte_valid_not_user(pte) \ >>>> ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) >>>> >>>> -static inline pte_t pte_wrprotect(pte_t pte) >>>> +static pte_t clear_pte_bit(pte_t pte, pgprot_t prot) >>>> { >>>> - pte_val(pte) &= ~PTE_WRITE; >>>> + pte_val(pte) &= ~pgprot_val(prot); >>>> return pte; >>>> } >>>> >>>> -static inline pte_t pte_mkwrite(pte_t pte) >>>> +static pte_t set_pte_bit(pte_t pte, pgprot_t prot) >>>> { >>>> - pte_val(pte) |= PTE_WRITE; >>>> + pte_val(pte) |= pgprot_val(prot); >>>> return pte; >>>> } >>> >>> Why these two functions don't have an "inline"? >>> >> >> That's an error on my part. >> >> Will, you mentioned you applied these patches already, how >> would you like to fix this up? > > Yup, I can easily add the missing inline keywords. Did you see Catalin's > other comment? It looks like we're missing a '-1' on the end address before > checking whether or not it sits in a module. If you confirm, I can add that > too. > > Will > Yes, Catalin's review was correct, we need the -1 as well. Thanks, Laura -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support 2014-08-19 19:41 [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support Laura Abbott 2014-08-19 19:41 ` [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit Laura Abbott @ 2014-08-19 19:41 ` Laura Abbott 2014-08-26 14:40 ` Catalin Marinas 2014-08-22 17:36 ` [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support Will Deacon 2 siblings, 1 reply; 17+ messages in thread From: Laura Abbott @ 2014-08-19 19:41 UTC (permalink / raw) To: linux-arm-kernel In a similar fashion to other architecture, add the infrastructure and Kconfig to enable DEBUG_SET_MODULE_RONX support. When enabled, module ranges will be marked read-only/no-execute as appropriate. Signed-off-by: Laura Abbott <lauraa@codeaurora.org> --- arch/arm64/Kconfig.debug | 11 +++++ arch/arm64/include/asm/cacheflush.h | 4 ++ arch/arm64/mm/Makefile | 2 +- arch/arm64/mm/pageattr.c | 96 +++++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 arch/arm64/mm/pageattr.c diff --git a/arch/arm64/Kconfig.debug b/arch/arm64/Kconfig.debug index 4ee8e90..0a12933 100644 --- a/arch/arm64/Kconfig.debug +++ b/arch/arm64/Kconfig.debug @@ -43,4 +43,15 @@ config ARM64_RANDOMIZE_TEXT_OFFSET of TEXT_OFFSET and platforms must not require a specific value. +config DEBUG_SET_MODULE_RONX + bool "Set loadable kernel module data as NX and text as RO" + depends on MODULES + help + This option helps catch unintended modifications to loadable + kernel module's text and read-only data. It also prevents execution + of module data. Such protection may interfere with run-time code + patching and dynamic kernel tracing - and they might also protect + against certain classes of kernel exploits. + If in doubt, say "N". + endmenu diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h index f2defe1..689b637 100644 --- a/arch/arm64/include/asm/cacheflush.h +++ b/arch/arm64/include/asm/cacheflush.h @@ -148,4 +148,8 @@ static inline void flush_cache_vunmap(unsigned long start, unsigned long end) { } +int set_memory_ro(unsigned long addr, int numpages); +int set_memory_rw(unsigned long addr, int numpages); +int set_memory_x(unsigned long addr, int numpages); +int set_memory_nx(unsigned long addr, int numpages); #endif diff --git a/arch/arm64/mm/Makefile b/arch/arm64/mm/Makefile index 3ecb56c..c56179e 100644 --- a/arch/arm64/mm/Makefile +++ b/arch/arm64/mm/Makefile @@ -1,5 +1,5 @@ obj-y := dma-mapping.o extable.o fault.o init.o \ cache.o copypage.o flush.o \ ioremap.o mmap.o pgd.o mmu.o \ - context.o proc.o + context.o proc.o pageattr.o obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c new file mode 100644 index 0000000..c66b897 --- /dev/null +++ b/arch/arm64/mm/pageattr.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/module.h> +#include <linux/sched.h> + +#include <asm/pgtable.h> +#include <asm/tlbflush.h> + +struct page_change_data { + pgprot_t set_mask; + pgprot_t clear_mask; +}; + +static int change_page_range(pte_t *ptep, pgtable_t token, unsigned long addr, + void *data) +{ + struct page_change_data *cdata = data; + pte_t pte = *ptep; + + pte = clear_pte_bit(pte, cdata->clear_mask); + pte = set_pte_bit(pte, cdata->set_mask); + + set_pte(ptep, pte); + return 0; +} + +static int change_memory_common(unsigned long addr, int numpages, + pgprot_t set_mask, pgprot_t clear_mask) +{ + unsigned long start = addr; + unsigned long size = PAGE_SIZE*numpages; + unsigned long end = start + size; + int ret; + struct page_change_data data; + + if (!IS_ALIGNED(addr, PAGE_SIZE)) { + addr &= PAGE_MASK; + WARN_ON_ONCE(1); + } + + if (!is_module_address(start) || !is_module_address(end)) + return -EINVAL; + + data.set_mask = set_mask; + data.clear_mask = clear_mask; + + ret = apply_to_page_range(&init_mm, start, size, change_page_range, + &data); + + flush_tlb_kernel_range(start, end); + return ret; +} + +int set_memory_ro(unsigned long addr, int numpages) +{ + return change_memory_common(addr, numpages, + __pgprot(PTE_RDONLY), + __pgprot(PTE_WRITE)); +} +EXPORT_SYMBOL_GPL(set_memory_ro); + +int set_memory_rw(unsigned long addr, int numpages) +{ + return change_memory_common(addr, numpages, + __pgprot(PTE_WRITE), + __pgprot(PTE_RDONLY)); +} +EXPORT_SYMBOL_GPL(set_memory_rw); + +int set_memory_nx(unsigned long addr, int numpages) +{ + return change_memory_common(addr, numpages, + __pgprot(PTE_PXN), + __pgprot(0)); +} +EXPORT_SYMBOL_GPL(set_memory_nx); + +int set_memory_x(unsigned long addr, int numpages) +{ + return change_memory_common(addr, numpages, + __pgprot(0), + __pgprot(PTE_PXN)); +} +EXPORT_SYMBOL_GPL(set_memory_x); -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support 2014-08-19 19:41 ` [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support Laura Abbott @ 2014-08-26 14:40 ` Catalin Marinas 2014-09-01 15:42 ` Laura Abbott 0 siblings, 1 reply; 17+ messages in thread From: Catalin Marinas @ 2014-08-26 14:40 UTC (permalink / raw) To: linux-arm-kernel On Tue, Aug 19, 2014 at 08:41:43PM +0100, Laura Abbott wrote: > --- /dev/null > +++ b/arch/arm64/mm/pageattr.c [...] > +static int change_memory_common(unsigned long addr, int numpages, > + pgprot_t set_mask, pgprot_t clear_mask) > +{ > + unsigned long start = addr; > + unsigned long size = PAGE_SIZE*numpages; > + unsigned long end = start + size; > + int ret; > + struct page_change_data data; > + > + if (!IS_ALIGNED(addr, PAGE_SIZE)) { > + addr &= PAGE_MASK; > + WARN_ON_ONCE(1); > + } > + > + if (!is_module_address(start) || !is_module_address(end)) > + return -EINVAL; Minor thing, "end" is exclusive here. Do you still get the right check with is_module_address(end)? -- Catalin ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support 2014-08-26 14:40 ` Catalin Marinas @ 2014-09-01 15:42 ` Laura Abbott 2014-09-01 15:45 ` Will Deacon 0 siblings, 1 reply; 17+ messages in thread From: Laura Abbott @ 2014-09-01 15:42 UTC (permalink / raw) To: linux-arm-kernel On 8/26/2014 7:40 AM, Catalin Marinas wrote: > On Tue, Aug 19, 2014 at 08:41:43PM +0100, Laura Abbott wrote: >> --- /dev/null >> +++ b/arch/arm64/mm/pageattr.c > [...] >> +static int change_memory_common(unsigned long addr, int numpages, >> + pgprot_t set_mask, pgprot_t clear_mask) >> +{ >> + unsigned long start = addr; >> + unsigned long size = PAGE_SIZE*numpages; >> + unsigned long end = start + size; >> + int ret; >> + struct page_change_data data; >> + >> + if (!IS_ALIGNED(addr, PAGE_SIZE)) { >> + addr &= PAGE_MASK; >> + WARN_ON_ONCE(1); >> + } >> + >> + if (!is_module_address(start) || !is_module_address(end)) >> + return -EINVAL; > > Minor thing, "end" is exclusive here. Do you still get the right check > with is_module_address(end)? > No, You are correct. I'll talk to Will to get that fixed up. Thanks, Laura -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support 2014-09-01 15:42 ` Laura Abbott @ 2014-09-01 15:45 ` Will Deacon 2014-09-10 3:58 ` Zi Shen Lim 0 siblings, 1 reply; 17+ messages in thread From: Will Deacon @ 2014-09-01 15:45 UTC (permalink / raw) To: linux-arm-kernel On Mon, Sep 01, 2014 at 04:42:20PM +0100, Laura Abbott wrote: > On 8/26/2014 7:40 AM, Catalin Marinas wrote: > > On Tue, Aug 19, 2014 at 08:41:43PM +0100, Laura Abbott wrote: > >> --- /dev/null > >> +++ b/arch/arm64/mm/pageattr.c > > [...] > >> +static int change_memory_common(unsigned long addr, int numpages, > >> + pgprot_t set_mask, pgprot_t clear_mask) > >> +{ > >> + unsigned long start = addr; > >> + unsigned long size = PAGE_SIZE*numpages; > >> + unsigned long end = start + size; > >> + int ret; > >> + struct page_change_data data; > >> + > >> + if (!IS_ALIGNED(addr, PAGE_SIZE)) { > >> + addr &= PAGE_MASK; > >> + WARN_ON_ONCE(1); > >> + } > >> + > >> + if (!is_module_address(start) || !is_module_address(end)) > >> + return -EINVAL; > > > > Minor thing, "end" is exclusive here. Do you still get the right check > > with is_module_address(end)? > > > > No, You are correct. I'll talk to Will to get that fixed up. I already had a crack at fixing it: https://git.kernel.org/cgit/linux/kernel/git/arm64/linux.git/commit/?h=devel&id=a8b974874c4770860c2a356adb9397d38f6c2b70 How did I do? Will ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support 2014-09-01 15:45 ` Will Deacon @ 2014-09-10 3:58 ` Zi Shen Lim 2014-09-10 8:47 ` Will Deacon 0 siblings, 1 reply; 17+ messages in thread From: Zi Shen Lim @ 2014-09-10 3:58 UTC (permalink / raw) To: linux-arm-kernel Hi Will, On Mon, Sep 1, 2014 at 8:45 AM, Will Deacon <will.deacon@arm.com> wrote: > On Mon, Sep 01, 2014 at 04:42:20PM +0100, Laura Abbott wrote: >> On 8/26/2014 7:40 AM, Catalin Marinas wrote: >> > On Tue, Aug 19, 2014 at 08:41:43PM +0100, Laura Abbott wrote: >> >> --- /dev/null >> >> +++ b/arch/arm64/mm/pageattr.c >> > [...] >> >> +static int change_memory_common(unsigned long addr, int numpages, >> >> + pgprot_t set_mask, pgprot_t clear_mask) >> >> +{ >> >> + unsigned long start = addr; >> >> + unsigned long size = PAGE_SIZE*numpages; >> >> + unsigned long end = start + size; >> >> + int ret; >> >> + struct page_change_data data; >> >> + >> >> + if (!IS_ALIGNED(addr, PAGE_SIZE)) { >> >> + addr &= PAGE_MASK; I don't see any uses of addr after this. Perhaps we also meant to compute start and end? >> >> + WARN_ON_ONCE(1); >> >> + } >> >> + >> >> + if (!is_module_address(start) || !is_module_address(end)) >> >> + return -EINVAL; >> > >> > Minor thing, "end" is exclusive here. Do you still get the right check >> > with is_module_address(end)? >> > >> >> No, You are correct. I'll talk to Will to get that fixed up. > > I already had a crack at fixing it: > > https://git.kernel.org/cgit/linux/kernel/git/arm64/linux.git/commit/?h=devel&id=a8b974874c4770860c2a356adb9397d38f6c2b70 > > How did I do? > > Will > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support 2014-09-10 3:58 ` Zi Shen Lim @ 2014-09-10 8:47 ` Will Deacon 2014-09-11 4:42 ` Laura Abbott 0 siblings, 1 reply; 17+ messages in thread From: Will Deacon @ 2014-09-10 8:47 UTC (permalink / raw) To: linux-arm-kernel On Wed, Sep 10, 2014 at 04:58:01AM +0100, Zi Shen Lim wrote: > On Mon, Sep 1, 2014 at 8:45 AM, Will Deacon <will.deacon@arm.com> wrote: > > On Mon, Sep 01, 2014 at 04:42:20PM +0100, Laura Abbott wrote: > >> On 8/26/2014 7:40 AM, Catalin Marinas wrote: > >> > On Tue, Aug 19, 2014 at 08:41:43PM +0100, Laura Abbott wrote: > >> >> --- /dev/null > >> >> +++ b/arch/arm64/mm/pageattr.c > >> > [...] > >> >> +static int change_memory_common(unsigned long addr, int numpages, > >> >> + pgprot_t set_mask, pgprot_t clear_mask) > >> >> +{ > >> >> + unsigned long start = addr; > >> >> + unsigned long size = PAGE_SIZE*numpages; > >> >> + unsigned long end = start + size; > >> >> + int ret; > >> >> + struct page_change_data data; > >> >> + > >> >> + if (!IS_ALIGNED(addr, PAGE_SIZE)) { > >> >> + addr &= PAGE_MASK; > > I don't see any uses of addr after this. > Perhaps we also meant to compute start and end? Actually, I think the alignment fixup should just be performed directly on start, but this is Laura's code so it would be good if she could confirm. Laura -- what's the right thing to do here? (sending a fix patch would be ideal :) Will ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support 2014-09-10 8:47 ` Will Deacon @ 2014-09-11 4:42 ` Laura Abbott 2014-09-11 22:10 ` [PATCH] arm64: pageattr: Correctly adjust unaligned start addresses Laura Abbott 0 siblings, 1 reply; 17+ messages in thread From: Laura Abbott @ 2014-09-11 4:42 UTC (permalink / raw) To: linux-arm-kernel On 9/10/2014 1:47 AM, Will Deacon wrote: > On Wed, Sep 10, 2014 at 04:58:01AM +0100, Zi Shen Lim wrote: >> On Mon, Sep 1, 2014 at 8:45 AM, Will Deacon <will.deacon@arm.com> wrote: >>> On Mon, Sep 01, 2014 at 04:42:20PM +0100, Laura Abbott wrote: >>>> On 8/26/2014 7:40 AM, Catalin Marinas wrote: >>>>> On Tue, Aug 19, 2014 at 08:41:43PM +0100, Laura Abbott wrote: >>>>>> --- /dev/null >>>>>> +++ b/arch/arm64/mm/pageattr.c >>>>> [...] >>>>>> +static int change_memory_common(unsigned long addr, int numpages, >>>>>> + pgprot_t set_mask, pgprot_t clear_mask) >>>>>> +{ >>>>>> + unsigned long start = addr; >>>>>> + unsigned long size = PAGE_SIZE*numpages; >>>>>> + unsigned long end = start + size; >>>>>> + int ret; >>>>>> + struct page_change_data data; >>>>>> + >>>>>> + if (!IS_ALIGNED(addr, PAGE_SIZE)) { >>>>>> + addr &= PAGE_MASK; >> >> I don't see any uses of addr after this. >> Perhaps we also meant to compute start and end? > > > Actually, I think the alignment fixup should just be performed directly on > start, but this is Laura's code so it would be good if she could confirm. > > Laura -- what's the right thing to do here? (sending a fix patch would be > ideal :) > > Will > Yes this needs to be fixed. I'll send a patch out tomorrow. Thanks, Laura -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH] arm64: pageattr: Correctly adjust unaligned start addresses 2014-09-11 4:42 ` Laura Abbott @ 2014-09-11 22:10 ` Laura Abbott 2014-09-12 3:40 ` Z Lim 2014-09-12 15:36 ` Catalin Marinas 0 siblings, 2 replies; 17+ messages in thread From: Laura Abbott @ 2014-09-11 22:10 UTC (permalink / raw) To: linux-arm-kernel The start address needs to be actually updated after it is detected to be unaligned. Adjust it and the end address properly. Reported-by: Zi Shen Lim <zlim.lnx@gmail.com> Signed-off-by: Laura Abbott <lauraa@codeaurora.org> --- arch/arm64/mm/pageattr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index 75e744e..bb0ea94 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -46,7 +46,8 @@ static int change_memory_common(unsigned long addr, int numpages, struct page_change_data data; if (!IS_ALIGNED(addr, PAGE_SIZE)) { - addr &= PAGE_MASK; + start &= PAGE_MASK; + end = start + size; WARN_ON_ONCE(1); } -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH] arm64: pageattr: Correctly adjust unaligned start addresses 2014-09-11 22:10 ` [PATCH] arm64: pageattr: Correctly adjust unaligned start addresses Laura Abbott @ 2014-09-12 3:40 ` Z Lim 2014-09-12 15:36 ` Catalin Marinas 1 sibling, 0 replies; 17+ messages in thread From: Z Lim @ 2014-09-12 3:40 UTC (permalink / raw) To: linux-arm-kernel On Thu, Sep 11, 2014 at 3:10 PM, Laura Abbott <lauraa@codeaurora.org> wrote: > The start address needs to be actually updated after it > is detected to be unaligned. Adjust it and the end address > properly. > > Reported-by: Zi Shen Lim <zlim.lnx@gmail.com> > Signed-off-by: Laura Abbott <lauraa@codeaurora.org> > --- > arch/arm64/mm/pageattr.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c > index 75e744e..bb0ea94 100644 > --- a/arch/arm64/mm/pageattr.c > +++ b/arch/arm64/mm/pageattr.c > @@ -46,7 +46,8 @@ static int change_memory_common(unsigned long addr, int numpages, > struct page_change_data data; > > if (!IS_ALIGNED(addr, PAGE_SIZE)) { > - addr &= PAGE_MASK; > + start &= PAGE_MASK; > + end = start + size; > WARN_ON_ONCE(1); > } > Looks good to me. Reviewed-by: Zi Shen Lim <zlim.lnx@gmail.com> > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > hosted by The Linux Foundation > ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH] arm64: pageattr: Correctly adjust unaligned start addresses 2014-09-11 22:10 ` [PATCH] arm64: pageattr: Correctly adjust unaligned start addresses Laura Abbott 2014-09-12 3:40 ` Z Lim @ 2014-09-12 15:36 ` Catalin Marinas 1 sibling, 0 replies; 17+ messages in thread From: Catalin Marinas @ 2014-09-12 15:36 UTC (permalink / raw) To: linux-arm-kernel On Thu, Sep 11, 2014 at 11:10:32PM +0100, Laura Abbott wrote: > The start address needs to be actually updated after it > is detected to be unaligned. Adjust it and the end address > properly. > > Reported-by: Zi Shen Lim <zlim.lnx@gmail.com> > Signed-off-by: Laura Abbott <lauraa@codeaurora.org> > --- > arch/arm64/mm/pageattr.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) Applied. Thanks. -- Catalin ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support 2014-08-19 19:41 [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support Laura Abbott 2014-08-19 19:41 ` [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit Laura Abbott 2014-08-19 19:41 ` [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support Laura Abbott @ 2014-08-22 17:36 ` Will Deacon 2 siblings, 0 replies; 17+ messages in thread From: Will Deacon @ 2014-08-22 17:36 UTC (permalink / raw) To: linux-arm-kernel On Tue, Aug 19, 2014 at 08:41:41PM +0100, Laura Abbott wrote: > This is another version of DEBUG_SET_MODULE_RONX support for arm64. > > Thanks, > Laura > > v4: Switch to one function to do set/clear per suggestion of Will Thanks Laura. It looks like you addressed all the comments I made after you sent this too, so I've applied it to our devel branch for the moment. Cheers, Will ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2014-09-12 15:36 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-19 19:41 [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support Laura Abbott
2014-08-19 19:41 ` [PATCHv4 1/2] arm64: Introduce {set,clear}_pte_bit Laura Abbott
2014-08-26 14:27 ` Catalin Marinas
2014-08-26 20:15 ` Laura Abbott
2014-08-27 8:07 ` Will Deacon
2014-09-01 15:42 ` Laura Abbott
2014-08-19 19:41 ` [PATCHv4 2/2] arm64: Add CONFIG_DEBUG_SET_MODULE_RONX support Laura Abbott
2014-08-26 14:40 ` Catalin Marinas
2014-09-01 15:42 ` Laura Abbott
2014-09-01 15:45 ` Will Deacon
2014-09-10 3:58 ` Zi Shen Lim
2014-09-10 8:47 ` Will Deacon
2014-09-11 4:42 ` Laura Abbott
2014-09-11 22:10 ` [PATCH] arm64: pageattr: Correctly adjust unaligned start addresses Laura Abbott
2014-09-12 3:40 ` Z Lim
2014-09-12 15:36 ` Catalin Marinas
2014-08-22 17:36 ` [PATCHv4 0/2] arm64 CONFIG_DEBUG_SET_MODULE_RONX support Will Deacon
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.