Messages in this thread | | | Subject | Re: extending callbacks? | From | (Eric W. Biederman) | Date | 20 Mar 2002 08:55:08 -0700 |
| |
"H. Peter Anvin" <hpa@zytor.com> writes:
> 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.
???
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.
Eric
- 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/
| |