1/* Copyright (C) 2021 Free Software Foundation, Inc. 2 Contributed by Oracle. 3 4 This file is part of GNU Binutils. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21#ifndef _COLLECTOR_MODULE_H 22#define _COLLECTOR_MODULE_H 23 24#include <sys/types.h> 25#include <stdarg.h> 26#include <stdio.h> 27#include <unistd.h> 28#include <dirent.h> 29 30#include "gp-defs.h" 31 32struct stat; 33struct tm; 34 35#define COLLECTOR_MODULE_ERR ((CollectorModule)-1) 36 37/* ------- libc interface ----------------- */ 38/* the fields in this structure are in alphabetical order. 39 * If you add any, please put it in the right place */ 40typedef struct CollectorUtilFuncs 41{ 42 int (*access)(); 43 int (*atoi)(const char *nptr); 44 void *(*calloc)(size_t nelem, size_t elsize); 45 int (*clearenv)(void); 46 int (*close)(int); 47 int (*closedir)(); 48 int (*execv)(const char *path, char *const argv[]); 49 void (*exit)(int status); 50 int (*fclose)(FILE *stream); 51 int (*fcntl)(int fd, int cmd, ...); 52 char *(*fgets)(char *s, int n, FILE *stream); 53 FILE *(*fopen)(const char *filename, const char *mode); 54 pid_t (*vfork)(); 55 int (*fprintf)(FILE *stream, const char *format, ...); 56 void (*free)(void *ptr); 57 int (*fstat)(int fd, struct stat *buf); 58 int (*getcpuid)(); 59 char *(*getcwd)(char *buf, size_t size); 60 char *(*getenv)(const char *name); 61 struct tm *(*gmtime_r)(const time_t *clock, struct tm *res); 62 int (*ioctl)(int d, int request, ...); 63 off_t (*lseek)(int fd, off_t offset, int whence); 64 void *(*malloc)(size_t size); 65 void *(*memset)(void *s1, int c, size_t n); 66 int (*mkdir)(); 67 time_t (*mktime)(struct tm *timeptr); 68 void *(*mmap)(void *, size_t, int, int, int, off_t); 69 void *(*mmap64)(); 70 int (*munmap)(); 71 int (*open)(const char *, int, ...); 72 int (*open_bare)(const char *, int, ...); 73 DIR *(*opendir)(); 74 int (*pclose)(FILE *stream); 75 FILE *(*popen)(const char *command, const char *mode); 76 int (*putenv)(char *string); 77 ssize_t (*pwrite)(); 78 ssize_t (*pwrite64)(); 79 ssize_t (*read)(); 80 int (*setenv)(const char *name, const char *value, int overwrite); 81 int (*sigfillset)(sigset_t *set); 82 int (*sigprocmask)(int how, const sigset_t *set, sigset_t *oldset); 83 int (*snprintf)(char *str, size_t size, const char *format, ...); 84 int (*stack_getbounds)(); 85 char *(*strchr)(const char *name, int c); 86 int (*strcmp)(const char *s1, const char *s2); 87 int (*strcpy)(const char *s1, const char *s2); 88 char *(*libc_strdup)(const char *s1); // Don't use "strdup" because it is a macro in gcc 89 char *(*strerror)(int errnum); 90 int (*strerror_r)(int errnum, char *strerrbuf, size_t buflen); 91 size_t (*strlcat)(char *dest, const char *src, size_t dstsize); 92 size_t (*strlcpy)(char *dest, const char *src, size_t dstsize); 93 size_t (*strlen)(const char *string); 94 int (*strncmp)(const char *s1, const char *s2, size_t n); 95 size_t (*strncpy)(char *dst, const char *src, size_t dstsize); 96 size_t (*strspn)(const char *s1, const char *s2); 97 char *(*strrchr)(const char *name, int c); 98 char *(*strstr)(const char *s1, const char *s2); 99 long int (*strtol)(const char *nptr, char **endptr, int base); 100 long long int (*strtoll)(const char *nptr, char **endptr, int base); 101 unsigned long int (*strtoul)(const char *nptr, char **endptr, int base); 102 unsigned long long int (*strtoull)(const char *nptr, char **endptr, int base); 103 int (*symlink)(const char *s1, const char *s2); 104 int (*syscall)(int number, ...); 105 long (*sysconf)(int name); 106 long (*sysinfo)(int command, char *buf, long count); 107 time_t (*time)(time_t *tloc); 108 int (*unsetenv)(const char *name); 109 int (*vsnprintf)(char *str, size_t size, const char *format, va_list ap); 110 pid_t (*waitpid)(pid_t pid, int *stat_loc, int options); 111 ssize_t (*write)(); 112 double (*atof)(); 113 void *n_a; 114} CollectorUtilFuncs; 115 116extern CollectorUtilFuncs __collector_util_funcs; 117extern int __collector_dlsym_guard; 118 119#define CALL_UTIL(x) __collector_util_funcs.x 120 121/* The following constants define the meaning of the "void *arg" 122 * argument of getFrameInfo(). 123 */ 124/* arg is a pointer to ucontext_t, walk the stack described by it */ 125#define FRINFO_FROM_UC 1 126/* walk the current stack starting from the frame containing arg */ 127#define FRINFO_FROM_STACK 2 128/* walk the current stack starting from the caller of the frame containing arg */ 129#define FRINFO_FROM_STACK_ARG 3 130/* arg is a pc, process a stack containing just that pc */ 131#define FRINFO_FROM_PC 4 132/* arg is of type CM_Array describing a stack image */ 133#define FRINFO_FROM_ARRAY 5 134#define FRINFO_NO_OMP_INFO 0x80000000 135#define FRINFO_NO_WALK 0x40000000 136 137typedef struct CM_Array 138{ 139 unsigned int length; /* in bytes, not including length */ 140 void *bytes; 141} CM_Array; 142 143// Interface with libcollector.so: 144typedef enum 145{ 146 SP_ORIGIN_FORK = -1, 147 SP_ORIGIN_LIBCOL_INIT = 0, 148 SP_ORIGIN_DBX_ATTACH = 1, 149 SP_ORIGIN_GENEXP = 2, 150 SP_ORIGIN_KERNEL = 3, 151 SP_ORIGIN_DTRACE = 4, 152 SP_ORIGIN_COLLECT = 5 153} sp_origin_t; 154 155struct Heap; 156struct Common_packet; 157struct CM_Packet; 158struct ModuleInterface; 159 160typedef long long HiResTime; 161typedef int CollectorModule; 162typedef unsigned long long FrameInfo; 163typedef struct CollectorInterface 164{ 165 /* General services */ 166 CollectorModule (*registerModule)(struct ModuleInterface*); 167 const char *(*getParams)(); 168 const char *(*getExpDir)(); 169 int (*writeLog)(char *format, ...); 170 FrameInfo (*getFrameInfo)(CollectorModule modl, HiResTime ts, int mode, void *arg); 171 FrameInfo (*getUID)(CM_Array *arg); 172 FrameInfo (*getUID2)(CM_Array *arg, FrameInfo uid); 173 int (*getStackTrace)(void *buf, int size, void *bptr, void *eptr, void *arg); 174 int (*writeMetaData)(CollectorModule modl, char *format, ...); 175 176 /* writeDataRecord ensures that the header is filled in, and then calls writeDataPacket */ 177 int (*writeDataRecord)(CollectorModule modl, struct Common_packet *pckt); 178 int (*writeDataPacket)(CollectorModule modl, struct CM_Packet *pckt); 179 void (*write_sample)(char *name); 180 void (*get_progspec)(char *retstr, int tmp_sz, char *namestr, int name_sz); 181 int (*open_experiment)(const char *exp, const char *params, sp_origin_t origin); 182 HiResTime (*getHiResTime)(); 183 184 /* Dynamic memory allocation service */ 185 struct Heap *(*newHeap)(); 186 void (*deleteHeap)(struct Heap *heap); 187 void *(*allocCSize)(struct Heap *heap, unsigned sz, int log); 188 void (*freeCSize)(struct Heap *heap, void *ptr, unsigned sz); 189 void *(*allocVSize)(struct Heap *heap, unsigned sz); 190 void *(*reallocVSize)(struct Heap *heap, void *ptr, unsigned newsz); 191 192 /* Thread specific data service */ 193 unsigned (*createKey)(size_t sz, void (*init)(void*), void (*fini)(void*)); 194 void *(*getKey)(unsigned key); 195 196 /* Debugging services */ 197 void (*writeDebugInfo)(int, int, char *, ...) __attribute__ ((format (printf, 3, 4))); 198} CollectorInterface; 199 200typedef struct ModuleInterface 201{ 202 char *description; 203 int (*initInterface)(CollectorInterface*); 204 int (*openExperiment)(const char *); 205 int (*startDataCollection)(); 206 int (*stopDataCollection)(); 207 int (*closeExperiment)(); 208 int (*detachExperiment)(); /* called from fork-child before openExperiment() */ 209} ModuleInterface; 210 211typedef CollectorModule (*RegModuleFunc)(ModuleInterface*); 212typedef void (*ModuleInitFunc)(CollectorInterface*); 213 214#ifdef __cplusplus 215extern "C" 216{ 217#endif 218 CollectorModule __collector_register_module (ModuleInterface *modint); 219#ifdef __cplusplus 220} 221#endif 222 223#ifdef __has_attribute 224# if __has_attribute (__symver__) 225# define SYMVER_ATTRIBUTE(sym, symver) \ 226 __attribute__ ((__symver__ (#symver))) 227# endif 228#endif 229#ifndef SYMVER_ATTRIBUTE 230# define SYMVER_ATTRIBUTE(sym, symver) \ 231 __asm__(".symver " #sym "," #symver); 232#endif 233 234#endif /* _COLLECTOR_MODULE_H */ 235