[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 09/24] xsplice: Implement payload loading
> > +int arch_xsplice_perform_rela(struct xsplice_elf *elf, > > + const struct xsplice_elf_sec *base, > > + const struct xsplice_elf_sec *rela) > > +{ > > + const Elf_RelA *r; > > + unsigned int symndx, i; > > + uint64_t val; > > + uint8_t *dest; > > + > > + if ( !rela->sec->sh_entsize || !rela->sec->sh_size || > > + rela->sec->sh_entsize != sizeof(Elf_RelA) ) > > + { > > + dprintk(XENLOG_DEBUG, XSPLICE "%s: Section relative header is > > corrupted!\n", > > + elf->name); > > XENLOG_ERR surely? (and the other examples). Yes! I modified all of those that return an error. One of them I made an printk (the one about more than 64 sections). > > > +/* > > + * Once the resolving symbols, performing relocations, etc is complete > > + * we secure the memory by putting in the proper page table attributes > > + * for the desired type. > > + */ > > +int arch_xsplice_secure(void *va, unsigned int pages, enum va_type type, > > + const mfn_t *mfn) > > +{ > > + unsigned long cur; > > + unsigned long start = (unsigned long)va; > > + int flag; > > + > > + ASSERT(va); > > + ASSERT(pages); > > + > > + if ( type == XSPLICE_VA_RX ) > > + flag = PAGE_HYPERVISOR_RX; > > + else if ( type == XSPLICE_VA_RW ) > > + flag = PAGE_HYPERVISOR_RW; > > + else > > + flag = PAGE_HYPERVISOR_RO; > > + > > + /* > > + * We could walk the pagetable and do the pagetable manipulations > > + * (strip the _PAGE_RW), which would mean also not needing the mfn > > + * array, but there are no generic code for this yet (TODO). > > + * > > + * For right now tear down the pagetables and recreate them. > > + */ > > + destroy_xen_mappings(start, start + pages * PAGE_SIZE); > > + > > + for ( cur = start; pages--; ++mfn, cur += PAGE_SIZE ) > > + { > > + if ( map_pages_to_xen(cur, mfn_x(*mfn), 1, flag) ) > > + { > > + if ( cur != start ) > > + destroy_xen_mappings(start, cur); > > + return -EINVAL; > > + } > > + } > > :) Much nicer than before. > > > + > > + return 0; > > +} > > + > > +void arch_xsplice_free_payload(void *va) > > +{ > > + vfree_type(va, VMAP_XEN); > > +} > > + > > +void arch_xsplice_init(void) > > +{ > > + void *start, *end; > > + > > + start = (void *)xen_virt_end; > > + end = (void *)(XEN_VIRT_END - NR_CPUS * PAGE_SIZE); > > Another TODO for the future. Make a constant to cover the VA space > occupied by the per-cpu stubs. Wrote it down in my TODO. Thanks. > > > @@ -276,6 +374,26 @@ static int xsplice_header_check(const struct > > xsplice_elf *elf) > > return -EOPNOTSUPP; > > } > > > > + if ( !IS_ELF(*hdr) ) > > + { > > + printk(XENLOG_ERR XSPLICE "%s: Not an ELF payload!\n", elf->name); > > + return -EINVAL; > > + } > > + > > + if ( hdr->e_ident[EI_CLASS] != ELFCLASS64 || > > + hdr->e_ident[EI_DATA] != ELFDATA2LSB || > > + hdr->e_ident[EI_OSABI] != ELFOSABI_SYSV || > > + hdr->e_type != ET_REL || > > + hdr->e_phnum != 0 ) > > + { > > + printk(XENLOG_ERR XSPLICE "%s: Invalid ELF payload!\n", elf->name); > > + return -EOPNOTSUPP; > > + } > > This hunk up to this point is a rebasing error over the previous patch. > These two checks are currently duplicated. (Clearly making doubly sure > it is a valid ELF payload ;p). Eww. Thanks for noticing! > > With these minor bits fixed, Reviewed-by: Andrew Cooper > <andrew.cooper3@xxxxxxxxxx> _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |