Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137237466
D44306.id137495.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D44306.id137495.diff
View Options
diff --git a/sys/compat/linuxkpi/common/include/linux/module.h b/sys/compat/linuxkpi/common/include/linux/module.h
--- a/sys/compat/linuxkpi/common/include/linux/module.h
+++ b/sys/compat/linuxkpi/common/include/linux/module.h
@@ -32,6 +32,8 @@
#include <sys/types.h>
#include <sys/param.h>
#include <sys/module.h>
+#include <sys/queue.h>
+#include <sys/linker.h>
#include <linux/list.h>
#include <linux/compiler.h>
@@ -51,7 +53,22 @@
#define MODULE_SUPPORTED_DEVICE(name)
#define MODULE_IMPORT_NS(_name)
-#define THIS_MODULE ((struct module *)0)
+/*
+ * THIS_MODULE is used to differentiate modules on Linux. We currently
+ * completely stub out any Linux struct module usage, but THIS_MODULE is still
+ * used to populate the "owner" fields of various drivers. Even though we
+ * don't actually dereference these "owner" fields they are still used by
+ * drivers to check if devices/dmabufs/etc come from different modules. For
+ * example, during DRM GEM import some drivers check if the dmabuf's owner
+ * matches the dev's owner. If they match because they are both NULL drivers
+ * may incorrectly think two resources come from the same module.
+ *
+ * To handle this we specify an undefined symbol __this_linker_file, which
+ * will get special treatment from the linker when resolving. This will
+ * populate the usages of __this_linker_file with the linker_file_t of the
+ * module.
+ */
+#define THIS_MODULE ((struct module *)&__this_linker_file)
#define __MODULE_STRING(x) __stringify(x)
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -906,6 +906,14 @@
KLD_DPF(SYM, ("linker_file_lookup_symbol: file=%p, name=%s, deps=%d\n",
file, name, deps));
+ /*
+ * Treat the __this_linker_file as a special symbol. This is a global that
+ * linuxkpi uses to populate the THIS_MODULE value. In this case we can
+ * simply return the linker_file_t.
+ */
+ if (strcmp(name, "__this_linker_file") == 0)
+ return ((caddr_t)file);
+
if (LINKER_LOOKUP_SYMBOL(file, name, &sym) == 0) {
LINKER_SYMBOL_VALUES(file, sym, &symval);
if (symval.value == 0)
diff --git a/sys/sys/linker.h b/sys/sys/linker.h
--- a/sys/sys/linker.h
+++ b/sys/sys/linker.h
@@ -44,6 +44,11 @@
* Object representing a file which has been loaded by the linker.
*/
typedef struct linker_file* linker_file_t;
+/*
+ * Special symbol which will be replaced by a reference to the linker_file_t
+ * of the module it is used in.
+ */
+extern linker_file_t __this_linker_file;
typedef TAILQ_HEAD(, linker_file) linker_file_list_t;
typedef caddr_t linker_sym_t; /* opaque symbol */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 22, 5:19 PM (40 m, 18 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25982171
Default Alt Text
D44306.id137495.diff (2 KB)
Attached To
Mode
D44306: linuxkpi: Provide a non-NULL value for THIS_MODULE
Attached
Detach File
Event Timeline
Log In to Comment