aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c')
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c b/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c
index 3bcb6dbdb4..979deacf5a 100644
--- a/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c
+++ b/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c
@@ -46,6 +46,8 @@
shared_info_t *HYPERVISOR_shared_info;
+unsigned long *phys_to_machine_mapping;
+
/*
* Machine setup..
*/
@@ -143,6 +145,7 @@ void __init setup_arch(char **cmdline_p)
{
unsigned long start_pfn, max_pfn, max_low_pfn;
unsigned long bootmap_size;
+ unsigned long i;
extern void hypervisor_callback(void);
extern void failsafe_callback(void);
@@ -254,12 +257,24 @@ void __init setup_arch(char **cmdline_p)
{
unsigned long pgde = *pgd++;
if ( !(pgde & 1) ) continue;
- pte = (pgde & PAGE_MASK) - start_info.phys_base;
+ pte = machine_to_phys(pgde & PAGE_MASK);
reserve_bootmem(pte, PAGE_SIZE);
}
}
cur_pgd = init_mm.pgd = (pgd_t *)start_info.pt_base;
+ /* Now initialise the physical->machine mapping table. */
+ phys_to_machine_mapping = alloc_bootmem(max_pfn * sizeof(unsigned long));
+ for ( i = 0; i < max_pfn; i++ )
+ {
+ unsigned long pgde, *ppte;
+ unsigned long pfn = i + (PAGE_OFFSET >> PAGE_SHIFT);
+ pgde = *((unsigned long *)start_info.pt_base + (pfn >> 10));
+ ppte = (unsigned long *)machine_to_phys(pgde & PAGE_MASK) + (pfn&1023);
+ phys_to_machine_mapping[i] =
+ (*(unsigned long *)__va(ppte)) >> PAGE_SHIFT;
+ }
+
#ifdef CONFIG_BLK_DEV_INITRD
if (start_info.mod_start) {
if ((__pa(start_info.mod_start) + start_info.mod_len) <=