Oleksandr Dmytryshyn
2013-Nov-27 16:55 UTC
[PATCH v3 0/2] xen: arm: introduce a function and flush dcache while preparing the device tree for Dom0
Difference between the previous patchset: raw_copy_to_guest_helper() function now is static. Currently we use OMAP5 ES2.0 Panda5 board to work with the hypervisor. Without flushing dcache the hypervisor couldn''t copy the device tree correctly when booting the kernel dom0 Image (memory with device tree is corrupted). As the result - when we try to load the kernel dom0 Image - dom0 hungs frequently. This issue is not reproduced with the kernel dom0 zImage because the zImage decompressor code flushes all dcache before starting the decompressed kernel Image. When the hypervisor loads the kernel image or initrd, this memory region isn''t corrupted because the hypervisor code flushes the dcache. Oleksandr Dmytryshyn (2): xen: arm: introduce raw_copy_to_guest_flush_dcache() function xen: arm: flush dcache while preparing the device tree for Dom0 xen/arch/arm/domain_build.c | 3 ++- xen/arch/arm/guestcopy.c | 16 +++++++++++++++- xen/include/asm-arm/guest_access.h | 2 ++ 3 files changed, 19 insertions(+), 2 deletions(-) -- 1.8.2.rc2
Oleksandr Dmytryshyn
2013-Nov-27 16:55 UTC
[PATCH v3 1/2] xen: arm: introduce raw_copy_to_guest_flush_dcache() function
This function flushes the dcache while copying the data. Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@globallogic.com> --- xen/arch/arm/guestcopy.c | 16 +++++++++++++++- xen/include/asm-arm/guest_access.h | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c index d146cd6..4d4af09 100644 --- a/xen/arch/arm/guestcopy.c +++ b/xen/arch/arm/guestcopy.c @@ -5,7 +5,8 @@ #include <asm/mm.h> #include <asm/guest_access.h> -unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) +static unsigned long raw_copy_to_guest_helper(void *to, const void *from, + unsigned len, unsigned flush_dcache) { /* XXX needs to handle faults */ unsigned offset = (vaddr_t)to & ~PAGE_MASK; @@ -24,6 +25,8 @@ unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) p = map_domain_page(g>>PAGE_SHIFT); p += offset; memcpy(p, from, size); + if (flush_dcache) + flush_xen_dcache_va_range(p, size); unmap_domain_page(p - offset); len -= size; @@ -35,6 +38,17 @@ unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) return 0; } +unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) +{ + return raw_copy_to_guest_helper(to, from, len, 0); +} + +unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, + unsigned len) +{ + return raw_copy_to_guest_helper(to, from, len, 1); +} + unsigned long raw_clear_guest(void *to, unsigned len) { /* XXX needs to handle faults */ diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h index 8ff088f..5876988 100644 --- a/xen/include/asm-arm/guest_access.h +++ b/xen/include/asm-arm/guest_access.h @@ -11,6 +11,8 @@ (likely(count < (~0UL/size)) && access_ok(addr,count*size)) unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len); +unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, + unsigned len); unsigned long raw_copy_from_guest(void *to, const void *from, unsigned len); unsigned long raw_clear_guest(void *to, unsigned len); -- 1.8.2.rc2
Oleksandr Dmytryshyn
2013-Nov-27 16:55 UTC
[PATCH v3 2/2] xen: arm: flush dcache while preparing the device tree for Dom0
Without flushing dcache the hypervisor couldn''t copy the device tree correctly when booting the kernel dom0 Image (memory with device tree is corrupted). As the result - when we try to load the kernel dom0 Image - dom0 hungs frequently. This issue is not reproduced with the kernel dom0 zImage because the zImage decompressor code flushes all dcache before starting the decompressed kernel Image. When the hypervisor loads the kernel image or initrd, this memory region isn''t corrupted because the hypervisor code flushes the dcache. Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@globallogic.com> --- xen/arch/arm/domain_build.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index e9bb01f..99e785a 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -906,7 +906,8 @@ static void dtb_load(struct kernel_info *kinfo) printk("Loading dom0 DTB to 0x%"PRIpaddr"-0x%"PRIpaddr"\n", kinfo->dtb_paddr, kinfo->dtb_paddr + fdt_totalsize(kinfo->fdt)); - rc = raw_copy_to_guest(dtb_virt, kinfo->fdt, fdt_totalsize(kinfo->fdt)); + rc = raw_copy_to_guest_flush_dcache(dtb_virt, kinfo->fdt, + fdt_totalsize(kinfo->fdt)); if ( rc != 0 ) panic("Unable to copy the DTB to dom0 memory (rc = %lu)\n", rc); xfree(kinfo->fdt); -- 1.8.2.rc2
Andrew Cooper
2013-Nov-27 16:59 UTC
Re: [PATCH v3 1/2] xen: arm: introduce raw_copy_to_guest_flush_dcache() function
On 27/11/13 16:55, Oleksandr Dmytryshyn wrote:> This function flushes the dcache while copying the data. > > Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@globallogic.com> > --- > xen/arch/arm/guestcopy.c | 16 +++++++++++++++- > xen/include/asm-arm/guest_access.h | 2 ++ > 2 files changed, 17 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c > index d146cd6..4d4af09 100644 > --- a/xen/arch/arm/guestcopy.c > +++ b/xen/arch/arm/guestcopy.c > @@ -5,7 +5,8 @@ > #include <asm/mm.h> > #include <asm/guest_access.h> > > -unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) > +static unsigned long raw_copy_to_guest_helper(void *to, const void *from, > + unsigned len, unsigned flush_dcache) > { > /* XXX needs to handle faults */ > unsigned offset = (vaddr_t)to & ~PAGE_MASK; > @@ -24,6 +25,8 @@ unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) > p = map_domain_page(g>>PAGE_SHIFT); > p += offset; > memcpy(p, from, size); > + if (flush_dcache)I know this is nitpicking, but Xens coding style requires spaces inside the brackets for the if. So "if ( flush_dcache )" ~Andrew> + flush_xen_dcache_va_range(p, size); > > unmap_domain_page(p - offset); > len -= size; > @@ -35,6 +38,17 @@ unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) > return 0; > } > > +unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) > +{ > + return raw_copy_to_guest_helper(to, from, len, 0); > +} > + > +unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, > + unsigned len) > +{ > + return raw_copy_to_guest_helper(to, from, len, 1); > +} > + > unsigned long raw_clear_guest(void *to, unsigned len) > { > /* XXX needs to handle faults */ > diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h > index 8ff088f..5876988 100644 > --- a/xen/include/asm-arm/guest_access.h > +++ b/xen/include/asm-arm/guest_access.h > @@ -11,6 +11,8 @@ > (likely(count < (~0UL/size)) && access_ok(addr,count*size)) > > unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len); > +unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, > + unsigned len); > unsigned long raw_copy_from_guest(void *to, const void *from, unsigned len); > unsigned long raw_clear_guest(void *to, unsigned len); >
Oleksandr Dmytryshyn
2013-Nov-27 17:05 UTC
Re: [PATCH v3 1/2] xen: arm: introduce raw_copy_to_guest_flush_dcache() function
Hi, Andrew. I''ll fix this in the next patch-set. Oleksandr Dmytryshyn | Product Engineering and Development GlobalLogic P x3657 M +38.067.382.2525 www.globallogic.com http://www.globallogic.com/email_disclaimer.txt On Wed, Nov 27, 2013 at 6:59 PM, Andrew Cooper <andrew.cooper3@citrix.com> wrote:> On 27/11/13 16:55, Oleksandr Dmytryshyn wrote: >> This function flushes the dcache while copying the data. >> >> Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@globallogic.com> >> --- >> xen/arch/arm/guestcopy.c | 16 +++++++++++++++- >> xen/include/asm-arm/guest_access.h | 2 ++ >> 2 files changed, 17 insertions(+), 1 deletion(-) >> >> diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c >> index d146cd6..4d4af09 100644 >> --- a/xen/arch/arm/guestcopy.c >> +++ b/xen/arch/arm/guestcopy.c >> @@ -5,7 +5,8 @@ >> #include <asm/mm.h> >> #include <asm/guest_access.h> >> >> -unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) >> +static unsigned long raw_copy_to_guest_helper(void *to, const void *from, >> + unsigned len, unsigned flush_dcache) >> { >> /* XXX needs to handle faults */ >> unsigned offset = (vaddr_t)to & ~PAGE_MASK; >> @@ -24,6 +25,8 @@ unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) >> p = map_domain_page(g>>PAGE_SHIFT); >> p += offset; >> memcpy(p, from, size); >> + if (flush_dcache) > > I know this is nitpicking, but Xens coding style requires spaces inside > the brackets for the if. > > So "if ( flush_dcache )" > > ~Andrew > >> + flush_xen_dcache_va_range(p, size); >> >> unmap_domain_page(p - offset); >> len -= size; >> @@ -35,6 +38,17 @@ unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) >> return 0; >> } >> >> +unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len) >> +{ >> + return raw_copy_to_guest_helper(to, from, len, 0); >> +} >> + >> +unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, >> + unsigned len) >> +{ >> + return raw_copy_to_guest_helper(to, from, len, 1); >> +} >> + >> unsigned long raw_clear_guest(void *to, unsigned len) >> { >> /* XXX needs to handle faults */ >> diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h >> index 8ff088f..5876988 100644 >> --- a/xen/include/asm-arm/guest_access.h >> +++ b/xen/include/asm-arm/guest_access.h >> @@ -11,6 +11,8 @@ >> (likely(count < (~0UL/size)) && access_ok(addr,count*size)) >> >> unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len); >> +unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, >> + unsigned len); >> unsigned long raw_copy_from_guest(void *to, const void *from, unsigned len); >> unsigned long raw_clear_guest(void *to, unsigned len); >> >