All of lore.kernel.org
 help / color / mirror / Atom feed
* [rfc] address space reorganization
@ 2005-04-15 13:07 Gerd Knorr
  0 siblings, 0 replies; 3+ messages in thread
From: Gerd Knorr @ 2005-04-15 13:07 UTC (permalink / raw)
  To: xen-devel

  Hi,

This is a patch doing the memory layout changes I've suggested
a few days ago on the list.  It's still a static layout, I havn't
changed it to adjust the frametable size at runtime.  Doesn't break
compatibility, the location of the ro MPT table and the size of xen's
private address space is still the same (for non-PAE), so domains don't
even notice this change ;)

Comments?

  Gerd

==============================[ cut here ]==============================
Subject: [patch] address space reorganization

Shuffle around the memory blocks a bit ;)

Intention is to have largely the same memory layout
in both PAE and non-PAE mode, so I moved the
fixed-size stuff to the top, followed by the
variable-sized stuff (frametable and linear page
tables), and the domain-accessable machine-phys-table
at the bottom.

Note that PAGE_OFFSET isn't the start address of xen's
private memory area any more.  Thats why the segment
range checks are fixed up and use RO_MPT_VIRT_END now.

Signed-off-by: Gerd Knorr <kraxel@bytesex.org>
---
 arch/x86/mm.c                 |    2 
 arch/x86/traps.c              |    4 -
 arch/x86/x86_32/mm.c          |    6 +-
 arch/x86/x86_32/seg_fixup.c   |    6 +-
 arch/x86/x86_32/xen.lds       |    2 
 include/asm-x86/config.h      |   83 +++++++++++++++++++---------------
 include/asm-x86/x86_32/page.h |    2 
 7 files changed, 59 insertions(+), 46 deletions(-)

Index: xen/arch/x86/x86_32/xen.lds
===================================================================
--- xen.orig/arch/x86/x86_32/xen.lds	2005-04-15 13:53:11.000000000 +0200
+++ xen/arch/x86/x86_32/xen.lds	2005-04-15 14:14:56.000000000 +0200
@@ -11,7 +11,7 @@ PHDRS
 }
 SECTIONS
 {
-  . = 0xFC400000 + 0x100000;
+  . = 0xFF000000 + 0x100000;
   _text = .;			/* Text and read-only data */
   .text : {
 	*(.text)
Index: xen/include/asm-x86/config.h
===================================================================
--- xen.orig/include/asm-x86/config.h	2005-04-15 13:53:10.000000000 +0200
+++ xen/include/asm-x86/config.h	2005-04-15 14:14:56.000000000 +0200
@@ -216,12 +216,56 @@ extern void __out_of_line_bug(int line) 
 
 #define asmlinkage __attribute__((regparm(0)))
 
-#define XENHEAP_DEFAULT_MB (12)
-#define DIRECTMAP_PHYS_END (12*1024*1024)
+#define IOREMAP_VIRT_SIZE	4
+#define DIRECTMAP_VIRT_SIZE	12
+#define MAPCACHE_VIRT_SIZE	4
+#define PERDOMAIN_VIRT_SIZE	4
+
+#ifdef CONFIG_X86_PAE
+# define SH_LINEAR_PT_VIRT_SIZE	8
+# define LINEAR_PT_VIRT_SIZE	8
+# define RDWR_MPT_VIRT_SIZE	4	/*  4 GB mem limit (per domain) */
+# define FRAMETABLE_VIRT_SIZE	96	/* 16 GB mem limit (total)      */
+# define RO_MPT_VIRT_SIZE	4	/*  4 GB mem limit (per domain) */
+#else
+# define SH_LINEAR_PT_VIRT_SIZE	4
+# define LINEAR_PT_VIRT_SIZE	4
+# define RDWR_MPT_VIRT_SIZE	4
+# define FRAMETABLE_VIRT_SIZE	24
+# define RO_MPT_VIRT_SIZE	4
+#endif
+
+#define IOREMAP_VIRT_END	0UL
+#define IOREMAP_VIRT_START	(IOREMAP_VIRT_END - (IOREMAP_VIRT_SIZE*1024*1024))
+#define DIRECTMAP_VIRT_END	IOREMAP_VIRT_START
+#define DIRECTMAP_VIRT_START	(DIRECTMAP_VIRT_END - (DIRECTMAP_VIRT_SIZE*1024*1024))
+#define MAPCACHE_VIRT_END	DIRECTMAP_VIRT_START
+#define MAPCACHE_VIRT_START	(MAPCACHE_VIRT_END - (MAPCACHE_VIRT_SIZE*1024*1024))
+#define PERDOMAIN_VIRT_END	MAPCACHE_VIRT_START
+#define PERDOMAIN_VIRT_START	(PERDOMAIN_VIRT_END - (PERDOMAIN_VIRT_SIZE*1024*1024))
+#define SH_LINEAR_PT_VIRT_END	PERDOMAIN_VIRT_START
+#define SH_LINEAR_PT_VIRT_START	(SH_LINEAR_PT_VIRT_END - (SH_LINEAR_PT_VIRT_SIZE*1024*1024))
+#define LINEAR_PT_VIRT_END	SH_LINEAR_PT_VIRT_START
+#define LINEAR_PT_VIRT_START	(LINEAR_PT_VIRT_END - (LINEAR_PT_VIRT_SIZE*1024*1024))
+#define RDWR_MPT_VIRT_END	LINEAR_PT_VIRT_START
+#define RDWR_MPT_VIRT_START	(RDWR_MPT_VIRT_END - (RDWR_MPT_VIRT_SIZE*1024*1024))
+#define FRAMETABLE_VIRT_END	RDWR_MPT_VIRT_START
+#define FRAMETABLE_VIRT_START	(FRAMETABLE_VIRT_END - (FRAMETABLE_VIRT_SIZE*1024*1024))
+#define RO_MPT_VIRT_END		FRAMETABLE_VIRT_START
+#define RO_MPT_VIRT_START	(RO_MPT_VIRT_END - (RO_MPT_VIRT_SIZE*1024*1024))
+
+#define XENHEAP_DEFAULT_MB	(DIRECTMAP_VIRT_SIZE)
+#define DIRECTMAP_PHYS_END	(DIRECTMAP_VIRT_SIZE*1024*1024)
 
+#ifdef CONFIG_X86_PAE
+/* Hypervisor owns top 144MB of virtual address space. */
+# define __HYPERVISOR_VIRT_START  0xF7000000
+# define HYPERVISOR_VIRT_START   (0xF7000000UL)
+#else
 /* Hypervisor owns top 64MB of virtual address space. */
-#define __HYPERVISOR_VIRT_START  0xFC000000
-#define HYPERVISOR_VIRT_START   (0xFC000000UL)
+# define __HYPERVISOR_VIRT_START  0xFC000000
+# define HYPERVISOR_VIRT_START   (0xFC000000UL)
+#endif
 
 #define ROOT_PAGETABLE_FIRST_XEN_SLOT \
     (HYPERVISOR_VIRT_START >> L2_PAGETABLE_SHIFT)
@@ -230,37 +274,6 @@ extern void __out_of_line_bug(int line) 
 #define ROOT_PAGETABLE_XEN_SLOTS \
     (ROOT_PAGETABLE_LAST_XEN_SLOT - ROOT_PAGETABLE_FIRST_XEN_SLOT + 1)
 
-/*
- * First 4MB are mapped read-only for all. It's for the machine->physical
- * mapping table (MPT table). The following are virtual addresses.
- */
-#define RO_MPT_VIRT_START     (HYPERVISOR_VIRT_START)
-#define RO_MPT_VIRT_END       (RO_MPT_VIRT_START + (4*1024*1024))
-/* Xen heap extends to end of 1:1 direct-mapped memory region. */
-#define DIRECTMAP_VIRT_START  (RO_MPT_VIRT_END)
-#define DIRECTMAP_VIRT_END    (DIRECTMAP_VIRT_START + DIRECTMAP_PHYS_END)
-/* Machine-to-phys conversion table. */
-#define RDWR_MPT_VIRT_START   (DIRECTMAP_VIRT_END)
-#define RDWR_MPT_VIRT_END     (RDWR_MPT_VIRT_START + (4*1024*1024))
-/* Variable-length page-frame information array. */
-#define FRAMETABLE_VIRT_START (RDWR_MPT_VIRT_END)
-#define FRAMETABLE_VIRT_END   (FRAMETABLE_VIRT_START + (24*1024*1024))
-/* Next 4MB of virtual address space is used as a linear p.t. mapping. */
-#define LINEAR_PT_VIRT_START  (FRAMETABLE_VIRT_END)
-#define LINEAR_PT_VIRT_END    (LINEAR_PT_VIRT_START + (4*1024*1024))
-/* Next 4MB of virtual address space is used as a shadow linear p.t. map. */
-#define SH_LINEAR_PT_VIRT_START (LINEAR_PT_VIRT_END)
-#define SH_LINEAR_PT_VIRT_END (SH_LINEAR_PT_VIRT_START + (4*1024*1024))
-/* Next 4MB of virtual address space used for per-domain mappings (eg. GDT). */
-#define PERDOMAIN_VIRT_START  (SH_LINEAR_PT_VIRT_END)
-#define PERDOMAIN_VIRT_END    (PERDOMAIN_VIRT_START + (4*1024*1024))
-/* Penultimate 4MB of virtual address space used for domain page mappings. */
-#define MAPCACHE_VIRT_START   (PERDOMAIN_VIRT_END)
-#define MAPCACHE_VIRT_END     (MAPCACHE_VIRT_START + (4*1024*1024))
-/* Final 4MB of virtual address space used for ioremap(). */
-#define IOREMAP_VIRT_START    (MAPCACHE_VIRT_END)
-#define IOREMAP_VIRT_END      (IOREMAP_VIRT_START + (4*1024*1024))
-
 #define PGT_base_page_table PGT_l2_page_table
 
 #define __HYPERVISOR_CS 0x0808
Index: xen/include/asm-x86/x86_32/page.h
===================================================================
--- xen.orig/include/asm-x86/x86_32/page.h	2005-04-15 13:53:33.000000000 +0200
+++ xen/include/asm-x86/x86_32/page.h	2005-04-15 14:14:56.000000000 +0200
@@ -12,7 +12,7 @@
 #define L2_PAGETABLE_ENTRIES    (1<<PAGETABLE_ORDER)
 #define ROOT_PAGETABLE_ENTRIES  L2_PAGETABLE_ENTRIES
 
-#define __PAGE_OFFSET           (0xFC400000)
+#define __PAGE_OFFSET           (0xFF000000)
 
 #define PADDR_BITS              32
 #define VADDR_BITS              32
Index: xen/arch/x86/mm.c
===================================================================
--- xen.orig/arch/x86/mm.c	2005-04-15 13:56:01.000000000 +0200
+++ xen/arch/x86/mm.c	2005-04-15 14:14:56.000000000 +0200
@@ -1634,7 +1634,7 @@ int do_mmuext_op(
             if ( ((ptr & (PAGE_SIZE-1)) != 0) || 
                  (ents > 8192) ||
                  ((ptr+ents*LDT_ENTRY_SIZE) < ptr) ||
-                 ((ptr+ents*LDT_ENTRY_SIZE) > PAGE_OFFSET) )
+                 ((ptr+ents*LDT_ENTRY_SIZE) > RO_MPT_VIRT_END) )
             {
                 okay = 0;
                 MEM_LOG("Bad args to SET_LDT: ptr=%p, ents=%p", ptr, ents);
Index: xen/arch/x86/x86_32/seg_fixup.c
===================================================================
--- xen.orig/arch/x86/x86_32/seg_fixup.c	2005-04-15 13:53:11.000000000 +0200
+++ xen/arch/x86/x86_32/seg_fixup.c	2005-04-15 14:14:56.000000000 +0200
@@ -145,7 +145,7 @@ int get_baselimit(u16 seg, unsigned long
      * Anything that looks like a truncated segment we assume ought really
      * to be a 4GB segment. DANGER!
      */
-    if ( (PAGE_OFFSET - (*base + *limit)) < PAGE_SIZE )
+    if ( (RO_MPT_VIRT_END - (*base + *limit)) < PAGE_SIZE )
         *limit = 0;
 
     return 1;
@@ -226,14 +226,14 @@ int fixup_seg(u16 seg, unsigned long off
         if ( ((base + limit) < PAGE_SIZE) && (offset <= limit)  )
         {
             /* Flip to expands-up. */
-            limit = PAGE_OFFSET - base;
+            limit = RO_MPT_VIRT_END - base;
             goto flip;
         }
     }
     else
     {
         /* Expands-up: All the way to Xen space? Assume 4GB if so. */
-        if ( ((PAGE_OFFSET - (base + limit)) < PAGE_SIZE) &&
+        if ( ((RO_MPT_VIRT_END - (base + limit)) < PAGE_SIZE) &&
              (offset > limit) )
         {
             /* Flip to expands-down. */
Index: xen/arch/x86/traps.c
===================================================================
--- xen.orig/arch/x86/traps.c	2005-04-15 13:53:11.000000000 +0200
+++ xen/arch/x86/traps.c	2005-04-15 14:14:56.000000000 +0200
@@ -284,7 +284,7 @@ asmlinkage int do_page_fault(struct xen_
             return EXCRET_fault_fixed;
         }
 
-        if ( (addr < PAGE_OFFSET) &&
+        if ( (addr < RO_MPT_VIRT_END) &&
              ((regs->error_code & 3) == 3) && /* write-protection fault */
              ptwr_do_page_fault(d, addr) )
         {
@@ -1102,7 +1102,7 @@ long do_set_trap_table(trap_info_t *trap
 
 #if defined(__i386__)
 #define DB_VALID_ADDR(_a) \
-    ((_a) <= (PAGE_OFFSET - 4))
+    ((_a) <= (RO_MPT_VIRT_END - 4))
 #elif defined(__x86_64__)
 #define DB_VALID_ADDR(_a) \
     ((_a) >= HYPERVISOR_VIRT_END) || ((_a) <= (HYPERVISOR_VIRT_START-8))
Index: xen/arch/x86/x86_32/mm.c
===================================================================
--- xen.orig/arch/x86/x86_32/mm.c	2005-04-15 13:53:33.000000000 +0200
+++ xen/arch/x86/x86_32/mm.c	2005-04-15 14:14:56.000000000 +0200
@@ -248,7 +248,7 @@ int check_descriptor(struct desc_struct 
     
     /* Check that base is at least a page away from Xen-private area. */
     base  = (b&(0xff<<24)) | ((b&0xff)<<16) | (a>>16);
-    if ( base >= (PAGE_OFFSET - PAGE_SIZE) )
+    if ( base >= (RO_MPT_VIRT_END - PAGE_SIZE) )
         goto bad;
 
     /* Check and truncate the limit if necessary. */
@@ -281,9 +281,9 @@ int check_descriptor(struct desc_struct 
          *     limit == 0x00000 provides 4kB access (if G=1).
          */
         if ( ((base + limit) <= base) || 
-             ((base + limit) > PAGE_OFFSET) )
+             ((base + limit) > RO_MPT_VIRT_END) )
         {
-            limit = PAGE_OFFSET - base;
+            limit = RO_MPT_VIRT_END - base;
         truncate:
             if ( !(b & _SEGMENT_G) )
                 goto bad; /* too dangerous; too hard to work out... */

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [rfc] address space reorganization
@ 2005-04-15 23:31 Ian Pratt
  2005-04-19  9:32 ` Gerd Knorr
  0 siblings, 1 reply; 3+ messages in thread
From: Ian Pratt @ 2005-04-15 23:31 UTC (permalink / raw)
  To: Gerd Knorr, xen-devel

> This is a patch doing the memory layout changes I've 
> suggested a few days ago on the list.  It's still a static 
> layout, I havn't changed it to adjust the frametable size at 
> runtime.  Doesn't break compatibility, the location of the ro 
> MPT table and the size of xen's private address space is 
> still the same (for non-PAE), so domains don't even notice 
> this change ;)

I think it would be good to introduce a new constant to indicate the
start of the hypervisor protected area rather than using RO_MPT_VIRT_END
everywhere.

Otherwise, I like it.

Best,
Ian

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [rfc] address space reorganization
  2005-04-15 23:31 Ian Pratt
@ 2005-04-19  9:32 ` Gerd Knorr
  0 siblings, 0 replies; 3+ messages in thread
From: Gerd Knorr @ 2005-04-19  9:32 UTC (permalink / raw)
  To: Ian Pratt; +Cc: xen-devel

  Hi,

> I think it would be good to introduce a new constant to indicate the
> start of the hypervisor protected area rather than using RO_MPT_VIRT_END
> everywhere.

Fixed ;)

cheers,

  Gerd

==============================[ cut here ]==============================
Subject: [patch] address space reorganization

Shuffle around the memory blocks a bit ;)

Intention is to have largely the same memory layout
in both PAE and non-PAE mode, so I moved the
fixed-size stuff to the top, followed by the
variable-sized stuff (frametable and linear page
tables), and the domain-accessable machine-phys-table
at the bottom.

Note that PAGE_OFFSET isn't the start address of xen's
private memory area any more.  Thats why the segment
range checks are fixed up and use the new
HYPERVISOR_VIRT_PRIV_START define which is currently
aliased to RO_MPT_VIRT_END.

Signed-off-by: Gerd Knorr <kraxel@bytesex.org>
---
 arch/x86/mm.c                 |    2 
 arch/x86/traps.c              |    4 -
 arch/x86/x86_32/mm.c          |    6 +-
 arch/x86/x86_32/seg_fixup.c   |    6 +-
 arch/x86/x86_32/xen.lds       |    2 
 include/asm-x86/config.h      |   85 ++++++++++++++++++++--------------
 include/asm-x86/x86_32/page.h |    2 
 7 files changed, 61 insertions(+), 46 deletions(-)

Index: xen/arch/x86/x86_32/xen.lds
===================================================================
--- xen.orig/arch/x86/x86_32/xen.lds	2005-04-15 15:31:22.000000000 +0200
+++ xen/arch/x86/x86_32/xen.lds	2005-04-18 20:33:04.000000000 +0200
@@ -11,7 +11,7 @@ PHDRS
 }
 SECTIONS
 {
-  . = 0xFC400000 + 0x100000;
+  . = 0xFF000000 + 0x100000;
   _text = .;			/* Text and read-only data */
   .text : {
 	*(.text)
Index: xen/include/asm-x86/config.h
===================================================================
--- xen.orig/include/asm-x86/config.h	2005-04-15 15:31:22.000000000 +0200
+++ xen/include/asm-x86/config.h	2005-04-19 11:20:58.000000000 +0200
@@ -216,12 +216,56 @@ extern void __out_of_line_bug(int line) 
 
 #define asmlinkage __attribute__((regparm(0)))
 
-#define XENHEAP_DEFAULT_MB (12)
-#define DIRECTMAP_PHYS_END (12*1024*1024)
+#define IOREMAP_VIRT_SIZE	4
+#define DIRECTMAP_VIRT_SIZE	12
+#define MAPCACHE_VIRT_SIZE	4
+#define PERDOMAIN_VIRT_SIZE	4
+
+#ifdef CONFIG_X86_PAE
+# define SH_LINEAR_PT_VIRT_SIZE	8
+# define LINEAR_PT_VIRT_SIZE	8
+# define RDWR_MPT_VIRT_SIZE	4	/*  4 GB mem limit (per domain) */
+# define FRAMETABLE_VIRT_SIZE	96	/* 16 GB mem limit (total)      */
+# define RO_MPT_VIRT_SIZE	4	/*  4 GB mem limit (per domain) */
+#else
+# define SH_LINEAR_PT_VIRT_SIZE	4
+# define LINEAR_PT_VIRT_SIZE	4
+# define RDWR_MPT_VIRT_SIZE	4
+# define FRAMETABLE_VIRT_SIZE	24
+# define RO_MPT_VIRT_SIZE	4
+#endif
 
+#define IOREMAP_VIRT_END	0UL
+#define IOREMAP_VIRT_START	(IOREMAP_VIRT_END - (IOREMAP_VIRT_SIZE*1024*1024))
+#define DIRECTMAP_VIRT_END	IOREMAP_VIRT_START
+#define DIRECTMAP_VIRT_START	(DIRECTMAP_VIRT_END - (DIRECTMAP_VIRT_SIZE*1024*1024))
+#define MAPCACHE_VIRT_END	DIRECTMAP_VIRT_START
+#define MAPCACHE_VIRT_START	(MAPCACHE_VIRT_END - (MAPCACHE_VIRT_SIZE*1024*1024))
+#define PERDOMAIN_VIRT_END	MAPCACHE_VIRT_START
+#define PERDOMAIN_VIRT_START	(PERDOMAIN_VIRT_END - (PERDOMAIN_VIRT_SIZE*1024*1024))
+#define SH_LINEAR_PT_VIRT_END	PERDOMAIN_VIRT_START
+#define SH_LINEAR_PT_VIRT_START	(SH_LINEAR_PT_VIRT_END - (SH_LINEAR_PT_VIRT_SIZE*1024*1024))
+#define LINEAR_PT_VIRT_END	SH_LINEAR_PT_VIRT_START
+#define LINEAR_PT_VIRT_START	(LINEAR_PT_VIRT_END - (LINEAR_PT_VIRT_SIZE*1024*1024))
+#define RDWR_MPT_VIRT_END	LINEAR_PT_VIRT_START
+#define RDWR_MPT_VIRT_START	(RDWR_MPT_VIRT_END - (RDWR_MPT_VIRT_SIZE*1024*1024))
+#define FRAMETABLE_VIRT_END	RDWR_MPT_VIRT_START
+#define FRAMETABLE_VIRT_START	(FRAMETABLE_VIRT_END - (FRAMETABLE_VIRT_SIZE*1024*1024))
+#define RO_MPT_VIRT_END		FRAMETABLE_VIRT_START
+#define RO_MPT_VIRT_START	(RO_MPT_VIRT_END - (RO_MPT_VIRT_SIZE*1024*1024))
+
+#define XENHEAP_DEFAULT_MB	(DIRECTMAP_VIRT_SIZE)
+#define DIRECTMAP_PHYS_END	(DIRECTMAP_VIRT_SIZE*1024*1024)
+
+#ifdef CONFIG_X86_PAE
+/* Hypervisor owns top 144MB of virtual address space. */
+# define __HYPERVISOR_VIRT_START  0xF7000000
+# define HYPERVISOR_VIRT_START   (0xF7000000UL)
+#else
 /* Hypervisor owns top 64MB of virtual address space. */
-#define __HYPERVISOR_VIRT_START  0xFC000000
-#define HYPERVISOR_VIRT_START   (0xFC000000UL)
+# define __HYPERVISOR_VIRT_START  0xFC000000
+# define HYPERVISOR_VIRT_START   (0xFC000000UL)
+#endif
 
 #define ROOT_PAGETABLE_FIRST_XEN_SLOT \
     (HYPERVISOR_VIRT_START >> L2_PAGETABLE_SHIFT)
@@ -230,37 +274,6 @@ extern void __out_of_line_bug(int line) 
 #define ROOT_PAGETABLE_XEN_SLOTS \
     (ROOT_PAGETABLE_LAST_XEN_SLOT - ROOT_PAGETABLE_FIRST_XEN_SLOT + 1)
 
-/*
- * First 4MB are mapped read-only for all. It's for the machine->physical
- * mapping table (MPT table). The following are virtual addresses.
- */
-#define RO_MPT_VIRT_START     (HYPERVISOR_VIRT_START)
-#define RO_MPT_VIRT_END       (RO_MPT_VIRT_START + (4*1024*1024))
-/* Xen heap extends to end of 1:1 direct-mapped memory region. */
-#define DIRECTMAP_VIRT_START  (RO_MPT_VIRT_END)
-#define DIRECTMAP_VIRT_END    (DIRECTMAP_VIRT_START + DIRECTMAP_PHYS_END)
-/* Machine-to-phys conversion table. */
-#define RDWR_MPT_VIRT_START   (DIRECTMAP_VIRT_END)
-#define RDWR_MPT_VIRT_END     (RDWR_MPT_VIRT_START + (4*1024*1024))
-/* Variable-length page-frame information array. */
-#define FRAMETABLE_VIRT_START (RDWR_MPT_VIRT_END)
-#define FRAMETABLE_VIRT_END   (FRAMETABLE_VIRT_START + (24*1024*1024))
-/* Next 4MB of virtual address space is used as a linear p.t. mapping. */
-#define LINEAR_PT_VIRT_START  (FRAMETABLE_VIRT_END)
-#define LINEAR_PT_VIRT_END    (LINEAR_PT_VIRT_START + (4*1024*1024))
-/* Next 4MB of virtual address space is used as a shadow linear p.t. map. */
-#define SH_LINEAR_PT_VIRT_START (LINEAR_PT_VIRT_END)
-#define SH_LINEAR_PT_VIRT_END (SH_LINEAR_PT_VIRT_START + (4*1024*1024))
-/* Next 4MB of virtual address space used for per-domain mappings (eg. GDT). */
-#define PERDOMAIN_VIRT_START  (SH_LINEAR_PT_VIRT_END)
-#define PERDOMAIN_VIRT_END    (PERDOMAIN_VIRT_START + (4*1024*1024))
-/* Penultimate 4MB of virtual address space used for domain page mappings. */
-#define MAPCACHE_VIRT_START   (PERDOMAIN_VIRT_END)
-#define MAPCACHE_VIRT_END     (MAPCACHE_VIRT_START + (4*1024*1024))
-/* Final 4MB of virtual address space used for ioremap(). */
-#define IOREMAP_VIRT_START    (MAPCACHE_VIRT_END)
-#define IOREMAP_VIRT_END      (IOREMAP_VIRT_START + (4*1024*1024))
-
 #define PGT_base_page_table PGT_l2_page_table
 
 #define __HYPERVISOR_CS 0x0808
@@ -278,6 +291,8 @@ extern void __out_of_line_bug(int line) 
 extern unsigned long xenheap_phys_end; /* user-configurable */
 #endif
 
+#define HYPERVISOR_VIRT_PRIV_START RO_MPT_VIRT_END
+
 #define GDT_VIRT_START(ed)    (PERDOMAIN_VIRT_START + ((ed)->eid << PDPT_VCPU_VA_SHIFT))
 #define GDT_VIRT_END(ed)      (GDT_VIRT_START(ed) + (64*1024))
 #define LDT_VIRT_START(ed)    (PERDOMAIN_VIRT_START + (64*1024) + ((ed)->eid << PDPT_VCPU_VA_SHIFT))
Index: xen/include/asm-x86/x86_32/page.h
===================================================================
--- xen.orig/include/asm-x86/x86_32/page.h	2005-04-18 20:33:03.000000000 +0200
+++ xen/include/asm-x86/x86_32/page.h	2005-04-19 11:09:37.000000000 +0200
@@ -12,7 +12,7 @@
 #define L2_PAGETABLE_ENTRIES    (1<<PAGETABLE_ORDER)
 #define ROOT_PAGETABLE_ENTRIES  L2_PAGETABLE_ENTRIES
 
-#define __PAGE_OFFSET           (0xFC400000)
+#define __PAGE_OFFSET           (0xFF000000)
 
 #define PADDR_BITS              32
 #define VADDR_BITS              32
Index: xen/arch/x86/mm.c
===================================================================
--- xen.orig/arch/x86/mm.c	2005-04-18 20:33:03.000000000 +0200
+++ xen/arch/x86/mm.c	2005-04-19 11:12:54.000000000 +0200
@@ -1634,7 +1634,7 @@ int do_mmuext_op(
             if ( ((ptr & (PAGE_SIZE-1)) != 0) || 
                  (ents > 8192) ||
                  ((ptr+ents*LDT_ENTRY_SIZE) < ptr) ||
-                 ((ptr+ents*LDT_ENTRY_SIZE) > PAGE_OFFSET) )
+                 ((ptr+ents*LDT_ENTRY_SIZE) > HYPERVISOR_VIRT_PRIV_START) )
             {
                 okay = 0;
                 MEM_LOG("Bad args to SET_LDT: ptr=%p, ents=%p", ptr, ents);
Index: xen/arch/x86/x86_32/seg_fixup.c
===================================================================
--- xen.orig/arch/x86/x86_32/seg_fixup.c	2005-04-15 15:31:22.000000000 +0200
+++ xen/arch/x86/x86_32/seg_fixup.c	2005-04-19 11:15:32.000000000 +0200
@@ -145,7 +145,7 @@ int get_baselimit(u16 seg, unsigned long
      * Anything that looks like a truncated segment we assume ought really
      * to be a 4GB segment. DANGER!
      */
-    if ( (PAGE_OFFSET - (*base + *limit)) < PAGE_SIZE )
+    if ( (HYPERVISOR_VIRT_PRIV_START - (*base + *limit)) < PAGE_SIZE )
         *limit = 0;
 
     return 1;
@@ -226,14 +226,14 @@ int fixup_seg(u16 seg, unsigned long off
         if ( ((base + limit) < PAGE_SIZE) && (offset <= limit)  )
         {
             /* Flip to expands-up. */
-            limit = PAGE_OFFSET - base;
+            limit = HYPERVISOR_VIRT_PRIV_START - base;
             goto flip;
         }
     }
     else
     {
         /* Expands-up: All the way to Xen space? Assume 4GB if so. */
-        if ( ((PAGE_OFFSET - (base + limit)) < PAGE_SIZE) &&
+        if ( ((HYPERVISOR_VIRT_PRIV_START - (base + limit)) < PAGE_SIZE) &&
              (offset > limit) )
         {
             /* Flip to expands-down. */
Index: xen/arch/x86/traps.c
===================================================================
--- xen.orig/arch/x86/traps.c	2005-04-15 15:31:22.000000000 +0200
+++ xen/arch/x86/traps.c	2005-04-19 11:15:32.000000000 +0200
@@ -284,7 +284,7 @@ asmlinkage int do_page_fault(struct xen_
             return EXCRET_fault_fixed;
         }
 
-        if ( (addr < PAGE_OFFSET) &&
+        if ( (addr < HYPERVISOR_VIRT_PRIV_START) &&
              ((regs->error_code & 3) == 3) && /* write-protection fault */
              ptwr_do_page_fault(d, addr) )
         {
@@ -1102,7 +1102,7 @@ long do_set_trap_table(trap_info_t *trap
 
 #if defined(__i386__)
 #define DB_VALID_ADDR(_a) \
-    ((_a) <= (PAGE_OFFSET - 4))
+    ((_a) <= (HYPERVISOR_VIRT_PRIV_START - 4))
 #elif defined(__x86_64__)
 #define DB_VALID_ADDR(_a) \
     ((_a) >= HYPERVISOR_VIRT_END) || ((_a) <= (HYPERVISOR_VIRT_START-8))
Index: xen/arch/x86/x86_32/mm.c
===================================================================
--- xen.orig/arch/x86/x86_32/mm.c	2005-04-18 20:33:03.000000000 +0200
+++ xen/arch/x86/x86_32/mm.c	2005-04-19 11:15:32.000000000 +0200
@@ -248,7 +248,7 @@ int check_descriptor(struct desc_struct 
     
     /* Check that base is at least a page away from Xen-private area. */
     base  = (b&(0xff<<24)) | ((b&0xff)<<16) | (a>>16);
-    if ( base >= (PAGE_OFFSET - PAGE_SIZE) )
+    if ( base >= (HYPERVISOR_VIRT_PRIV_START - PAGE_SIZE) )
         goto bad;
 
     /* Check and truncate the limit if necessary. */
@@ -281,9 +281,9 @@ int check_descriptor(struct desc_struct 
          *     limit == 0x00000 provides 4kB access (if G=1).
          */
         if ( ((base + limit) <= base) || 
-             ((base + limit) > PAGE_OFFSET) )
+             ((base + limit) > HYPERVISOR_VIRT_PRIV_START) )
         {
-            limit = PAGE_OFFSET - base;
+            limit = HYPERVISOR_VIRT_PRIV_START - base;
         truncate:
             if ( !(b & _SEGMENT_G) )
                 goto bad; /* too dangerous; too hard to work out... */

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-04-19  9:32 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-15 13:07 [rfc] address space reorganization Gerd Knorr
  -- strict thread matches above, loose matches on Subject: below --
2005-04-15 23:31 Ian Pratt
2005-04-19  9:32 ` Gerd Knorr

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.