aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/domain_build.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-01-22 18:00:48 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-01-22 18:00:48 +0000
commite2b1ebf4de503eef701bf122362355ec11af34f3 (patch)
tree504ff98b3f0a7fcfc8a8c9cbda62e84ba4d48f49 /xen/arch/x86/domain_build.c
parent85952ca7cefe27cdf13e1c24571d964708b876dc (diff)
downloadxen-e2b1ebf4de503eef701bf122362355ec11af34f3.tar.gz
xen-e2b1ebf4de503eef701bf122362355ec11af34f3.tar.bz2
xen-e2b1ebf4de503eef701bf122362355ec11af34f3.zip
x86: Support booting a bzImage format domain 0 kernel.
This requires a bzImage v2.08 or later kernel. xen/common/inflate.c is taken unmodified from Linux v2.6.28. Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'xen/arch/x86/domain_build.c')
-rw-r--r--xen/arch/x86/domain_build.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c
index 3b8a1a15fe..c4eb21a056 100644
--- a/xen/arch/x86/domain_build.c
+++ b/xen/arch/x86/domain_build.c
@@ -32,6 +32,9 @@
#include <public/version.h>
+int __init bzimage_parse(
+ char *output, char **image_start, unsigned long *image_len);
+
extern unsigned long initial_images_nrpages(void);
extern void discard_initial_images(void);
@@ -196,7 +199,8 @@ static void __init process_dom0_ioports_disable(void)
int __init construct_dom0(
struct domain *d,
- unsigned long _image_start, unsigned long image_len,
+ unsigned long _image_base,
+ unsigned long _image_start, unsigned long image_len,
unsigned long _initrd_start, unsigned long initrd_len,
char *cmdline)
{
@@ -213,9 +217,11 @@ int __init construct_dom0(
struct vcpu *v = d->vcpu[0];
unsigned long long value;
#if defined(__i386__)
+ char *image_base = (char *)_image_base; /* use lowmem mappings */
char *image_start = (char *)_image_start; /* use lowmem mappings */
char *initrd_start = (char *)_initrd_start; /* use lowmem mappings */
#elif defined(__x86_64__)
+ char *image_base = __va(_image_base);
char *image_start = __va(_image_start);
char *initrd_start = __va(_initrd_start);
#endif
@@ -262,6 +268,9 @@ int __init construct_dom0(
nr_pages = compute_dom0_nr_pages();
+ if ( (rc = bzimage_parse(image_base, &image_start, &image_len)) != 0 )
+ return rc;
+
if ( (rc = elf_init(&elf, image_start, image_len)) != 0 )
return rc;
#ifdef VERBOSE