:: commit d65d180c0d10624e9777a324a7ca5e4b640c2d50

mintsuki <mintsuki@protonmail.com> — 2022-10-04 19:53

parents: dddcf34a8c

limine: Reimplement proper callback functionality

diff --git a/common/protos/limine.c b/common/protos/limine.c
index 3144c176..6d2a75f6 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;
tab: 248 wrap: offon