> Followup to: <Pine.GSO.4.44.0203191111320.20995-100000@speedy>
> By author: Matthias Scheidegger <firstname.lastname@example.org>
> In newsgroup: linux.dev.kernel
> > I've got the following problem: I want to register a callback in a kernel
> > structure, but I need to supply an additional argument to my own code. I.e. I
> > need a callback
> > int (*cb)(int u)
> > to really call
> > int (*real_cb)(int u, void* my_arg)
> > At the moment, I'm only focussing on the i386 architecture.
> > In user space, I'd do this by generating some machine code, which takes the
> > original args, pushes my_fixed_arg and calls real_cb (using mprotect to make
> > the generated code callable). That way I'd use a function
> > int (*)(int) create_callback(int (*real_cb)(int, void*), void *arg);
> > Is there a good way to do that in the kernel?
> > Not necessarily using self modifying code, I'll only use it if I must.
> In general, it's impossible. On a lot of architectures, it happens to
> "just work" with the appropriate cast, but that's completely dependent
> on the ABI.
> The extra arguemnt, of course, contains garbage.
static void *my_fixed_arg;
int temp_cb(int u)
return real_cb(u, my_fixed_arg);
Generally works. The variant that builds that code on the fly for
create_callback is a little more interesting of course.
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to email@example.com
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/