All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: Laura Abbott <lauraa@codeaurora.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Nicolas Pitre <nicolas.pitre@linaro.org>,
	Rob Herring <robh@kernel.org>, Liu hua <sdu.liu@huawei.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Tomasz Figa <t.figa@samsung.com>,
	Will Deacon <will.deacon@arm.com>,
	Leif Lindholm <leif.lindholm@linaro.org>,
	Doug Anderson <dianders@google.com>, Rabin Vincent <rabin@rab.in>,
	Nikolay Borisov <Nikolay.Borisov@arm.com>,
	Mark Salter <msalter@redhat.com>,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH 1/7] arm: use generic fixmap.h
Date: Thu, 7 Aug 2014 07:35:30 -0700	[thread overview]
Message-ID: <CAGXu5jL7L--apmCSO52ErUMPfXPBUBKCCg2NwYAc8FUNZaAGvg@mail.gmail.com> (raw)
In-Reply-To: <53E2E354.6020902@codeaurora.org>

On Wed, Aug 6, 2014 at 7:24 PM, Laura Abbott <lauraa@codeaurora.org> wrote:
> On 8/6/2014 12:32 PM, Kees Cook wrote:
>> From: Mark Salter <msalter@redhat.com>
>>
>> ARM is different from other architectures in that fixmap pages are indexed
>> with a positive offset from FIXADDR_START.  Other architectures index with
>> a negative offset from FIXADDR_TOP.  In order to use the generic fixmap.h
>> definitions, this patch redefines FIXADDR_TOP to be inclusive of the
>> useable range.  That is, FIXADDR_TOP is the virtual address of the topmost
>> fixed page.  The newly defined FIXADDR_END is the first virtual address
>> past the fixed mappings.
>>
>> Signed-off-by: Mark Salter <msalter@redhat.com>
>> Reviewed-by: Doug Anderson <dianders@chromium.org>
>> [update for "ARM: 8031/2: change fixmap mapping region to support 32 CPUs"]
>> Signed-off-by: Kees Cook <keescook@chromium.org>
>> ---
>>  arch/arm/include/asm/fixmap.h | 27 +++++++++------------------
>>  arch/arm/mm/init.c            |  2 +-
>>  2 files changed, 10 insertions(+), 19 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/fixmap.h b/arch/arm/include/asm/fixmap.h
>> index 74124b0d0d79..190142d174ee 100644
>> --- a/arch/arm/include/asm/fixmap.h
>> +++ b/arch/arm/include/asm/fixmap.h
>> @@ -2,27 +2,18 @@
>>  #define _ASM_FIXMAP_H
>>
>>  #define FIXADDR_START                0xffc00000UL
>> -#define FIXADDR_TOP          0xffe00000UL
>> -#define FIXADDR_SIZE         (FIXADDR_TOP - FIXADDR_START)
>> +#define FIXADDR_END          0xffe00000UL
>> +#define FIXADDR_TOP          (FIXADDR_END - PAGE_SIZE)
>> +#define FIXADDR_SIZE         (FIXADDR_END - FIXADDR_START)
>>
>>  #define FIX_KMAP_NR_PTES     (FIXADDR_SIZE >> PAGE_SHIFT)
>>
>> -#define __fix_to_virt(x)     (FIXADDR_START + ((x) << PAGE_SHIFT))
>> -#define __virt_to_fix(x)     (((x) - FIXADDR_START) >> PAGE_SHIFT)
>> +enum fixed_addresses {
>> +     FIX_KMAP_BEGIN,
>> +     FIX_KMAP_END = FIX_KMAP_NR_PTES - 1,
>> +     __end_of_fixed_addresses
>> +};
>>
>> -extern void __this_fixmap_does_not_exist(void);
>> -
>> -static inline unsigned long fix_to_virt(const unsigned int idx)
>> -{
>> -     if (idx >= FIX_KMAP_NR_PTES)
>> -             __this_fixmap_does_not_exist();
>> -     return __fix_to_virt(idx);
>> -}
>> -
>> -static inline unsigned int virt_to_fix(const unsigned long vaddr)
>> -{
>> -     BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
>> -     return __virt_to_fix(vaddr);
>> -}
>> +#include <asm-generic/fixmap.h>
>>
>>  #endif
>> diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
>> index 659c75d808dc..ad82c05bfc3a 100644
>> --- a/arch/arm/mm/init.c
>> +++ b/arch/arm/mm/init.c
>> @@ -570,7 +570,7 @@ void __init mem_init(void)
>>                       MLK(DTCM_OFFSET, (unsigned long) dtcm_end),
>>                       MLK(ITCM_OFFSET, (unsigned long) itcm_end),
>>  #endif
>> -                     MLK(FIXADDR_START, FIXADDR_TOP),
>> +                     MLK(FIXADDR_START, FIXADDR_END),
>>                       MLM(VMALLOC_START, VMALLOC_END),
>>                       MLM(PAGE_OFFSET, (unsigned long)high_memory),
>>  #ifdef CONFIG_HIGHMEM
>>
>
> I'm working off of a 3.14 kernel and with this backported
> kmap_atomic does not actually map properly for me. This was
>
> my quick fix (not sure if we should be using __set_fixmap?). Or did
> I fail at backportery?
>
> -----8<-----
> From ea11b54704aa0a311ab3d05fd70072679bfe1a0b Mon Sep 17 00:00:00 2001
> From: Laura Abbott <lauraa@codeaurora.org>
> Date: Wed, 6 Aug 2014 19:20:46 -0700
> Subject: [PATCH] arm: Get proper pte for fixmaps
>
> The generic fixmap.h gets indexes from high to low instead
> of low to high so the fixmap idx does not correspond to
> the array entry in fixmap_page_table. Get the proper pte
> to update.
>
> Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
> ---
>  arch/arm/mm/highmem.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c
> index bedca3a..7f08e64 100644
> --- a/arch/arm/mm/highmem.c
> +++ b/arch/arm/mm/highmem.c
> @@ -22,14 +22,18 @@
>  static inline void set_fixmap_pte(int idx, pte_t pte)
>  {
>         unsigned long vaddr = __fix_to_virt(idx);
> -       set_pte_ext(fixmap_page_table + idx, pte, 0);
> +       pte_t *ppte = pte_offset_kernel(pmd_off_k(FIXADDR_START), vaddr);
> +
> +       set_pte_ext(ppte, pte, 0);
>         local_flush_tlb_kernel_page(vaddr);
>  }
>
>  static inline pte_t get_fixmap_pte(unsigned long vaddr)
>  {
>         unsigned long idx = __virt_to_fix(vaddr);
> -       return *(fixmap_page_table + idx);
> +       pte_t *ppte = pte_offset_kernel(pmd_off_k(FIXADDR_START), vaddr);
> +
> +       return *ppte;
>  }

IIUC, what you have is correct: it matches what I had to do for
__set_fixmap and flips the high/low indexing. Thanks! I'll merge this
with the "use generic fixmap" patch, since it's what flips around the
ordering.

-Kees

-- 
Kees Cook
Chrome OS Security

WARNING: multiple messages have this Message-ID (diff)
From: keescook@chromium.org (Kees Cook)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/7] arm: use generic fixmap.h
Date: Thu, 7 Aug 2014 07:35:30 -0700	[thread overview]
Message-ID: <CAGXu5jL7L--apmCSO52ErUMPfXPBUBKCCg2NwYAc8FUNZaAGvg@mail.gmail.com> (raw)
In-Reply-To: <53E2E354.6020902@codeaurora.org>

On Wed, Aug 6, 2014 at 7:24 PM, Laura Abbott <lauraa@codeaurora.org> wrote:
> On 8/6/2014 12:32 PM, Kees Cook wrote:
>> From: Mark Salter <msalter@redhat.com>
>>
>> ARM is different from other architectures in that fixmap pages are indexed
>> with a positive offset from FIXADDR_START.  Other architectures index with
>> a negative offset from FIXADDR_TOP.  In order to use the generic fixmap.h
>> definitions, this patch redefines FIXADDR_TOP to be inclusive of the
>> useable range.  That is, FIXADDR_TOP is the virtual address of the topmost
>> fixed page.  The newly defined FIXADDR_END is the first virtual address
>> past the fixed mappings.
>>
>> Signed-off-by: Mark Salter <msalter@redhat.com>
>> Reviewed-by: Doug Anderson <dianders@chromium.org>
>> [update for "ARM: 8031/2: change fixmap mapping region to support 32 CPUs"]
>> Signed-off-by: Kees Cook <keescook@chromium.org>
>> ---
>>  arch/arm/include/asm/fixmap.h | 27 +++++++++------------------
>>  arch/arm/mm/init.c            |  2 +-
>>  2 files changed, 10 insertions(+), 19 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/fixmap.h b/arch/arm/include/asm/fixmap.h
>> index 74124b0d0d79..190142d174ee 100644
>> --- a/arch/arm/include/asm/fixmap.h
>> +++ b/arch/arm/include/asm/fixmap.h
>> @@ -2,27 +2,18 @@
>>  #define _ASM_FIXMAP_H
>>
>>  #define FIXADDR_START                0xffc00000UL
>> -#define FIXADDR_TOP          0xffe00000UL
>> -#define FIXADDR_SIZE         (FIXADDR_TOP - FIXADDR_START)
>> +#define FIXADDR_END          0xffe00000UL
>> +#define FIXADDR_TOP          (FIXADDR_END - PAGE_SIZE)
>> +#define FIXADDR_SIZE         (FIXADDR_END - FIXADDR_START)
>>
>>  #define FIX_KMAP_NR_PTES     (FIXADDR_SIZE >> PAGE_SHIFT)
>>
>> -#define __fix_to_virt(x)     (FIXADDR_START + ((x) << PAGE_SHIFT))
>> -#define __virt_to_fix(x)     (((x) - FIXADDR_START) >> PAGE_SHIFT)
>> +enum fixed_addresses {
>> +     FIX_KMAP_BEGIN,
>> +     FIX_KMAP_END = FIX_KMAP_NR_PTES - 1,
>> +     __end_of_fixed_addresses
>> +};
>>
>> -extern void __this_fixmap_does_not_exist(void);
>> -
>> -static inline unsigned long fix_to_virt(const unsigned int idx)
>> -{
>> -     if (idx >= FIX_KMAP_NR_PTES)
>> -             __this_fixmap_does_not_exist();
>> -     return __fix_to_virt(idx);
>> -}
>> -
>> -static inline unsigned int virt_to_fix(const unsigned long vaddr)
>> -{
>> -     BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
>> -     return __virt_to_fix(vaddr);
>> -}
>> +#include <asm-generic/fixmap.h>
>>
>>  #endif
>> diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
>> index 659c75d808dc..ad82c05bfc3a 100644
>> --- a/arch/arm/mm/init.c
>> +++ b/arch/arm/mm/init.c
>> @@ -570,7 +570,7 @@ void __init mem_init(void)
>>                       MLK(DTCM_OFFSET, (unsigned long) dtcm_end),
>>                       MLK(ITCM_OFFSET, (unsigned long) itcm_end),
>>  #endif
>> -                     MLK(FIXADDR_START, FIXADDR_TOP),
>> +                     MLK(FIXADDR_START, FIXADDR_END),
>>                       MLM(VMALLOC_START, VMALLOC_END),
>>                       MLM(PAGE_OFFSET, (unsigned long)high_memory),
>>  #ifdef CONFIG_HIGHMEM
>>
>
> I'm working off of a 3.14 kernel and with this backported
> kmap_atomic does not actually map properly for me. This was
>
> my quick fix (not sure if we should be using __set_fixmap?). Or did
> I fail at backportery?
>
> -----8<-----
> From ea11b54704aa0a311ab3d05fd70072679bfe1a0b Mon Sep 17 00:00:00 2001
> From: Laura Abbott <lauraa@codeaurora.org>
> Date: Wed, 6 Aug 2014 19:20:46 -0700
> Subject: [PATCH] arm: Get proper pte for fixmaps
>
> The generic fixmap.h gets indexes from high to low instead
> of low to high so the fixmap idx does not correspond to
> the array entry in fixmap_page_table. Get the proper pte
> to update.
>
> Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
> ---
>  arch/arm/mm/highmem.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c
> index bedca3a..7f08e64 100644
> --- a/arch/arm/mm/highmem.c
> +++ b/arch/arm/mm/highmem.c
> @@ -22,14 +22,18 @@
>  static inline void set_fixmap_pte(int idx, pte_t pte)
>  {
>         unsigned long vaddr = __fix_to_virt(idx);
> -       set_pte_ext(fixmap_page_table + idx, pte, 0);
> +       pte_t *ppte = pte_offset_kernel(pmd_off_k(FIXADDR_START), vaddr);
> +
> +       set_pte_ext(ppte, pte, 0);
>         local_flush_tlb_kernel_page(vaddr);
>  }
>
>  static inline pte_t get_fixmap_pte(unsigned long vaddr)
>  {
>         unsigned long idx = __virt_to_fix(vaddr);
> -       return *(fixmap_page_table + idx);
> +       pte_t *ppte = pte_offset_kernel(pmd_off_k(FIXADDR_START), vaddr);
> +
> +       return *ppte;
>  }

IIUC, what you have is correct: it matches what I had to do for
__set_fixmap and flips the high/low indexing. Thanks! I'll merge this
with the "use generic fixmap" patch, since it's what flips around the
ordering.

-Kees

-- 
Kees Cook
Chrome OS Security

  reply	other threads:[~2014-08-07 14:35 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-06 19:32 [PATCH 0/7] arm: support CONFIG_RODATA Kees Cook
2014-08-06 19:32 ` Kees Cook
2014-08-06 19:32 ` [PATCH 1/7] arm: use generic fixmap.h Kees Cook
2014-08-06 19:32   ` Kees Cook
2014-08-07  2:24   ` Laura Abbott
2014-08-07  2:24     ` Laura Abbott
2014-08-07 14:35     ` Kees Cook [this message]
2014-08-07 14:35       ` Kees Cook
2014-08-07 15:15   ` Max Filippov
2014-08-07 15:15     ` Max Filippov
2014-08-07 15:22     ` Rob Herring
2014-08-07 15:22       ` Rob Herring
2014-08-07 15:32       ` Nicolas Pitre
2014-08-07 15:32         ` Nicolas Pitre
2014-08-07 15:42         ` Max Filippov
2014-08-07 15:42           ` Max Filippov
2014-08-07 17:23           ` Mark Salter
2014-08-07 17:23             ` Mark Salter
2014-08-06 19:32 ` [PATCH 2/7] arm: fixmap: implement __set_fixmap() Kees Cook
2014-08-06 19:32   ` Kees Cook
2014-08-06 19:32 ` [PATCH 3/7] arm: mm: reduce fixmap kmap from 32 to 16 CPUS Kees Cook
2014-08-06 19:32   ` Kees Cook
2014-08-06 19:32 ` [PATCH 4/7] arm: use fixmap for text patching when text is RO Kees Cook
2014-08-06 19:32   ` Kees Cook
2014-08-06 19:32 ` [PATCH 5/7] ARM: kexec: Make .text R/W in machine_kexec Kees Cook
2014-08-06 19:32   ` Kees Cook
2014-08-06 19:32 ` [PATCH 6/7] ARM: mm: allow non-text sections to be non-executable Kees Cook
2014-08-06 19:32   ` Kees Cook
2014-08-06 19:32 ` [PATCH 7/7] ARM: mm: allow text and rodata sections to be read-only Kees Cook
2014-08-06 19:32   ` Kees Cook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAGXu5jL7L--apmCSO52ErUMPfXPBUBKCCg2NwYAc8FUNZaAGvg@mail.gmail.com \
    --to=keescook@chromium.org \
    --cc=Nikolay.Borisov@arm.com \
    --cc=catalin.marinas@arm.com \
    --cc=dianders@google.com \
    --cc=lauraa@codeaurora.org \
    --cc=leif.lindholm@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=msalter@redhat.com \
    --cc=nicolas.pitre@linaro.org \
    --cc=rabin@rab.in \
    --cc=robh@kernel.org \
    --cc=sdu.liu@huawei.com \
    --cc=t.figa@samsung.com \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.