#ifdef CONFIG_BALLOON
+unsigned long virt_kernel_area_end; /* TODO: find a virtual area */
+
#endif
* DEALINGS IN THE SOFTWARE.
*/
+#include <mini-os/os.h>
#include <mini-os/balloon.h>
+#include <mini-os/lib.h>
+#include <mini-os/mm.h>
#ifdef CONFIG_BALLOON
+unsigned long virt_kernel_area_end = VIRT_KERNEL_AREA;
+
+void arch_remap_p2m(unsigned long max_pfn)
+{
+ unsigned long pfn;
+
+ if ( p2m_pages(nr_max_pages) <= p2m_pages(max_pfn) )
+ return;
+
+ for ( pfn = 0; pfn < max_pfn; pfn += P2M_ENTRIES )
+ {
+ map_frame_rw(virt_kernel_area_end + PAGE_SIZE * (pfn / P2M_ENTRIES),
+ virt_to_mfn(phys_to_machine_mapping + pfn));
+ }
+
+ phys_to_machine_mapping = (unsigned long *)virt_kernel_area_end;
+ printk("remapped p2m list to %p\n", phys_to_machine_mapping);
+
+ virt_kernel_area_end += PAGE_SIZE * p2m_pages(nr_max_pages);
+ ASSERT(virt_kernel_area_end <= VIRT_DEMAND_AREA);
+}
+
#endif
#include <mini-os/errno.h>
#include <mini-os/os.h>
#include <mini-os/hypervisor.h>
+#include <mini-os/balloon.h>
#include <mini-os/mm.h>
#include <mini-os/types.h>
#include <mini-os/lib.h>
HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
virt_to_mfn(l3_list);
HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
+
+ arch_remap_p2m(max_pfn);
}
void arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p)
#ifdef CONFIG_BALLOON
extern unsigned long nr_max_pages;
+extern unsigned long virt_kernel_area_end;
void get_max_pages(void);
+void arch_remap_p2m(unsigned long max_pfn);
#else /* CONFIG_BALLOON */
static inline void get_max_pages(void) { }
+static inline void arch_remap_p2m(unsigned long max_pfn) { }
#endif /* CONFIG_BALLOON */
#endif /* _BALLOON_H_ */
do_exit();
}
}
+static inline unsigned long p2m_pages(unsigned long pages)
+{
+ return (pages + P2M_ENTRIES - 1) >> L1_P2M_SHIFT;
+}
#include "arch_limits.h"
#define PAGE_SIZE __PAGE_SIZE