Messages in this thread | | | Date | Wed, 8 Jun 2011 14:33:35 +0200 | From | Borislav Petkov <> | Subject | Re: [PATCH 2/5] x86-64: Allow alternative patching in the vDSO |
| |
On Tue, Jun 07, 2011 at 03:32:39PM -0400, Andy Lutomirski wrote: > This code is short enough and different enough from the module > loader that it's not worth trying to share anything. > > Signed-off-by: Andy Lutomirski <luto@mit.edu> > --- > arch/x86/vdso/vma.c | 32 ++++++++++++++++++++++++++++++++ > 1 files changed, 32 insertions(+), 0 deletions(-) > > diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c > index 7abd2be..b8b074c1 100644 > --- a/arch/x86/vdso/vma.c > +++ b/arch/x86/vdso/vma.c > @@ -23,11 +23,43 @@ extern unsigned short vdso_sync_cpuid; > static struct page **vdso_pages; > static unsigned vdso_size; > > +static void patch_vdso(void *vdso, size_t len) > +{ > + Elf64_Ehdr *hdr = vdso; > + Elf64_Shdr *sechdrs, *alt_sec = 0; > + char *secstrings; > + void *alt_data; > + int i; > + > + BUG_ON(len < sizeof(Elf64_Ehdr)); > + BUG_ON(memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0); > + > + sechdrs = (void *)hdr + hdr->e_shoff; > + secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; > + > + for (i = 1; i < hdr->e_shnum; i++) { > + Elf64_Shdr *shdr = &sechdrs[i]; > + if (!strcmp(secstrings + shdr->sh_name, ".altinstructions")) { > + alt_sec = shdr; > + break; > + } > + } > + > + if (!alt_sec) > + return; /* nothing to patch */
Just a minor nitpick:
Maybe do
for (.. ) {
if (!strcmp(...)) { alt_sec = shdr; goto apply; } } return;
apply:
to save yourself the if (!alt_sec) test and the alt_sec = 0 aka NULL assignment above.
> + > + alt_data = (void *)hdr + alt_sec->sh_offset; > + > + apply_alternatives(alt_data, alt_data + alt_sec->sh_size); > +} > + > static int __init init_vdso_vars(void) > { > int npages = (vdso_end - vdso_start + PAGE_SIZE - 1) / PAGE_SIZE; > int i; > > + patch_vdso(vdso_start, vdso_end - vdso_start); > + > vdso_size = npages << PAGE_SHIFT; > vdso_pages = kmalloc(sizeof(struct page *) * npages, GFP_KERNEL); > if (!vdso_pages) > -- > 1.7.5.2
Thanks.
-- Regards/Gruss, Boris.
Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach General Managers: Alberto Bozzo, Andrew Bowd Registration: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632
| |