// context tapset
// Copyright (C) 2005-2009 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.
/**
* sfunction print_regs - Print a register dump.
*/
function print_regs () %{
if (CONTEXT->regs) {
_stp_print_regs (CONTEXT->regs);
}
%}
/**
* sfunction execname - Execname of current processes
*
* Return the name of the current process.
*/
function execname:string () %{ /* pure */
strlcpy (THIS->__retvalue, current->comm, MAXSTRINGLEN);
%}
/**
* sfunction pid - Process ID of current process
*
*
* Return the id of the current process.
*/
function pid:long () %{ /* pure */
THIS->__retvalue = current->tgid;
%}
/**
* sfunction tid - Thread ID of current process
*
* Return the id of the current thread.
*/
function tid:long () %{ /* pure */
THIS->__retvalue = current->pid;
%}
/**
* sfunction ppid - Parent Process ID of current process
*
* Return the id of the parent process.
*/
function ppid:long () %{ /* pure */
#if defined(STAPCONF_REAL_PARENT)
THIS->__retvalue = current->real_parent->tgid;
#else
THIS->__retvalue = current->parent->tgid;
#endif
%}
/**
* sfunction pexecname - Execname of the parent process.
*
* Return the name of the parent process.
*/
function pexecname:string () %{ /* pure */
#if defined(STAPCONF_REAL_PARENT)
strlcpy (THIS->__retvalue, current->real_parent->comm, MAXSTRINGLEN);
#else
strlcpy (THIS->__retvalue, current->parent->comm, MAXSTRINGLEN);
#endif
%}
/**
* sfunction gid - Group ID of current process
*
* Return the gid of the current process.
*/
function gid:long () %{ /* pure */
#ifdef STAPCONF_TASK_UID
THIS->__retvalue = current->gid;
#else
THIS->__retvalue = current_gid();
#endif
%}
/**
* sfunction egid - Effective gid of the current process.
*
* Return the effective gid of the current process.
*/
function egid:long () %{ /* pure */
#ifdef STAPCONF_TASK_UID
THIS->__retvalue = current->egid;
#else
THIS->__retvalue = current_egid();
#endif
%}
/**
* sfunction uid -User ID of the current process.
*
* Return the uid of the current process.
*/
function uid:long () %{ /* pure */
#ifdef STAPCONF_TASK_UID
THIS->__retvalue = current->uid;
#else
THIS->__retvalue = current_uid();
#endif
%}
/**
* sfunction euid - Effective User ID of the current process.
*
* Return the effective uid of the current process.
*/
function euid:long () %{ /* pure */
#ifdef STAPCONF_TASK_UID
THIS->__retvalue = current->euid;
#else
THIS->__retvalue = current_euid();
#endif
%}
// cpuid() is not documented
function cpuid:long () %{ /* pure */
THIS->__retvalue = smp_processor_id();
%}
/**
* sfunction cpu - The current cpu number.
*
* Return the current cpu number.
*/
function cpu:long () %{ /* pure */
THIS->__retvalue = smp_processor_id();
%}
/**
* sfunction pp - Current probe point
*
* Return the probe point associated with the currently running
* probe handler, including alias and wildcard expansion effects.
*/
function pp:string () %{ /* pure */
strlcpy (THIS->__retvalue, CONTEXT->probe_point, MAXSTRINGLEN);
%}
/**
* sfunction registers_valid - Register information valid
*
* Return 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 */
THIS->__retvalue = (CONTEXT->regs != NULL);
%}
/**
* sfunction user_mode - User Mode
*
* Return 1 if the probe point occurred in user-mode.
*/
function user_mode:long () %{ /* pure */ /* currently a user-mode address? */
if (CONTEXT->regs) {
#if defined(__i386__) || defined(__x86_64__)
THIS->__retvalue = (uint64_t) user_mode_vm (CONTEXT->regs);
#else
THIS->__retvalue = (uint64_t) user_mode (CONTEXT->regs);
#endif
} else {
THIS->__retvalue = 0;
}
%}
/**
* sfunction is_return - Is return probe
*
* Return 1 if the probe point is a return probe.
* Deprecated.
*/
function is_return:long () %{ /* pure */
if (CONTEXT->pi)
THIS->__retvalue = 1;
else
THIS->__retvalue = 0;
%}
/**
* sfunction target - Target pid
*
* Return the pid of the target process.
*/
function target:long () %{ /* pure */
THIS->__retvalue = _stp_target;
%}
///
/// module_name:string()
/// module_name
///
/// FIXME: need description.
///
///
function module_name:string () %{ /* pure */
strlcpy(THIS->__retvalue, THIS_MODULE->name, MAXSTRINGLEN);
%}
///
/// stp_pid:long()
/// stp_pid
///
/// FIXME: need description.
///
///
function stp_pid:long () %{ /* pure */
THIS->__retvalue = _stp_pid;
%}
/**
* sfunction stack_size - Size of kernel stack
*
* Return the size of the kernel stack.
*/
function stack_size:long () %{ /* pure */
THIS->__retvalue = THREAD_SIZE;
%}
/**
* sfunction stack_used - Current amount of kernel stack used
*
* Return how many bytes are currently used in the kernel stack.
*/
function stack_used:long () %{ /* pure */
char a;
THIS->__retvalue = THREAD_SIZE - ((long)&a & (THREAD_SIZE-1));
%}
/**
* sfunction stack_unused - Amount of kernel stack currently available
*
* Return how many bytes are currently available in the kernel stack.
*/
function stack_unused:long () %{ /* pure */
char a;
THIS->__retvalue = (long)&a & (THREAD_SIZE-1);
%}