# HG changeset patch
# User Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
# Date 1280331153 -3600
# Node ID 2007fd03f53d9a3e8774a6df06beef7c74801b07
# Parent bf4d0eb3643d7c86a42ad5265208e6fdf08b01fb
# Parent 4207549948a4c34b9e192635ec5b3b75a09dbf30
Merge
---
xen/include/xen/multiboot2.h | 97 -------------------------------------------
xen/arch/x86/boot/reloc.c | 9 +++
xen/arch/x86/domain.c | 4 +
xen/arch/x86/mm/mem_event.c | 7 +++
xen/arch/x86/mm/p2m.c | 8 ++-
xen/arch/x86/numa.c | 2
xen/arch/x86/setup.c | 30 +++++++++++--
xen/arch/x86/tboot.c | 2
xen/include/xen/multiboot.h | 34 +++++++++++----
9 files changed, 79 insertions(+), 114 deletions(-)
diff -r bf4d0eb3643d -r 2007fd03f53d xen/arch/x86/boot/reloc.c
--- a/xen/arch/x86/boot/reloc.c Wed Jul 28 16:18:44 2010 +0100
+++ b/xen/arch/x86/boot/reloc.c Wed Jul 28 16:32:33 2010 +0100
@@ -106,12 +106,17 @@ multiboot_info_t *reloc(multiboot_info_t
mbi->mmap_addr = (u32)reloc_mbi_struct(
(memory_map_t *)mbi->mmap_addr, mbi->mmap_length);
+ if ( mbi->flags & MBI_LOADERNAME )
+ mbi->boot_loader_name = (u32)reloc_mbi_string(
+ (char *)mbi->boot_loader_name);
+
/* Mask features we don't understand or don't relocate. */
mbi->flags &= (MBI_MEMLIMITS |
- MBI_DRIVES |
+ MBI_BOOTDEV |
MBI_CMDLINE |
MBI_MODULES |
- MBI_MEMMAP);
+ MBI_MEMMAP |
+ MBI_LOADERNAME);
return mbi;
}
diff -r bf4d0eb3643d -r 2007fd03f53d xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Wed Jul 28 16:18:44 2010 +0100
+++ b/xen/arch/x86/domain.c Wed Jul 28 16:32:33 2010 +0100
@@ -139,12 +139,14 @@ void dump_pageframe_info(struct domain *
}
else
{
+ spin_lock(&d->page_alloc_lock);
page_list_for_each ( page, &d->page_list )
{
printk(" DomPage %p: caf=%08lx, taf=%" PRtype_info "\n",
_p(page_to_mfn(page)),
page->count_info, page->u.inuse.type_info);
}
+ spin_unlock(&d->page_alloc_lock);
}
if ( is_hvm_domain(d) )
@@ -152,12 +154,14 @@ void dump_pageframe_info(struct domain *
p2m_pod_dump_data(d);
}
+ spin_lock(&d->page_alloc_lock);
page_list_for_each ( page, &d->xenpage_list )
{
printk(" XenPage %p: caf=%08lx, taf=%" PRtype_info "\n",
_p(page_to_mfn(page)),
page->count_info, page->u.inuse.type_info);
}
+ spin_unlock(&d->page_alloc_lock);
}
struct domain *alloc_domain_struct(void)
diff -r bf4d0eb3643d -r 2007fd03f53d xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c Wed Jul 28 16:18:44 2010 +0100
+++ b/xen/arch/x86/mm/mem_event.c Wed Jul 28 16:32:33 2010 +0100
@@ -21,6 +21,7 @@
*/
+#include <asm/domain.h>
#include <xen/event.h>
#include <asm/p2m.h>
#include <asm/mem_event.h>
@@ -225,6 +226,12 @@ int mem_event_domctl(struct domain *d, x
mfn_t ring_mfn;
mfn_t shared_mfn;
+ /* Currently only EPT is supported */
+ rc = -ENODEV;
+ if ( !(hap_enabled(d) &&
+ (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)) )
+ break;
+
/* Get MFN of ring page */
guest_get_eff_l1e(v, ring_addr, &l1e);
gfn = l1e_get_pfn(l1e);
diff -r bf4d0eb3643d -r 2007fd03f53d xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c Wed Jul 28 16:18:44 2010 +0100
+++ b/xen/arch/x86/mm/p2m.c Wed Jul 28 16:32:33 2010 +0100
@@ -1833,6 +1833,7 @@ int p2m_alloc_table(struct domain *d,
goto error;
/* Copy all existing mappings from the page list and m2p */
+ spin_lock(&d->page_alloc_lock);
page_list_for_each(page, &d->page_list)
{
mfn = page_to_mfn(page);
@@ -1848,13 +1849,16 @@ int p2m_alloc_table(struct domain *d,
#endif
&& gfn != INVALID_M2P_ENTRY
&& !set_p2m_entry(d, gfn, mfn, 0, p2m_ram_rw) )
- goto error;
- }
+ goto error_unlock;
+ }
+ spin_unlock(&d->page_alloc_lock);
P2M_PRINTK("p2m table initialised (%u pages)\n", page_count);
p2m_unlock(p2m);
return 0;
+error_unlock:
+ spin_unlock(&d->page_alloc_lock);
error:
P2M_PRINTK("failed to initialize p2m table, gfn=%05lx, mfn=%"
PRI_mfn "\n", gfn, mfn_x(mfn));
diff -r bf4d0eb3643d -r 2007fd03f53d xen/arch/x86/numa.c
--- a/xen/arch/x86/numa.c Wed Jul 28 16:18:44 2010 +0100
+++ b/xen/arch/x86/numa.c Wed Jul 28 16:32:33 2010 +0100
@@ -385,11 +385,13 @@ static void dump_numa(unsigned char key)
for_each_online_node(i)
page_num_node[i] = 0;
+ spin_lock(&d->page_alloc_lock);
page_list_for_each(page, &d->page_list)
{
i = phys_to_nid((paddr_t)page_to_mfn(page) <<
PAGE_SHIFT);
page_num_node[i]++;
}
+ spin_unlock(&d->page_alloc_lock);
for_each_online_node(i)
printk(" Node %u: %u\n", i, page_num_node[i]);
diff -r bf4d0eb3643d -r 2007fd03f53d xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c Wed Jul 28 16:18:44 2010 +0100
+++ b/xen/arch/x86/setup.c Wed Jul 28 16:32:33 2010 +0100
@@ -363,22 +363,38 @@ void init_done(void)
startup_cpu_idle_loop();
}
-static char * __init cmdline_cook(char *p)
+static bool_t __init loader_is_grub2(const char *loader_name)
+{
+ /* GRUB1="GNU GRUB 0.xx"; GRUB2="GRUB 1.xx" */
+ const char *p = strstr(loader_name, "GRUB ");
+ return (p != NULL) && (p[5] != '0');
+}
+
+static char * __init cmdline_cook(char *p, char *loader_name)
{
p = p ? : "";
+
+ /* Strip leading whitespace. */
while ( *p == ' ' )
p++;
+
+ /* GRUB2 does not include image name as first item on command line. */
+ if ( loader_is_grub2(loader_name) )
+ return p;
+
+ /* Strip image name plus whitespace. */
while ( (*p != ' ') && (*p != '\0') )
p++;
while ( *p == ' ' )
p++;
+
return p;
}
void __init __start_xen(unsigned long mbi_p)
{
char *memmap_type = NULL;
- char *cmdline, *kextra;
+ char *cmdline, *kextra, *loader;
unsigned long _initrd_start = 0, _initrd_len = 0;
unsigned int initrdidx = 1;
multiboot_info_t *mbi = __va(mbi_p);
@@ -396,9 +412,13 @@ void __init __start_xen(unsigned long mb
set_intr_gate(TRAP_page_fault, &early_page_fault);
+ loader = (mbi->flags & MBI_LOADERNAME)
+ ? (char *)__va(mbi->boot_loader_name) : "unknown";
+
/* Parse the command-line options. */
cmdline = cmdline_cook((mbi->flags & MBI_CMDLINE) ?
- __va(mbi->cmdline) : NULL);
+ __va(mbi->cmdline) : NULL,
+ loader);
if ( (kextra = strstr(cmdline, " -- ")) != NULL )
{
/*
@@ -431,6 +451,8 @@ void __init __start_xen(unsigned long mb
ns16550.irq = 3;
ns16550_init(1, &ns16550);
console_init_preirq();
+
+ printk("Bootloader: %s\n", loader);
printk("Command line: %s\n", cmdline);
@@ -1032,7 +1054,7 @@ void __init __start_xen(unsigned long mb
{
static char dom0_cmdline[MAX_GUEST_CMDLINE];
- cmdline = cmdline_cook(cmdline);
+ cmdline = cmdline_cook(cmdline, loader);
safe_strcpy(dom0_cmdline, cmdline);
if ( kextra != NULL )
diff -r bf4d0eb3643d -r 2007fd03f53d xen/arch/x86/tboot.c
--- a/xen/arch/x86/tboot.c Wed Jul 28 16:18:44 2010 +0100
+++ b/xen/arch/x86/tboot.c Wed Jul 28 16:32:33 2010 +0100
@@ -211,12 +211,14 @@ static void tboot_gen_domain_integrity(c
continue;
printk("MACing Domain %u\n", d->domain_id);
+ spin_lock(&d->page_alloc_lock);
page_list_for_each(page, &d->page_list)
{
void *pg = __map_domain_page(page);
vmac_update(pg, PAGE_SIZE, &ctx);
unmap_domain_page(pg);
}
+ spin_unlock(&d->page_alloc_lock);
if ( !is_idle_domain(d) )
{
diff -r bf4d0eb3643d -r 2007fd03f53d xen/include/xen/multiboot.h
--- a/xen/include/xen/multiboot.h Wed Jul 28 16:18:44 2010 +0100
+++ b/xen/include/xen/multiboot.h Wed Jul 28 16:32:33 2010 +0100
@@ -31,14 +31,17 @@
/* The magic number passed by a Multiboot-compliant boot loader. */
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
-#define MBI_MEMLIMITS (1<<0)
-#define MBI_DRIVES (1<<1)
-#define MBI_CMDLINE (1<<2)
-#define MBI_MODULES (1<<3)
-#define MBI_AOUT_SYMS (1<<4)
-#define MBI_ELF_SYMS (1<<5)
-#define MBI_MEMMAP (1<<6)
-#define MBI_LOADERNAME (1<<9)
+#define MBI_MEMLIMITS (1u<< 0)
+#define MBI_BOOTDEV (1u<< 1)
+#define MBI_CMDLINE (1u<< 2)
+#define MBI_MODULES (1u<< 3)
+#define MBI_AOUT_SYMS (1u<< 4)
+#define MBI_ELF_SYMS (1u<< 5)
+#define MBI_MEMMAP (1u<< 6)
+#define MBI_DRIVES (1u<< 7)
+#define MBI_BIOSCONFIG (1u<< 8)
+#define MBI_LOADERNAME (1u<< 9)
+#define MBI_APM (1u<<10)
#ifndef __ASSEMBLY__
@@ -66,7 +69,7 @@ typedef struct {
u32 mem_lower;
u32 mem_upper;
- /* Valid if flags sets MBI_DRIVES */
+ /* Valid if flags sets MBI_BOOTDEV */
u32 boot_device;
/* Valid if flags sets MBI_CMDLINE */
@@ -85,6 +88,19 @@ typedef struct {
/* Valid if flags sets MBI_MEMMAP */
u32 mmap_length;
u32 mmap_addr;
+
+ /* Valid if flags sets MBI_DRIVES */
+ u32 drives_length;
+ u32 drives_addr;
+
+ /* Valid if flags sets MBI_BIOSCONFIG */
+ u32 config_table;
+
+ /* Valid if flags sets MBI_LOADERNAME */
+ u32 boot_loader_name;
+
+ /* Valid if flags sets MBI_APM */
+ u32 apm_table;
} multiboot_info_t;
/* The module structure. */
diff -r bf4d0eb3643d -r 2007fd03f53d xen/include/xen/multiboot2.h
--- a/xen/include/xen/multiboot2.h Wed Jul 28 16:18:44 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Copyright IBM Corp. 2006, 2007
- *
- * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx>
- *
- */
-
-#ifndef _MULTIBOOT2_H_
-#define _MULTIBOOT2_H_
-
-/* How many bytes from the start of the file we search for the header. */
-#define MB2_HEADER_SEARCH 8192
-
-/* The magic field should contain this. */
-#define MB2_HEADER_MAGIC 0xe85250d6
-
-/* Passed from the bootloader to the kernel. */
-#define MB2_BOOTLOADER_MAGIC 0x36d76289
-
-#define for_each_tag(_tag, _tags) \
- for ((_tag) = (_tags); \
- ((_tag)->key != MB2_TAG_END && (_tag)->key != 0); \
- (_tag) = (void *)(_tag) + (_tag)->len)
-
-typedef uint32_t mb2_word;
-
-struct mb2_header
-{
- uint32_t magic;
-};
-
-struct mb2_tag_header
-{
- uint32_t key;
- uint32_t len;
-};
-
-#define MB2_TAG_START 1
-struct mb2_tag_start
-{
- struct mb2_tag_header header;
- mb2_word size; /* Total size of all mb2 tags. */
-};
-
-#define MB2_TAG_NAME 2
-struct mb2_tag_name
-{
- struct mb2_tag_header header;
- char name[1];
-};
-
-#define MB2_TAG_MODULE 3
-struct mb2_tag_module
-{
- struct mb2_tag_header header;
- mb2_word addr;
- mb2_word size;
- unsigned char type[36];
- unsigned char cmdline[1];
-};
-
-#define MB2_TAG_MEMORY 4
-struct mb2_tag_memory
-{
- struct mb2_tag_header header;
- mb2_word addr;
- mb2_word size;
- mb2_word type;
-};
-
-#define MB2_TAG_UNUSED 5
-struct mb2_tag_unused
-{
- struct mb2_tag_header header;
-};
-
-#define MB2_TAG_END 0xffff
-struct mb2_tag_end
-{
- struct mb2_tag_header header;
-};
-
-#endif
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|