Date: Sat, 8 May 2004 20:25:04 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 52521 for review Message-ID: <200405090325.i493P46i085223@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=52521 Change 52521 by marcel@marcel_nfs on 2004/05/08 20:24:54 IFC @52520 Affected files ... .. //depot/projects/gdb/sbin/ipfw/ipfw2.c#5 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src.diff#1 branch .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx.h#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_context.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_env.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_env.h#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_scoreboard.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_self-new.c#1 branch .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_self.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_self.h#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_self_context.s#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_step.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_step.h#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_str.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_ttrace.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_ttrace.h#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_uinfo.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_utable.c#2 integrate .. //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_utable.h#2 integrate .. //depot/projects/gdb/sys/sparc64/sparc64/pmap.c#5 integrate .. //depot/projects/gdb/sys/vm/vm_page.c#7 integrate .. //depot/projects/gdb/usr.sbin/pkg_install/add/main.c#3 integrate Differences ... ==== //depot/projects/gdb/sbin/ipfw/ipfw2.c#5 (text+ko) ==== @@ -17,7 +17,7 @@ * * NEW command line interface for IP firewall facility * - * $FreeBSD: src/sbin/ipfw/ipfw2.c,v 1.47 2004/04/23 14:28:38 andre Exp $ + * $FreeBSD: src/sbin/ipfw/ipfw2.c,v 1.48 2004/05/09 01:53:31 csjp Exp $ */ #include <sys/param.h> @@ -3388,8 +3388,6 @@ break; case TOK_MAC: - if (ac < 2) - errx(EX_USAGE, "MAC dst-mac src-mac"); if (add_mac(cmd, ac, av)) { ac -= 2; av += 2; } ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx.h#2 (text+ko) ==== @@ -22,6 +22,9 @@ OTHER DEALINGS IN THE SOFTWARE. */ +#ifndef __UWX_INCLUDED +#define __UWX_INCLUDED 1 + #ifndef _KERNEL #include <stdlib.h> #include <inttypes.h> @@ -30,22 +33,30 @@ #include <sys/systm.h> #endif +#if defined(__cplusplus) +#define __EXTERN_C extern "C" +#else +#define __EXTERN_C extern +#endif + +#define UWX_VERSION 1 /* Version id for callback interfaces */ + /* Unwind environment structure (opaque) */ struct uwx_env; /* Allocate and free callbacks */ typedef void *(*alloc_cb)(size_t size); typedef void (*free_cb)(void *ptr); -extern int uwx_register_alloc_cb(alloc_cb alloc, free_cb free); +__EXTERN_C int uwx_register_alloc_cb(alloc_cb alloc, free_cb free); /* Allocate and initialize an unwind environment */ -extern struct uwx_env *uwx_init(void); +__EXTERN_C struct uwx_env *uwx_init(void); /* Free an unwind environment */ -extern int uwx_free(struct uwx_env *env); +__EXTERN_C int uwx_free(struct uwx_env *env); /* Put unwind express into cross-process mode */ -extern int uwx_set_remote(struct uwx_env *env, int is_big_endian_target); +__EXTERN_C int uwx_set_remote(struct uwx_env *env, int is_big_endian_target); /* Copy-in callback */ typedef int (*copyin_cb)( @@ -63,14 +74,14 @@ uint64_t **vecp); /* parameter vector (in/out) */ /* Register copy-in and lookup IP callbacks */ -extern int uwx_register_callbacks( +__EXTERN_C int uwx_register_callbacks( struct uwx_env *env, /* unwind environment */ intptr_t tok, /* callback token */ copyin_cb copyin, /* copy-in callback */ lookupip_cb lookupip); /* lookup IP callback */ /* Initialize a context with the basic info needed to start an unwind */ -extern int uwx_init_context( +__EXTERN_C int uwx_init_context( struct uwx_env *env, /* unwind environment */ uint64_t ip, /* IP (instruction pointer) */ uint64_t sp, /* SP (stack pointer) */ @@ -78,51 +89,51 @@ uint64_t cfm); /* CFM (current frame marker) */ /* Set the value of a specific register in the current context (non fp) */ -extern int uwx_set_reg( +__EXTERN_C int uwx_set_reg( struct uwx_env *env, /* unwind environment */ int regid, /* register id (see below) */ uint64_t val); /* register value */ /* Set the value of a floating-point register in the current context */ -extern int uwx_set_fr( +__EXTERN_C int uwx_set_fr( struct uwx_env *env, /* unwind environment */ int regid, /* register id (see below) */ uint64_t *val); /* register value (ptr to 16 bytes) */ /* (memory spill format) */ /* Initialize the unwind history */ -extern int uwx_init_history(struct uwx_env *env); +__EXTERN_C int uwx_init_history(struct uwx_env *env); /* Step one frame */ -extern int uwx_step(struct uwx_env *env); +__EXTERN_C int uwx_step(struct uwx_env *env); /* Get symbol information, if available, for current frame */ -extern int uwx_get_sym_info( +__EXTERN_C int uwx_get_sym_info( struct uwx_env *env, /* unwind environment */ char **modp, /* load module name (out) */ char **symp, /* function name (out) */ uint64_t *offsetp); /* offset from start of function (out) */ /* Get the value of a register from the current context */ -extern int uwx_get_reg( +__EXTERN_C int uwx_get_reg( struct uwx_env *env, /* unwind environment */ int regid, /* register id (see below) */ uint64_t *valp); /* register value (out) */ /* Get the NaT bit of a GR from the current context */ -extern int uwx_get_nat( +__EXTERN_C int uwx_get_nat( struct uwx_env *env, /* unwind environment */ int regid, /* register id (see below) */ int *natp); /* NaT value (out: 0 or 1) */ /* Get the spill location for a register in the current context */ -extern int uwx_get_spill_loc( +__EXTERN_C int uwx_get_spill_loc( struct uwx_env *env, /* unwind environment */ int regid, /* register id (see below) */ uint64_t *dispp); /* disposition code (see below) (out) */ /* Get the ABI context code (if uwx_step returned UWX_ABI_FRAME) */ -extern int uwx_get_abi_context_code(struct uwx_env *env); +__EXTERN_C int uwx_get_abi_context_code(struct uwx_env *env); /* Return status codes for uwx_ APIs */ #define UWX_OK 0 @@ -165,6 +176,8 @@ #define UWX_LKUP_UTABLE 2 /* Returned ref to unwind table */ #define UWX_LKUP_FDESC 3 /* Returned frame description */ #define UWX_LKUP_SYMINFO 4 /* Returned symbolic information */ +#define UWX_LKUP_REMAP 5 /* Returned remapped IP */ +#define UWX_LKUP_UINFO 6 /* Returned unw info block ptr */ /* The lookup IP callback receives a parameter vector, and returns */ /* one on success. This vector is a series of key/value pairs; each */ @@ -175,26 +188,40 @@ /* Keys passed to lookup IP callback */ #define UWX_KEY_PREDS 1 /* Predicate registers */ +#define UWX_KEY_VERSION 2 /* Version id of unwind engine */ +/* UWX_KEY_FUNCSTART (below) may also be passed with the UWX_LKUP_SYMINFO */ +/* request. */ /* Keys returned with UWX_LKUP_UTABLE */ /* These key/value pairs describe the unwind table corresponding */ /* to the load module in which the current IP resides. */ #define UWX_KEY_TBASE 1 /* Base address of text seg */ -#define UWX_KEY_UFLAGS 2 /* Unwind flags */ +#define UWX_KEY_UFLAGS 2 /* Unwind flags (optional) */ #define UWX_KEY_USTART 3 /* Base of unwind tbl */ #define UWX_KEY_UEND 4 /* End of unwind tbl */ /* Keys returned with UWX_LKUP_FDESC */ /* These key/value pairs describe the state of the frame at the */ /* given IP. They are typically used for dynamically-generated code. */ +/* If UWX_KEY_CONTEXT is returned, it must be the only key returned. */ #define UWX_KEY_FSIZE 1 /* Frame size */ #define UWX_KEY_SPILL(reg_id) (2 | ((reg_id) << 4)) /* Reg spilled */ #define UWX_KEY_CONTEXT 3 /* ABI-dep. context */ -/* Keys returned with UWX_LKUP_FDESC or UWX_LKUP_SYMINFO */ -#define UWX_KEY_MODULE 5 /* Name of load module */ -#define UWX_KEY_FUNC 6 /* Name of function */ -#define UWX_KEY_FUNCSTART 7 /* Address of start of function */ +/* Keys returned with UWX_LKUP_REMAP */ +#define UWX_KEY_NEWIP 5 /* Remapped IP */ + +/* Keys returned with UWX_LKUP_UINFO */ +/* Use UWX_KEY_FUNCSTART for the start address of the function */ +/* Use UWX_KEY_UFLAGS for the unwind flags (optional) */ +#define UWX_KEY_UINFO 6 /* Address of unwind info block */ + +/* Keys returned with UWX_LKUP_SYMINFO */ +/* These keys may be returned with UWX_LKUP_FDESC or UWX_LKUP_UINFO, */ +/* if the information is cheap to obtain. */ +#define UWX_KEY_MODULE 17 /* Name of load module */ +#define UWX_KEY_FUNC 18 /* Name of function */ +#define UWX_KEY_FUNCSTART 19 /* Address of start of function */ /* Register identifiers */ /* For use in UWX_LKUP_FDESC result vectors and context access APIs. */ @@ -255,3 +282,75 @@ #define UWX_GET_DISP_OFFSET(disp) ((disp) & ~(uint64_t)0x07) #define UWX_GET_DISP_ADDR(disp) ((disp) & ~(uint64_t)0x07) #define UWX_GET_DISP_REGID(disp) ((int)(disp) >> 4) + +#undef __EXTERN_C + +#if defined(__cplusplus) + +class UnwindExpress { + +public: + + UnwindExpress() { + env = uwx_init(); + } + + ~UnwindExpress() { + if (env != 0) + uwx_free(env); + env = 0; + } + + int init_context(uint64_t ip, uint64_t sp, uint64_t bsp, uint64_t cfm) { + return uwx_init_context(env, ip, sp, bsp, cfm); + } + + int init_history() { + return uwx_init_history(env); + } + + int set_reg(int regid, uint64_t val) { + return uwx_set_reg(env, regid, val); + } + + int set_fr(int regid, uint64_t *valp) { + return uwx_set_fr(env, regid, valp); + } + + int step() { + return uwx_step(env); + } + + int get_sym_info(char **modp, char **symp, uint64_t *offsetp) { + return uwx_get_sym_info(env, modp, symp, offsetp); + } + + int get_reg(int regid, uint64_t *valp) { + return uwx_get_reg(env, regid, valp); + } + + int get_nat(int regid, int *natp) { + return uwx_get_nat(env, regid, natp); + } + + int get_spill_loc(int regid, uint64_t *dispp) { + return uwx_get_spill_loc(env, regid, dispp); + } + + int get_abi_context_code() { + return uwx_get_abi_context_code(env); + } + + struct uwx_env *get_env() { + return env; + } + +protected: + + struct uwx_env *env; + +}; + +#endif /* __cplusplus */ + +#endif /* __UWX_INCLUDED */ ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_context.c#2 (text+ko) ==== @@ -181,11 +181,7 @@ } bsp = uwx_add_to_bsp(bsp, regid); natcollp = bsp | 0x01f8; - if (natcollp >= bsp) - n = (*env->copyin)(UWX_COPYIN_REG, (char *)&natcoll, - (uint64_t)UWX_REG_AR_RNAT, DWORDSZ, env->cb_token); - else - n = (*env->copyin)(UWX_COPYIN_RSTACK, (char *)&natcoll, + n = (*env->copyin)(UWX_COPYIN_RSTACK, (char *)&natcoll, bsp, DWORDSZ, env->cb_token); if (n != DWORDSZ) return UWX_ERR_COPYIN_RSTK; @@ -319,28 +315,86 @@ * bsp * <------- adjusted (nslots + bias) -------> - * When subtracting from bsp, we bias the bsp in the opposite - * direction so that it is at the next NaT collection. + * When subtracting from bsp, we avoid depending on the sign of + * the quotient by adding 63*8 before division and subtracting 8 + * after division. (Assumes that we will never be called upon + * to subtract more than 504 slots from bsp.) * * 0 1f8 3f8 * +---------------------------------------------------------------+ * | X X| * +---------------------------------------------------------------+ - * <------- bias -------> - * <--- nslots ---> - * ^ - * | - * bsp - * <------ adjusted (nslots + bias) ------> + * <-- bias --> + * <--- |nslots| ---> + * ^ + * | + * bsp + * <-----------------> + * adjusted |nslots + bias| */ - if (nslots > 0) { - bias = ((unsigned int)bsp & 0x1f8) / DWORDSZ; - nslots += (nslots + bias) / 63; + bias = ((unsigned int)bsp & 0x1f8) / DWORDSZ; + nslots += (nslots + bias + 63*8) / 63 - 8; + return bsp + nslots * DWORDSZ; +} + +#if 0 +int uwx_selftest_bsp_arithmetic() +{ + int i; + int j; + int r; + uint64_t bstore[161]; + uint64_t *bsp; + uint64_t *p; + int failed = 0; + + printf("uwx_selftest_bsp_arithmetic: bsp at %08lx\n", (unsigned int)bstore); + r = 0; + bsp = bstore; + for (i = 0; i < 161; i++) { + if (((unsigned int)bsp & 0x1f8) == 0x1f8) + *bsp++ = 1000 + r; + else + *bsp++ = r++; + } + + printf("uwx_selftest_bsp_arithmetic: plus tests...\n"); + bsp = bstore; + for (i = 0; i < 64; i++) { + r = (int)*bsp; + if (r >= 1000) + r -= 1000; + for (j = 0; j < 96; j++) { + p = (uint64_t *)uwx_add_to_bsp((uint64_t)bsp, j); + if (*p != (r + j)) { + failed++; + printf("%d [%08lx] + %d -> %08lx ", + i, (unsigned int)bsp, j, (unsigned int)p); + printf("(read %d instead of %d)\n", (int)*p, r + j); + } + } + bsp++; } - else if (nslots < 0) { - bias = (0x1f8 - ((unsigned int)bsp & 0x1f8)) / DWORDSZ; - nslots -= (-nslots + bias) / 63; + + printf("uwx_selftest_bsp_arithmetic: minus tests...\n"); + bsp = &bstore[161]; + for (i = 63; i >= 0; i--) { + bsp--; + r = (int)*bsp; + if (r >= 1000) + r -= 1000; + for (j = 0; j < 96; j++) { + p = (uint64_t *)uwx_add_to_bsp((uint64_t)bsp, -j); + if (*p != (r - j)) { + failed++; + printf("%d [%08lx] - %d -> %08lx ", + i, (unsigned int)bsp, j, (unsigned int)p); + printf("(read %d instead of %d)\n", (int)*p, r - j); + } + } } - return bsp + nslots * DWORDSZ; + + return failed; } +#endif ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_env.c#2 (text+ko) ==== @@ -24,9 +24,6 @@ #ifndef _KERNEL #include <stdlib.h> -#else -#define free(p) /* nullified */ -#define malloc(sz) NULL #endif #include "uwx_env.h" @@ -34,6 +31,12 @@ #include "uwx_str.h" #include "uwx_trace.h" +#ifdef _KERNEL +static struct uwx_env uwx_env; +#define free(p) /* nullified */ +#define malloc(sz) ((sz == sizeof(uwx_env)) ? &uwx_env : NULL) +#endif + alloc_cb uwx_allocate_cb = 0; free_cb uwx_free_cb = 0; @@ -88,6 +91,7 @@ env->context.fr[i].part1 = 0; } env->rstate = 0; + env->remapped_ip = 0; env->function_offset = 0; (void)uwx_init_history(env); env->allocate_cb = uwx_allocate_cb; ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_env.h#2 (text+ko) ==== @@ -78,6 +78,7 @@ struct uwx_env { struct uwx_context context; uint64_t *rstate; + uint64_t remapped_ip; int64_t function_offset; struct uwx_history history; alloc_cb allocate_cb; ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_scoreboard.c#2 (text+ko) ==== @@ -24,15 +24,39 @@ #ifndef _KERNEL #include <stdlib.h> -#else -#define free(p) /* nullified */ -#define malloc(sz) NULL #endif #include "uwx_env.h" #include "uwx_scoreboard.h" #include "uwx_trace.h" +#ifdef _KERNEL +static unsigned short uwx_allocated; +static struct uwx_scoreboard uwx_scoreboard[sizeof(uwx_allocated) << 3]; + +static void +free(struct uwx_scoreboard *p) +{ + int idx = p - uwx_scoreboard; + uwx_allocated &= ~(1 << idx); +} + +static struct uwx_scoreboard * +malloc(size_t sz) +{ + int idx; + if (sz != sizeof(struct uwx_scoreboard)) + return (NULL); + for (idx = 0; idx < (sizeof(uwx_allocated) << 3); idx++) { + if ((uwx_allocated & (1 << idx)) == 0) { + uwx_allocated |= 1 << idx; + return (uwx_scoreboard + idx); + } + } + return (NULL); +} +#endif + struct uwx_scoreboard *uwx_alloc_scoreboard(struct uwx_env *env) { ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_self.c#2 (text+ko) ==== @@ -22,12 +22,10 @@ OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef _KERNEL #include <stdlib.h> #include <crt0.h> #include <dlfcn.h> #include <sys/uc_access.h> -#endif #include "uwx_env.h" #include "uwx_context.h" @@ -37,6 +35,7 @@ #define UWX_ABI_HPUX_SIGCONTEXT 0x0101 /* abi = HP-UX, context = 1 */ struct uwx_self_info { + struct uwx_env *env; ucontext_t *ucontext; uint64_t bspstore; uint64_t rvec[10]; @@ -60,6 +59,7 @@ if (info == 0) return 0; + info->env = env; info->ucontext = 0; info->bspstore = 0; info->sendsig_start = __load_info->li_sendsig_txt; @@ -155,72 +155,78 @@ unsigned long *wp; uint64_t *dp; + status = -1; + dp = (uint64_t *) loc; - if (request == UWX_COPYIN_UINFO || - request == UWX_COPYIN_MSTACK) { - if (len == 4) { - wp = (unsigned long *) loc; - *wp = *(unsigned long *)rem; - TRACE_SELF_COPYIN4(rem, len, wp) - } - else if (len == 8) { - *dp = *(uint64_t *)rem; - TRACE_SELF_COPYIN4(rem, len, dp) - } - else - return 0; - } - else if (request == UWX_COPYIN_RSTACK && len == 8) { - if (info->ucontext == 0 || rem < info->bspstore) { - *dp = *(uint64_t *)rem; - TRACE_SELF_COPYIN4(rem, len, dp) - } - else { - status = __uc_get_rsebs(info->ucontext, (uint64_t *)rem, 1, dp); - if (status != 0) - return 0; - } - } - else if (request == UWX_COPYIN_REG && len == 8) { - if (info->ucontext == 0) - return 0; - regid = (int)rem; - if (rem < UWX_REG_GR(0)) { - switch (regid) { - case UWX_REG_PREDS: - status = __uc_get_prs(info->ucontext, dp); - break; - case UWX_REG_AR_PFS: - status = __uc_get_ar(info->ucontext, 64, dp); - break; - case UWX_REG_AR_RNAT: - status = __uc_get_ar(info->ucontext, 19, dp); - break; - case UWX_REG_AR_UNAT: - status = __uc_get_ar(info->ucontext, 36, dp); - break; - case UWX_REG_AR_FPSR: - status = __uc_get_ar(info->ucontext, 40, dp); - break; - case UWX_REG_AR_LC: - status = __uc_get_ar(info->ucontext, 65, dp); - break; - default: - return 0; + switch (request) { + case UWX_COPYIN_UINFO: + case UWX_COPYIN_MSTACK: + if (len == 4) { + wp = (unsigned long *) loc; + *wp = *(unsigned long *)rem; + TRACE_SELF_COPYIN4(rem, len, wp) + status = 0; + } + else if (len == 8) { + *dp = *(uint64_t *)rem; + TRACE_SELF_COPYIN8(rem, len, dp) + status = 0; + } + break; + case UWX_COPYIN_RSTACK: + if (len == 8) { + if (info->ucontext == 0 && rem == (info->bspstore | 0x1f8)) { + *dp = info->env->context.special[UWX_REG_AR_RNAT]; + status = 0; + } + else if (info->ucontext == 0 || rem < info->bspstore) { + *dp = *(uint64_t *)rem; + TRACE_SELF_COPYIN8(rem, len, dp) + status = 0; + } + else { + status = __uc_get_rsebs(info->ucontext, + (uint64_t *)rem, 1, dp); + } + } + break; + case UWX_COPYIN_REG: + regid = (int)rem; + if (info->ucontext != 0) { + if (len == 8) { + if (rem == UWX_REG_PREDS) + status = __uc_get_prs(info->ucontext, dp); + else if (rem == UWX_REG_AR_PFS) + status = __uc_get_ar(info->ucontext, 64, dp); + else if (rem == UWX_REG_AR_RNAT) + status = __uc_get_ar(info->ucontext, 19, dp); + else if (rem == UWX_REG_AR_UNAT) + status = __uc_get_ar(info->ucontext, 36, dp); + else if (rem == UWX_REG_AR_FPSR) + status = __uc_get_ar(info->ucontext, 40, dp); + else if (rem == UWX_REG_AR_LC) + status = __uc_get_ar(info->ucontext, 65, dp); + else if (regid >= UWX_REG_GR(1) && + regid <= UWX_REG_GR(31)) + status = __uc_get_grs(info->ucontext, + regid - UWX_REG_GR(0), 1, dp, &nat); + else if (regid >= UWX_REG_BR(0) && + regid <= UWX_REG_BR(7)) + status = __uc_get_brs(info->ucontext, + regid - UWX_REG_BR(0), 1, dp); + } + else if (len == 16) { + if (regid >= UWX_REG_FR(2) && regid <= UWX_REG_FR(127)) { + status = __uc_get_frs(info->ucontext, + regid - UWX_REG_FR(0), 1, (fp_regval_t *)dp); + } + } } - } - else if (regid >= UWX_REG_GR(1) && regid <= UWX_REG_GR(31)) { - status = __uc_get_grs(info->ucontext, - regid - UWX_REG_GR(0), 1, dp, &nat); - } - else if (regid >= UWX_REG_BR(0) && regid <= UWX_REG_BR(7)) { - status = __uc_get_brs(info->ucontext, - regid - UWX_REG_BR(0), 1, dp); - } - if (status != 0) - return 0; + break; } + if (status != 0) + return 0; return len; } ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_self.h#2 (text+ko) ==== @@ -22,38 +22,91 @@ OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef _KERNEL +#ifndef __UWX_SELF_INCLUDED +#define __UWX_SELF_INCLUDED 1 + #include <signal.h> + +#ifndef __UWX_INCLUDED +#include "uwx.h" +#endif /* __UWX_INCLUDED */ + +#if defined(__cplusplus) +#define __EXTERN_C extern "C" +#else +#define __EXTERN_C extern #endif struct uwx_self_info; -extern struct uwx_self_info *uwx_self_init_info(struct uwx_env *env); +__EXTERN_C struct uwx_self_info *uwx_self_init_info(struct uwx_env *env); -extern int uwx_self_free_info(struct uwx_self_info *info); +__EXTERN_C int uwx_self_free_info(struct uwx_self_info *info); -extern int uwx_self_init_context(struct uwx_env *env); +__EXTERN_C int uwx_self_init_context(struct uwx_env *env); -extern int uwx_self_init_from_sigcontext( +__EXTERN_C int uwx_self_init_from_sigcontext( struct uwx_env *env, struct uwx_self_info *info, ucontext_t *ucontext); -extern int uwx_self_do_context_frame( +__EXTERN_C int uwx_self_do_context_frame( struct uwx_env *env, struct uwx_self_info *info); -extern int uwx_self_copyin( +__EXTERN_C int uwx_self_copyin( int request, char *loc, uint64_t rem, int len, intptr_t tok); -extern int uwx_self_lookupip( +__EXTERN_C int uwx_self_lookupip( int request, uint64_t ip, intptr_t tok, uint64_t **resultp); #define UWX_SELF_ERR_BADABICONTEXT (-101) + +#undef __EXTERN_C + +#if defined(__cplusplus) + +class UnwindExpressSelf : public UnwindExpress { + +public: + + UnwindExpressSelf() { + info = uwx_self_init_info(env); + (void)uwx_register_callbacks(env, (intptr_t)info, + uwx_self_copyin, uwx_self_lookupip); + } + + ~UnwindExpressSelf() { + if (info != 0) + uwx_self_free_info(info); + info = 0; + } + + int init_context() { + return uwx_self_init_context(env); + } + + int init_context(ucontext_t *ucontext) { + return uwx_self_init_from_sigcontext(env, info, ucontext); + } + + int do_context_frame() { + return uwx_self_do_context_frame(env, info); + } + +protected: + + struct uwx_self_info *info; + +}; + +#endif /* __cplusplus */ + +#endif /* __UWX_SELF_INCLUDED */ ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_self_context.s#2 (text+ko) ==== @@ -1,24 +1,24 @@ -/* - * Copyright (c) 2002,2003 Hewlett-Packard Company - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ +// Copyright (c) 2003 Hewlett-Packard Development Company, L.P. +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. #ifdef _LP64 #define SWIZZLE add @@ -48,6 +48,21 @@ rTMP4 = r31 rTMP5 = r8 +VALID_IP = 1 +VALID_SP = 1 << 1 +VALID_BSP = 1 << 2 +VALID_CFM = 1 << 3 +VALID_PREDS = 1 << 7 +VALID_RNAT = 1 << 10 +VALID_UNAT = 1 << 11 +VALID_FPSR = 1 << 12 +VALID_LC = 1 << 13 +VALID_GRS = 0xf << 16 +VALID_BRS = 0x1f << 20 +VALID_BASIC4 = VALID_IP | VALID_SP | VALID_BSP | VALID_CFM +VALID_SPEC = VALID_PREDS | VALID_RNAT | VALID_UNAT | VALID_FPSR | VALID_LC +VALID_BITS = (VALID_BASIC4 | VALID_SPEC | VALID_GRS | VALID_BRS) << 32 + .text .proc uwx_self_init_context .global uwx_self_init_context @@ -63,40 +78,42 @@ mov rRP = b0 ;; mov rRSC = ar.rsc - add rENV1 = 120, rENV0 // rENV1 = &env->context.gr[0] - add rENV2 = 128, rENV0 // rENV2 = &env->context.gr[1] + add rENV1 = 136, rENV0 // rENV1 = &env->context.gr[0] + add rENV2 = 144, rENV0 // rENV2 = &env->context.gr[1] ;; and rRSC0 = -4, rRSC // clear ar.rsc.mode adds rNATP = 0x1f8, r0 mov rTMP1 = b1 ;; - st8.spill [rENV1] = r4, 16 // env+120: r4 - st8.spill [rENV2] = r5, 16 // env+128: r5 + st8.spill [rENV1] = r4, 16 // env+136: r4 + st8.spill [rENV2] = r5, 16 // env+144: r5 mov rTMP2 = b2 ;; - st8.spill [rENV1] = r6, 16 // env+136: r6 - st8.spill [rENV2] = r7, 16 // env+144: r7 + st8.spill [rENV1] = r6, 16 // env+152: r6 + st8.spill [rENV2] = r7, 16 // env+160: r7 mov rTMP3 = b3 ;; - st8 [rENV1] = rTMP1, 16 // env+152: b1 - st8 [rENV2] = rTMP2, 16 // env+160: b2 + st8 [rENV1] = rTMP1, 16 // env+168: b1 + st8 [rENV2] = rTMP2, 16 // env+176: b2 mov rTMP1 = b4 ;; - st8 [rENV1] = rTMP3, 16 // env+168: b3 - st8 [rENV2] = rTMP1, 16 // env+176: b4 + st8 [rENV1] = rTMP3, 16 // env+184: b3 + st8 [rENV2] = rTMP1, 16 // env+192: b4 mov rTMP2 = b5 ;; - st8 [rENV1] = rTMP2 // env+184: b5 + st8 [rENV1] = rTMP2 // env+200: b5 mov ar.rsc = rRSC0 // enforced lazy mode add rENV1 = 8, rENV0 ;; mov rRNAT = ar.rnat // get copy of ar.rnat - movl rTMP1 = 0x7fec8f00000000 // valid_regs: ip, sp, bsp, cfm, - // preds, rnat, unat, lc, grs, brs + movl rTMP1 = VALID_BITS // valid_regs: ip, sp, bsp, cfm, + // preds, rnat, unat, fpsr, + // lc, grs, brs + // = 0x1ff3c8f00000000 ;; mov ar.rsc = rRSC // restore ar.rsc mov rBSP = ar.bsp - add rTMP3 = 120, rENV0 // spill_loc = &env->context.gr[0] + add rTMP3 = 136, rENV0 // spill_loc = &env->context.gr[0] ;; mov rTMP2 = ar.unat nop @@ -143,7 +160,7 @@ add rENV2 = 320, rENV2 // rENV2 = &env->context.rstate ;; st8 [rENV1] = rTMP1 // env+112: lc - STPTR [rENV2] = r0 // env+512: env->rstate = 0 + STPTR [rENV2] = r0 // env+528: env->rstate = 0 nop ;; mov ar.unat = rUNAT ==== //depot/projects/gdb/sys/contrib/ia64/libuwx/src/uwx_step.c#2 (text+ko) ==== @@ -52,6 +52,19 @@ int uwx_restore_nat(struct uwx_env *env, uint64_t rstate, int unat); +/* uwx_lookupip_hook: Hook routine so dynamic instrumentation */ +/* tools can intercept Lookup IP events. When not */ +/* intercepted, it just returns "Not found", so that */ +/* the callback routine is invoked. */ + +/*ARGSUSED*/ +int uwx_lookupip_hook(int request, uint64_t ip, intptr_t tok, uint64_t **vecp, + size_t uvecsize) +{ + return UWX_LKUP_NOTFOUND; +} + + /* uwx_get_frame_info: Gets unwind info for current frame */ static int uwx_get_frame_info(struct uwx_env *env) @@ -59,10 +72,12 @@ int i; int status; int cbstatus; + int cbcalled = 0; + uint64_t ip; uint64_t *uvec; uint64_t *rstate; struct uwx_utable_entry uentry; - uint64_t uvecout[4]; + uint64_t uvecout[UVECSIZE]; if (env->copyin == 0 || env->lookupip == 0) return UWX_ERR_NOCALLBACKS; @@ -76,7 +91,14 @@ /* current IP. If the predicate registers are valid, pass them */ /* in the uvec. */ + /* When self-unwinding, we call a hook routine before the */ + /* callback. If the application is running under control of */ + /* a dynamic instrumentation tool, that tool will have an */ + /* opportunity to intercept lookup IP requests. */ + i = 0; + uvecout[i++] = UWX_KEY_VERSION; + uvecout[i++] = UWX_VERSION; if (env->context.valid_regs & (1 << UWX_REG_PREDS)) { uvecout[i++] = UWX_KEY_PREDS; uvecout[i++] = env->context.special[UWX_REG_PREDS]; @@ -84,8 +106,52 @@ uvecout[i++] = UWX_KEY_END; uvecout[i++] = 0; uvec = uvecout; - cbstatus = (*env->lookupip)(UWX_LKUP_LOOKUP, - env->context.special[UWX_REG_IP], env->cb_token, &uvec); + cbstatus = UWX_LKUP_NOTFOUND; + ip = env->context.special[UWX_REG_IP]; + env->remapped_ip = ip; + + /* Call the hook routine. */ + + if (env->remote == 0) + cbstatus = uwx_lookupip_hook(UWX_LKUP_LOOKUP, ip, env->cb_token, &uvec, + sizeof(uvecout)); + + /* If the hook routine remapped the IP, use the new IP for */ + /* the callback instead of the original IP. */ >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200405090325.i493P46i085223>