From owner-p4-projects@FreeBSD.ORG Tue Jun 13 16:29:43 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id F35F216A551; Tue, 13 Jun 2006 16:29:42 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C70AB16A54F for ; Tue, 13 Jun 2006 16:29:42 +0000 (UTC) (envelope-from cognet@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7BF6043D45 for ; Tue, 13 Jun 2006 16:29:42 +0000 (GMT) (envelope-from cognet@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5DGRM9J050648 for ; Tue, 13 Jun 2006 16:27:22 GMT (envelope-from cognet@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5DGRMbh050645 for perforce@freebsd.org; Tue, 13 Jun 2006 16:27:22 GMT (envelope-from cognet@freebsd.org) Date: Tue, 13 Jun 2006 16:27:22 GMT Message-Id: <200606131627.k5DGRMbh050645@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to cognet@freebsd.org using -f From: Olivier Houchard To: Perforce Change Reviews Cc: Subject: PERFORCE change 99143 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 13 Jun 2006 16:29:43 -0000 http://perforce.freebsd.org/chv.cgi?CH=99143 Change 99143 by cognet@cognet on 2006/06/13 16:26:29 Dirty hack to handle the special case of trapframe unwinding when the trap was an undefined instruction (has it happens on a breakpoint). Affected files ... .. //depot/projects/arm/gnu-arm.diff#11 edit Differences ... ==== //depot/projects/arm/gnu-arm.diff#11 (text+ko) ==== @@ -1,11 +1,11 @@ Index: gnu/lib/libgcc/Makefile =================================================================== RCS file: /cognet/ncvs/src/gnu/lib/libgcc/Makefile,v -retrieving revision 1.54 -diff -u -p -r1.54 Makefile ---- gnu/lib/libgcc/Makefile 21 Dec 2004 09:33:45 -0000 1.54 -+++ gnu/lib/libgcc/Makefile 29 Aug 2005 12:39:27 -0000 -@@ -97,8 +97,11 @@ LIB2FUNCS_EXTRA = qrnnd.asm +retrieving revision 1.55 +diff -u -p -r1.55 Makefile +--- gnu/lib/libgcc/Makefile 18 Mar 2006 21:37:03 -0000 1.55 ++++ gnu/lib/libgcc/Makefile 19 Mar 2006 21:13:20 -0000 +@@ -98,8 +98,11 @@ LIB2FUNCS_EXTRA = qrnnd.asm # from config/arm/t-strongarm-elf CFLAGS+= -Dinhibit_libc -fno-inline LIB1ASMSRC = lib1funcs.asm @@ -19,7 +19,7 @@ # We want fine grained libraries, so use the new code to build the # floating point emulation libraries. XXX fix this: NEED_FP_EMULATION set to "yes" with different rules per platform -@@ -168,7 +171,7 @@ ASM_S= ${LIB1ASMFUNCS:S/$/.So/} +@@ -169,7 +172,7 @@ ASM_S= ${LIB1ASMFUNCS:S/$/.So/} SYMS= ${LIB2FUNCS} \ ${LIB2_DIVMOD_FUNCS} @@ -96,7 +96,7 @@ RCS file: gnu/usr.bin/binutils/libbfd/Makefile.arm diff -N gnu/usr.bin/binutils/libbfd/Makefile.arm --- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ gnu/usr.bin/binutils/libbfd/Makefile.arm 29 Aug 2005 12:39:27 -0000 ++++ gnu/usr.bin/binutils/libbfd/Makefile.arm 20 May 2006 22:58:30 -0000 @@ -0,0 +1,24 @@ +# $FreeBSD$ + @@ -136,11 +136,11 @@ Index: gnu/usr.bin/cc/cc_tools/Makefile =================================================================== RCS file: /cognet/ncvs/src/gnu/usr.bin/cc/cc_tools/Makefile,v -retrieving revision 1.81 -diff -u -p -r1.81 Makefile ---- gnu/usr.bin/cc/cc_tools/Makefile 3 Jun 2005 04:21:04 -0000 1.81 -+++ gnu/usr.bin/cc/cc_tools/Makefile 29 Aug 2005 12:39:27 -0000 -@@ -214,7 +214,9 @@ CLEANFILES+= fini +retrieving revision 1.82 +diff -u -p -r1.82 Makefile +--- gnu/usr.bin/cc/cc_tools/Makefile 17 Mar 2006 18:54:23 -0000 1.82 ++++ gnu/usr.bin/cc/cc_tools/Makefile 19 Mar 2006 21:13:24 -0000 +@@ -216,7 +216,9 @@ CLEANFILES+= fini .if ${TARGET_ARCH} == "amd64" TARGET_INC= i386/biarch64.h .endif @@ -150,7 +150,7 @@ .if ${TARGET_ARCH} == "i386" || ${TARGET_ARCH} == "amd64" TARGET_INC+= ${GCC_CPU}/unix.h TARGET_INC+= ${GCC_CPU}/att.h -@@ -234,6 +236,11 @@ TARGET_INC+= ${GCC_CPU}/elf.h +@@ -236,6 +238,11 @@ TARGET_INC+= ${GCC_CPU}/elf.h TARGET_INC+= ${GCC_CPU}/sysv4.h .endif .endif @@ -999,8 +999,8 @@ RCS file: gnu/usr.bin/gdb/kgdb/trgt_arm.c diff -N gnu/usr.bin/gdb/kgdb/trgt_arm.c --- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ gnu/usr.bin/gdb/kgdb/trgt_arm.c 4 Oct 2005 23:17:12 -0000 -@@ -0,0 +1,196 @@ ++++ gnu/usr.bin/gdb/kgdb/trgt_arm.c 13 Jun 2006 16:26:07 -0000 +@@ -0,0 +1,224 @@ +/* + * Copyright (c) 2004 Marcel Moolenaar + * All rights reserved. @@ -1033,6 +1033,7 @@ +#include +#include +#include ++#include +#include +#include +#include @@ -1133,6 +1134,8 @@ + return (cache); +} + ++static int is_undef; ++ +static void +kgdb_trgt_trapframe_this_id(struct frame_info *next_frame, void **this_cache, + struct frame_id *this_id) @@ -1151,6 +1154,7 @@ + char dummy_valuep[MAX_REGISTER_SIZE]; + struct kgdb_frame_cache *cache; + int ofs, regsz; ++ int is_undefined = 0; + + regsz = register_size(current_gdbarch, regnum); + @@ -1168,9 +1172,24 @@ + return; + + cache = kgdb_trgt_frame_cache(next_frame, this_cache); ++ ++ if (is_undef && (regnum == ARM_SP_REGNUM || regnum == ARM_PC_REGNUM)) { ++ *addrp = cache->sp + offsetof(struct trapframe, tf_spsr); ++ target_read_memory(*addrp, valuep, regsz); ++ is_undefined = 1; ++ ofs = kgdb_trgt_frame_offset[ARM_SP_REGNUM]; ++ ++ } + *addrp = cache->sp + ofs; + *lvalp = lval_memory; + target_read_memory(*addrp, valuep, regsz); ++ ++ if (is_undefined) { ++ *addrp = *(unsigned int *)valuep + (regnum == ARM_SP_REGNUM ? ++ 0 : 8); ++ target_read_memory(*addrp, valuep, regsz); ++ ++ } +} + +static const struct frame_unwind kgdb_trgt_trapframe_unwind = { @@ -1188,12 +1207,21 @@ + pc = frame_pc_unwind(next_frame); + pname = NULL; + find_pc_partial_function(pc, &pname, NULL, NULL); -+ if (pname == NULL) ++ if (pname == NULL) { ++ is_undef = 0; + return (NULL); ++ } ++ if (!strcmp(pname, "undefinedinstruction")) ++ is_undef = 1; + if (strcmp(pname, "Laddress_exception_entry") == 0 || + strcmp(pname, "undefined_entry") == 0 || + strcmp(pname, "exception_exit") == 0 || ++ strcmp(pname, "Laddress_exception_msg") == 0 || + strcmp(pname, "irq_entry") == 0) + return (&kgdb_trgt_trapframe_unwind); ++ if (!strcmp(pname, "undefinedinstruction")) ++ is_undef = 1; ++ else ++ is_undef = 0; + return (NULL); +}