Today I was writing a script to dump out ACPI object names and required some embedded C in my SystemTap script to walk the ACPI namespace and this required a C callback function. However, inside the C callback I wanted to print the handle and name of the ACPI object but couldn't figure out how to use the native SystemTap print() functions from within embedded C code. So I crufted up a simple "HelloWorld" SystemTap script and ran it with -k to keep the temporary sources and then had a look at the automagically generated code.
It appears that SystemTap converts the script print statements into _stp_printf() C calls, so I just plugged these into my C callback instead of using printk(). Now my output goes via the underlying SystemTap print mechanism and appears on the tty rather than going to the kernel log. Bit of a hack, but the result is easy to use. I wish it was documented though.
Here is a sample of the original script to illustrate the point:
%{
#include <acpi/acpi.h>
static acpi_status dump_name(acpi_handle handle, u32 lvl, void *context, void **rv)
{
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER};
int *count = (int*)context;
if (!ACPI_FAILURE(acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer))) {
_stp_printf(" %lx %s\n", handle, (char*)buffer.pointer);
kfree(buffer.pointer);
(*count)++;
}
return AE_OK;
}
...
%}
_stp_printf and other runtime functions are not documented because we've never encouraged their use from embedded-C code. They may change from version to version, and in some cases be risky. So we've just been conservative.
ReplyDelete@fche,
ReplyDeleteIs is possible to allow some kind of mechanism like this which is accessible from an embedded C function? It would be useful!