aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/include
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2006-03-09 15:57:32 +0100
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2006-03-09 15:57:32 +0100
commit44fb8b72969a9009fab1944f25b7c27311f33dc5 (patch)
tree1ee248400058bb177bad3208009493e9a6e44377 /extras/mini-os/include
parent0026c91c773c0d29b151b0be20b95a3fa2464071 (diff)
downloadxen-44fb8b72969a9009fab1944f25b7c27311f33dc5.tar.gz
xen-44fb8b72969a9009fab1944f25b7c27311f33dc5.tar.bz2
xen-44fb8b72969a9009fab1944f25b7c27311f33dc5.zip
64 bit pagetable builder added to mm.c
Signed-off-by: Aravindh Puthiyaparambil <aravindh.puthiyaparambil@unisys.com> Signed-off-by: Grzegorz Milos <gm281@cam.ac.uk>
Diffstat (limited to 'extras/mini-os/include')
-rw-r--r--extras/mini-os/include/lib.h1
-rw-r--r--extras/mini-os/include/mm.h74
-rw-r--r--extras/mini-os/include/os.h2
3 files changed, 54 insertions, 23 deletions
diff --git a/extras/mini-os/include/lib.h b/extras/mini-os/include/lib.h
index f386cb8053..0bf458565c 100644
--- a/extras/mini-os/include/lib.h
+++ b/extras/mini-os/include/lib.h
@@ -57,6 +57,7 @@
#include <stdarg.h>
+
/* printing */
#define printk printf
#define kprintf printf
diff --git a/extras/mini-os/include/mm.h b/extras/mini-os/include/mm.h
index 613fe29dfa..f88c8be83e 100644
--- a/extras/mini-os/include/mm.h
+++ b/extras/mini-os/include/mm.h
@@ -25,18 +25,34 @@
#ifndef _MM_H_
#define _MM_H_
-#ifdef __i386__
+#if defined(__i386__)
#include <xen/arch-x86_32.h>
-#endif
-
-#ifdef __x86_64__
+#elif defined(__x86_64__)
#include <xen/arch-x86_64.h>
+#else
+#error "Unsupported architecture"
#endif
+#include <lib.h>
-#ifdef __x86_64__
+#define L1_FRAME 1
+#define L2_FRAME 2
+#define L3_FRAME 3
#define L1_PAGETABLE_SHIFT 12
+
+#if defined(__i386__)
+
+#define L2_PAGETABLE_SHIFT 22
+
+#define L1_PAGETABLE_ENTRIES 1024
+#define L2_PAGETABLE_ENTRIES 1024
+
+#define PADDR_BITS 32
+#define PADDR_MASK (~0UL)
+
+#elif defined(__x86_64__)
+
#define L2_PAGETABLE_SHIFT 21
#define L3_PAGETABLE_SHIFT 30
#define L4_PAGETABLE_SHIFT 39
@@ -52,29 +68,29 @@
#define PADDR_MASK ((1UL << PADDR_BITS)-1)
#define VADDR_MASK ((1UL << VADDR_BITS)-1)
-#define pte_to_mfn(_pte) (((_pte) & (PADDR_MASK&PAGE_MASK)) >> L1_PAGETABLE_SHIFT)
-
-#endif
-
-
-
-#ifdef __i386__
+/* Get physical address of page mapped by pte (paddr_t). */
+#define l1e_get_paddr(x) \
+ ((unsigned long)(((x) & (PADDR_MASK&PAGE_MASK))))
+#define l2e_get_paddr(x) \
+ ((unsigned long)(((x) & (PADDR_MASK&PAGE_MASK))))
+#define l3e_get_paddr(x) \
+ ((unsigned long)(((x) & (PADDR_MASK&PAGE_MASK))))
+#define l4e_get_paddr(x) \
+ ((unsigned long)(((x) & (PADDR_MASK&PAGE_MASK))))
-#define L1_PAGETABLE_SHIFT 12
-#define L2_PAGETABLE_SHIFT 22
+#define L2_MASK ((1UL << L3_PAGETABLE_SHIFT) - 1)
+#define L3_MASK ((1UL << L4_PAGETABLE_SHIFT) - 1)
-#define L1_PAGETABLE_ENTRIES 1024
-#define L2_PAGETABLE_ENTRIES 1024
-
-#elif defined(__x86_64__)
#endif
+#define L1_MASK ((1UL << L2_PAGETABLE_SHIFT) - 1)
+
/* Given a virtual address, get an entry offset into a page table. */
#define l1_table_offset(_a) \
(((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES - 1))
#define l2_table_offset(_a) \
(((_a) >> L2_PAGETABLE_SHIFT) & (L2_PAGETABLE_ENTRIES - 1))
-#ifdef __x86_64__
+#if defined(__x86_64__)
#define l3_table_offset(_a) \
(((_a) >> L3_PAGETABLE_SHIFT) & (L3_PAGETABLE_ENTRIES - 1))
#define l4_table_offset(_a) \
@@ -92,8 +108,15 @@
#define _PAGE_PSE 0x080UL
#define _PAGE_GLOBAL 0x100UL
-#define L1_PROT (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED)
-#define L2_PROT (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_USER)
+#if defined(__i386__)
+#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
+#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY |_PAGE_USER)
+#elif defined(__x86_64__)
+#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER)
+#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
+#define L3_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
+#define L4_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
+#endif
#define PAGE_SIZE (1UL << L1_PAGETABLE_SHIFT)
#define PAGE_SHIFT L1_PAGETABLE_SHIFT
@@ -124,9 +147,9 @@ static __inline__ unsigned long machine_to_phys(unsigned long machine)
return phys;
}
-#ifdef __x86_64__
+#if defined(__x86_64__)
#define VIRT_START 0xFFFFFFFF00000000UL
-#else
+#elif defined(__i386__)
#define VIRT_START 0xC0000000UL
#endif
@@ -136,6 +159,11 @@ static __inline__ unsigned long machine_to_phys(unsigned long machine)
#define virt_to_pfn(_virt) (PFN_DOWN(to_phys(_virt)))
#define mach_to_virt(_mach) (to_virt(machine_to_phys(_mach)))
#define mfn_to_virt(_mfn) (mach_to_virt(_mfn << PAGE_SHIFT))
+#define pfn_to_virt(_pfn) (to_virt(_pfn << PAGE_SHIFT))
+
+/* Pagetable walking. */
+#define pte_to_mfn(_pte) (((_pte) & (PADDR_MASK&PAGE_MASK)) >> L1_PAGETABLE_SHIFT)
+#define pte_to_virt(_pte) to_virt(mfn_to_pfn(pte_to_mfn(_pte)) << PAGE_SHIFT)
void init_mm(void);
unsigned long alloc_pages(int order);
diff --git a/extras/mini-os/include/os.h b/extras/mini-os/include/os.h
index 2fbb11c203..1ad51e99af 100644
--- a/extras/mini-os/include/os.h
+++ b/extras/mini-os/include/os.h
@@ -59,6 +59,8 @@ extern shared_info_t *HYPERVISOR_shared_info;
void trap_init(void);
+
+
/*
* The use of 'barrier' in the following reflects their use as local-lock
* operations. Reentrancy must be prevented (e.g., __cli()) /before/ following