|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] libelf: improve PVH elfnote parsing
On Fri, May 21, 2021 at 07:26:21AM +0200, Juergen Gross wrote:
> On 20.05.21 11:28, Jan Beulich wrote:
> > On 20.05.2021 11:27, Roger Pau Monné wrote:
> > > On Wed, May 19, 2021 at 12:34:19PM +0200, Jan Beulich wrote:
> > > > On 18.05.2021 16:47, Roger Pau Monne wrote:
> > > > > @@ -425,8 +425,11 @@ static elf_errorstatus
> > > > > elf_xen_addr_calc_check(struct elf_binary *elf,
> > > > > return -1;
> > > > > }
> > > > > - /* Initial guess for virt_base is 0 if it is not explicitly
> > > > > defined. */
> > > > > - if ( parms->virt_base == UNSET_ADDR )
> > > > > + /*
> > > > > + * Initial guess for virt_base is 0 if it is not explicitly
> > > > > defined in the
> > > > > + * PV case. For PVH virt_base is forced to 0 because paging is
> > > > > disabled.
> > > > > + */
> > > > > + if ( parms->virt_base == UNSET_ADDR || hvm )
> > > > > {
> > > > > parms->virt_base = 0;
> > > > > elf_msg(elf, "ELF: VIRT_BASE unset, using %#" PRIx64 "\n",
> > > >
> > > > This message is wrong now if hvm is true but parms->virt_base !=
> > > > UNSET_ADDR.
> > > > Best perhaps is to avoid emitting the message altogether when hvm is
> > > > true.
> > > > (Since you'll be touching it anyway, perhaps a good opportunity
> > > > to do
> away
> > > > with passing parms->virt_base to elf_msg(), and instead simply use a
> > > > literal
> > > > zero.)
> > > >
> > > > > @@ -441,8 +444,10 @@ static elf_errorstatus
> > > > > elf_xen_addr_calc_check(struct elf_binary *elf,
> > > > > *
> > > > > * If we are using the modern ELF notes interface then the
> > > > > default
> > > > > * is 0.
> > > > > + *
> > > > > + * For PVH this is forced to 0, as it's already a
> > > > > legacy option
> for PV.
> > > > > */
> > > > > - if ( parms->elf_paddr_offset == UNSET_ADDR )
> > > > > + if ( parms->elf_paddr_offset == UNSET_ADDR || hvm )
> > > > > {
> > > > > if ( parms->elf_note_start )
> > > >
> > > > Don't you want "|| hvm" here as well, or alternatively suppress the
> > > > fallback to the __xen_guest section in the PVH case (near the end of
> > > > elf_xen_parse())?
> > >
> > > The legacy __xen_guest section doesn't support PHYS32_ENTRY, so yes,
> > > that part could be completely skipped when called from an HVM
> > > container.
> > >
> > > I think I will fix that in another patch though if you are OK, as
> > > it's not strictly related to the calculation fixes done here.
> >
> > That's fine; it wants to be a prereq to the one here then, though,
> > I think.
>
> Would it be possible to add some comment to xen/include/public/elfnote.h
> Indicating which elfnotes are evaluated for which guest types,
For PVH after this patch the only mandatory note should be
PHYS32_ENTRY. BSD_SYMTAB is also parsed if found on that case.
> including
> a hint which elfnotes _have_ been evaluated before this series?
Before this patch mostly all PV notes are parsed, and you have to
manage to get suitable values set so that:
if ( (parms->virt_kstart > parms->virt_kend) ||
(parms->virt_entry < parms->virt_kstart) ||
(parms->virt_entry > parms->virt_kend) ||
(parms->virt_base > parms->virt_kstart) )
{
elf_err(elf, "ERROR: ELF start or entries are out of bounds\n");
return -1;
}
Doesn't trigger. That can be done by setting virt_entry or the native
elf entry point to a value that satisfies the condition. Or by setting
a suitable offset in VIRT_BASE to a value that matches the offset
added to the native entry point in the ELF header.
I can try to write this up, albeit I think it can get messy. Not sure
what's the best approach here regarding recommended settings to
satisfy old Xen versions.
Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |