PERFORCE change 101055 for review
John Baldwin
jhb at FreeBSD.org
Sat Jul 8 20:38:29 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=101055
Change 101055 by jhb at jhb_mutex on 2006/07/08 20:38:19
IFC @101054 - loopback.
Affected files ...
.. //depot/projects/smpng/sys/compat/linux/linux_ipc.c#27 integrate
.. //depot/projects/smpng/sys/compat/linux/linux_socket.c#32 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_ipc.c#19 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src.diff#2 delete
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/Makefile#4 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx.h#5 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_bstream.c#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_bstream.h#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_context.c#5 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_context.h#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_env.c#4 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_env.h#5 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_scoreboard.c#5 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_scoreboard.h#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_self-new.c#2 delete
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_self.c#5 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_self.h#4 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_self_context.s#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_self_info.h#1 branch
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_step.c#5 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_step.h#4 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_str.c#4 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_str.h#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_swap.c#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_swap.h#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_symbols.c#1 branch
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_symbols.h#1 branch
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_trace.c#5 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_trace.h#5 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_ttrace.c#5 delete
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_ttrace.h#4 delete
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_uinfo.c#6 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_uinfo.h#3 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_utable.c#4 integrate
.. //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_utable.h#4 integrate
.. //depot/projects/smpng/sys/contrib/pf/net/if_pfsync.c#21 integrate
.. //depot/projects/smpng/sys/doc/Doxyfile#2 delete
.. //depot/projects/smpng/sys/doc/Makefile#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Dependencies#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-cam#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-crypto#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-dev_pci#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-dev_sound#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-dev_usb#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-geom#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-i4b#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-kern#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-libkern#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-linux#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-net80211#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-netgraph#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-netinet#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-netinet6#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-netipsec#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-opencrypto#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Doxyfile-vm#2 delete
.. //depot/projects/smpng/sys/doc/subsys/Makefile#2 delete
.. //depot/projects/smpng/sys/doc/subsys/README#2 delete
.. //depot/projects/smpng/sys/doc/subsys/common-Doxyfile#2 delete
.. //depot/projects/smpng/sys/doc/subsys/notreviewed.dox#2 delete
.. //depot/projects/smpng/sys/fs/portalfs/portal_vnops.c#25 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#13 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.h#5 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_other.c#10 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_xenix.c#17 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_xenix.h#10 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_xenix_syscall.h#9 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_xenix_sysent.c#10 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/syscalls.xenix#8 integrate
.. //depot/projects/smpng/sys/isa/isahint.c#6 integrate
.. //depot/projects/smpng/sys/kern/bus_if.m#12 integrate
.. //depot/projects/smpng/sys/kern/kern_descrip.c#94 integrate
.. //depot/projects/smpng/sys/kern/subr_bus.c#61 integrate
.. //depot/projects/smpng/sys/kern/sys_generic.c#45 integrate
.. //depot/projects/smpng/sys/kern/sysv_sem.c#41 integrate
.. //depot/projects/smpng/sys/netinet/ip_carp.c#18 integrate
.. //depot/projects/smpng/sys/nfsclient/nfs_socket.c#44 integrate
.. //depot/projects/smpng/sys/nfsclient/nfs_vnops.c#60 integrate
.. //depot/projects/smpng/sys/sys/bus.h#27 integrate
.. //depot/projects/smpng/sys/sys/syscallsubr.h#46 integrate
Differences ...
==== //depot/projects/smpng/sys/compat/linux/linux_ipc.c#27 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ipc.c,v 1.47 2006/06/27 18:28:49 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ipc.c,v 1.48 2006/07/08 19:51:37 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
==== //depot/projects/smpng/sys/compat/linux/linux_socket.c#32 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.68 2006/05/10 20:38:16 netchild Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.69 2006/07/08 20:03:38 jhb Exp $");
/* XXX we use functions that might not exist. */
#include "opt_compat.h"
==== //depot/projects/smpng/sys/compat/svr4/svr4_ipc.c#19 (text+ko) ====
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_ipc.c,v 1.22 2006/07/06 21:38:24 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_ipc.c,v 1.23 2006/07/08 19:51:37 jhb Exp $");
#include "opt_sysvipc.h"
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/Makefile#4 (text+ko) ====
@@ -15,11 +15,12 @@
CFLAGS = -O $(OTHERCFLAGS)
OBJS = uwx_bstream.o uwx_context.o uwx_env.o uwx_scoreboard.o \
- uwx_step.o uwx_str.o uwx_swap.o uwx_trace.o uwx_uinfo.o \
- uwx_utable.o
+ uwx_step.o uwx_str.o uwx_swap.o uwx_symbols.o \
+ uwx_trace.o uwx_uinfo.o uwx_utable.o
# SELFOBJS = # For cross-unwind library
-SELFOBJS = uwx_self.o uwx_self_context.o uwx_ttrace.o
+# SELFOBJS = uwx_self.o uwx_self_context.o uwx_ttrace.o
+SELFOBJS = uwx_self.o uwx_self_context.o
# SELFLIBS = # For cross-unwind library
SELFLIBS = -luca
@@ -34,6 +35,9 @@
libuwx.sl: $(OBJS) $(SELFOBJS)
ld -b -o libuwx.sl $(OBJS) $(SELFOBJS) $(SELFLIBS)
+clean:
+ rm -f $(OBJS) $(SELFOBJS) libuwx.a libuwx.so libuwx.sl
+
uwx_bstream.o: uwx.h uwx_env.h uwx_bstream.h
uwx_context.o: uwx.h uwx_env.h uwx_scoreboard.h uwx_step.h uwx_trace.h
@@ -49,6 +53,8 @@
uwx_swap.o: uwx.h uwx_env.h uwx_swap.h
+uwx_symbols.o: uwx.h uwx_env.h uwx_symbols.h
+
uwx_trace.o: uwx.h uwx_env.h uwx_uinfo.h uwx_scoreboard.h uwx_trace.h
uwx_uinfo.o: uwx.h uwx_env.h uwx_uinfo.h uwx_utable.h \
@@ -56,7 +62,8 @@
uwx_utable.o: uwx.h uwx_env.h uwx_utable.h uwx_swap.h uwx_trace.h
-uwx_self.o: uwx.h uwx_env.h uwx_context.h uwx_trace.h uwx_self.h
+uwx_self.o: uwx.h uwx_env.h uwx_context.h uwx_trace.h uwx_self.h \
+ uwx_symbols.h
uwx_self_context.o: uwx_self_context.s
$(CC) -c $(CFLAGS) -o uwx_self_context.o uwx_self_context.s
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx.h#5 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
@@ -39,11 +39,14 @@
#define __EXTERN_C extern
#endif
-#define UWX_VERSION 1 /* Version id for callback interfaces */
+#define UWX_VERSION 3 /* Version id for callback interfaces */
/* Unwind environment structure (opaque) */
struct uwx_env;
+/* Symbol Cache for uwx_find_symbol (opaque) */
+struct uwx_symbol_cache;
+
/* Allocate and free callbacks */
typedef void *(*alloc_cb)(size_t size);
typedef void (*free_cb)(void *ptr);
@@ -58,6 +61,9 @@
/* Put unwind express into cross-process mode */
__EXTERN_C int uwx_set_remote(struct uwx_env *env, int is_big_endian_target);
+/* Put unwind express into reduced-context mode (no floating-point regs) */
+__EXTERN_C int uwx_set_nofr(struct uwx_env *env);
+
/* Copy-in callback */
typedef int (*copyin_cb)(
int request, /* request code (see below) */
@@ -107,6 +113,17 @@
/* Step one frame */
__EXTERN_C int uwx_step(struct uwx_env *env);
+/* Get module name and text base, if available, for current frame */
+__EXTERN_C int uwx_get_module_info(
+ struct uwx_env *env, /* unwind environment */
+ char **modp, /* load module name (out) */
+ uint64_t *text_base); /* base address of text segment (out) */
+
+/* Get function start address for current frame */
+__EXTERN_C int uwx_get_funcstart(
+ struct uwx_env *env, /* unwind environment */
+ uint64_t *funcstart); /* function start address (out) */
+
/* Get symbol information, if available, for current frame */
__EXTERN_C int uwx_get_sym_info(
struct uwx_env *env, /* unwind environment */
@@ -114,6 +131,22 @@
char **symp, /* function name (out) */
uint64_t *offsetp); /* offset from start of function (out) */
+/* Get symbol information, given module name and IP */
+__EXTERN_C int uwx_find_symbol(
+ struct uwx_env *env, /* unwind environment */
+ struct uwx_symbol_cache **cachep,
+ /* ptr to symbol cache ptr (in/out) */
+ char *mod, /* load module name */
+ uint64_t relip, /* IP, relative to text segment */
+ char **symp, /* function name (out) */
+ uint64_t *offsetp); /* offset from start of function (out) */
+
+/* Release memory used by symbol cache */
+__EXTERN_C void uwx_release_symbol_cache(
+ struct uwx_env *env, /* unwind environment */
+ struct uwx_symbol_cache *symbol_cache);
+ /* symbol cache ptr */
+
/* Get the value of a register from the current context */
__EXTERN_C int uwx_get_reg(
struct uwx_env *env, /* unwind environment */
@@ -135,6 +168,10 @@
/* Get the ABI context code (if uwx_step returned UWX_ABI_FRAME) */
__EXTERN_C int uwx_get_abi_context_code(struct uwx_env *env);
+/* Increment/Decrement the bsp by a number of slots */
+/* (accounts for NaT collections) */
+__EXTERN_C uint64_t uwx_add_to_bsp(uint64_t bsp, int nslots);
+
/* Return status codes for uwx_ APIs */
#define UWX_OK 0
#define UWX_BOTTOM 1 /* Hit bottom of stack */
@@ -158,6 +195,8 @@
#define UWX_ERR_CANTUNWIND (-17) /* Can't unwind */
#define UWX_ERR_NOCALLBACKS (-18) /* No callbacks registered */
#define UWX_ERR_NOCONTEXT (-19) /* Context not initialized */
+#define UWX_ERR_UCACCESS (-20) /* Failure in libuca */
+#define UWX_ERR_NOSYM (-21) /* Symbol not found */
/* Request codes for copyin callback */
#define UWX_COPYIN_UINFO 1 /* Reading unwind info */
@@ -169,6 +208,7 @@
#define UWX_LKUP_LOOKUP 1 /* Lookup IP */
#define UWX_LKUP_FREE 2 /* Free result vector */
#define UWX_LKUP_SYMBOLS 3 /* Lookup symbolic information */
+#define UWX_LKUP_MODULE 4 /* Get module name */
/* Return status codes for lookup IP callback */
#define UWX_LKUP_NOTFOUND 0 /* IP not found */
@@ -199,11 +239,13 @@
#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 */
+#define UWX_KEY_GP 7 /* GP value for module */
/* 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. */
+/* Use UWX_KEY_GP for the module's gp value. */
#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 */
@@ -212,6 +254,7 @@
#define UWX_KEY_NEWIP 5 /* Remapped IP */
/* Keys returned with UWX_LKUP_UINFO */
+/* Use UWX_KEY_GP for the module's gp value. */
/* 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 */
@@ -219,6 +262,7 @@
/* 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. */
+/* Use UWX_KEY_TBASE for the base of the text segment */
#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 */
@@ -246,6 +290,7 @@
#define UWX_REG_AR_FPSR 12 /* ar.fpsr */
#define UWX_REG_AR_LC 13 /* ar.lc */
#define UWX_REG_AR_PFS 14 /* ar.pfs */
+#define UWX_REG_GP 15 /* gp (pseudo-register) */
#define UWX_REG_GR(gr) (0x100 | (gr))
#define UWX_REG_FR(fr) (0x200 | (fr))
#define UWX_REG_BR(br) (0x300 | (br))
@@ -321,10 +366,27 @@
return uwx_step(env);
}
+ int get_module_info(char **modp, uint64_t *text_base_p) {
+ return uwx_get_module_info(env, modp, text_base_p);
+ }
+
+ int get_funcstart(uint64_t *funcstart) {
+ return uwx_get_funcstart(env, funcstart);
+ }
+
int get_sym_info(char **modp, char **symp, uint64_t *offsetp) {
return uwx_get_sym_info(env, modp, symp, offsetp);
}
+ int find_symbol(struct uwx_symbol_cache **cachep,
+ char *mod, uint64_t relip, char **symp, uint64_t *offsetp) {
+ return uwx_find_symbol(env, cachep, mod, relip, symp, offsetp);
+ }
+
+ void release_symbol_cache(struct uwx_symbol_cache *symbol_cache) {
+ uwx_release_symbol_cache(env, symbol_cache);
+ }
+
int get_reg(int regid, uint64_t *valp) {
return uwx_get_reg(env, regid, valp);
}
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_bstream.c#3 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
@@ -46,7 +46,7 @@
}
else {
bstream->source = 0;
- bstream->bufp = (unsigned char *) source;
+ bstream->bufp = (unsigned char *) (intptr_t) source;
bstream->nbuf = len;
bstream->copyin = 0;
bstream->cb_token = 0;
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_bstream.h#3 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_context.c#5 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
@@ -23,7 +23,6 @@
*/
#include "uwx_env.h"
-#include "uwx_context.h"
#include "uwx_scoreboard.h"
#include "uwx_step.h"
#include "uwx_trace.h"
@@ -182,7 +181,7 @@
bsp = uwx_add_to_bsp(bsp, regid);
natcollp = bsp | 0x01f8;
n = (*env->copyin)(UWX_COPYIN_RSTACK, (char *)&natcoll,
- bsp, DWORDSZ, env->cb_token);
+ natcollp, DWORDSZ, env->cb_token);
if (n != DWORDSZ)
return UWX_ERR_COPYIN_RSTK;
*natp = (int)(natcoll >> (((int)bsp >> 3) & 0x3f)) & 0x01;
@@ -208,8 +207,17 @@
if (regid == UWX_REG_GR(12))
regid = UWX_REG_SP;
- if (regid < NSPECIALREG)
+ if (regid < NSPECIALREG) {
+ if (regid == UWX_REG_PSP || regid == UWX_REG_RP ||
+ regid == UWX_REG_PFS) {
+ if (!(env->context.valid_regs & (1 << regid))) {
+ status = uwx_restore_markers(env);
+ if (status != UWX_OK)
+ return status;
+ }
+ }
*dispp = env->history.special[regid];
+ }
else if (regid >= UWX_REG_GR(4) && regid <= UWX_REG_GR(7))
*dispp = env->history.gr[regid - UWX_REG_GR(4)];
else if (regid >= UWX_REG_GR(32) && regid <= UWX_REG_GR(127)) {
@@ -313,7 +321,7 @@
* ^
* |
* bsp
- * <------- adjusted (nslots + bias) ------->
+ * <------------ nslots + bias ----------->
* When subtracting from bsp, we avoid depending on the sign of
* the quotient by adding 63*8 before division and subtracting 8
@@ -325,12 +333,12 @@
* | X X|
* +---------------------------------------------------------------+
* <-- bias -->
- * <--- |nslots| --->
+ * <--- (-nslots) --->
* ^
* |
* bsp
* <----------------->
- * adjusted |nslots + bias|
+ * -(nslots + bias)
*/
bias = ((unsigned int)bsp & 0x1f8) / DWORDSZ;
@@ -366,7 +374,7 @@
if (r >= 1000)
r -= 1000;
for (j = 0; j < 96; j++) {
- p = (uint64_t *)uwx_add_to_bsp((uint64_t)bsp, j);
+ p = (uint64_t *)(intptr_t)uwx_add_to_bsp((uint64_t)bsp, j);
if (*p != (r + j)) {
failed++;
printf("%d [%08lx] + %d -> %08lx ",
@@ -385,7 +393,7 @@
if (r >= 1000)
r -= 1000;
for (j = 0; j < 96; j++) {
- p = (uint64_t *)uwx_add_to_bsp((uint64_t)bsp, -j);
+ p = (uint64_t *)(intptr_t)uwx_add_to_bsp((uint64_t)bsp, -j);
if (*p != (r - j)) {
failed++;
printf("%d [%08lx] - %d -> %08lx ",
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_context.h#3 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_env.c#4 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
@@ -68,52 +68,97 @@
return UWX_OK;
}
+int uwx_init_env(struct uwx_env *env, size_t total_size)
+{
+ int i;
+ struct uwx_str_pool *str_pool;
+ struct uwx_scoreboard *scoreboards;
+
+ str_pool = (struct uwx_str_pool *)(env + 1);
+ scoreboards = (struct uwx_scoreboard *)(str_pool + 1);
+
+ if (sizeof(struct uwx_env) + sizeof(struct uwx_str_pool) > total_size)
+ return UWX_ERR_NOMEM;
+ total_size -= sizeof(struct uwx_env) + sizeof(struct uwx_str_pool);
+
+ env->context.valid_regs = 0;
+ env->context.valid_frs = 0;
+ for (i = 0; i < NSPECIALREG; i++)
+ env->context.special[i] = 0;
+ for (i = 0; i < NPRESERVEDGR; i++)
+ env->context.gr[i] = 0;
+ for (i = 0; i < NPRESERVEDBR; i++)
+ env->context.br[i] = 0;
+ for (i = 0; i < NPRESERVEDFR; i++) {
+ env->context.fr[i].part0 = 0;
+ env->context.fr[i].part1 = 0;
+ }
+ env->rstate = 0;
+ env->remapped_ip = 0;
+ env->function_offset = 0;
+ env->ptr_size = DWORDSZ;
+ env->uinfo_hdr = 0;
+ env->uinfo_end = 0;
+ env->code_start = 0;
+ env->text_base = 0;
+ (void)uwx_init_history(env);
+ if (uwx_allocate_cb != NULL)
+ env->allocate_cb = uwx_allocate_cb;
+ else
+ env->allocate_cb = NULL;
+ if (uwx_free_cb != NULL)
+ env->free_cb = uwx_free_cb;
+ else
+ env->free_cb = NULL;
+ env->free_scoreboards = 0;
+ env->used_scoreboards = 0;
+ env->labeled_scoreboards = 0;
+ (void)uwx_init_str_pool(env, str_pool);
+ env->module_name = 0;
+ env->function_name = 0;
+ env->cb_token = 0;
+ env->copyin = 0;
+ env->lookupip = 0;
+ env->remote = 0;
+ env->byte_swap = 0;
+ env->abi_context = 0;
+ env->nsbreg = NSBREG;
+ env->nscoreboards = 0;
+ env->on_heap = 0;
+ env->trace = 0;
+ TRACE_INIT
+ for (i = 0; total_size >= sizeof(struct uwx_scoreboard); i++) {
+ (void) uwx_prealloc_scoreboard(env, &scoreboards[i]);
+ total_size -= sizeof(struct uwx_scoreboard);
+ }
+ return UWX_OK;
+}
+
+int uwx_set_nofr(struct uwx_env *env)
+{
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ env->nsbreg = NSBREG_NOFR;
+ return UWX_OK;
+}
+
struct uwx_env *uwx_init()
{
- int i;
struct uwx_env *env;
+ size_t total_size;
+
+ total_size = sizeof(struct uwx_env) +
+ sizeof(struct uwx_str_pool) +
+ NSCOREBOARDS * sizeof(struct uwx_scoreboard);
if (uwx_allocate_cb == 0)
- env = (struct uwx_env *) malloc(sizeof(struct uwx_env));
+ env = (struct uwx_env *) malloc(total_size);
else
- env = (struct uwx_env *) (*uwx_allocate_cb)(sizeof(struct uwx_env));
+ env = (struct uwx_env *) (*uwx_allocate_cb)(total_size);
if (env != 0) {
- env->context.valid_regs = 0;
- env->context.valid_frs = 0;
- for (i = 0; i < NSPECIALREG; i++)
- env->context.special[i] = 0;
- for (i = 0; i < NPRESERVEDGR; i++)
- env->context.gr[i] = 0;
- for (i = 0; i < NPRESERVEDBR; i++)
- env->context.br[i] = 0;
- for (i = 0; i < NPRESERVEDFR; i++) {
- env->context.fr[i].part0 = 0;
- 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;
- env->free_cb = uwx_free_cb;
- env->free_scoreboards = 0;
- env->used_scoreboards = 0;
- env->labeled_scoreboards = 0;
- (void)uwx_init_str_pool(env);
- env->module_name = 0;
- env->function_name = 0;
- env->cb_token = 0;
- env->copyin = 0;
- env->lookupip = 0;
- env->remote = 0;
- env->byte_swap = 0;
- env->abi_context = 0;
- env->nsbreg = NSBREG_NOFR;
- env->nscoreboards = 0;
- env->trace = 0;
- TRACE_INIT
- for (i = 0; i < NSCOREBOARDS; i++)
- (void) uwx_alloc_scoreboard(env);
+ uwx_init_env(env, total_size);
+ env->on_heap = 1;
}
return env;
}
@@ -165,10 +210,12 @@
if (env != 0) {
uwx_free_scoreboards(env);
uwx_free_str_pool(env);
- if (env->free_cb == 0)
- free((void *)env);
- else
- (*env->free_cb)((void *)env);
+ if (env->on_heap) {
+ if (env->free_cb == 0)
+ free((void *)env);
+ else
+ (*env->free_cb)((void *)env);
+ }
}
return UWX_OK;
}
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_env.h#5 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
@@ -80,6 +80,11 @@
uint64_t *rstate;
uint64_t remapped_ip;
int64_t function_offset;
+ uint64_t ptr_size;
+ uint64_t uinfo_hdr;
+ uint64_t uinfo_end;
+ uint64_t code_start;
+ uint64_t text_base;
struct uwx_history history;
alloc_cb allocate_cb;
free_cb free_cb;
@@ -97,8 +102,10 @@
int abi_context;
int nsbreg;
int nscoreboards;
+ int on_heap;
int trace;
};
extern alloc_cb uwx_allocate_cb;
extern free_cb uwx_free_cb;
+extern int uwx_init_env(struct uwx_env *env, size_t total_size);
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_scoreboard.c#5 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
@@ -58,6 +58,15 @@
#endif
+void uwx_prealloc_scoreboard(struct uwx_env *env, struct uwx_scoreboard *sb)
+{
+ sb->id = env->nscoreboards++;
+ sb->nextused = env->used_scoreboards;
+ sb->prealloc = 1;
+ env->used_scoreboards = sb;
+ TRACE_B_PREALLOC(sb->id)
+}
+
struct uwx_scoreboard *uwx_alloc_scoreboard(struct uwx_env *env)
{
struct uwx_scoreboard *sb;
@@ -79,6 +88,7 @@
return 0;
sb->id = env->nscoreboards++;
sb->nextused = env->used_scoreboards;
+ sb->prealloc = 0;
env->used_scoreboards = sb;
TRACE_B_ALLOC(sb->id)
}
@@ -291,10 +301,12 @@
for (sb = env->used_scoreboards; sb != 0; sb = next) {
TRACE_B_FREE(sb->id)
next = sb->nextused;
- if (env->free_cb == 0)
- free((void *)sb);
- else
- (*env->free_cb)((void *)sb);
+ if (!sb->prealloc) {
+ if (env->free_cb == 0)
+ free((void *)sb);
+ else
+ (*env->free_cb)((void *)sb);
+ }
}
env->free_scoreboards = 0;
env->used_scoreboards = 0;
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_scoreboard.h#3 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
@@ -51,8 +51,13 @@
uint64_t rstate[NSBREG];
int label;
int id;
+ int prealloc;
};
+extern void uwx_prealloc_scoreboard(
+ struct uwx_env *env,
+ struct uwx_scoreboard *sb);
+
extern struct uwx_scoreboard *uwx_alloc_scoreboard(struct uwx_env *env);
extern struct uwx_scoreboard *uwx_init_scoreboards(struct uwx_env *env);
==== //depot/projects/smpng/sys/contrib/ia64/libuwx/src/uwx_self.c#5 (text+ko) ====
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2003-2006 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
@@ -23,6 +23,7 @@
*/
#include <stdlib.h>
+#include <string.h>
#include <crt0.h>
#include <dlfcn.h>
#include <sys/uc_access.h>
@@ -31,52 +32,49 @@
#include "uwx_context.h"
#include "uwx_trace.h"
#include "uwx_self.h"
+#include "uwx_self_info.h"
#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];
- uint64_t sendsig_start;
- uint64_t sendsig_end;
- alloc_cb allocate_cb;
- free_cb free_cb;
- int trace;
-};
+void uwx_free_load_module_cache(struct uwx_self_info *info);
+
+int uwx_self_init_info_block(struct uwx_env *env, struct uwx_self_info *info)
+{
+ info->env = env;
+ info->ucontext = 0;
+ info->bspstore = 0;
+ info->sendsig_start = __load_info->li_sendsig_txt;
+ info->sendsig_end = __load_info->li_sendsig_txt +
+ __load_info->li_sendsig_tsz;
+ info->on_heap = 0;
+ info->trace = env->trace;
+ info->load_module_cache = NULL;
+
+ return UWX_OK;
+}
struct uwx_self_info *uwx_self_init_info(struct uwx_env *env)
{
struct uwx_self_info *info;
- if (env->allocate_cb == 0)
- info = (struct uwx_self_info *)
- malloc(sizeof(struct uwx_self_info));
- else
- info = (struct uwx_self_info *)
+ info = (struct uwx_self_info *)
(*env->allocate_cb)(sizeof(struct uwx_self_info));
if (info == 0)
return 0;
- info->env = env;
- info->ucontext = 0;
- info->bspstore = 0;
- info->sendsig_start = __load_info->li_sendsig_txt;
- info->sendsig_end = __load_info->li_sendsig_txt +
- __load_info->li_sendsig_tsz;
- info->allocate_cb = env->allocate_cb;
- info->free_cb = env->free_cb;
- info->trace = env->trace;
+ uwx_self_init_info_block(env, info);
+ info->on_heap = 1;
return info;
}
int uwx_self_free_info(struct uwx_self_info *info)
{
- if (info->free_cb == 0)
- free((void *)info);
- else
- (*info->free_cb)((void *)info);
+ int i;
+
+ if (info->load_module_cache != NULL)
+ uwx_free_load_module_cache(info);
+ if (info->on_heap)
+ (*info->env->free_cb)((void *)info);
return UWX_OK;
}
@@ -97,17 +95,37 @@
info->ucontext = ucontext;
status = __uc_get_reason(ucontext, &reason);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
status = __uc_get_ip(ucontext, &ip);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
status = __uc_get_grs(ucontext, 12, 1, &sp, &nat);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
status = __uc_get_cfm(ucontext, &cfm);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
#ifdef NEW_UC_GET_AR
status = __uc_get_ar_bsp(ucontext, &bsp);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
status = __uc_get_ar_bspstore(ucontext, &info->bspstore);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
status = __uc_get_ar_ec(ucontext, &ec);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
#else
status = __uc_get_ar(ucontext, 17, &bsp);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
status = __uc_get_ar(ucontext, 18, &info->bspstore);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
status = __uc_get_ar(ucontext, 66, &ec);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
#endif
/* The returned bsp needs to be adjusted. */
/* For interrupt frames, where bsp was advanced by a cover */
@@ -136,9 +154,10 @@
if (abi_context != UWX_ABI_HPUX_SIGCONTEXT)
return UWX_SELF_ERR_BADABICONTEXT;
status = uwx_get_reg(env, UWX_REG_GR(32), (uint64_t *)&ucontext);
- if (status != 0)
+ if (status != UWX_OK)
return status;
- return uwx_self_init_from_sigcontext(env, info, (ucontext_t *)ucontext);
+ return uwx_self_init_from_sigcontext(env, info,
+ (ucontext_t *)(intptr_t)ucontext);
}
int uwx_self_copyin(
@@ -164,12 +183,12 @@
case UWX_COPYIN_MSTACK:
if (len == 4) {
wp = (unsigned long *) loc;
- *wp = *(unsigned long *)rem;
+ *wp = *(unsigned long *)(intptr_t)rem;
TRACE_SELF_COPYIN4(rem, len, wp)
status = 0;
}
else if (len == 8) {
- *dp = *(uint64_t *)rem;
+ *dp = *(uint64_t *)(intptr_t)rem;
TRACE_SELF_COPYIN8(rem, len, dp)
status = 0;
}
@@ -181,13 +200,13 @@
status = 0;
}
else if (info->ucontext == 0 || rem < info->bspstore) {
- *dp = *(uint64_t *)rem;
+ *dp = *(uint64_t *)(intptr_t)rem;
TRACE_SELF_COPYIN8(rem, len, dp)
status = 0;
}
else {
status = __uc_get_rsebs(info->ucontext,
- (uint64_t *)rem, 1, dp);
+ (uint64_t *)(intptr_t)rem, 1, dp);
}
}
break;
@@ -230,6 +249,88 @@
return len;
}
+#define MODULE_CACHE_SIZE 4
+
+struct load_module_cache {
+ int clock;
+ char *names[MODULE_CACHE_SIZE];
+ struct load_module_desc descs[MODULE_CACHE_SIZE];
+ struct uwx_symbol_cache *symbol_cache;
+};
+
+void uwx_free_load_module_cache(struct uwx_self_info *info)
+{
+ int i;
+
+ for (i = 0; i < MODULE_CACHE_SIZE; i++) {
+ if (info->load_module_cache->names[i] != NULL)
+ (*info->env->free_cb)((void *)info->load_module_cache->names[i]);
+ }
+
+ if (info->load_module_cache->symbol_cache != NULL)
+ uwx_release_symbol_cache(info->env,
+ info->load_module_cache->symbol_cache);
+
+ (*info->env->free_cb)((void *)info->load_module_cache);
+}
+
+struct load_module_desc *uwx_get_modinfo(
+ struct uwx_self_info *info,
+ uint64_t ip,
+ char **module_name_p)
+{
+ int i;
+ UINT64 handle;
+ struct load_module_cache *cache;
+ struct load_module_desc *desc;
+ char *module_name;
+
+ cache = info->load_module_cache;
+ if (cache == NULL) {
+ cache = (struct load_module_cache *)
+ (*info->env->allocate_cb)(sizeof(struct load_module_cache));
+ if (cache == NULL)
+ return NULL;
+ for (i = 0; i < MODULE_CACHE_SIZE; i++) {
+ desc = &cache->descs[i];
+ desc->text_base = 0;
+ desc->text_size = 0;
+ cache->names[i] = NULL;
+ }
+ cache->clock = 0;
+ cache->symbol_cache = NULL;
+ info->load_module_cache = cache;
+ }
+ for (i = 0; i < MODULE_CACHE_SIZE; i++) {
+ desc = &cache->descs[i];
+ if (ip >= desc->text_base && ip < desc->text_base + desc->text_size)
+ break;
+ }
+ if (i >= MODULE_CACHE_SIZE) {
+ i = cache->clock;
+ cache->clock = (cache->clock + 1) % MODULE_CACHE_SIZE;
+ desc = &cache->descs[i];
+ handle = dlmodinfo(ip, desc, sizeof(*desc), 0, 0, 0);
+ if (handle == 0)
+ return NULL;
+ if (cache->names[i] != NULL)
+ (*info->env->free_cb)(cache->names[i]);
+ cache->names[i] = NULL;
+ }
+ if (module_name_p != NULL) {
+ if (cache->names[i] == NULL) {
+ module_name = dlgetname(desc, sizeof(*desc), 0, 0, 0);
+ if (module_name != NULL) {
+ cache->names[i] = (char *)
+ (*info->env->allocate_cb)(strlen(module_name)+1);
+ if (cache->names[i] != NULL)
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list