mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
a585912dcc
commit
66edeb2e39
1 file changed
+44
-19
+44
-19
@@ -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;
|
||||||
|
|||||||