From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753385AbcADVHd (ORCPT ); Mon, 4 Jan 2016 16:07:33 -0500 Received: from mout.gmx.net ([212.227.17.21]:63144 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752531AbcADVHX (ORCPT ); Mon, 4 Jan 2016 16:07:23 -0500 Subject: Re: [PATCH 1/6] extable: add support for relative extables to search and sort routines To: Ard Biesheuvel , linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-ia64@vger.kernel.org, linux-s390@vger.kernel.org, x86@kernel.org, hpa@zytor.com, mingo@redhat.com, heiko.carstens@de.ibm.com, schwidefsky@de.ibm.com, mattst88@gmail.com, ink@jurassic.park.msu.ru, rth@twiddle.net, tony.luck@intel.com, fenghua.yu@intel.com, catalin.marinas@arm.com, will.deacon@arm.com, arnd@arndb.de, akpm@linux-foundation.org References: <1451837157-447-1-git-send-email-ard.biesheuvel@linaro.org> <1451837157-447-2-git-send-email-ard.biesheuvel@linaro.org> Cc: mark.rutland@arm.com, marc.zyngier@arm.com From: Helge Deller Message-ID: <568ADE83.3090502@gmx.de> Date: Mon, 4 Jan 2016 22:05:07 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <1451837157-447-2-git-send-email-ard.biesheuvel@linaro.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:K1YOE47BV56SudbKeu1HzvfySsZb6Nnpr79dk1HM5D/lLZ6WVAQ 8J9TjawpWpaqlon17zbM22CP6uFuyOxqDXpnmy5pnz6eBxdSbe7GESYB793xqKxkZz3NMxW mHD79RJIOQdciPpO/6X6xoH52JSNmrntpkccUQfoUkifh1CjRMM+8A7WTRfnZq6n96ghbRe LuYebcqnEcK/WDUxQP7Og== X-UI-Out-Filterresults: notjunk:1;V01:K0:3B99kiMVnMk=:Cs0mcfHBqTL7KZnAfeWEO0 LqrMWFoeCM2HzvS/tkQG73Cz2WV7RAS3iHUAz1tUxPHJpq27j6Us6MtNwhDcvE9lLn8Lf8+BQ 3Tz7HHYC7+dj58mTS3CWG2+8tNd9ALomqza19MJff9BFY6h99N1uihYRiuJNjdo3siwcK17Ae d7IOI69qfMeLJ0VPXAGhaKQS5UD4RUCuT6bqV4z55VWFIivYYUiQYKUN1lsyJcaOZmQYCaf88 LpQ1Fyr6gskbOTlcyP0AeicKv5L0YpXmReJCs205nQONKlTZBAX56nWqjQxFjzKgFP/dLdisG 2L4qMx4xzKl5F95Bp2MVI5Jq0r7kMlHM85bPiNwVKYSTlXn3all9pW5zoBkruSBTL7c/gubnr woDjfXn3DvOdl008jD3L5zBXucmERKJZCZ33Mle/CXcnYwWH86Xk+YPK2mIn6XnZHoPH0HTk0 ZlltLQck4UYoW4KrhNiO1rIsuqvvlvC0F2Q8D7BcVch2hoyCXr1qCGY2ydAJfQgpl2V7O0sSp O9lMYw8YSEs7GfG+g82m3oXrhwQ3nfZUUsIRc0l7Na8m6x/Hi/SlBPUFYdDvsI1DcahlhhfCx bTSesiRoFKwSyv5Hn3QqhGQ2Nxs2TpjWOTOEAt6BGJd1MpN7YPFyON+vT4p5SsO8vjiMjPnrx A34qTnn6DO3xh0+Bqb+eGg5S/O9bJlzBSOEO3Iox5GNxxuHjvGhOuoK+XzRtljNHiDEDJzgah ykxuV8GoXjOAgEEjvKhlNorto1PlX+KbNQ0pfKShH2qux5i4iS2j2nVe9SzPFL36dohT5yT16 GH5loTo Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 03.01.2016 17:05, Ard Biesheuvel wrote: > This adds support to the generic search_extable() and sort_extable() > implementations for dealing with exception table entries whose fields > contain relative offsets rather than absolute addresses. > > Signed-off-by: Ard Biesheuvel I tested the generic parts with an upcoming patch which handles relative exception tables on the parisc platform. Everything worked as expected. So for the non arch-relevant changes: Acked-by: Helge Deller Helge > --- > lib/extable.c | 50 ++++++++++++++++---- > 1 file changed, 41 insertions(+), 9 deletions(-) > > diff --git a/lib/extable.c b/lib/extable.c > index 4cac81ec225e..0be02ad561e9 100644 > --- a/lib/extable.c > +++ b/lib/extable.c > @@ -14,7 +14,37 @@ > #include > #include > > +#ifndef ARCH_HAS_RELATIVE_EXTABLE > +#define ex_to_insn(x) ((x)->insn) > +#else > +static inline unsigned long ex_to_insn(const struct exception_table_entry *x) > +{ > + return (unsigned long)&x->insn + x->insn; > +} > +#endif > + > #ifndef ARCH_HAS_SORT_EXTABLE > +#ifndef ARCH_HAS_RELATIVE_EXTABLE > +#define swap_ex NULL > +#else > +static void swap_ex(void *a, void *b, int size) > +{ > + struct exception_table_entry *x = a, *y = b, tmp; > + int delta = b - a; > + > + tmp = *x; > + x->insn = y->insn + delta; > + y->insn = tmp.insn - delta; > + > +#ifdef swap_ex_entry_fixup > + swap_ex_entry_fixup(x, y, tmp, delta); > +#else > + x->fixup = y->fixup + delta; > + y->fixup = tmp.fixup - delta; > +#endif > +} > +#endif /* ARCH_HAS_RELATIVE_EXTABLE */ > + > /* > * The exception table needs to be sorted so that the binary > * search that we use to find entries in it works properly. > @@ -26,9 +56,9 @@ static int cmp_ex(const void *a, const void *b) > const struct exception_table_entry *x = a, *y = b; > > /* avoid overflow */ > - if (x->insn > y->insn) > + if (ex_to_insn(x) > ex_to_insn(y)) > return 1; > - if (x->insn < y->insn) > + if (ex_to_insn(x) < ex_to_insn(y)) > return -1; > return 0; > } > @@ -37,7 +67,7 @@ void sort_extable(struct exception_table_entry *start, > struct exception_table_entry *finish) > { > sort(start, finish - start, sizeof(struct exception_table_entry), > - cmp_ex, NULL); > + cmp_ex, swap_ex); > } > > #ifdef CONFIG_MODULES > @@ -48,13 +78,15 @@ void sort_extable(struct exception_table_entry *start, > void trim_init_extable(struct module *m) > { > /*trim the beginning*/ > - while (m->num_exentries && within_module_init(m->extable[0].insn, m)) { > + while (m->num_exentries && > + within_module_init(ex_to_insn(&m->extable[0]), m)) { > m->extable++; > m->num_exentries--; > } > /*trim the end*/ > while (m->num_exentries && > - within_module_init(m->extable[m->num_exentries-1].insn, m)) > + within_module_init(ex_to_insn(&m->extable[m->num_exentries - 1]), > + m)) > m->num_exentries--; > } > #endif /* CONFIG_MODULES */ > @@ -81,13 +113,13 @@ search_extable(const struct exception_table_entry *first, > * careful, the distance between value and insn > * can be larger than MAX_LONG: > */ > - if (mid->insn < value) > + if (ex_to_insn(mid) < value) > first = mid + 1; > - else if (mid->insn > value) > + else if (ex_to_insn(mid) > value) > last = mid - 1; > else > return mid; > - } > - return NULL; > + } > + return NULL; > } > #endif >