diff options
author | ian <ian@FreeBSD.org> | 2013-01-30 23:49:36 +0000 |
---|---|---|
committer | ian <ian@FreeBSD.org> | 2013-01-30 23:49:36 +0000 |
commit | 2d2ebd5bc052ccae68bd5bc354de7f5946ee4b92 (patch) | |
tree | 4041ab1697381487bc0ef2acef2c3139480f0da0 /sys/boot/uboot | |
parent | 85fcf6286dd7a0721e5b300d232483d5bb13b1a8 (diff) | |
download | FreeBSD-src-2d2ebd5bc052ccae68bd5bc354de7f5946ee4b92.zip FreeBSD-src-2d2ebd5bc052ccae68bd5bc354de7f5946ee4b92.tar.gz |
Do metadata relocation fixup on all loaded modules, not just the kernel.
Approved by: cognet (mentor)
Diffstat (limited to 'sys/boot/uboot')
-rw-r--r-- | sys/boot/uboot/common/metadata.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/boot/uboot/common/metadata.c b/sys/boot/uboot/common/metadata.c index 74497a9..bbc1893 100644 --- a/sys/boot/uboot/common/metadata.c +++ b/sys/boot/uboot/common/metadata.c @@ -369,12 +369,15 @@ md_load(char *args, vm_offset_t *modulep) /* Convert addresses to the final VA */ *modulep -= __elfN(relocation_offset); - for (i = 0; i < sizeof mdt / sizeof mdt[0]; i++) { - md = file_findmetadata(kfp, mdt[i]); - if (md) { - bcopy(md->md_data, &vaddr, sizeof vaddr); - vaddr -= __elfN(relocation_offset); - bcopy(&vaddr, md->md_data, sizeof vaddr); + /* Do relocation fixup on metadata of each module. */ + for (xp = file_findfile(NULL, NULL); xp != NULL; xp = xp->f_next) { + for (i = 0; i < sizeof mdt / sizeof mdt[0]; i++) { + md = file_findmetadata(xp, mdt[i]); + if (md) { + bcopy(md->md_data, &vaddr, sizeof vaddr); + vaddr -= __elfN(relocation_offset); + bcopy(&vaddr, md->md_data, sizeof vaddr); + } } } |