KGRKJGETMRETU895U-589TY5MIGM5JGB5SDFESFREWTGR54TY
Server : Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 PHP/5.2.17
System : Linux localhost 2.6.18-419.el5 #1 SMP Fri Feb 24 22:47:42 UTC 2017 x86_64
User : nobody ( 99)
PHP Version : 5.2.17
Disable Function : NONE
Directory :  /proc/21573/root/usr/share/systemtap/tapset/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //proc/21573/root/usr/share/systemtap/tapset/context.stp
// context tapset
// Copyright (C) 2005-2011 Red Hat Inc.
// Copyright (C) 2006 Intel Corporation.
//
// This file is part of systemtap, and is free software.  You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.
// <tapsetdescription>
// Context functions provide additional information about where an event occurred. These functions can
//provide information such as a backtrace to where the event occurred and the current register values for the
//processor.
// </tapsetdescription>

/**
 * sfunction print_regs - Print a register dump
 * 
 * Description: This function prints a register dump. Does nothing if no registers are available for the probe point.
 */
function print_regs ()
%{
	if ((c->probe_flags & _STP_PROBE_STATE_USER_MODE) && CONTEXT->uregs) {
		_stp_print_regs (CONTEXT->uregs);
	} else if (CONTEXT->kregs) {
		_stp_print_regs (CONTEXT->kregs);
	}
%}

/**
 * sfunction execname - Returns the execname of a target process (or group of processes)
 * 
 * Description: Returns the execname of a target process (or group of processes).
 */
function execname:string ()
%{ /* pure */ /* unprivileged */
	strlcpy (STAP_RETVALUE, current->comm, MAXSTRINGLEN);
%}

/**
 * sfunction pid - Returns the ID of a target process
 * 
 * Description: This function returns the ID of a target process.
 */
function pid:long ()
%{ /* pure */ /* unprivileged */
	STAP_RETVALUE = current->tgid;
%}

/**
 * sfunction tid - Returns the thread ID of a target process
 * 
 * Description: This function returns the thread ID of the target process.
 */
function tid:long ()
%{ /* pure */ /* unprivileged */
	STAP_RETVALUE = current->pid;
%}

/**
 * sfunction ppid - Returns the process ID of a target process's parent process
 *
 * Description: This function return the process ID of the target proccess's parent process.
 */
function ppid:long()
%{ /* pure */ /* unprivileged */
#if defined(STAPCONF_REAL_PARENT)
	STAP_RETVALUE = current->real_parent->tgid;
#else
	STAP_RETVALUE = current->parent->tgid;
#endif
%}

/**
 * sfunction pgrp - Returns the process group ID of the current process
 *
 * Description: This function returns the process group ID of the
 * current process.
 */
function pgrp:long ()
%{ /* pure */ /* unprivileged */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
	struct signal_struct *ss = kread( &(current->signal) );
	STAP_RETVALUE = kread ( &(ss->pgrp) );
	CATCH_DEREF_FAULT();
#else
	STAP_RETVALUE = task_pgrp_nr_ns(current, &init_pid_ns);
#endif
%}

/**
 * sfunction sid - Returns the session ID of the current process
 *
 * Description: The session ID of a process is the process group ID
 * of the session leader. Session ID is stored in the signal_struct
 *  since Kernel 2.6.0.
 */
function sid:long ()
%{ /* pure */ /* unprivileged */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
	struct signal_struct *ss = kread( &(current->signal) );
	STAP_RETVALUE = kread ( &(ss->session) );
	CATCH_DEREF_FAULT();
#else
	STAP_RETVALUE = task_session_nr_ns(current, &init_pid_ns);
#endif
%}

/**
 * sfunction pexecname - Returns the execname of a target process's parent process
 * 
 * Description: This function returns the execname of a target
 * process's parent procces.
 */
function pexecname:string ()
%{ /* pure */ /* unprivileged */
#if defined(STAPCONF_REAL_PARENT)
	strlcpy (STAP_RETVALUE, current->real_parent->comm, MAXSTRINGLEN);
#else
	strlcpy (STAP_RETVALUE, current->parent->comm, MAXSTRINGLEN);
#endif
%}

/**
 * sfunction gid - Returns the group ID of a target process
 * 
 * Description: This function returns the group ID of a target process.
 */
function gid:long ()
%{ /* pure */ /* unprivileged */
#ifdef STAPCONF_TASK_UID
	STAP_RETVALUE = current->gid;
#else
	STAP_RETVALUE = current_gid();
#endif
%}

/**
 * sfunction egid - Returns the effective gid of a target process
 * 
 * Description: This function returns the effective gid of a target process
 */
function egid:long ()
%{ /* pure */ /* unprivileged */
#ifdef STAPCONF_TASK_UID
	STAP_RETVALUE = current->egid;
#else
	STAP_RETVALUE = current_egid();
#endif
%}

/**
 * sfunction uid - Returns the user ID of a target process
 * 
 * Description: This function returns the user ID of the target process.
 */
function uid:long ()
%{ /* pure */ /* unprivileged */
#ifdef STAPCONF_TASK_UID
	STAP_RETVALUE = current->uid;
#else
	STAP_RETVALUE = current_uid();
#endif
%}

/**
 * sfunction euid - Return the effective uid of a target process
 *
 * Description: Returns the effective user ID of the target process.
 */
function euid:long ()
%{ /* pure */ /* unprivileged */
#ifdef STAPCONF_TASK_UID
	STAP_RETVALUE = current->euid;
#else
	STAP_RETVALUE = current_euid();
#endif
%}


/**
 * sfunction is_myproc - Determines if the current probe point has occurred in the user's own process
 *
 * Description: This function returns 1 if the current probe
 * point has occurred in the user's own process.
 */
function is_myproc:long ()
%{ /* pure */ /* unprivileged */
        STAP_RETVALUE = is_myproc();
%}


%( systemtap_v <= "1.4" %?
/**
 * sfunction cpuid - Returns the current cpu number
 * 
 * Description: This function returns the current cpu number.
 * Deprecated in SystemTap 1.4 and removed in SystemTap 1.5.
 */
function cpuid:long ()
%{ /* pure */
	STAP_RETVALUE = smp_processor_id();
%}
%)

/**
 * sfunction cpu - Returns the current cpu number
 *
 * Description: This function returns the current cpu number.
 */
function cpu:long ()
%{ /* pure */ /* unprivileged */
	STAP_RETVALUE = smp_processor_id();
%}

/**
 * sfunction pp - Returns the active probe point
 *
 * Description: This function returns the fully-resolved probe point
 * associated with a currently running probe handler, including alias
 * and wild-card expansion effects. Context: The current probe point.
 */
function pp:string ()
%{ /* pure */ /* unprivileged */
	strlcpy (STAP_RETVALUE, CONTEXT->probe_point, MAXSTRINGLEN);
%}

/**
 * sfunction registers_valid - Determines validity of register() and u_register() in current context
 *
 * Description: This function returns 1 if register() and u_register()
 * can be used in the current context, or 0 otherwise.
 * For example, registers_valid() returns 0
 * when called from a begin or end probe.
 */
function registers_valid:long ()
%{ /* pure */ /* unprivileged */
	STAP_RETVALUE = ((c->probe_flags & _STP_PROBE_STATE_USER_MODE)
			    ? (CONTEXT->uregs != NULL)
			    : (CONTEXT->kregs != NULL));
%}

/**
 * sfunction user_mode - Determines if probe point occurs in user-mode
 *
 * Return 1 if the probe point occurred in user-mode.
 */
function user_mode:long ()
%{ /* pure */ /* unprivileged */
  STAP_RETVALUE = (CONTEXT->probe_flags
		      & _STP_PROBE_STATE_USER_MODE) ? 1 : 0;
%}

/**
 * sfunction is_return - Whether the current probe context is a return probe
 * 
 * Description: Returns 1 if the current probe context is a return probe,
 * returns 0 otherwise.
 */
function is_return:long ()
%{ /* pure */
	if (CONTEXT->probe_type == _STP_PROBE_HANDLER_KRETPROBE
	    || CONTEXT->probe_type == _STP_PROBE_HANDLER_URETPROBE)
		STAP_RETVALUE = 1;
	else
		STAP_RETVALUE = 0;
%}

/**
 * sfunction target - Return the process ID of the target process
 * 
 * Description: This function returns the process ID of the target
 * process.  This is useful in conjunction with the -x PID or
 * -c CMD command-line options to stap. An example of its use is
 * to create scripts that filter on a specific process.
 *
 * -x <pid>
 * target() returns the pid specified by -x
 *
 * -c <command>
 * target() returns the pid for the executed command specified by -c
 */
function target:long ()
%{ /* pure */ /* unprivileged */
        STAP_RETVALUE = _stp_target;
%}

/**
 * sfunction module_name - The module name of the current script
 * 
 * Description: This function returns the name of the stap module.
 * Either generated randomly (stap_[0-9a-f]+_[0-9a-f]+)
 * or set by stap -m <module_name>.
 */
function module_name:string ()
%{ /* pure */ /* unprivileged */
	strlcpy(STAP_RETVALUE, THIS_MODULE->name, MAXSTRINGLEN);
%}

/**
 * sfunction stp_pid - The process id of the stapio process
 *
 * Description: This function returns the process id of the 
 * stapio process that launched this script. There could be
 * other SystemTap scripts and stapio processes running on
 * the system.
 */
function stp_pid:long ()
%{ /* pure */
        STAP_RETVALUE = _stp_pid;
%}


/**
 * sfunction remote_id - The index of this instance in a remote execution.
 *
 * Description: This function returns a number 0..N, which is the unique 
 * index of this particular script execution from a swarm of
 * "stap --remote A --remote B ..." runs, and is the same number
 * "stap --remote-prefix" would print.  The function returns -1 if the
 * script was not launched with "stap --remote", or if the remote 
 * staprun/stapsh are older than version 1.7.
 */
function remote_id:long () {
         return %{ /* pure */ /* unprivileged */ _stp_remote_id %}
}


/**
 * sfunction remote_uri - The name of this instance in a remote execution.
 *
 * Description: This function returns the remote host used to invoke
 * this particular script execution from a swarm of "stap --remote" runs.
 * It may not be unique among the swarm.
 * The function returns an empty string if the script was not launched with
 * "stap --remote".
 */
function remote_uri:string () {
         return %{ /* string */ /* pure */ /* unprivileged */ _stp_remote_uri %}
}


/**
 * sfunction stack_size - Return the size of the kernel stack
 * 
 * Description: This function returns the size of the kernel stack.
 */
function stack_size:long ()
%{ /* pure */
        STAP_RETVALUE = THREAD_SIZE;
%}

/**
 * sfunction stack_used - Returns the amount of kernel stack used
 *
 * Description: This function determines how many bytes are
 * currently used in the kernel stack.
 */
function stack_used:long ()
%{ /* pure */
	char a;
        STAP_RETVALUE = THREAD_SIZE - ((long)&a & (THREAD_SIZE-1));
%}

/**
 * sfunction stack_unused - Returns the amount of kernel stack currently available
 *
 * Description: This function determines how many bytes are
 * currently available in the kernel stack.
 */
function stack_unused:long ()
%{ /* pure */
	char a;
        STAP_RETVALUE = (long)&a & (THREAD_SIZE-1);
%}

/**
 * sfunction addr - Address of the current probe point.
 *
 * Description: Returns the instruction pointer from the current probe's
 * register state.  Not all probe types have registers though, in which case
 * zero is returned.  The returned address is suitable for use with functions
 * like symname() and symdata().
 */
function addr:long ()
%{ /* pure */
  if (CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE) {
    STAP_RETVALUE = (intptr_t)(CONTEXT->uregs ? REG_IP(CONTEXT->uregs) : 0);
  } else {
    STAP_RETVALUE = (intptr_t)(CONTEXT->kregs ? REG_IP(CONTEXT->kregs) : 0);
  }
%}

/**
 * sfunction uaddr - User space address of current running task
 *
 * Description: Returns the address in userspace that the current
 * task was at when the probe occurred. When the current running task
 * isn't a user space thread, or the address cannot be found, zero
 * is returned. Can be used to see where the current task is combined
 * with usymname() or usymdata(). Often the task will be in the VDSO
 * where it entered the kernel.
 */
function uaddr:long ()
%{ /* pure */ /* myproc-unprivileged */
  struct pt_regs *uregs;

  if (CONTEXT->probe_flags & _STP_PROBE_STATE_USER_MODE)
    uregs = CONTEXT->uregs;
  else
    uregs = _stp_current_pt_regs();

  if (uregs)
    STAP_RETVALUE = (int64_t) REG_IP(uregs);
  else
    STAP_RETVALUE = 0;
%}


/**
 * sfunction probe_type - The low level probe handler type of the current probe.
 *
 * Description: Returns a short string describing the low level probe handler
 * type for the current probe point. This is for informational purposes only.
 * Depending on the low level probe handler different context functions can
 * or cannot provide information about the current event (for example some
 * probe handlers only trigger in user space and have no associated kernel
 * context). High-level probes might map to the same or different low-level
 * probes (depending on systemtap version and/or kernel used).
 */
function probe_type:string()
%{ /* pure */ /* unprivileged */
  switch (CONTEXT->probe_type)
  {
    case _STP_PROBE_HANDLER_BEEN:
      strlcpy (STAP_RETVALUE, "begin_end", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_ITRACE:
      strlcpy (STAP_RETVALUE, "itrace", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_MARKER:
      strlcpy (STAP_RETVALUE, "kernel_marker", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_PERF:
      strlcpy (STAP_RETVALUE, "perf_event", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_PROCFS:
      strlcpy (STAP_RETVALUE, "procfs", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_TIMER:
      strlcpy (STAP_RETVALUE, "timer", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_HRTIMER:
      strlcpy (STAP_RETVALUE, "hrtimer", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_PROFILE_TIMER:
      strlcpy (STAP_RETVALUE, "profile_timer", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_NETFILTER:
      strlcpy (STAP_RETVALUE, "netfilter", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_UTRACE:
      strlcpy (STAP_RETVALUE, "utrace", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_UTRACE_SYSCALL:
      strlcpy (STAP_RETVALUE, "utrace_syscall", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_KPROBE:
      strlcpy (STAP_RETVALUE, "kprobe", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_KRETPROBE:
      strlcpy (STAP_RETVALUE, "kretprobe", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_UPROBE:
      strlcpy (STAP_RETVALUE, "uprobe", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_URETPROBE:
      strlcpy (STAP_RETVALUE, "uretprobe", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_HWBKPT:
      strlcpy (STAP_RETVALUE, "hardware_data_breakpoint", MAXSTRINGLEN);
      break;
    case _STP_PROBE_HANDLER_TRACEPOINT:
      strlcpy (STAP_RETVALUE, "kernel_tracepoint", MAXSTRINGLEN);
      break;
    default:
      /* This should never happen. */
      snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
               "Unknown probe-type state %d", CONTEXT->probe_type);
      CONTEXT->last_error = CONTEXT->error_buffer;
      break;
  }
%}

/**
 * sfunction cmdline_args - Fetch command line arguments from current process
 * @n: First argument to get (zero is the command itself)
 * @m: Last argument to get (or minus one for all arguments after n)
 * @delim: String to use to delimit arguments when more than one.
 *
 * Description: Returns arguments from the current process starting
 * with argument number n, up to argument m. If there are less than n
 * arguments, or the arguments cannot be retrieved from the current
 * process, the empty string is returned. If m is smaller than n then
 * all arguments starting from argument n are returned. Argument zero
 * is traditionally the command itself.
 */
function cmdline_args:string(n:long, m:long, delim:string)
{
  args = "";
  mm = @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->mm;
  if (mm)
    {
      arg_start = @cast(mm, "mm_struct", "kernel<linux/sched.h>")->arg_start;
      arg_end = @cast(mm, "mm_struct", "kernel<linux/sched.h>")->arg_end;
      if (arg_start != 0 && arg_end != 0)
        {
          nr = 0;
          len = arg_end - arg_start;
          arg = user_string2(arg_start, "");
          while (len > 0)
            {
              if (nr == n)
                args = arg;
              else if (nr > n)
                {
                  if (arg == "")
                    args .= delim . "\"\""
                  else
                    args .= delim . arg;
                }

              arg_len = strlen(arg);
              arg_start += arg_len + 1;
              len -= arg_len + 1;
              if (len > 0 && nr != m)
                arg = user_string2(arg_start, "");
              else
                arg = "";
              nr++;
            }
        }
    }
  return args;
}

/**
 * sfunction cmdline_arg - Fetch a command line argument
 * @n: Argument to get (zero is the command itself)
 *
 * Description: Returns argument the requested argument from the
 * current process or the empty string when there are not that many
 * arguments or there is a problem retrieving the argument. Argument
 * zero is traditionally the command itself.
 */
function cmdline_arg:string(n:long)
{
  return cmdline_args(n, n, "");
}

/**
 * sfunction cmdline_str - Fetch all command line arguments from current process
 *
 * Description: Returns all arguments from the current process
 * delimited by spaces. Returns the empty string when the arguments
 * cannot be retrieved.
 */
function cmdline_str:string()
{
  return cmdline_args(0, -1, " ");
}

Anon7 - 2021