diff options
author | marcel <marcel@FreeBSD.org> | 2011-02-09 19:08:21 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2011-02-09 19:08:21 +0000 |
commit | 45f0eb1542f0365247307c6d913752be53a2beac (patch) | |
tree | ae4ccf0b7e14c5a6378ac4d32ca1346e2686517b /sys/kern/subr_module.c | |
parent | 6f316af6e26c8a2111b42d2713f4c8cc34809086 (diff) | |
download | FreeBSD-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.c | 25 |
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) |