Followup to: <Pine.GSO.4.44.0203191111320.20995-100000@speedy>
By author: Matthias Scheidegger <mscheid@iam.unibe.ch>
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.
-hpa
-- <hpa@transmeta.com> at work, <hpa@zytor.com> in private! "Unix gives you enough rope to shoot yourself in the foot." http://www.zytor.com/~hpa/puzzle.txt <amsp@zytor.com> - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
This archive was generated by hypermail 2b29 : Sat Mar 23 2002 - 22:00:19 EST