From: david mosberger <dmosberger@gmail.com>
To: linux-ia64@vger.kernel.org
Subject: Re: Rationalise Region definitions
Date: Wed, 17 Aug 2005 01:56:19 +0000 [thread overview]
Message-ID: <ed5aea430508161856380022de@mail.gmail.com> (raw)
In-Reply-To: <17154.38711.462180.885909@berry.gelato.unsw.EDU.AU>
Peter,
You deleted this comment:
/* note: this is hardcoded in reload_context()!*/
but didn't actually do anything about reload_context(). There is an
ia64_get_rr(0x8...) which would need to be fixed.
--david
On 8/16/05, Peter Chubb <peterc@gelato.unsw.edu.au> wrote:
>
> Currently, region numbers are defined in several files, with several
> names. For example, we have REGION_KERNEL in asm/page.h and
> RGN_KERNEL in pgtable.h
>
> We also have address definitions that should depend on the
> RGN_XXX macros, but are currently just long constants.
>
> The following patch reorganises all the definitions so that they have
> the same form (RGN_XXX), are in one place, and that addresses that
> depend on RGN_XXX are derived from them.
>
> (This is a necessary but not sufficient patch to allow UML-like
> operation on IA64).
>
> Signed-off-by: Peter Chubb <peterc@gelato.unsw.edu.au>
>
> arch/ia64/kernel/sys_ia64.c | 2 +-
> arch/ia64/mm/hugetlbpage.c | 8 ++++----
> include/asm-ia64/io.h | 2 +-
> include/asm-ia64/page.h | 27 ++++++++++++++++++---------
> include/asm-ia64/pgtable.h | 13 +++++--------
> include/asm-ia64/system.h | 5 +++--
> 6 files changed, 32 insertions(+), 25 deletions(-)
>
> Index: linux-2.6-ia64/include/asm-ia64/io.h
> =================================> --- linux-2.6-ia64.orig/include/asm-ia64/io.h 2005-08-17 11:41:35.973769771 +1000
> +++ linux-2.6-ia64/include/asm-ia64/io.h 2005-08-17 11:41:42.013728802 +1000
> @@ -23,7 +23,7 @@
> #define __SLOW_DOWN_IO do { } while (0)
> #define SLOW_DOWN_IO do { } while (0)
>
> -#define __IA64_UNCACHED_OFFSET 0xc000000000000000UL /* region 6 */
> +#define __IA64_UNCACHED_OFFSET RGN_BASE(RGN_UNCACHED)
>
> /*
> * The legacy I/O space defined by the ia64 architecture supports only 65536 ports, but
> Index: linux-2.6-ia64/include/asm-ia64/page.h
> =================================> --- linux-2.6-ia64.orig/include/asm-ia64/page.h 2005-08-17 09:42:45.234137614 +1000
> +++ linux-2.6-ia64/include/asm-ia64/page.h 2005-08-17 11:41:42.021728748 +1000
> @@ -13,6 +13,19 @@
> #include <asm/types.h>
>
> /*
> + * The top three bits of an IA64 address are its Region Number.
> + * Different regions are assigned to different purposes.
> + */
> +#define RGN_SHIFT (61)
> +#define RGN_BASE(r) (__IA64_UL_CONST(r)<<RGN_SHIFT)
> +
> +#define KHIGH -1 /* high three bits of Kernel virtual address */
> +#define RGN_KERNEL 7 /* Identity mapped region */
> +#define RGN_UNCACHED 6 /* Identity mapped I/O region */
> +#define RGN_GATE 5 /* Gate page, Kernel text, etc */
> +#define RGN_HPAGE 4 /* For Huge TLB pages */
> +
> +/*
> * PAGE_SHIFT determines the actual kernel page size.
> */
> #if defined(CONFIG_IA64_PAGE_SIZE_4KB)
> @@ -36,10 +49,9 @@
>
> #define RGN_MAP_LIMIT ((1UL << (4*PAGE_SHIFT - 12)) - PAGE_SIZE) /* per region addr limit */
>
> +
> #ifdef CONFIG_HUGETLB_PAGE
> -# define REGION_HPAGE (4UL) /* note: this is hardcoded in reload_context()!*/
> -# define REGION_SHIFT 61
> -# define HPAGE_REGION_BASE (REGION_HPAGE << REGION_SHIFT)
> +# define HPAGE_REGION_BASE RGN_BASE(RGN_HPAGE)
> # define HPAGE_SHIFT hpage_shift
> # define HPAGE_SHIFT_DEFAULT 28 /* check ia64 SDM for architecture supported size */
> # define HPAGE_SIZE (__IA64_UL_CONST(1) << HPAGE_SHIFT)
> @@ -130,16 +142,13 @@
> #define REGION_NUMBER(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg;})
> #define REGION_OFFSET(x) ({ia64_va _v; _v.l = (long) (x); _v.f.off;})
>
> -#define REGION_SIZE REGION_NUMBER(1)
> -#define REGION_KERNEL 7
> -
> #ifdef CONFIG_HUGETLB_PAGE
> # define htlbpage_to_page(x) (((unsigned long) REGION_NUMBER(x) << 61) \
> | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT)))
> # define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
> # define is_hugepage_only_range(mm, addr, len) \
> - (REGION_NUMBER(addr) = REGION_HPAGE && \
> - REGION_NUMBER((addr)+(len)-1) = REGION_HPAGE)
> + (REGION_NUMBER(addr) = RGN_HPAGE && \
> + REGION_NUMBER((addr)+(len)-1) = RGN_HPAGE)
> extern unsigned int hpage_shift;
> #endif
>
> @@ -197,7 +206,7 @@
> # define __pgprot(x) (x)
> #endif /* !STRICT_MM_TYPECHECKS */
>
> -#define PAGE_OFFSET __IA64_UL_CONST(0xe000000000000000)
> +#define PAGE_OFFSET RGN_BASE(RGN_KERNEL)
>
> #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | \
> VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC | \
> Index: linux-2.6-ia64/include/asm-ia64/pgtable.h
> =================================> --- linux-2.6-ia64.orig/include/asm-ia64/pgtable.h 2005-08-17 09:42:45.238137586 +1000
> +++ linux-2.6-ia64/include/asm-ia64/pgtable.h 2005-08-17 11:41:42.033728666 +1000
> @@ -204,21 +204,18 @@
> #define set_pte(ptep, pteval) (*(ptep) = (pteval))
> #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
>
> -#define RGN_SIZE (1UL << 61)
> -#define RGN_KERNEL 7
> -
> -#define VMALLOC_START 0xa000000200000000UL
> +#define VMALLOC_START (RGN_BASE(RGN_GATE) + 0x200000000UL)
> #ifdef CONFIG_VIRTUAL_MEM_MAP
> -# define VMALLOC_END_INIT (0xa000000000000000UL + (1UL << (4*PAGE_SHIFT - 9)))
> +# define VMALLOC_END_INIT (RGN_BASE(RGN_GATE) + (1UL << (4*PAGE_SHIFT - 9)))
> # define VMALLOC_END vmalloc_end
> extern unsigned long vmalloc_end;
> #else
> -# define VMALLOC_END (0xa000000000000000UL + (1UL << (4*PAGE_SHIFT - 9)))
> +# define VMALLOC_END (RGN_BASE(RGN_GATE) + (1UL << (4*PAGE_SHIFT - 9)))
> #endif
>
> /* fs/proc/kcore.c */
> -#define kc_vaddr_to_offset(v) ((v) - 0xa000000000000000UL)
> -#define kc_offset_to_vaddr(o) ((o) + 0xa000000000000000UL)
> +#define kc_vaddr_to_offset(v) ((v) - RGN_BASE(RGN_GATE))
> +#define kc_offset_to_vaddr(o) ((o) + RGN_BASE(RGN_GATE))
>
> /*
> * Conversion functions: convert page frame number (pfn) and a protection value to a page
> Index: linux-2.6-ia64/include/asm-ia64/system.h
> =================================> --- linux-2.6-ia64.orig/include/asm-ia64/system.h 2005-08-17 09:42:45.238137586 +1000
> +++ linux-2.6-ia64/include/asm-ia64/system.h 2005-08-17 11:41:42.037728639 +1000
> @@ -19,12 +19,13 @@
> #include <asm/pal.h>
> #include <asm/percpu.h>
>
> -#define GATE_ADDR __IA64_UL_CONST(0xa000000000000000)
> +#define GATE_ADDR RGN_BASE(RGN_GATE)
> +
> /*
> * 0xa000000000000000+2*PERCPU_PAGE_SIZE
> * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page)
> */
> -#define KERNEL_START __IA64_UL_CONST(0xa000000100000000)
> +#define KERNEL_START (GATE_ADDR+0x100000000)
> #define PERCPU_ADDR (-PERCPU_PAGE_SIZE)
>
> #ifndef __ASSEMBLY__
> Index: linux-2.6-ia64/arch/ia64/kernel/sys_ia64.c
> =================================> --- linux-2.6-ia64.orig/arch/ia64/kernel/sys_ia64.c 2005-08-17 09:42:45.238137586 +1000
> +++ linux-2.6-ia64/arch/ia64/kernel/sys_ia64.c 2005-08-17 11:41:42.069728422 +1000
> @@ -35,7 +35,7 @@
> return -ENOMEM;
>
> #ifdef CONFIG_HUGETLB_PAGE
> - if (REGION_NUMBER(addr) = REGION_HPAGE)
> + if (REGION_NUMBER(addr) = RGN_HPAGE)
> addr = 0;
> #endif
> if (!addr)
> Index: linux-2.6-ia64/arch/ia64/mm/hugetlbpage.c
> =================================> --- linux-2.6-ia64.orig/arch/ia64/mm/hugetlbpage.c 2005-08-17 09:42:45.242137559 +1000
> +++ linux-2.6-ia64/arch/ia64/mm/hugetlbpage.c 2005-08-17 11:41:42.085728314 +1000
> @@ -76,7 +76,7 @@
> return -EINVAL;
> if (addr & ~HPAGE_MASK)
> return -EINVAL;
> - if (REGION_NUMBER(addr) != REGION_HPAGE)
> + if (REGION_NUMBER(addr) != RGN_HPAGE)
> return -EINVAL;
>
> return 0;
> @@ -87,7 +87,7 @@
> struct page *page;
> pte_t *ptep;
>
> - if (REGION_NUMBER(addr) != REGION_HPAGE)
> + if (REGION_NUMBER(addr) != RGN_HPAGE)
> return ERR_PTR(-EINVAL);
>
> ptep = huge_pte_offset(mm, addr);
> @@ -142,8 +142,8 @@
> return -ENOMEM;
> if (len & ~HPAGE_MASK)
> return -EINVAL;
> - /* This code assumes that REGION_HPAGE != 0. */
> - if ((REGION_NUMBER(addr) != REGION_HPAGE) || (addr & (HPAGE_SIZE - 1)))
> + /* This code assumes that RGN_HPAGE != 0. */
> + if ((REGION_NUMBER(addr) != RGN_HPAGE) || (addr & (HPAGE_SIZE - 1)))
> addr = HPAGE_REGION_BASE;
> else
> addr = ALIGN(addr, HPAGE_SIZE);
> -
> To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
Mosberger Consulting LLC, voice/fax: 510-744-9372,
http://www.mosberger-consulting.com/
35706 Runckel Lane, Fremont, CA 94536
next prev parent reply other threads:[~2005-08-17 1:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-17 1:47 Rationalise Region definitions Peter Chubb
2005-08-17 1:56 ` david mosberger [this message]
2005-08-17 2:53 ` Rationalise Region Definitions Peter Chubb
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=ed5aea430508161856380022de@mail.gmail.com \
--to=dmosberger@gmail.com \
--cc=linux-ia64@vger.kernel.org \
/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.