Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329153
b: refs/heads/master
c: 806c312
h: refs/heads/master
i:
  329151: 6064570
v: v3
  • Loading branch information
Konrad Rzeszutek Wilk committed Aug 21, 2012
1 parent f942369 commit 1bc4a13
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 59b294403e9814e7c1154043567f0d71bac7a511
refs/heads/master: 806c312e50f122c47913145cf884f53dd09d9199
30 changes: 21 additions & 9 deletions trunk/arch/x86/xen/enlighten.c
Original file line number Diff line number Diff line change
Expand Up @@ -1002,32 +1002,38 @@ static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high)
* If the MFN is not in the m2p (provided to us by the hypervisor) this
* function won't do anything. In practice this means that the XenBus
* MFN won't be available for the initial domain. */
static void __init xen_reserve_mfn(unsigned long mfn)
static unsigned long __init xen_reserve_mfn(unsigned long mfn)
{
unsigned long pfn;
unsigned long pfn, end_pfn = 0;

if (!mfn)
return;
return end_pfn;

pfn = mfn_to_pfn(mfn);
if (phys_to_machine_mapping_valid(pfn))
memblock_reserve(PFN_PHYS(pfn), PAGE_SIZE);
if (phys_to_machine_mapping_valid(pfn)) {
end_pfn = PFN_PHYS(pfn) + PAGE_SIZE;
memblock_reserve(PFN_PHYS(pfn), end_pfn);
}
return end_pfn;
}
static void __init xen_reserve_internals(void)
{
unsigned long size;
unsigned long last_phys = 0;

if (!xen_pv_domain())
return;

/* xen_start_info does not exist in the M2P, hence can't use
* xen_reserve_mfn. */
memblock_reserve(__pa(xen_start_info), PAGE_SIZE);
last_phys = __pa(xen_start_info) + PAGE_SIZE;

xen_reserve_mfn(PFN_DOWN(xen_start_info->shared_info));
xen_reserve_mfn(xen_start_info->store_mfn);
last_phys = max(xen_reserve_mfn(PFN_DOWN(xen_start_info->shared_info)), last_phys);
last_phys = max(xen_reserve_mfn(xen_start_info->store_mfn), last_phys);

if (!xen_initial_domain())
xen_reserve_mfn(xen_start_info->console.domU.mfn);
last_phys = max(xen_reserve_mfn(xen_start_info->console.domU.mfn), last_phys);

if (xen_feature(XENFEAT_auto_translated_physmap))
return;
Expand All @@ -1043,8 +1049,14 @@ static void __init xen_reserve_internals(void)
* a lot (and call memblock_reserve for each PAGE), so lets just use
* the easy way and reserve it wholesale. */
memblock_reserve(__pa(xen_start_info->mfn_list), size);

last_phys = max(__pa(xen_start_info->mfn_list) + size, last_phys);
/* The pagetables are reserved in mmu.c */

/* Under 64-bit hypervisor with a 32-bit domain, the hypervisor
* offsets the pt_base by two pages. Hence the reservation that is done
* in mmu.c misses two pages. We correct it here if we detect this. */
if (last_phys < __pa(xen_start_info->pt_base))
memblock_reserve(last_phys, __pa(xen_start_info->pt_base) - last_phys);
}
void xen_setup_shared_info(void)
{
Expand Down

0 comments on commit 1bc4a13

Please sign in to comment.