arm: copy DTB appended to zImage

When copying a zImage from flash, also copy any appended device tree
blob.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
David Vrabel committed 2012-02-09 15:32:50 +00:00
1 parent a585912dcc
commit 66edeb2e39
1 file changed
+44 -19
+44 -19
View File
@@ -10,6 +10,7 @@
#include <xen/mm.h> #include <xen/mm.h>
#include <xen/domain_page.h> #include <xen/domain_page.h>
#include <xen/sched.h> #include <xen/sched.h>
#include <asm/byteorder.h>
#include "kernel.h" #include "kernel.h"
@@ -23,6 +24,40 @@
#define ZIMAGE_MAGIC 0x016f2818 #define ZIMAGE_MAGIC 0x016f2818
struct minimal_dtb_header {
uint32_t magic;
uint32_t total_size;
/* There are other fields but we don't use them yet. */
};
#define DTB_MAGIC 0xd00dfeed
static void copy_from_flash(void *dst, paddr_t flash, unsigned long len)
{
void *src = (void *)FIXMAP_ADDR(FIXMAP_MISC);
printk("Copying %#lx bytes from flash %"PRIpaddr" to %p",
len, flash, dst);
while (len) {
paddr_t p;
unsigned long l, s;
p = flash >> PAGE_SHIFT;
s = flash & (PAGE_SIZE-1);
l = min(PAGE_SIZE - s, len);
set_fixmap(FIXMAP_MISC, p, DEV_SHARED);
memcpy(dst, src + s, l);
flash += l;
dst += l;
len -= l;
}
clear_fixmap(FIXMAP_MISC);
}
static void kernel_zimage_load(struct kernel_info *info) static void kernel_zimage_load(struct kernel_info *info)
{ {
paddr_t load_addr = info->zimage.load_addr; paddr_t load_addr = info->zimage.load_addr;
@@ -58,6 +93,7 @@ static int kernel_try_zimage_prepare(struct kernel_info *info)
{ {
uint32_t *zimage = (void *)FIXMAP_ADDR(FIXMAP_MISC); uint32_t *zimage = (void *)FIXMAP_ADDR(FIXMAP_MISC);
uint32_t start, end; 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, KERNEL_FLASH_ADDRESS >> PAGE_SHIFT, DEV_SHARED);
@@ -69,6 +105,14 @@ static int kernel_try_zimage_prepare(struct kernel_info *info)
clear_fixmap(FIXMAP_MISC); clear_fixmap(FIXMAP_MISC);
/*
* Check for an appended DTB.
*/
copy_from_flash(&dtb_hdr, KERNEL_FLASH_ADDRESS + end - start, sizeof(dtb_hdr));
if (be32_to_cpu(dtb_hdr.magic) == DTB_MAGIC) {
end += be32_to_cpu(dtb_hdr.total_size);
}
/* FIXME: get RAM location from appended DTB (if there is one)? */ /* FIXME: get RAM location from appended DTB (if there is one)? */
/* /*
@@ -97,25 +141,6 @@ static void kernel_elf_load(struct kernel_info *info)
free_xenheap_pages(info->kernel_img, info->kernel_order); free_xenheap_pages(info->kernel_img, info->kernel_order);
} }
static void copy_from_flash(void *dst, paddr_t flash, unsigned long len)
{
void *src = (void *)FIXMAP_ADDR(FIXMAP_MISC);
unsigned long offs;
printk("Copying %#lx bytes from flash %"PRIpaddr" to %p-%p: [",
len, flash, dst, dst+(1<<23));
for ( offs = 0; offs < len ; offs += PAGE_SIZE )
{
if ( ( offs % (1<<20) ) == 0 )
printk(".");
set_fixmap(FIXMAP_MISC, (flash+offs) >> PAGE_SHIFT, DEV_SHARED);
memcpy(dst+offs, src, PAGE_SIZE);
}
printk("]\n");
clear_fixmap(FIXMAP_MISC);
}
static int kernel_try_elf_prepare(struct kernel_info *info) static int kernel_try_elf_prepare(struct kernel_info *info)
{ {
int rc; int rc;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.