This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: Calling systemtap function from pure code
- From: Daniel Doron <danielmeirdoron at gmail dot com>
- To: Arkady <arkady dot miasnikov at gmail dot com>
- Cc: David Smith <dsmith at redhat dot com>, systemtap at sourceware dot org
- Date: Thu, 14 Sep 2017 10:46:36 +0300
- Subject: Re: Calling systemtap function from pure code
- Authentication-results: sourceware.org; auth=none
- References: <CAFwN=+zcORJkmRWuGUySAtQTkDzdcBuEoQzC5QRmatQrhJW6uA@mail.gmail.com> <CAKFOr-atnUAZs1bneU2gCCV1gTafDkToK4-AuidCVYfSpMMfeQ@mail.gmail.com> <CAFwN=+y6R75c4iL89sMxbrO0zZr5SbtTegafdDEUtO-ffqZNhA@mail.gmail.com> <CANA-60rSWx=EiBZ+Wq7azQ-9=RqcrdSg=wy1z9Ze_CWRnyBaAA@mail.gmail.com>
Hi Arkady,
not what I meant but does provide an answer to another problem I was
having ;-) Thanks.
On Thu, Sep 14, 2017 at 10:40 AM, Arkady <arkady.miasnikov@gmail.com> wrote:
> I read your e-mail a couple of times and probably I got it. You
> want to know inside the systemtap script some details about the kernel
> module the script is part of.
>
> The easiest way to do this is to load a non-STAP kernel module which
> contains a data structure with all the data. The steps:
> * Load the stap driver, make sure that probe begin blocks until there
> is an exported variable "Daniel" in the kernel and the value of the
> variable is True.
> * Collect the data you need from the user space, insmod a small kernel
> module with the data, collect more data from the kernel if needed, set
> the exported variable to True.
> * At this point probe begin discovers an exported variable "Daniel"
> and can continue.
>
>
> If the kernel keeps the relevant data somewhere "probe begin" can try
> to fetch the data from the kernel.
>
> On Thu, Sep 14, 2017 at 10:20 AM, Daniel Doron
> <danielmeirdoron@gmail.com> wrote:
>> I will explain....
>> i wanted to get as much info on kernel module insertion/removal but
>> the init_module/delete_module probe points do not provide enough
>> information. So , I thought about load_module() which does provide
>> adequate info via struct module (local var), but this gets filled
>> along the way and I can;t really have access to it via systemtap. So I
>> thought the simplest way to access that struct is though notification
>> chain, i.e. use register_module_notifier() and extract the info from
>> the struct there and then print it via systemtap.
>> So I guess the right question would be how to access the STAP print
>> function/mechanism/buffer...from standard kernel code.
>>
>> Thanks.
>>
>> On Thu, Sep 14, 2017 at 12:22 AM, David Smith <dsmith@redhat.com> wrote:
>>> On Wed, Sep 13, 2017 at 9:41 AM, Daniel Doron <danielmeirdoron@gmail.com> wrote:
>>>> Hi,
>>>>
>>>> Is it possible to call a stap function from kernel code (guru mode)?
>>>
>>> No, not really.
>>>
>>> Yes, all stap language functions get translated to a C function.
>>> However, you can't call that function easily, for several reasons:
>>>
>>> 1) The stap language function name gets mangled when it gets
>>> translated to C. That mangling isn't documented and changes from time
>>> to time. The last time it changed was when we implemented function
>>> overloading. We have no plans to document the current mangling scheme
>>> (you could certainly figure it out looking at the generated output)
>>> and we reserve the right to change the mangling scheme in the future.
>>>
>>> 2) Even if you know the correct C function name for a stap language
>>> function, you can't easily call it. Function parameters aren't passed
>>> on the stack, they are passed in a context structure, which once again
>>> is undocumented and subject to change.
>>>
>>> I'm not really sure what you are really trying to do here, but if you
>>> need to call common code from a stap language function and a C
>>> function, I'd put that functionality in a C function, then write a
>>> stap language wrapper for it. Something like the following (untested):
>>>
>>> ====
>>> %{
>>>
>>> int internal_log_event(char *str)
>>> {
>>> printk(KERN_INFO "name: %s\n", str);
>>> return 0;
>>> }
>>>
>>> %}
>>>
>>> function log_event:long(str:string)
>>> %{
>>> STAP_RETVALUE = internal_log_event(STAP_ARG_str);
>>> %}
>>>
>>> function call_me()
>>> {
>>> log_event("hello world")
>>> }
>>>
>>> probe begin {
>>> call_me()
>>> }
>>> ====
>>>
>>> Note that the STAP_ARG_ function argument prefix and STAP_RETVALUE
>>> item are documented and are supported.
>>>
>>> If this doesn't answer your question, you'll need to let us know what
>>> you are really trying to do.
>>>
>>> --
>>> David Smith
>>> Principal Software Engineer
>>> Red Hat