aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/arch
diff options
context:
space:
mode:
authorawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>2007-03-07 12:38:28 -0700
committerawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>2007-03-07 12:38:28 -0700
commit5ac1e3b0f07346b04066a652e16d3980da32ebb7 (patch)
tree5705fd16ea69965c7cbdf35f7292131fc3bc5fe8 /extras/mini-os/arch
parent24fbef10c201887696d1f37628dde8fd0cbf7086 (diff)
parent757f568bbf0b5d42d5d0458795f57a8133d8511d (diff)
downloadxen-5ac1e3b0f07346b04066a652e16d3980da32ebb7.tar.gz
xen-5ac1e3b0f07346b04066a652e16d3980da32ebb7.tar.bz2
xen-5ac1e3b0f07346b04066a652e16d3980da32ebb7.zip
merge with xen-unstable.hg
Diffstat (limited to 'extras/mini-os/arch')
-rw-r--r--extras/mini-os/arch/ia64/mm.c4
-rw-r--r--extras/mini-os/arch/x86/Makefile1
-rw-r--r--extras/mini-os/arch/x86/arch.mk10
-rw-r--r--extras/mini-os/arch/x86/mm.c43
4 files changed, 52 insertions, 6 deletions
diff --git a/extras/mini-os/arch/ia64/mm.c b/extras/mini-os/arch/ia64/mm.c
index ad5acccc7e..dd1fb9dc78 100644
--- a/extras/mini-os/arch/ia64/mm.c
+++ b/extras/mini-os/arch/ia64/mm.c
@@ -130,3 +130,7 @@ map_frames(unsigned long* frames, unsigned long n)
return (void*) __va(frames[0] << PAGE_SHIFT);
}
+void arch_init_p2m(unsigned long max_pfn)
+{
+ printk("Warn: p2m map not implemented.\n");
+}
diff --git a/extras/mini-os/arch/x86/Makefile b/extras/mini-os/arch/x86/Makefile
index 8e655f1d64..10cb1ff9a1 100644
--- a/extras/mini-os/arch/x86/Makefile
+++ b/extras/mini-os/arch/x86/Makefile
@@ -4,6 +4,7 @@
#
# include arch.mk has to be before mini-os.mk!
+
include arch.mk
include ../../minios.mk
diff --git a/extras/mini-os/arch/x86/arch.mk b/extras/mini-os/arch/x86/arch.mk
index 9a7704b490..bf3350c150 100644
--- a/extras/mini-os/arch/x86/arch.mk
+++ b/extras/mini-os/arch/x86/arch.mk
@@ -9,13 +9,11 @@ ARCH_LDFLAGS := -m elf_i386
ARCH_ASFLAGS := -m32
EXTRA_INC += $(TARGET_ARCH_FAM)/$(TARGET_ARCH)
EXTRA_SRC += arch/$(EXTRA_INC)
-endif
-ifeq ($(TARGET_ARCH)$(pae),x86_32y)
-ARCH_CFLAGS := -DCONFIG_X86_PAE=1
-ARCH_ASFLAGS := -DCONFIG_X86_PAE=1
-EXTRA_INC += $(TARGET_ARCH_FAM)/$(TARGET_ARCH)
-EXTRA_SRC += arch/$(EXTRA_INC)
+ifeq ($(XEN_TARGET_X86_PAE),y)
+ARCH_CFLAGS += -DCONFIG_X86_PAE=1
+ARCH_ASFLAGS += -DCONFIG_X86_PAE=1
+endif
endif
ifeq ($(TARGET_ARCH),x86_64)
diff --git a/extras/mini-os/arch/x86/mm.c b/extras/mini-os/arch/x86/mm.c
index d0fe762792..d1508f8263 100644
--- a/extras/mini-os/arch/x86/mm.c
+++ b/extras/mini-os/arch/x86/mm.c
@@ -402,6 +402,49 @@ void *map_frames(unsigned long *f, unsigned long n)
}
}
+
+void arch_init_p2m(unsigned long max_pfn)
+{
+#define L1_P2M_SHIFT 10
+#define L2_P2M_SHIFT 20
+#define L3_P2M_SHIFT 30
+#define L1_P2M_ENTRIES (1 << L1_P2M_SHIFT)
+#define L2_P2M_ENTRIES (1 << (L2_P2M_SHIFT - L1_P2M_SHIFT))
+#define L3_P2M_ENTRIES (1 << (L3_P2M_SHIFT - L2_P2M_SHIFT))
+#define L1_P2M_MASK (L1_P2M_ENTRIES - 1)
+#define L2_P2M_MASK (L2_P2M_ENTRIES - 1)
+#define L3_P2M_MASK (L3_P2M_ENTRIES - 1)
+
+ unsigned long *l1_list, *l2_list, *l3_list;
+ unsigned long pfn;
+
+ l3_list = (unsigned long *)alloc_page();
+ for(pfn=0; pfn<max_pfn; pfn++)
+ {
+ if(!(pfn % (L1_P2M_ENTRIES * L2_P2M_ENTRIES)))
+ {
+ l2_list = (unsigned long*)alloc_page();
+ if((pfn >> L3_P2M_SHIFT) > 0)
+ {
+ printk("Error: Too many pfns.\n");
+ do_exit();
+ }
+ l3_list[(pfn >> L2_P2M_SHIFT)] = virt_to_mfn(l2_list);
+ }
+ if(!(pfn % (L1_P2M_ENTRIES)))
+ {
+ l1_list = (unsigned long*)alloc_page();
+ l2_list[(pfn >> L1_P2M_SHIFT) & L2_P2M_MASK] =
+ virt_to_mfn(l1_list);
+ }
+
+ l1_list[pfn & L1_P2M_MASK] = pfn_to_mfn(pfn);
+ }
+ HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
+ virt_to_mfn(l3_list);
+ HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
+}
+
void arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p)
{