1521fa314SDavid van Moolenbroek 2521fa314SDavid van Moolenbroek #include <sys/queue.h> 3521fa314SDavid van Moolenbroek 4521fa314SDavid van Moolenbroek /* 5521fa314SDavid van Moolenbroek * The maximum nesting depth of parentheses/brackets. The current maximum 6521fa314SDavid van Moolenbroek * depth is something like six, for UDS control messages. This constant can be 7521fa314SDavid van Moolenbroek * increased as necessary without any problem. 8521fa314SDavid van Moolenbroek */ 9521fa314SDavid van Moolenbroek #define MAX_DEPTH 10 10521fa314SDavid van Moolenbroek 11521fa314SDavid van Moolenbroek /* 12521fa314SDavid van Moolenbroek * The maximum size of text that may be recorded, including null terminator. 13521fa314SDavid van Moolenbroek * Increasing this allows longer lines to be recorded and replayed without 14521fa314SDavid van Moolenbroek * being cut short (see call_replay), but also increases memory usage. 15521fa314SDavid van Moolenbroek */ 16521fa314SDavid van Moolenbroek #define RECORD_BUFSZ 256 17521fa314SDavid van Moolenbroek 18521fa314SDavid van Moolenbroek struct trace_proc { 19521fa314SDavid van Moolenbroek /* identity (public) */ 20521fa314SDavid van Moolenbroek pid_t pid; 21521fa314SDavid van Moolenbroek 22521fa314SDavid van Moolenbroek /* data structure management (proc.c) */ 23521fa314SDavid van Moolenbroek TAILQ_ENTRY(trace_proc) next; 24521fa314SDavid van Moolenbroek 25521fa314SDavid van Moolenbroek /* general process state (trace.c) */ 26521fa314SDavid van Moolenbroek char name[PROC_NAME_LEN]; 27521fa314SDavid van Moolenbroek unsigned int trace_flags; 28521fa314SDavid van Moolenbroek reg_t last_pc; 29521fa314SDavid van Moolenbroek reg_t last_sp; 30521fa314SDavid van Moolenbroek 31521fa314SDavid van Moolenbroek /* call enter-to-leave state (call.c) */ 32521fa314SDavid van Moolenbroek int call_type; 33521fa314SDavid van Moolenbroek vir_bytes m_addr; 34521fa314SDavid van Moolenbroek message m_out; 35521fa314SDavid van Moolenbroek const char *call_name; 36521fa314SDavid van Moolenbroek unsigned int call_flags; 37521fa314SDavid van Moolenbroek const struct call_handler *call_handler; 38521fa314SDavid van Moolenbroek int call_result; 39521fa314SDavid van Moolenbroek 40521fa314SDavid van Moolenbroek /* output state (output.c) */ 41521fa314SDavid van Moolenbroek int recording; 42521fa314SDavid van Moolenbroek char outbuf[RECORD_BUFSZ]; 43521fa314SDavid van Moolenbroek size_t outlen; 44521fa314SDavid van Moolenbroek 45521fa314SDavid van Moolenbroek /* formatting state (format.c) */ 46521fa314SDavid van Moolenbroek const char *next_sep; 47521fa314SDavid van Moolenbroek int depth; 48521fa314SDavid van Moolenbroek struct { 49521fa314SDavid van Moolenbroek const char *sep; 50521fa314SDavid van Moolenbroek int name; 51521fa314SDavid van Moolenbroek } depths[MAX_DEPTH]; 52521fa314SDavid van Moolenbroek 53521fa314SDavid van Moolenbroek /* ioctl state (ioctl.c) */ 54521fa314SDavid van Moolenbroek int ioctl_index; 55521fa314SDavid van Moolenbroek unsigned int ioctl_flags; 56*e4e21ee1SDavid van Moolenbroek 57*e4e21ee1SDavid van Moolenbroek /* sysctl state (service/mib.c) */ 58*e4e21ee1SDavid van Moolenbroek uint32_t sctl_flags; 59*e4e21ee1SDavid van Moolenbroek size_t sctl_size; 60*e4e21ee1SDavid van Moolenbroek int (*sctl_proc)(struct trace_proc *, const char *, int, const void *, 61*e4e21ee1SDavid van Moolenbroek vir_bytes, size_t); 62*e4e21ee1SDavid van Moolenbroek int sctl_arg; 63521fa314SDavid van Moolenbroek }; 64521fa314SDavid van Moolenbroek 65521fa314SDavid van Moolenbroek /* Trace flags. */ 66521fa314SDavid van Moolenbroek #define TF_INCALL 0x01 /* the process has entered a system call */ 67521fa314SDavid van Moolenbroek #define TF_SKIP 0x02 /* the system call result is to be skipped */ 68521fa314SDavid van Moolenbroek #define TF_CTX_SKIP 0x04 /* skip call result only if context changes */ 69521fa314SDavid van Moolenbroek #define TF_STOPPING 0x08 /* the process is expecting a SIGSTOP */ 70521fa314SDavid van Moolenbroek #define TF_ATTACH 0x10 /* we have not started this process */ 71521fa314SDavid van Moolenbroek #define TF_DETACH 0x20 /* detach from the process as soon as we can */ 72521fa314SDavid van Moolenbroek #define TF_EXEC 0x40 /* the process may be performing an execve() */ 73521fa314SDavid van Moolenbroek #define TF_NOCALL 0x80 /* no system call seen yet (for info only) */ 74521fa314SDavid van Moolenbroek 75521fa314SDavid van Moolenbroek /* Trace classes, determining how the tracer engine should handle a call. */ 76521fa314SDavid van Moolenbroek #define TC_NORMAL 0 /* normal call, no exceptions required */ 77521fa314SDavid van Moolenbroek #define TC_EXEC 1 /* exec call, success on subsequent SIGSTOP */ 78521fa314SDavid van Moolenbroek #define TC_SIGRET 2 /* sigreturn call, success on context change */ 79521fa314SDavid van Moolenbroek 80521fa314SDavid van Moolenbroek /* Call flags. */ 81521fa314SDavid van Moolenbroek #define CF_DONE 0x01 /* printing the call parameters is done */ 82521fa314SDavid van Moolenbroek #define CF_NORETURN 0x02 /* the call does not return on success */ 83521fa314SDavid van Moolenbroek #define CF_HIDE 0x04 /* do not print the current call */ 84521fa314SDavid van Moolenbroek #define CF_IPC_ERR 0x08 /* a failure occurred at the IPC level */ 85521fa314SDavid van Moolenbroek #define CF_REG_ERR 0x10 /* unable to retrieve the result register */ 86521fa314SDavid van Moolenbroek #define CF_MSG_ERR 0x20 /* unable to copy in the reply message */ 87521fa314SDavid van Moolenbroek 88521fa314SDavid van Moolenbroek /* Call types, determining how much has been printed up to the call split. */ 89521fa314SDavid van Moolenbroek #define CT_NOTDONE (0) /* not all parameters have been printed yet */ 90521fa314SDavid van Moolenbroek #define CT_DONE (CF_DONE) /* all parameters have been printed */ 91521fa314SDavid van Moolenbroek #define CT_NORETURN (CF_DONE | CF_NORETURN) /* the no-return call type */ 92521fa314SDavid van Moolenbroek 93521fa314SDavid van Moolenbroek /* Put flags. */ 94521fa314SDavid van Moolenbroek #define PF_FAILED 0x01 /* call failed, results may be invalid */ 95521fa314SDavid van Moolenbroek #define PF_LOCADDR 0x02 /* pointer is into local address space */ 96521fa314SDavid van Moolenbroek /* Yes, PF_LOCAL would conflict with the packet family definition. Bah. */ 97521fa314SDavid van Moolenbroek #define PF_ALT 0x04 /* alternative output (callee specific) */ 98521fa314SDavid van Moolenbroek #define PF_STRING PF_ALT /* buffer is string (put_buf only) */ 99521fa314SDavid van Moolenbroek #define PF_FULL 0x08 /* print full format (callee specific) */ 100521fa314SDavid van Moolenbroek #define PF_PATH (PF_STRING | PF_FULL) /* flags for path names */ 101521fa314SDavid van Moolenbroek #define PF_NONAME 0x10 /* default to no field names at this depth */ 102521fa314SDavid van Moolenbroek 103521fa314SDavid van Moolenbroek /* I/O control flags. */ 104521fa314SDavid van Moolenbroek #define IF_OUT 0x1 /* call to print outgoing (written) data */ 105521fa314SDavid van Moolenbroek #define IF_IN 0x2 /* call to print incoming (read) data */ 106521fa314SDavid van Moolenbroek #define IF_ALL 0x4 /* all fields printed (not really a bit) */ 107*e4e21ee1SDavid van Moolenbroek 108*e4e21ee1SDavid van Moolenbroek /* Sysctl processing types, determining what the callback function is to do. */ 109*e4e21ee1SDavid van Moolenbroek #define ST_NAME 0 /* print the rest of the name */ 110*e4e21ee1SDavid van Moolenbroek #define ST_OLDP 1 /* print the data pointed to by oldp */ 111*e4e21ee1SDavid van Moolenbroek #define ST_NEWP 2 /* print the data pointed to by newp */ 112