diff --git a/common/protos/limine.c b/common/protos/limine.c index d23cbcf7..e1597e7d 100644 --- a/common/protos/limine.c +++ b/common/protos/limine.c @@ -267,6 +267,14 @@ uint64_t limine_term_write_ptr = 0; void limine_term_callback(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t); #endif +static uint64_t term_arg; +static void (*actual_callback)(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t); + +static void callback_shim(struct term_context *ctx, uint64_t a, uint64_t b, uint64_t c, uint64_t d) { + (void)ctx; + actual_callback(term_arg, a, b, c, d); +} + static void term_write_shim(uint64_t context, uint64_t buf, uint64_t count) { (void)context; _term_write(buf, count); @@ -696,16 +704,20 @@ FEAT_START fb = fbinfo; if (terminal_request->callback != 0) { + term->callback = callback_shim; + #if defined (__i386__) - term->callback = (void *)limine_term_callback; + actual_callback = (void *)limine_term_callback; limine_term_callback_ptr = terminal_request->callback; #elif defined (__x86_64__) || defined (__aarch64__) - term->callback = (void *)terminal_request->callback; + actual_callback = (void *)terminal_request->callback; #else #error Unknown architecture #endif } + term_arg = reported_addr(terminal); + #if defined (__i386__) if (limine_rt_stack == NULL) { limine_rt_stack = ext_mem_alloc(16384) + 16384;