summaryrefslogtreecommitdiffstats
path: root/tapset/conversions-guru.stp
blob: 9d662ce3427e5dfb8d12fa54b929b9b526f0d22a (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
126
127
128
129
130
131
132
133
134
135
// guru-mode conversions tapset
// Copyright (C) 2010 Red Hat Inc.
//
// 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 set_kernel_string - Writes a string to kernel memory.
 * @addr: The kernel address to write the string to.
 * @val: The string which is to be written.
 *
 * Description: Writes the given string to a given kernel
 * memory address. Reports an error on string copy fault.
 */
function set_kernel_string (addr:long, val:string) %{ /* guru */
  store_deref_string (THIS->val, THIS->addr, MAXSTRINGLEN);
  if (0) {
deref_fault: /* branched to from store_deref_string() */
    snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
        "kernel string copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
    CONTEXT->last_error = CONTEXT->error_buffer;
  }
%}

/**
 * sfunction set_kernel_string_n - Writes a string of given length to kernel memory.
 * @addr: The kernel address to write the string to.
 * @n: The maximum length of the string.
 * @val: The string which is to be written.
 *
 * Description: Writes the given string up to a maximum given length to a
 * given kernel memory address. Reports an error on string copy fault.
 */
function set_kernel_string_n (addr:long, n:long, val:string) %{ /* guru */
  int64_t len = clamp_t(int64_t, THIS->n + 1, 1, MAXSTRINGLEN);
  store_deref_string (THIS->val, THIS->addr, len);
  if (0) {
deref_fault: /* branched to from store_deref_string() */
    snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
        "kernel string copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
    CONTEXT->last_error = CONTEXT->error_buffer;
  }
%}

/**
 * sfunction set_kernel_long - Writes a long value to kernel memory.
 * @addr: The kernel address to write the long to.
 * @val: The long which is to be written.
 *
 * Description: Writes the long value to a given kernel memory address.
 * Reports an error when writing to the given address fails.
 */
function set_kernel_long (addr:long, val:long) %{ /* guru */
  kwrite((long *) (intptr_t) THIS->addr, THIS->val);
  if (0) {
deref_fault: /* branched to from kwrite() */
    snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
        "kernel long copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
    CONTEXT->last_error = CONTEXT->error_buffer;
  }
%}

/**
 * sfunction set_kernel_int - Writes an int value to kernel memory.
 * @addr: The kernel address to write the int to.
 * @val: The int which is to be written.
 *
 * Description: Writes the int value to a given kernel memory address.
 * Reports an error when writing to the given address fails.
 */
function set_kernel_int (addr:long, val:long) %{ /* guru */
  kwrite((int *) (intptr_t) THIS->addr, THIS->val);
  if (0) {
deref_fault: /* branched to from kwrite() */
    snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
        "kernel int copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
    CONTEXT->last_error = CONTEXT->error_buffer;
  }
%}

/**
 * sfunction set_kernel_short - Writes a short value to kernel memory.
 * @addr: The kernel address to write the short to.
 * @val: The short which is to be written.
 *
 * Description: Writes the short value to a given kernel memory address.
 * Reports an error when writing to the given address fails.
 */
function set_kernel_short (addr:long, val:long) %{ /* guru */
  kwrite((short *) (intptr_t) THIS->addr, THIS->val);
  if (0) {
deref_fault: /* branched to from kwrite() */
    snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
        "kernel short copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
    CONTEXT->last_error = CONTEXT->error_buffer;
  }
%}

/**
 * sfunction set_kernel_char - Writes a char value to kernel memory.
 * @addr: The kernel address to write the char to.
 * @val: The char which is to be written.
 *
 * Description: Writes the char value to a given kernel memory address.
 * Reports an error when writing to the given address fails.
 */
function set_kernel_char (addr:long, val:long) %{ /* guru */
  kwrite((char *) (intptr_t) THIS->addr, THIS->val);
  if (0) {
deref_fault: /* branched to from kwrite() */
    snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
        "kernel char copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
    CONTEXT->last_error = CONTEXT->error_buffer;
  }
%}

/**
 * sfunction set_kernel_pointer - Writes a pointer value to kernel memory.
 * @addr: The kernel address to write the pointer to.
 * @val: The pointer which is to be written.
 *
 * Description: Writes the pointer value to a given kernel memory address.
 * Reports an error when writing to the given address fails.
 */
function set_kernel_pointer (addr:long, val:long) %{ /* guru */
  kwrite((void **) (intptr_t) THIS->addr, THIS->val);
  if (0) {
deref_fault: /* branched to from kwrite() */
    snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
        "kernel pointer copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
    CONTEXT->last_error = CONTEXT->error_buffer;
  }
%}