WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [rfc] address space reorganization

To: Ian Pratt <m+Ian.Pratt@xxxxxxxxxxxx>
Subject: Re: [Xen-devel] [rfc] address space reorganization
From: Gerd Knorr <kraxel@xxxxxxxxxxx>
Date: Tue, 19 Apr 2005 11:32:05 +0200
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Tue, 19 Apr 2005 09:35:18 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <A95E2296287EAD4EB592B5DEEFCE0E9D1E3BD3@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <A95E2296287EAD4EB592B5DEEFCE0E9D1E3BD3@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.9i
  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@xxxxxxxxxxx>
---
 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... */

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>