From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xen.org
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [PATCH 14/16] arm: load dom0 kernel from first boot module
Date: Mon, 3 Sep 2012 13:30:54 +0000 [thread overview]
Message-ID: <1346679056-8108-14-git-send-email-ian.campbell@citrix.com> (raw)
In-Reply-To: <1346678886.32462.9.camel@zakaz.uk.xensource.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
---
xen/arch/arm/kernel.c | 63 +++++++++++++++++++++++++++++++++++++-----------
xen/arch/arm/kernel.h | 10 +++++++
2 files changed, 58 insertions(+), 15 deletions(-)
diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
index 2d56130..d82c3e1 100644
--- a/xen/arch/arm/kernel.c
+++ b/xen/arch/arm/kernel.c
@@ -65,13 +65,13 @@ void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len, int attrindx)
static void kernel_zimage_load(struct kernel_info *info)
{
paddr_t load_addr = info->zimage.load_addr;
+ paddr_t paddr = info->zimage.kernel_addr;
paddr_t len = info->zimage.len;
- paddr_t flash = KERNEL_FLASH_ADDRESS;
void *src = (void *)FIXMAP_ADDR(FIXMAP_MISC);
unsigned long offs;
- printk("Loading %"PRIpaddr" byte zImage from flash %"PRIpaddr" to %"PRIpaddr"-%"PRIpaddr": [",
- len, flash, load_addr, load_addr + len);
+ printk("Loading zImage from %"PRIpaddr" to %"PRIpaddr"-%"PRIpaddr": [",
+ paddr, load_addr, load_addr + len);
for ( offs = 0; offs < len; offs += PAGE_SIZE )
{
paddr_t ma = gvirt_to_maddr(load_addr + offs);
@@ -80,7 +80,7 @@ static void kernel_zimage_load(struct kernel_info *info)
if ( ( offs % (1<<20) ) == 0 )
printk(".");
- set_fixmap(FIXMAP_MISC, (flash+offs) >> PAGE_SHIFT, DEV_SHARED);
+ set_fixmap(FIXMAP_MISC, (paddr+offs) >> PAGE_SHIFT, DEV_SHARED);
memcpy(dst, src, PAGE_SIZE);
clear_fixmap(FIXMAP_MISC);
@@ -92,13 +92,16 @@ static void kernel_zimage_load(struct kernel_info *info)
/**
* Check the image is a zImage and return the load address and length
*/
-static int kernel_try_zimage_prepare(struct kernel_info *info)
+static int kernel_try_zimage_prepare(struct kernel_info *info,
+ paddr_t addr, paddr_t size)
{
uint32_t *zimage = (void *)FIXMAP_ADDR(FIXMAP_MISC);
uint32_t start, end;
struct minimal_dtb_header dtb_hdr;
- set_fixmap(FIXMAP_MISC, KERNEL_FLASH_ADDRESS >> PAGE_SHIFT, DEV_SHARED);
+ set_fixmap(FIXMAP_MISC, addr >> PAGE_SHIFT, DEV_SHARED);
+
+ zimage += addr & ~PAGE_MASK;
if (zimage[ZIMAGE_MAGIC_OFFSET/4] != ZIMAGE_MAGIC)
return -EINVAL;
@@ -106,16 +109,24 @@ static int kernel_try_zimage_prepare(struct kernel_info *info)
start = zimage[ZIMAGE_START_OFFSET/4];
end = zimage[ZIMAGE_END_OFFSET/4];
+ if ( end > addr + size )
+ return -EINVAL;
+
clear_fixmap(FIXMAP_MISC);
/*
* Check for an appended DTB.
*/
- copy_from_paddr(&dtb_hdr, KERNEL_FLASH_ADDRESS + end - start, sizeof(dtb_hdr), DEV_SHARED);
+ copy_from_paddr(&dtb_hdr, addr + end - start, sizeof(dtb_hdr), DEV_SHARED);
if (be32_to_cpu(dtb_hdr.magic) == DTB_MAGIC) {
end += be32_to_cpu(dtb_hdr.total_size);
+
+ if ( end > addr + size )
+ return -EINVAL;
}
+ info->zimage.kernel_addr = addr;
+
/*
* If start is zero, the zImage is position independent -- load it
* at 32k from start of RAM.
@@ -142,25 +153,26 @@ static void kernel_elf_load(struct kernel_info *info)
free_xenheap_pages(info->kernel_img, info->kernel_order);
}
-static int kernel_try_elf_prepare(struct kernel_info *info)
+static int kernel_try_elf_prepare(struct kernel_info *info,
+ paddr_t addr, paddr_t size)
{
int rc;
- info->kernel_order = get_order_from_bytes(KERNEL_FLASH_SIZE);
+ info->kernel_order = get_order_from_bytes(size);
info->kernel_img = alloc_xenheap_pages(info->kernel_order, 0);
if ( info->kernel_img == NULL )
panic("Cannot allocate temporary buffer for kernel.\n");
- copy_from_paddr(info->kernel_img, KERNEL_FLASH_ADDRESS, KERNEL_FLASH_SIZE, DEV_SHARED);
+ copy_from_paddr(info->kernel_img, addr, size, DEV_SHARED);
- if ( (rc = elf_init(&info->elf.elf, info->kernel_img, KERNEL_FLASH_SIZE )) != 0 )
- return rc;
+ if ( (rc = elf_init(&info->elf.elf, info->kernel_img, size )) != 0 )
+ goto err;
#ifdef VERBOSE
elf_set_verbose(&info->elf.elf);
#endif
elf_parse_binary(&info->elf.elf);
if ( (rc = elf_xen_parse(&info->elf.elf, &info->elf.parms)) != 0 )
- return rc;
+ goto err;
/*
* TODO: can the ELF header be used to find the physical address
@@ -170,15 +182,36 @@ static int kernel_try_elf_prepare(struct kernel_info *info)
info->load = kernel_elf_load;
return 0;
+err:
+ free_xenheap_pages(info->kernel_img, info->kernel_order);
+ return rc;
}
int kernel_prepare(struct kernel_info *info)
{
int rc;
- rc = kernel_try_zimage_prepare(info);
+ paddr_t start, size;
+
+ if ( early_info.modules.nr_mods > 1 )
+ panic("Cannot handle dom0 initrd yet\n");
+
+ if ( early_info.modules.nr_mods < 1 )
+ {
+ printk("No boot modules found, trying flash\n");
+ start = KERNEL_FLASH_ADDRESS;
+ size = KERNEL_FLASH_SIZE;
+ }
+ else
+ {
+ printk("Loading kernel from boot module 1\n");
+ start = early_info.modules.module[0].start;
+ size = early_info.modules.module[0].size;
+ }
+
+ rc = kernel_try_zimage_prepare(info, start, size);
if (rc < 0)
- rc = kernel_try_elf_prepare(info);
+ rc = kernel_try_elf_prepare(info, start, size);
return rc;
}
diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h
index 4533568..2353e13 100644
--- a/xen/arch/arm/kernel.h
+++ b/xen/arch/arm/kernel.h
@@ -22,6 +22,7 @@ struct kernel_info {
union {
struct {
+ paddr_t kernel_addr;
paddr_t load_addr;
paddr_t len;
} zimage;
@@ -39,3 +40,12 @@ int kernel_prepare(struct kernel_info *info);
void kernel_load(struct kernel_info *info);
#endif /* #ifdef __ARCH_ARM_KERNEL_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
--
1.7.9.1
next prev parent reply other threads:[~2012-09-03 13:30 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-03 13:28 [PATCH 0/16] arm: support for initial modules (e.g. dom0) and DTB supplied in RAM Ian Campbell
2012-09-03 13:30 ` [PATCH 01/16] arm: Zero the BSS at start of day Ian Campbell
2012-09-06 9:56 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 02/16] Create a raw binary target Ian Campbell
2012-09-06 10:01 ` Tim Deegan
2012-09-06 10:29 ` Ian Campbell
2012-09-03 13:30 ` [PATCH 03/16] arm: make virtual address defines unsigned Ian Campbell
2012-09-06 10:02 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 04/16] arm: handle xenheap which isn't at the start of RAM Ian Campbell
2012-09-06 11:36 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 05/16] arm: move get_paddr_function to arch setup.c from device_tree.c Ian Campbell
2012-09-06 11:40 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 06/16] arm: parse modules from DT during early boot Ian Campbell
2012-09-06 11:47 ` Tim Deegan
2012-09-06 11:53 ` Ian Campbell
2012-11-30 14:58 ` Stefano Stabellini
2012-09-03 13:30 ` [PATCH 07/16] arm: avoid placing Xen over any modules Ian Campbell
2012-09-06 12:01 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 08/16] arm: really allocate boot frametable pages with 32M alignment Ian Campbell
2012-09-06 12:04 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 09/16] arm: avoid allocating the heaps over modules or xen itself Ian Campbell
2012-09-06 12:08 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 10/16] arm: print a message if multiple banks of memory are present Ian Campbell
2012-09-06 12:31 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 11/16] arm: mark heap and frametable limits as read mostly Ian Campbell
2012-09-06 13:29 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 12/16] arm: const-correctness in virt_to_maddr Ian Campbell
2012-09-06 13:33 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 13/16] device-tree: get_val cannot cope with cells > 2, add a BUG Ian Campbell
2012-09-06 13:35 ` Tim Deegan
2012-09-03 13:30 ` Ian Campbell [this message]
2012-09-06 13:44 ` [PATCH 14/16] arm: load dom0 kernel from first boot module Tim Deegan
2012-09-03 13:30 ` [PATCH 15/16] arm: discard boot modules after building domain 0 Ian Campbell
2012-09-06 13:53 ` Tim Deegan
2012-09-06 13:57 ` Ian Campbell
2012-09-06 14:03 ` Tim Deegan
2012-09-03 13:30 ` [PATCH 16/16] arm: use /chosen/module1-args for domain 0 command line Ian Campbell
2012-09-06 13:50 ` Tim Deegan
2012-09-06 13:55 ` Ian Campbell
2012-09-06 13:58 ` Tim Deegan
2012-09-06 13:59 ` Ian Campbell
2012-09-06 14:19 ` David Vrabel
2012-09-06 14:28 ` Ian Campbell
2012-09-06 14:46 ` [PATCH 0/16] arm: support for initial modules (e.g. dom0) and DTB supplied in RAM David Vrabel
2012-09-10 16:12 ` Ian Campbell
2012-09-17 11:39 ` Stefano Stabellini
2012-10-11 14:57 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1346679056-8108-14-git-send-email-ian.campbell@citrix.com \
--to=ian.campbell@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).