Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 217850
b: refs/heads/master
c: 35ae11f
h: refs/heads/master
v: v3
  • Loading branch information
Ian Campbell authored and Jeremy Fitzhardinge committed Oct 22, 2010
1 parent 4bb89de commit fa59fc6
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 3 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: cfd8951e082a589637f9de3c33efd3218fdb3c03
refs/heads/master: 35ae11fd146384d222f3bb1f17eed1970cc92c36
38 changes: 36 additions & 2 deletions trunk/arch/x86/xen/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include <xen/page.h>
#include <xen/interface/callback.h>
#include <xen/interface/memory.h>
#include <xen/interface/physdev.h>
#include <xen/interface/memory.h>
#include <xen/features.h>
Expand Down Expand Up @@ -107,13 +108,46 @@ static unsigned long __init xen_return_unused_memory(unsigned long max_pfn,

char * __init xen_memory_setup(void)
{
static struct e820entry map[E820MAX] __initdata;

unsigned long max_pfn = xen_start_info->nr_pages;
unsigned long long mem_end;
int rc;
struct xen_memory_map memmap;
int i;

max_pfn = min(MAX_DOMAIN_PAGES, max_pfn);
mem_end = PFN_PHYS(max_pfn);

memmap.nr_entries = E820MAX;
set_xen_guest_handle(memmap.buffer, map);

rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
if (rc == -ENOSYS) {
memmap.nr_entries = 1;
map[0].addr = 0ULL;
map[0].size = mem_end;
/* 8MB slack (to balance backend allocations). */
map[0].size += 8ULL << 20;
map[0].type = E820_RAM;
rc = 0;
}
BUG_ON(rc);

e820.nr_map = 0;

e820_add_region(0, PFN_PHYS((u64)max_pfn), E820_RAM);
for (i = 0; i < memmap.nr_entries; i++) {
unsigned long long end = map[i].addr + map[i].size;
if (map[i].type == E820_RAM) {
if (map[i].addr > mem_end)
continue;
if (end > mem_end) {
/* Truncate region to max_mem. */
map[i].size -= end - mem_end;
}
}
if (map[i].size > 0)
e820_add_region(map[i].addr, map[i].size, map[i].type);
}

/*
* Even though this is normal, usable memory under Xen, reserve
Expand Down
29 changes: 29 additions & 0 deletions trunk/include/xen/interface/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,35 @@ struct xen_translate_gpfn_list {
};
DEFINE_GUEST_HANDLE_STRUCT(xen_translate_gpfn_list);

/*
* Returns the pseudo-physical memory map as it was when the domain
* was started (specified by XENMEM_set_memory_map).
* arg == addr of struct xen_memory_map.
*/
#define XENMEM_memory_map 9
struct xen_memory_map {
/*
* On call the number of entries which can be stored in buffer. On
* return the number of entries which have been stored in
* buffer.
*/
unsigned int nr_entries;

/*
* Entries in the buffer are in the same format as returned by the
* BIOS INT 0x15 EAX=0xE820 call.
*/
GUEST_HANDLE(void) buffer;
};
DEFINE_GUEST_HANDLE_STRUCT(xen_memory_map);

/*
* Returns the real physical memory map. Passes the same structure as
* XENMEM_memory_map.
* arg == addr of struct xen_memory_map.
*/
#define XENMEM_machine_memory_map 10


/*
* Prevent the balloon driver from changing the memory reservation
Expand Down

0 comments on commit fa59fc6

Please sign in to comment.