Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760179AbbLCMmW (ORCPT ); Thu, 3 Dec 2015 07:42:22 -0500 Received: from us01smtprelay-2.synopsys.com ([198.182.60.111]:47635 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760149AbbLCMmT (ORCPT ); Thu, 3 Dec 2015 07:42:19 -0500 From: Vineet Gupta To: CC: , , , Vineet Gupta Subject: [PATCH 09/17] ARC: dw2 unwind: Use striaght forward code to implement binary lookup Date: Thu, 3 Dec 2015 18:11:07 +0530 Message-ID: <1449146475-15335-10-git-send-email-vgupta@synopsys.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1449146475-15335-1-git-send-email-vgupta@synopsys.com> References: <1449146475-15335-1-git-send-email-vgupta@synopsys.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.12.197.182] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2523 Lines: 82 The {start, pc} entries are already word aligned, no need to use read_pointer() inefficiency ! Signed-off-by: Vineet Gupta --- arch/arc/kernel/unwind.c | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/arch/arc/kernel/unwind.c b/arch/arc/kernel/unwind.c index 9b34038a7582..6a09ffa0b697 100644 --- a/arch/arc/kernel/unwind.c +++ b/arch/arc/kernel/unwind.c @@ -866,7 +866,7 @@ int arc_unwind(struct unwind_frame_info *frame) const u8 *ptr = NULL, *end = NULL; unsigned long pc = UNW_PC(frame); unsigned long startLoc = 0, endLoc = 0, cfa; - unsigned i; + unsigned i, s, e; signed ptrType = -1; uleb128_t retAddrReg = 0; const struct unwind_table *table; @@ -874,7 +874,6 @@ int arc_unwind(struct unwind_frame_info *frame) unsigned long *fptr; unsigned long addr; struct eh_frame_header *hdr; - unsigned long hdrEntrySz; unw_debug("\nUNWIND FRAME: -------------------------------------\n"); unw_debug("PC\t\t: 0x%lx %pS\nr31 [BLINK]\t: 0x%lx %pS\nr28 [SP]\t: 0x%lx\nr27 [FP]\t: 0x%lx\n", @@ -903,28 +902,23 @@ int arc_unwind(struct unwind_frame_info *frame) if (hdr == NULL) return -EINVAL; - hdrEntrySz = sizeof(unsigned long); - BUILD_BUG_ON(hdrEntrySz != sizeof(hdr->table[0].start)); + s = i = 0; + e = hdr->fde_count - 1; - ptr = (const u8*)(hdr->table); - end = (const u8*)(hdr) + table->hdrsz; - i = hdr->fde_count; - - do { - const u8 *cur = ptr + (i / 2) * (2 * hdrEntrySz); - - startLoc = read_pointer(&cur, cur + hdrEntrySz, hdr->table_enc); - if (pc < startLoc) - i /= 2; - else { - ptr = cur - hdrEntrySz; - i = (i + 1) / 2; - } - } while (startLoc && i > 1); - if (i == 1 - && (startLoc = read_pointer(&ptr, ptr + hdrEntrySz, hdr->table_enc)) != 0 - && pc >= startLoc) - fde = (void *)read_pointer(&ptr, ptr + hdrEntrySz, hdr->table_enc); + do { + if (pc < startLoc) + e = i; + else + s = i; + i = s + (e - s) / 2; + startLoc = hdr->table[i].start; + unw_debug("s %d e %d i %d startLoc %lx\n", s, e, i, startLoc) + } while ((e - s) > 1); + + if (pc >= startLoc) + fde = (u32 *)hdr->table[i].fde; + else + return -EINVAL; if (fde != NULL) { cie = cie_for_fde(fde, table); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/