Date: Thu, 24 Aug 2006 23:36:17 GMT From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 105001 for review Message-ID: <200608242336.k7ONaHkQ056198@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=105001 Change 105001 by marcel@marcel_nfs on 2006/08/24 23:35:25 Resolve merge conflict. Affected files ... .. //depot/projects/gdb/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c#3 edit Differences ... ==== //depot/projects/gdb/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c#3 (text+ko) ==== @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2006 Peter Grehan +/*- + * Copyright (c) 2006 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -12,10 +12,10 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); +__FBSDID("$FreeBSD: src/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c,v 1.1 2006/08/24 21:53:49 marcel Exp $"); #include <sys/types.h> #include <machine/pcb.h> @@ -40,7 +40,7 @@ #include <inferior.h> #include <regcache.h> #include <frame-unwind.h> -#include <i386-tdep.h> +#include <ppc-tdep.h> #include "kgdb.h" @@ -84,43 +84,21 @@ } struct kgdb_frame_cache { - int intrframe; CORE_ADDR pc; CORE_ADDR sp; }; -static int kgdb_trgt_frame_offset[15] = { - offsetof(struct trapframe, tf_eax), - offsetof(struct trapframe, tf_ecx), - offsetof(struct trapframe, tf_edx), - offsetof(struct trapframe, tf_ebx), - offsetof(struct trapframe, tf_esp), - offsetof(struct trapframe, tf_ebp), - offsetof(struct trapframe, tf_esi), - offsetof(struct trapframe, tf_edi), - offsetof(struct trapframe, tf_eip), - offsetof(struct trapframe, tf_eflags), - offsetof(struct trapframe, tf_cs), - offsetof(struct trapframe, tf_ss), - offsetof(struct trapframe, tf_ds), - offsetof(struct trapframe, tf_es), - offsetof(struct trapframe, tf_fs) -}; - static struct kgdb_frame_cache * kgdb_trgt_frame_cache(struct frame_info *next_frame, void **this_cache) { char buf[MAX_REGISTER_SIZE]; struct kgdb_frame_cache *cache; - char *pname; cache = *this_cache; if (cache == NULL) { cache = FRAME_OBSTACK_ZALLOC(struct kgdb_frame_cache); *this_cache = cache; cache->pc = frame_func_unwind(next_frame); - find_pc_partial_function(cache->pc, &pname, NULL, NULL); - cache->intrframe = (pname[0] == 'X') ? 1 : 0; frame_unwind_register(next_frame, SP_REGNUM, buf); cache->sp = extract_unsigned_integer(buf, register_size(current_gdbarch, SP_REGNUM)); @@ -144,9 +122,11 @@ CORE_ADDR *addrp, int *realnump, void *valuep) { char dummy_valuep[MAX_REGISTER_SIZE]; + struct gdbarch_tdep *tdep; struct kgdb_frame_cache *cache; int ofs, regsz; + tdep = gdbarch_tdep(current_gdbarch); regsz = register_size(current_gdbarch, regnum); if (valuep == NULL) @@ -157,13 +137,25 @@ *lvalp = not_lval; *realnump = -1; - ofs = (regnum >= I386_EAX_REGNUM && regnum <= I386_FS_REGNUM) - ? kgdb_trgt_frame_offset[regnum] : -1; - if (ofs == -1) + if (regnum >= tdep->ppc_gp0_regnum && + regnum <= tdep->ppc_gplast_regnum) + ofs = offsetof(struct trapframe, + fixreg[regnum - tdep->ppc_gp0_regnum]); + else if (regnum == tdep->ppc_lr_regnum) + ofs = offsetof(struct trapframe, lr); + else if (regnum == tdep->ppc_cr_regnum) + ofs = offsetof(struct trapframe, cr); + else if (regnum == tdep->ppc_xer_regnum) + ofs = offsetof(struct trapframe, xer); + else if (regnum == tdep->ppc_ctr_regnum) + ofs = offsetof(struct trapframe, ctr); + else if (regnum == PC_REGNUM) + ofs = offsetof(struct trapframe, srr0); + else return; cache = kgdb_trgt_frame_cache(next_frame, this_cache); - *addrp = cache->sp + ofs + (cache->intrframe ? 4 : 0); + *addrp = cache->sp + 8 + ofs; *lvalp = lval_memory; target_read_memory(*addrp, valuep, regsz); } @@ -185,8 +177,8 @@ find_pc_partial_function(pc, &pname, NULL, NULL); if (pname == NULL) return (NULL); - if (strcmp(pname, "calltrap") == 0 || - (pname[0] == 'X' && pname[1] != '_')) + if (strcmp(pname, "asttrapexit") == 0 || + strcmp(pname, "trapexit") == 0) return (&kgdb_trgt_trapframe_unwind); /* printf("%s: %llx =%s\n", __func__, pc, pname); */ return (NULL);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608242336.k7ONaHkQ056198>