X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=bjm.c;h=926add3c4c2ed047022820a4c62bde956d0ba0a1;hb=73a21f1a3f83799a4ed0ad36b487a31ab9a51a74;hp=301ac40c07334a4ee4278f4b76faba9d893b6ea0;hpb=46100d07257824da2ae1147da0324b5788c95501;p=strace diff --git a/bjm.c b/bjm.c index 301ac40c..926add3c 100644 --- a/bjm.c +++ b/bjm.c @@ -26,181 +26,43 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ */ -#include "defs.h" - -#if defined(LINUX) +#include "defs.h" #include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Bits of module.flags. */ - -#define MOD_UNINITIALIZED 0 -#define MOD_RUNNING 1 -#define MOD_DELETED 2 -#define MOD_AUTOCLEAN 4 -#define MOD_VISITED 8 -#define MOD_USED_ONCE 16 -#define MOD_JUST_FREED 32 -#define MOD_INITIALIZING 64 - -/* Values for query_module's which. */ - -#define QM_MODULES 1 -#define QM_DEPS 2 -#define QM_REFS 3 -#define QM_SYMBOLS 4 -#define QM_INFO 5 -struct module_symbol -{ - unsigned long value; - const char *name; -}; +#include "xlat/delete_module_flags.h" -struct module_info +SYS_FUNC(delete_module) { - unsigned long addr; - unsigned long size; - unsigned long flags; - long usecount; -}; - -static const struct xlat which[] = { - { 0, "0" }, - { QM_MODULES, "QM_MODULES" }, - { QM_DEPS, "QM_DEPS" }, - { QM_REFS, "QM_REFS" }, - { QM_SYMBOLS, "QM_SYMBOLS" }, - { QM_INFO, "QM_INFO" }, - { 0, NULL }, -}; + printstr(tcp, tcp->u_arg[0]); + tprints(", "); + printflags(delete_module_flags, tcp->u_arg[1], "O_???"); -static const struct xlat modflags[] = { - { MOD_UNINITIALIZED, "MOD_UNINITIALIZED" }, - { MOD_RUNNING, "MOD_RUNNING" }, - { MOD_DELETED, "MOD_DELETED" }, - { MOD_AUTOCLEAN, "MOD_AUTOCLEAN" }, - { MOD_VISITED, "MOD_VISITED" }, - { MOD_USED_ONCE, "MOD_USED_ONCE" }, - { MOD_JUST_FREED, "MOD_JUST_FREED" }, - { 0, NULL }, -}; + return RVAL_DECODED; +} -int -sys_query_module(tcp) -struct tcb *tcp; +SYS_FUNC(init_module) { + printaddr(tcp->u_arg[0]); + tprintf(", %" PRI_klu ", ", tcp->u_arg[1]); + printstr(tcp, tcp->u_arg[2]); - if (exiting(tcp)) { - printstr(tcp, tcp->u_arg[0], -1); - tprintf(", "); - printxval(which, tcp->u_arg[1], "QM_???"); - tprintf(", "); - if (!verbose(tcp)) { - tprintf("%#lx, %lu, %#lx", tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[4]); - } else if (tcp->u_rval!=0) { - size_t ret; - umove(tcp, tcp->u_arg[4], &ret); - tprintf("%#lx, %lu, %Zu", tcp->u_arg[2], tcp->u_arg[3], ret); - } else if (tcp->u_arg[1]==QM_INFO) { - struct module_info mi; - size_t ret; - umove(tcp, tcp->u_arg[2], &mi); - tprintf("{address=%#lx, size=%lu, flags=", mi.addr, mi.size); - printflags(modflags, mi.flags); - tprintf(", usecount=%lu}", mi.usecount); - umove(tcp, tcp->u_arg[4], &ret); - tprintf(", %Zu", ret); - } else if ((tcp->u_arg[1]==QM_MODULES) || - (tcp->u_arg[1]==QM_DEPS) || - (tcp->u_arg[1]==QM_REFS)) { - size_t ret; - - umove(tcp, tcp->u_arg[4], &ret); - tprintf("{"); - if (!abbrev(tcp)) { - char* data = (char*)malloc(tcp->u_arg[3]); - char* mod = data; - size_t idx; - - if (data==NULL) { - fprintf(stderr, "out of memory\n"); - tprintf(" /* %Zu entries */ ", ret); - } else { - umoven(tcp, tcp->u_arg[2], tcp->u_arg[3], data); - for (idx=0; idxu_arg[1]==QM_SYMBOLS) { - size_t ret; - umove(tcp, tcp->u_arg[4], &ret); - tprintf("{"); - if (!abbrev(tcp)) { - char* data = (char *)malloc(tcp->u_arg[3]); - struct module_symbol* sym = (struct module_symbol*)data; - size_t idx; - - if (data==NULL) { - fprintf(stderr, "out of memory\n"); - tprintf(" /* %Zu entries */ ", ret); - } else { - umoven(tcp, tcp->u_arg[2], tcp->u_arg[3], data); - for (idx=0; idxname, sym->value); - sym++; - } - free(data); - } - } else - tprintf(" /* %Zu entries */ ", ret); - tprintf("}, %Zd", ret); - } else { - printstr(tcp, tcp->u_arg[2], tcp->u_arg[3]); - tprintf(", %#lx", tcp->u_arg[4]); - } - } - return 0; + return RVAL_DECODED; } -int -sys_create_module(tcp) -struct tcb *tcp; -{ - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprintf(", %lu", tcp->u_arg[1]); - } - return RVAL_HEX; -} +#include "xlat/module_init_flags.h" -int -sys_init_module(tcp) -struct tcb *tcp; +SYS_FUNC(finit_module) { - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprintf(", %#lx", tcp->u_arg[1]); - } - return 0; + /* file descriptor */ + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + /* param_values */ + printstr(tcp, tcp->u_arg[1]); + tprints(", "); + /* flags */ + printflags(module_init_flags, tcp->u_arg[2], "MODULE_INIT_???"); + + return RVAL_DECODED; } -#endif /* LINUX */