summaryrefslogtreecommitdiffstats
path: root/runtime/docs/examples/template.c
blob: 244bd39f5bffd2348642c27c34f47d72d63f1b8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* Framework for new probes using the runtime */
/* this example shows both kprobes and jprobes although you */
/* likely will only want one. */

/* define this if you don't want to use relayfs.  Normally */
/* you want relayfs, unless you need a realtime stream of data */

#define STP_NETLINK_ONLY

/* How many strings to allocate. see strings.c. Default is 0. */
#define STP_NUM_STRINGS 1

/* maximum size for a string. default is 2048 */
#define STP_STRING_SIZE 2048

/* size of strings saved in maps */
#define MAP_STRING_LENGTH 256

/* width of histograms. Default 50 */
#define HIST_WIDTH 50

/* always include this.  Put all non-map defines above it. */
#include "runtime.h"

/* These are the possible values a map can have. */
/* Comment out unused ones. Comment out all if you don't need maps. */
#define NEED_INT64_VALS
#define NEED_STRING_VALS
#define NEED_STAT_VALS

/* now for each set of keys, define the key type and include map-keys.c */
/* This define a single key of int64, for example map1[2048] */
#define KEY1_TYPE INT64
#include "map-keys.c"

/* This generates code to handle keys of int64,string, for example */
/* map2[1000,"Cobalt"] */
#define KEY1_TYPE INT64
#define KEY2_TYPE STRING
#include "map-keys.c"

/* After defining all your key combinations, include map.c */
#include "map.c"

/* include if you use lists */
#include "list.c"

/* include if you use copy_from_user functions */
#include "copy.c"

/* include if you use the _stp_register_probe functions */
#include "probes.c"

MODULE_DESCRIPTION("SystemTap probe: myname");
MODULE_AUTHOR("Me <myname@nowhere.com>");

/* here is an example jprobe instrumentation function. */
/* jprobes require a prototype matching the probed function. */

static int inst_meminfo_read_proc(char *page, char **start, off_t off,
                                 int count, int *eof, void *data)
{
  _stp_print("Now in meminfo\n");
  _stp_stack_printj();
  _stp_ustack_print();
  jprobe_return();
  return 0;
}

/* here is an example kprobe. kprobes always take the same arguments */
static int inst_uptime_read_proc(struct kprobe *p, struct pt_regs *regs)
{
  _stp_stack_print(regs);
  _stp_ustack_print();
  return 0;
}

/* put jprobes here */
static struct jprobe jp[] = {
  {
    .kp.addr = (kprobe_opcode_t *)"meminfo_read_proc",
    .entry = (kprobe_opcode_t *) inst_meminfo_read_proc
  },
};

/* put kprobes here */
static struct kprobe kp[] = {
  {
    .addr = "uptime_read_proc",
    .pre_handler = inst_uptime_read_proc,
  }
};

#define NUM_JPROBES (sizeof(jp)/sizeof(struct jprobe))
#define NUM_KPROBES (sizeof(kp)/sizeof(struct kprobe))

/* called when the module loads. */
int probe_start(void)
{
  /* initialize any data or variables */


  /* register any jprobes */
  int ret = _stp_register_jprobes (jp, NUM_JPROBES);

  /* Register any kprobes and jprobes. */
  /* You probably only have one type */
  if (ret >= 0)
    if ((ret = _stp_register_kprobes (kp, NUM_KPROBES)) < 0)
      _stp_unregister_jprobes (jp, NUM_JPROBES);

  return ret;
}


void probe_exit (void)
{
  /* unregister the probes */
  _stp_unregister_jprobes (jp, NUM_JPROBES);
  _stp_unregister_kprobes (kp, NUM_KPROBES);

  /* print out any colledted data, etc */
  _stp_printf ("whatever I want to say\n");
  _stp_print_flush();
}
opt">, longlabel, device) in chainList: if ((not label) or (label == "")): continue try: (fsType, sl, path, other) = lilo.getImage(label) lilo.delImage(label) except IndexError: sl = LiloConfigFile(imageType = "other", path = "/dev/%s" %(device)) sl.addEntry("optional") sl.addEntry("label", label) lilo.addImage (sl) # Sanity check #1. There could be aliases in sections which conflict # with the new images we just created. If so, erase those aliases imageNames = {} for label in lilo.listImages(): imageNames[label] = 1 for label in lilo.listImages(): (fsType, sl, path, other) = lilo.getImage(label) if sl.testEntry('alias'): alias = sl.getEntry('alias') if imageNames.has_key(alias): sl.delEntry('alias') imageNames[alias] = 1 # Sanity check #2. If single-key is turned on, go through all of # the image names (including aliases) (we just built the list) and # see if single-key will still work. if lilo.testEntry('single-key'): singleKeys = {} turnOff = 0 for label in imageNames.keys(): l = label[0] if singleKeys.has_key(l): turnOff = 1 singleKeys[l] = 1 if turnOff: lilo.delEntry('single-key') return lilo def writeChandevConf(self, bl, instroot): # S/390 only cf = "/etc/chandev.conf" self.perms = 0644 if bl.args.chandevget(): fd = os.open(instroot + "/etc/chandev.conf", os.O_WRONLY | os.O_CREAT) os.write(fd, "noauto\n") for cdev in bl.args.chandevget(): os.write(fd,'%s\n' % cdev) os.close(fd) return "" def writeZipl(self, instRoot, bl, kernelList, chainList, defaultDev, justConfigFile): rootDev = self.storage.fsset.rootDevice cf = '/etc/zipl.conf' self.perms = 0600 if os.access (instRoot + cf, os.R_OK): self.perms = os.stat(instRoot + cf)[0] & 0777 os.rename(instRoot + cf, instRoot + cf + '.rpmsave') f = open(instRoot + cf, "w+") f.write('[defaultboot]\n') f.write('default=' + kernelList[0][0] + '\n') f.write('target=%s\n' % (self.kernelLocation)) cfPath = "/boot/" for (label, longlabel, version) in kernelList: kernelTag = "-" + version kernelFile = "%svmlinuz%s" % (cfPath, kernelTag) initrd = self.makeInitrd(kernelTag, instRoot) f.write('[%s]\n' % (label)) f.write('\timage=%s\n' % (kernelFile)) if initrd: f.write('\tramdisk=%s%s\n' %(self.kernelLocation, initrd)) realroot = rootDev.fstabSpec f.write('\tparameters="root=%s' %(realroot,)) if bl.args.get(): f.write(' %s' % (bl.args.get())) f.write('"\n') f.close() if not justConfigFile: rc = iutil.execWithRedirect("/sbin/zipl", [], root = instRoot, stdout = "/dev/stdout", stderr = "/dev/stderr") if rc: return rc return 0 def write(self, instRoot, bl, kernelList, chainList, defaultDev, justConfig): rc = self.writeZipl(instRoot, bl, kernelList, chainList, defaultDev, justConfig | (not self.useZiplVal)) if rc: return rc return self.writeChandevConf(bl, instRoot) def __init__(self, instData): bootloaderInfo.__init__(self, instData) self.useZiplVal = 1 # only used on s390 self.kernelLocation = "/boot/" self.configfile = "/etc/zipl.conf"