/usr/share/systemtap/tapset/linux/conversions.stp is in systemtap-common 2.9-2ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 | // conversions tapset
// Copyright (C) 2005-2014 Red Hat Inc.
// Copyright (C) 2007 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 kernel_string - Retrieves string from kernel memory
* @addr: The kernel address to retrieve the string from
*
* Description: This function returns the null terminated C string
* from a given kernel memory address. Reports an error on string
* copy fault.
*/
function kernel_string:string (addr:long) %{ /* pure */
char *destination = STAP_RETVALUE;
kderef_string (destination, STAP_ARG_addr, MAXSTRINGLEN);
if (0) {
deref_fault: /* branched to from deref_string() */
/* Why '%1p' below? On newer kernels, the snprintf() function pads
* out '(null)' to the same width as other pointers, which looks
* really odd in the following error message. Setting a format
* width of '1' fixes this. */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel string copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
/**
* sfunction kernel_string2 - Retrieves string from kernel memory with alternative error string
* @addr: The kernel address to retrieve the string from
* @err_msg: The error message to return when data isn't available
*
* Description: This function returns the null terminated C string
* from a given kernel memory address. Reports the given error message
* on string copy fault.
*/
function kernel_string2:string (addr:long, err_msg:string) {
try { return kernel_string(addr) } catch { return err_msg }
}
/**
* sfunction kernel_string_quoted - Retrieves and quotes string from kernel memory
*
* @addr: the kernel memory address to retrieve the string from
*
* Description: Returns the null terminated C string from a given kernel
* memory address where any ASCII characters that are not printable are
* replaced by the corresponding escape sequence in the returned string. Note
* that the string will be surrounded by double quotes. If the kernel memory
* data is not accessible at the given address, the address itself is returned
* as a string, without double quotes.
*/
function kernel_string_quoted:string (addr:long)
%{ /* pure */
int rc = 0;
if (STAP_ARG_addr != 0)
rc = _stp_text_str(STAP_RETVALUE,
(char *)(uintptr_t)STAP_ARG_addr,
MAXSTRINGLEN, MAXSTRINGLEN, 1, 0);
if (STAP_ARG_addr == 0 || rc < 0)
snprintf(STAP_RETVALUE, MAXSTRINGLEN, "%p", (void *)(long)STAP_ARG_addr);
%}
/**
* sfunction kernel_string_n - Retrieves string of given length from kernel memory
* @addr: The kernel address to retrieve the string from
* @n: The maximum length of the string (if not null terminated)
*
* Description: Returns the C string of a maximum given length from a
* given kernel memory address. Reports an error on string copy fault.
*/
function kernel_string_n:string (addr:long, n:long) %{ /* pure */
char *destination = STAP_RETVALUE;
int64_t len = clamp_t(int64_t, STAP_ARG_n + 1, 1, MAXSTRINGLEN);
kderef_string (destination, STAP_ARG_addr, len);
if (0) {
deref_fault: /* branched to from deref_string() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel string copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
/**
* sfunction kernel_string_utf32 - Retrieves UTF-32 string from kernel memory
* @addr: The kernel address to retrieve the string from
*
* Description: This function returns a null terminated UTF-8 string converted
* from the UTF-32 string at a given kernel memory address. Reports an error on
* string copy fault or conversion error.
*/
function kernel_string_utf32:string (addr:long) %{ /* pure */
int rc = 0, len = MAXSTRINGLEN;
uint32_t c32, *source = (uint32_t*)(intptr_t)STAP_ARG_addr;
char *destination = STAP_RETVALUE;
*destination = '\0';
while (len > 1 && (c32 = kread(source))) {
if ((rc = _stp_convert_utf32(destination, len, c32)) <= 0) {
if (rc < 0) {
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"invalid UTF-32 character U+%X at 0x%p", c32, source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
break;
}
++source;
destination += rc;
len -= rc;
}
if (0) {
deref_fault: /* branched to from deref_string() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel string copy fault at 0x%p [man error::fault]", source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
/**
* sfunction kernel_string2_utf32 - Retrieves UTF-32 string from kernel memory with alternative error string
* @addr: The kernel address to retrieve the string from
* @err_msg: The error message to return when data isn't available
*
* Description: This function returns a null terminated UTF-8 string converted
* from the UTF-32 string at a given kernel memory address. Reports the given
* error message on string copy fault or conversion error.
*/
function kernel_string2_utf32:string (addr:long, err_msg:string) {
try { return kernel_string_utf32(addr) } catch { return err_msg }
}
/**
* sfunction kernel_string_utf16 - Retrieves UTF-16 string from kernel memory
* @addr: The kernel address to retrieve the string from
*
* Description: This function returns a null terminated UTF-8 string converted
* from the UTF-16 string at a given kernel memory address. Reports an error on
* string copy fault or conversion error.
*/
function kernel_string_utf16:string (addr:long) %{ /* pure */
int rc = 0, len = MAXSTRINGLEN;
uint32_t c32;
uint16_t c16low, *source = (uint16_t*)(intptr_t)STAP_ARG_addr;
char *destination = STAP_RETVALUE;
*destination = '\0';
while (len > 1 && (c32 = kread(source))) {
/* Check for a UTF-16 high surrogate, then its low pair, and combine them.
* Broken surrogates will just fall through to _stp_convert_utf32 and get
* flagged as an error there. (Or even allowed, if we decide to be lax.)
*/
if (c32 >= 0xD800 && c32 <= 0xDBFF) {
++source;
c16low = kread(source);
if (c16low >= 0xDC00 && c16low <= 0xDFFF)
c32 = 0x10000 + ((c32 & 0x3FF) << 10) + (c16low & 0x3FF);
else
--source;
}
if ((rc = _stp_convert_utf32(destination, len, c32)) <= 0) {
if (rc < 0) {
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"invalid UTF-16 character U+%X at 0x%p", c32, source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
break;
}
++source;
destination += rc;
len -= rc;
}
if (0) {
deref_fault: /* branched to from deref_string() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel string copy fault at 0x%p [man error::fault]", source);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
/**
* sfunction kernel_string2_utf16 - Retrieves UTF-16 string from kernel memory with alternative error string
* @addr: The kernel address to retrieve the string from
* @err_msg: The error message to return when data isn't available
*
* Description: This function returns a null terminated UTF-8 string converted
* from the UTF-16 string at a given kernel memory address. Reports the given
* error message on string copy fault or conversion error.
*/
function kernel_string2_utf16:string (addr:long, err_msg:string) {
try { return kernel_string_utf16(addr) } catch { return err_msg }
}
/**
* sfunction kernel_long - Retrieves a long value stored in kernel memory
* @addr: The kernel address to retrieve the long from
*
* Description: Returns the long value from a given kernel memory address.
* Reports an error when reading from the given address fails.
*/
function kernel_long:long (addr:long) %{ /* pure */
STAP_RETVALUE = kread((long *) (intptr_t) STAP_ARG_addr);
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel long copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
/**
* sfunction kernel_int - Retrieves an int value stored in kernel memory
* @addr: The kernel address to retrieve the int from
*
* Description: Returns the int value from a given kernel memory address.
* Reports an error when reading from the given address fails.
*/
function kernel_int:long (addr:long) %{ /* pure */
STAP_RETVALUE = kread((int *) (intptr_t) STAP_ARG_addr);
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel int copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
/**
* sfunction kernel_short - Retrieves a short value stored in kernel memory
* @addr: The kernel address to retrieve the short from
*
* Description: Returns the short value from a given kernel memory address.
* Reports an error when reading from the given address fails.
*/
function kernel_short:long (addr:long) %{ /* pure */
STAP_RETVALUE = kread((short *) (intptr_t) STAP_ARG_addr);
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel short copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
/**
* sfunction kernel_char - Retrieves a char value stored in kernel memory
* @addr: The kernel address to retrieve the char from
*
* Description: Returns the char value from a given kernel memory address.
* Reports an error when reading from the given address fails.
*/
function kernel_char:long (addr:long) %{ /* pure */
STAP_RETVALUE = kread((char *) (intptr_t) STAP_ARG_addr);
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel char copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
/**
* sfunction kernel_pointer - Retrieves a pointer value stored in kernel memory
* @addr: The kernel address to retrieve the pointer from
*
* Description: Returns the pointer value from a given kernel memory
* address. Reports an error when reading from the given address
* fails.
*/
function kernel_pointer:long (addr:long) %{ /* pure */
STAP_RETVALUE = (uintptr_t) kread((void **) (uintptr_t) STAP_ARG_addr);
if (0) {
deref_fault: /* branched to from kread() */
snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
"kernel pointer copy fault at 0x%p [man error::fault]", (void *) (uintptr_t) STAP_ARG_addr);
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
|