diff options
author | awilliam@xenbuild2.aw <awilliam@xenbuild2.aw> | 2007-03-07 12:38:28 -0700 |
---|---|---|
committer | awilliam@xenbuild2.aw <awilliam@xenbuild2.aw> | 2007-03-07 12:38:28 -0700 |
commit | 5ac1e3b0f07346b04066a652e16d3980da32ebb7 (patch) | |
tree | 5705fd16ea69965c7cbdf35f7292131fc3bc5fe8 /extras/mini-os/arch | |
parent | 24fbef10c201887696d1f37628dde8fd0cbf7086 (diff) | |
parent | 757f568bbf0b5d42d5d0458795f57a8133d8511d (diff) | |
download | xen-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.c | 4 | ||||
-rw-r--r-- | extras/mini-os/arch/x86/Makefile | 1 | ||||
-rw-r--r-- | extras/mini-os/arch/x86/arch.mk | 10 | ||||
-rw-r--r-- | extras/mini-os/arch/x86/mm.c | 43 |
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) { |