|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v7 4/7] x86/libelf: pass the destination vCPU to libelf for Dom0 build
On Thu, Feb 23, 2017 at 06:47:24AM -0700, Jan Beulich wrote:
> >>> On 22.02.17 at 15:24, <roger.pau@xxxxxxxxxx> wrote:
> > Allow setting the destination vCPU for libelf, so that elf_load_image can
> > take
> > it into account when loading the kernel for Dom0. This is needed for PVHv2
> > Dom0
> > build, so that hvm_copy_to_guest_phys can be called with a Dom0 vCPU
> > instead of
> > current (that contains the idle vCPU at this point).
> >
> > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>
> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
> albeit ...
>
> > --- a/xen/common/libelf/libelf-loader.c
> > +++ b/xen/common/libelf/libelf-loader.c
> > @@ -146,6 +146,25 @@ void elf_set_verbose(struct elf_binary *elf)
> > elf->verbose = 1;
> > }
> >
> > +static elf_errorstatus elf_memcpy(struct vcpu *v, void *dst, void *src,
> > + uint64_t size)
> > +{
> > + int rc = 0;
> > +
> > +#ifdef CONFIG_X86
> > + if ( is_hvm_vcpu(v) )
> > + {
> > + rc = hvm_copy_to_guest_phys((paddr_t)dst, src, size, v);
> > + rc = rc != HVMCOPY_okay ? -1 : 0;
> > + }
> > + else
> > +#endif
> > + rc = src == NULL ? raw_clear_guest(dst, size) :
> > + raw_copy_to_guest(dst, src, size);
> > +
> > + return rc;
> > +}
>
> ... elf_errorstatus is not a correct type for the return values of
> raw_{copy_to,clear}_guest(). Nevertheless that's in line with ...
>
> > static elf_errorstatus elf_load_image(struct elf_binary *elf, elf_ptrval
> > dst, elf_ptrval src, uint64_t filesz, uint64_t memsz)
> > {
> > elf_errorstatus rc;
>
> ... the variable declared here having been used ...
>
> > @@ -153,10 +172,12 @@ static elf_errorstatus elf_load_image(struct
> > elf_binary *elf, elf_ptrval dst, el
> > return -1;
> > /* We trust the dom0 kernel image completely, so we don't care
> > * about overruns etc. here. */
> > - rc = raw_copy_to_guest(ELF_UNSAFE_PTR(dst), ELF_UNSAFE_PTR(src),
> > filesz);
> > + rc = elf_memcpy(elf->vcpu, ELF_UNSAFE_PTR(dst), ELF_UNSAFE_PTR(src),
> > + filesz);
> > if ( rc != 0 )
> > return -1;
> > - rc = raw_clear_guest(ELF_UNSAFE_PTR(dst + filesz), memsz - filesz);
> > + rc = elf_memcpy(elf->vcpu, ELF_UNSAFE_PTR(dst + filesz), NULL,
> > + memsz - filesz);
>
> ... the same (wrong) way, so should be good enough for now.
> Ideally the setting of rc in elf_memcpy() would be corrected, though.
Would you like to squash the following chunk on top of this patch?
---8<---
diff --git a/xen/common/libelf/libelf-loader.c
b/xen/common/libelf/libelf-loader.c
index 371061c..1acecab 100644
--- a/xen/common/libelf/libelf-loader.c
+++ b/xen/common/libelf/libelf-loader.c
@@ -149,20 +149,22 @@ void elf_set_verbose(struct elf_binary *elf)
static elf_errorstatus elf_memcpy(struct vcpu *v, void *dst, void *src,
uint64_t size)
{
- int rc = 0;
+ unsigned int res;
#ifdef CONFIG_X86
if ( is_hvm_vcpu(v) )
{
+ enum hvm_copy_result rc;
+
rc = hvm_copy_to_guest_phys((paddr_t)dst, src, size, v);
- rc = rc != HVMCOPY_okay ? -1 : 0;
+ return rc != HVMCOPY_okay ? -1 : 0;
}
else
#endif
- rc = src == NULL ? raw_clear_guest(dst, size) :
- raw_copy_to_guest(dst, src, size);
+ res = src == NULL ? raw_clear_guest(dst, size) :
+ raw_copy_to_guest(dst, src, size);
- return rc;
+ return res != 0 ? -1 : 0;
}
static elf_errorstatus elf_load_image(struct elf_binary *elf, elf_ptrval dst,
elf_ptrval src, uint64_t filesz, uint64_t memsz)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |