blob: aa39b757f7c0d16df72081294d12fab3d1aee280 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1
/*
* Copyright (C) 2022, VMware, Tzvetomir Stoyanov <tz.stoyanov@gmail.com>
*
*/
#include <stdlib.h>
#include <errno.h>
#include "tracefs.h"
#include "tracefs-local.h"
#define UPROBE_DEFAULT_GROUP "uprobes"
static struct tracefs_dynevent *
uprobe_alloc(enum tracefs_dynevent_type type, const char *system, const char *event,
const char *file, unsigned long long offset, const char *fetchargs)
{
struct tracefs_dynevent *kp;
char *target;
if (!event || !file) {
errno = EINVAL;
return NULL;
}
if (!system)
system = UPROBE_DEFAULT_GROUP;
if (asprintf(&target, "%s:0x%0*llx", file, (int)(sizeof(void *) * 2), offset) < 0)
return NULL;
kp = dynevent_alloc(type, system, event, target, fetchargs);
free(target);
return kp;
}
/**
* tracefs_uprobe_alloc - Allocate new user probe (uprobe)
* @system: The system name (NULL for the default uprobes)
* @event: The name of the event to create
* @file: The full path to the binary file, where the uprobe will be set
* @offset: Offset within the @file
* @fetchargs: String with arguments, that will be fetched with the uprobe
*
* Allocate new uprobe context that will be in the @system group
* (or uprobes if @system is NULL) and with @event name. The new uprobe will be
* attached to @offset within the @file. The arguments described in @fetchargs
* will fetched with the uprobe. See linux/Documentation/trace/uprobetracer.rst
* for more details.
*
* The uprobe is not created in the system.
*
* Return a pointer to a uprobe context on success, or NULL on error.
* The returned pointer must be freed with tracefs_dynevent_free()
*
*/
struct tracefs_dynevent *
tracefs_uprobe_alloc(const char *system, const char *event,
const char *file, unsigned long long offset, const char *fetchargs)
{
return uprobe_alloc(TRACEFS_DYNEVENT_UPROBE, system, event, file, offset, fetchargs);
}
/**
* tracefs_uretprobe_alloc - Allocate new user return probe (uretprobe)
* @system: The system name (NULL for the default uprobes)
* @event: The name of the event to create
* @file: The full path to the binary file, where the uretprobe will be set
* @offset: Offset within the @file
* @fetchargs: String with arguments, that will be fetched with the uretprobe
*
* Allocate mew uretprobe context that will be in the @system group
* (or uprobes if @system is NULL) and with @event name. The new uretprobe will
* be attached to @offset within the @file. The arguments described in @fetchargs
* will fetched with the uprobe. See linux/Documentation/trace/uprobetracer.rst
* for more details.
*
* The uretprobe is not created in the system.
*
* Return a pointer to a uretprobe context on success, or NULL on error.
* The returned pointer must be freed with tracefs_dynevent_free()
*
*/
struct tracefs_dynevent *
tracefs_uretprobe_alloc(const char *system, const char *event,
const char *file, unsigned long long offset, const char *fetchargs)
{
return uprobe_alloc(TRACEFS_DYNEVENT_URETPROBE, system, event, file, offset, fetchargs);
}