summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_module.c
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2011-02-09 19:08:21 +0000
committermarcel <marcel@FreeBSD.org>2011-02-09 19:08:21 +0000
commit45f0eb1542f0365247307c6d913752be53a2beac (patch)
treeae4ccf0b7e14c5a6378ac4d32ca1346e2686517b /sys/kern/subr_module.c
parent6f316af6e26c8a2111b42d2713f4c8cc34809086 (diff)
downloadFreeBSD-src-45f0eb1542f0365247307c6d913752be53a2beac.zip
FreeBSD-src-45f0eb1542f0365247307c6d913752be53a2beac.tar.gz
Provide convenience function for obtaining MODINFO_ADDR and MODINFO_SIZE
attributes for preloaded modules/images. In particular, MODINFO_ADDR has the added complexity of not always being relocated properly. Rather than kluging this in the various components that are affected, we handle it in a centralized place (preload_fetch_addr()). To that end, expose a new variable, preload_addr_relocate, that MD initialization code can set and that turns the address attribute into a valid kernel VA. Architectures that need the relocation: arm & powerpc (at least). Components that can utilize this: acpi(4), md(4), fb(4), pci(4), ZFS, geli. Sponsored by: Juniper Networks
Diffstat (limited to 'sys/kern/subr_module.c')
-rw-r--r--sys/kern/subr_module.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/sys/kern/subr_module.c b/sys/kern/subr_module.c
index 1295cb8..2485c94 100644
--- a/sys/kern/subr_module.c
+++ b/sys/kern/subr_module.c
@@ -35,7 +35,8 @@ __FBSDID("$FreeBSD$");
* Preloaded module support
*/
-caddr_t preload_metadata;
+vm_offset_t preload_addr_relocate = 0;
+caddr_t preload_metadata;
/*
* Search for the preloaded module (name)
@@ -230,6 +231,28 @@ preload_delete_name(const char *name)
}
}
+void *
+preload_fetch_addr(caddr_t mod)
+{
+ caddr_t *mdp;
+
+ mdp = (caddr_t *)preload_search_info(mod, MODINFO_ADDR);
+ if (mdp == NULL)
+ return (NULL);
+ return (*mdp + preload_addr_relocate);
+}
+
+size_t
+preload_fetch_size(caddr_t mod)
+{
+ size_t *mdp;
+
+ mdp = (size_t *)preload_search_info(mod, MODINFO_SIZE);
+ if (mdp == NULL)
+ return (0);
+ return (*mdp);
+}
+
/* Called from locore on i386. Convert physical pointers to kvm. Sigh. */
void
preload_bootstrap_relocate(vm_offset_t offset)
OpenPOWER on IntegriCloud