Cleanup to better match our coding style guide; renamed variables, etc..
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7525 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+77
-73
@@ -29,30 +29,31 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define ELF_TRACE 0
|
//#define TRACE_ELF
|
||||||
#if ELF_TRACE
|
#ifdef TRACE_ELF
|
||||||
# define PRINT(x) dprintf x
|
|
||||||
# define TRACE(x) dprintf x
|
# define TRACE(x) dprintf x
|
||||||
#else
|
#else
|
||||||
# define PRINT(x) ;
|
|
||||||
# define TRACE(x) ;
|
# define TRACE(x) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// ToDo: this shall contain a list of linked images (one day)
|
||||||
|
// this is a preparation for shared libraries in the kernel
|
||||||
|
// and not yet used.
|
||||||
|
#if 0
|
||||||
|
typedef struct elf_linked_image {
|
||||||
|
struct elf_linked_image *next;
|
||||||
|
struct elf_image_info *image;
|
||||||
|
} elf_linked_image;
|
||||||
|
#endif
|
||||||
|
|
||||||
#define IMAGE_HASH_SIZE 16
|
#define IMAGE_HASH_SIZE 16
|
||||||
|
|
||||||
static hash_table *sImagesHash;
|
static hash_table *sImagesHash;
|
||||||
|
|
||||||
// XXX TK this shall contain a list of linked images
|
static struct elf_image_info *sKernelImage = NULL;
|
||||||
// (don't know enough about ELF how to get this list)
|
static mutex sImageMutex;
|
||||||
typedef struct elf_linked_image {
|
static mutex sImageLoadMutex;
|
||||||
struct elf_linked_image *next;
|
|
||||||
struct elf_image_info *image;
|
|
||||||
} elf_linked_image;
|
|
||||||
|
|
||||||
static struct elf_image_info *kernel_image = NULL;
|
|
||||||
static mutex image_lock;
|
|
||||||
static mutex image_load_lock;
|
|
||||||
|
|
||||||
static status_t elf_unload_image(struct elf_image_info *image);
|
static status_t elf_unload_image(struct elf_image_info *image);
|
||||||
|
|
||||||
@@ -124,9 +125,9 @@ elf_lookup_symbol_address(addr address, addr *baseAddress, char *text, size_t le
|
|||||||
uint32 i;
|
uint32 i;
|
||||||
int j,rv;
|
int j,rv;
|
||||||
|
|
||||||
PRINT(("looking up %p\n",(void *)address));
|
TRACE(("looking up %p\n",(void *)address));
|
||||||
|
|
||||||
mutex_lock(&image_lock);
|
mutex_lock(&sImageMutex);
|
||||||
hash_open(sImagesHash, &iterator);
|
hash_open(sImagesHash, &iterator);
|
||||||
|
|
||||||
found_sym = 0;
|
found_sym = 0;
|
||||||
@@ -134,19 +135,19 @@ elf_lookup_symbol_address(addr address, addr *baseAddress, char *text, size_t le
|
|||||||
found_delta = 0x7fffffff;
|
found_delta = 0x7fffffff;
|
||||||
|
|
||||||
while ((image = hash_next(sImagesHash, &iterator)) != NULL) {
|
while ((image = hash_next(sImagesHash, &iterator)) != NULL) {
|
||||||
PRINT((" image %p, base = %p, size = %p\n", image, (void *)image->regions[0].start, (void *)image->regions[0].size));
|
TRACE((" image %p, base = %p, size = %p\n", image, (void *)image->regions[0].start, (void *)image->regions[0].size));
|
||||||
if ((address < image->regions[0].start) || (address >= (image->regions[0].start + image->regions[0].size)))
|
if ((address < image->regions[0].start) || (address >= (image->regions[0].start + image->regions[0].size)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
PRINT((" searching...\n"));
|
TRACE((" searching...\n"));
|
||||||
found_image = image;
|
found_image = image;
|
||||||
for (i = 0; i < HASHTABSIZE(image); i++) {
|
for (i = 0; i < HASHTABSIZE(image); i++) {
|
||||||
for (j = HASHBUCKETS(image)[i]; j != STN_UNDEF; j = HASHCHAINS(image)[j]) {
|
for (j = HASHBUCKETS(image)[i]; j != STN_UNDEF; j = HASHCHAINS(image)[j]) {
|
||||||
long d;
|
long d;
|
||||||
sym = &image->syms[j];
|
sym = &image->syms[j];
|
||||||
|
|
||||||
PRINT((" %p looking at %s, type = %d, bind = %d, addr = %p\n",sym,SYMNAME(image, sym),ELF32_ST_TYPE(sym->st_info),ELF32_ST_BIND(sym->st_info),(void *)sym->st_value));
|
TRACE((" %p looking at %s, type = %d, bind = %d, addr = %p\n",sym,SYMNAME(image, sym),ELF32_ST_TYPE(sym->st_info),ELF32_ST_BIND(sym->st_info),(void *)sym->st_value));
|
||||||
PRINT((" symbol: %lx (%x + %lx)\n", sym->st_value + image->regions[0].delta, sym->st_value, image->regions[0].delta));
|
TRACE((" symbol: %lx (%x + %lx)\n", sym->st_value + image->regions[0].delta, sym->st_value, image->regions[0].delta));
|
||||||
|
|
||||||
if ((ELF32_ST_TYPE(sym->st_info) != STT_FUNC) || (ELF32_ST_BIND(sym->st_info) != STB_GLOBAL))
|
if ((ELF32_ST_TYPE(sym->st_info) != STT_FUNC) || (ELF32_ST_BIND(sym->st_info) != STB_GLOBAL))
|
||||||
continue;
|
continue;
|
||||||
@@ -162,9 +163,9 @@ elf_lookup_symbol_address(addr address, addr *baseAddress, char *text, size_t le
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (found_sym != 0) {
|
if (found_sym != 0) {
|
||||||
PRINT(("symbol at %p, in image %p, name = %s\n", found_sym, found_image, found_image->name));
|
TRACE(("symbol at %p, in image %p, name = %s\n", found_sym, found_image, found_image->name));
|
||||||
PRINT(("name index %d, '%s'\n", found_sym->st_name, SYMNAME(found_image, found_sym)));
|
TRACE(("name index %d, '%s'\n", found_sym->st_name, SYMNAME(found_image, found_sym)));
|
||||||
PRINT(("addr = %#lx, offset = %#lx\n",(found_sym->st_value + found_image->regions[0].delta),found_delta));
|
TRACE(("addr = %#lx, offset = %#lx\n",(found_sym->st_value + found_image->regions[0].delta),found_delta));
|
||||||
|
|
||||||
strlcpy(text, SYMNAME(found_image, found_sym), length);
|
strlcpy(text, SYMNAME(found_image, found_sym), length);
|
||||||
|
|
||||||
@@ -173,13 +174,13 @@ elf_lookup_symbol_address(addr address, addr *baseAddress, char *text, size_t le
|
|||||||
|
|
||||||
rv = B_OK;
|
rv = B_OK;
|
||||||
} else {
|
} else {
|
||||||
PRINT(("symbol not found!\n"));
|
TRACE(("symbol not found!\n"));
|
||||||
strlcpy(text, "symbol not found", length);
|
strlcpy(text, "symbol not found", length);
|
||||||
rv = B_ENTRY_NOT_FOUND;
|
rv = B_ENTRY_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
hash_close(sImagesHash, &iterator, false);
|
hash_close(sImagesHash, &iterator, false);
|
||||||
mutex_unlock(&image_lock);
|
mutex_unlock(&sImageMutex);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
@@ -217,7 +218,7 @@ find_image_by_vnode(void *vnode)
|
|||||||
struct hash_iterator iterator;
|
struct hash_iterator iterator;
|
||||||
struct elf_image_info *image;
|
struct elf_image_info *image;
|
||||||
|
|
||||||
mutex_lock(&image_lock);
|
mutex_lock(&sImageMutex);
|
||||||
hash_open(sImagesHash, &iterator);
|
hash_open(sImagesHash, &iterator);
|
||||||
|
|
||||||
while ((image = hash_next(sImagesHash, &iterator)) != NULL) {
|
while ((image = hash_next(sImagesHash, &iterator)) != NULL) {
|
||||||
@@ -226,7 +227,7 @@ find_image_by_vnode(void *vnode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hash_close(sImagesHash, &iterator, false);
|
hash_close(sImagesHash, &iterator, false);
|
||||||
mutex_unlock(&image_lock);
|
mutex_unlock(&sImageMutex);
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
@@ -244,7 +245,6 @@ create_image_struct()
|
|||||||
image->regions[0].id = -1;
|
image->regions[0].id = -1;
|
||||||
image->regions[1].id = -1;
|
image->regions[1].id = -1;
|
||||||
image->ref_count = 1;
|
image->ref_count = 1;
|
||||||
image->linked_images = NULL;
|
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
@@ -330,8 +330,10 @@ dump_image(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* XXX - Currently unused
|
// Currently unused
|
||||||
static void dump_symbol(struct elf_image_info *image, struct Elf32_Sym *sym)
|
#if 0
|
||||||
|
static
|
||||||
|
void dump_symbol(struct elf_image_info *image, struct Elf32_Sym *sym)
|
||||||
{
|
{
|
||||||
|
|
||||||
dprintf("symbol at %p, in image %p\n", sym, image);
|
dprintf("symbol at %p, in image %p\n", sym, image);
|
||||||
@@ -343,7 +345,8 @@ static void dump_symbol(struct elf_image_info *image, struct Elf32_Sym *sym)
|
|||||||
dprintf(" st_other 0x%x\n", sym->st_other);
|
dprintf(" st_other 0x%x\n", sym->st_other);
|
||||||
dprintf(" st_shndx %d\n", sym->st_shndx);
|
dprintf(" st_shndx %d\n", sym->st_shndx);
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static struct Elf32_Sym *
|
static struct Elf32_Sym *
|
||||||
elf_find_symbol(struct elf_image_info *image, const char *name)
|
elf_find_symbol(struct elf_image_info *image, const char *name)
|
||||||
@@ -370,7 +373,7 @@ elf_lookup_symbol(image_id id, const char *symbol)
|
|||||||
struct elf_image_info *image;
|
struct elf_image_info *image;
|
||||||
struct Elf32_Sym *sym;
|
struct Elf32_Sym *sym;
|
||||||
|
|
||||||
PRINT(("elf_lookup_symbol: %s\n", symbol));
|
TRACE(("elf_lookup_symbol: %s\n", symbol));
|
||||||
|
|
||||||
image = find_image(id);
|
image = find_image(id);
|
||||||
if (!image)
|
if (!image)
|
||||||
@@ -383,7 +386,7 @@ elf_lookup_symbol(image_id id, const char *symbol)
|
|||||||
if (sym->st_shndx == SHN_UNDEF)
|
if (sym->st_shndx == SHN_UNDEF)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
PRINT(("found: %lx (%x + %lx)\n", sym->st_value + image->regions[0].delta,
|
TRACE(("found: %lx (%x + %lx)\n", sym->st_value + image->regions[0].delta,
|
||||||
sym->st_value, image->regions[0].delta));
|
sym->st_value, image->regions[0].delta));
|
||||||
|
|
||||||
return sym->st_value + image->regions[0].delta;
|
return sym->st_value + image->regions[0].delta;
|
||||||
@@ -397,7 +400,7 @@ elf_parse_dynamic_section(struct elf_image_info *image)
|
|||||||
int i;
|
int i;
|
||||||
int needed_offset = -1;
|
int needed_offset = -1;
|
||||||
|
|
||||||
PRINT(("top of elf_parse_dynamic_section\n"));
|
TRACE(("top of elf_parse_dynamic_section\n"));
|
||||||
|
|
||||||
image->symhash = 0;
|
image->symhash = 0;
|
||||||
image->syms = 0;
|
image->syms = 0;
|
||||||
@@ -452,7 +455,7 @@ elf_parse_dynamic_section(struct elf_image_info *image)
|
|||||||
if (!image->symhash || !image->syms || !image->strtab)
|
if (!image->symhash || !image->syms || !image->strtab)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
PRINT(("needed_offset = %d\n", needed_offset));
|
TRACE(("needed_offset = %d\n", needed_offset));
|
||||||
|
|
||||||
if (needed_offset >= 0)
|
if (needed_offset >= 0)
|
||||||
image->needed = STRING(image, needed_offset);
|
image->needed = STRING(image, needed_offset);
|
||||||
@@ -492,7 +495,7 @@ elf_resolve_symbol(struct elf_image_info *image, struct Elf32_Sym *sym, struct e
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ELF32_ST_BIND(sym2->st_info) != STB_GLOBAL && ELF32_ST_BIND(sym2->st_info) != STB_WEAK) {
|
if (ELF32_ST_BIND(sym2->st_info) != STB_GLOBAL && ELF32_ST_BIND(sym2->st_info) != STB_WEAK) {
|
||||||
PRINT(("elf_resolve_symbol: found symbol '%s' but not exported\n", new_symname));
|
TRACE(("elf_resolve_symbol: found symbol '%s' but not exported\n", new_symname));
|
||||||
return B_MISSING_SYMBOL;
|
return B_MISSING_SYMBOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -503,7 +506,7 @@ elf_resolve_symbol(struct elf_image_info *image, struct Elf32_Sym *sym, struct e
|
|||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
case SHN_COMMON:
|
case SHN_COMMON:
|
||||||
// ToDo: finish this
|
// ToDo: finish this
|
||||||
PRINT(("elf_resolve_symbol: COMMON symbol, finish me!\n"));
|
TRACE(("elf_resolve_symbol: COMMON symbol, finish me!\n"));
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
default:
|
default:
|
||||||
// standard symbol
|
// standard symbol
|
||||||
@@ -520,13 +523,13 @@ elf_relocate(struct elf_image_info *image, const char *sym_prepend)
|
|||||||
{
|
{
|
||||||
int status = B_NO_ERROR;
|
int status = B_NO_ERROR;
|
||||||
|
|
||||||
PRINT(("top of elf_relocate\n"));
|
TRACE(("top of elf_relocate\n"));
|
||||||
|
|
||||||
// deal with the rels first
|
// deal with the rels first
|
||||||
if (image->rel) {
|
if (image->rel) {
|
||||||
TRACE(("total %i relocs\n", image->rel_len / (int)sizeof(struct Elf32_Rel)));
|
TRACE(("total %i relocs\n", image->rel_len / (int)sizeof(struct Elf32_Rel)));
|
||||||
|
|
||||||
status = arch_elf_relocate_rel(image, sym_prepend, kernel_image, image->rel, image->rel_len);
|
status = arch_elf_relocate_rel(image, sym_prepend, sKernelImage, image->rel, image->rel_len);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -535,15 +538,15 @@ elf_relocate(struct elf_image_info *image, const char *sym_prepend)
|
|||||||
TRACE(("total %i plt-relocs\n", image->pltrel_len / (int)sizeof(struct Elf32_Rel)));
|
TRACE(("total %i plt-relocs\n", image->pltrel_len / (int)sizeof(struct Elf32_Rel)));
|
||||||
|
|
||||||
if (image->pltrel_type == DT_REL)
|
if (image->pltrel_type == DT_REL)
|
||||||
status = arch_elf_relocate_rel(image, sym_prepend, kernel_image, image->pltrel, image->pltrel_len);
|
status = arch_elf_relocate_rel(image, sym_prepend, sKernelImage, image->pltrel, image->pltrel_len);
|
||||||
else
|
else
|
||||||
status = arch_elf_relocate_rela(image, sym_prepend, kernel_image, (struct Elf32_Rela *)image->pltrel, image->pltrel_len);
|
status = arch_elf_relocate_rela(image, sym_prepend, sKernelImage, (struct Elf32_Rela *)image->pltrel, image->pltrel_len);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (image->rela) {
|
if (image->rela) {
|
||||||
status = arch_elf_relocate_rela(image, sym_prepend, kernel_image, image->rela, image->rela_len);
|
status = arch_elf_relocate_rela(image, sym_prepend, sKernelImage, image->rela, image->rela_len);
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -744,7 +747,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
|
|||||||
int i;
|
int i;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
PRINT(("elf_load_kspace: entry path '%s'\n", path));
|
TRACE(("elf_load_kspace: entry path '%s'\n", path));
|
||||||
|
|
||||||
fd = sys_open(path, 0);
|
fd = sys_open(path, 0);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
@@ -756,7 +759,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
|
|||||||
|
|
||||||
// XXX awful hack to keep someone else from trying to load this image
|
// XXX awful hack to keep someone else from trying to load this image
|
||||||
// probably not a bad thing, shouldn't be too many races
|
// probably not a bad thing, shouldn't be too many races
|
||||||
mutex_lock(&image_load_lock);
|
mutex_lock(&sImageLoadMutex);
|
||||||
|
|
||||||
// make sure it's not loaded already. Search by vnode
|
// make sure it's not loaded already. Search by vnode
|
||||||
image = find_image_by_vnode(vnode);
|
image = find_image_by_vnode(vnode);
|
||||||
@@ -802,15 +805,15 @@ elf_load_kspace(const char *path, const char *sym_prepend)
|
|||||||
goto error2;
|
goto error2;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRINT(("reading in program headers at 0x%x, len 0x%x\n", eheader->e_phoff, eheader->e_phnum * eheader->e_phentsize));
|
TRACE(("reading in program headers at 0x%x, len 0x%x\n", eheader->e_phoff, eheader->e_phnum * eheader->e_phentsize));
|
||||||
len = sys_read(fd, eheader->e_phoff, pheaders, eheader->e_phnum * eheader->e_phentsize);
|
len = sys_read(fd, eheader->e_phoff, pheaders, eheader->e_phnum * eheader->e_phentsize);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
err = len;
|
err = len;
|
||||||
PRINT(("error reading in program headers\n"));
|
TRACE(("error reading in program headers\n"));
|
||||||
goto error3;
|
goto error3;
|
||||||
}
|
}
|
||||||
if (len != eheader->e_phnum * eheader->e_phentsize) {
|
if (len != eheader->e_phnum * eheader->e_phentsize) {
|
||||||
PRINT(("short read while reading in program headers\n"));
|
TRACE(("short read while reading in program headers\n"));
|
||||||
err = -1;
|
err = -1;
|
||||||
goto error3;
|
goto error3;
|
||||||
}
|
}
|
||||||
@@ -820,7 +823,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
|
|||||||
int image_region;
|
int image_region;
|
||||||
int protection;
|
int protection;
|
||||||
|
|
||||||
PRINT(("looking at program header %d\n", i));
|
TRACE(("looking at program header %d\n", i));
|
||||||
|
|
||||||
switch (pheaders[i].p_type) {
|
switch (pheaders[i].p_type) {
|
||||||
case PT_LOAD:
|
case PT_LOAD:
|
||||||
@@ -874,7 +877,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
|
|||||||
}
|
}
|
||||||
image->regions[image_region].delta = image->regions[image_region].start - ROUNDOWN(pheaders[i].p_vaddr, PAGE_SIZE);
|
image->regions[image_region].delta = image->regions[image_region].start - ROUNDOWN(pheaders[i].p_vaddr, PAGE_SIZE);
|
||||||
|
|
||||||
PRINT(("elf_load_kspace: created a region at %p\n", (void *)image->regions[image_region].start));
|
TRACE(("elf_load_kspace: created a region at %p\n", (void *)image->regions[image_region].start));
|
||||||
|
|
||||||
len = sys_read(fd, pheaders[i].p_offset,
|
len = sys_read(fd, pheaders[i].p_offset,
|
||||||
(void *)(image->regions[image_region].start + (pheaders[i].p_vaddr % PAGE_SIZE)),
|
(void *)(image->regions[image_region].start + (pheaders[i].p_vaddr % PAGE_SIZE)),
|
||||||
@@ -913,7 +916,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
|
|||||||
register_elf_image(image);
|
register_elf_image(image);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
mutex_unlock(&image_load_lock);
|
mutex_unlock(&sImageLoadMutex);
|
||||||
|
|
||||||
return image->id;
|
return image->id;
|
||||||
|
|
||||||
@@ -929,7 +932,7 @@ error2:
|
|||||||
error1:
|
error1:
|
||||||
free(eheader);
|
free(eheader);
|
||||||
error:
|
error:
|
||||||
mutex_unlock(&image_load_lock);
|
mutex_unlock(&sImageLoadMutex);
|
||||||
error0:
|
error0:
|
||||||
if (vnode)
|
if (vnode)
|
||||||
vfs_put_vnode_ptr(vnode);
|
vfs_put_vnode_ptr(vnode);
|
||||||
@@ -938,7 +941,7 @@ error0:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static int
|
static int
|
||||||
elf_unlink_relocs(struct elf_image_info *image)
|
elf_unlink_relocs(struct elf_image_info *image)
|
||||||
{
|
{
|
||||||
@@ -952,7 +955,7 @@ elf_unlink_relocs(struct elf_image_info *image)
|
|||||||
|
|
||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
elf_unload_image_final(struct elf_image_info *image)
|
elf_unload_image_final(struct elf_image_info *image)
|
||||||
@@ -980,7 +983,8 @@ elf_unload_image(struct elf_image_info *image)
|
|||||||
if (atomic_add(&image->ref_count, -1) > 0)
|
if (atomic_add(&image->ref_count, -1) > 0)
|
||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
|
|
||||||
elf_unlink_relocs(image);
|
//elf_unlink_relocs(image);
|
||||||
|
// not yet used
|
||||||
elf_unload_image_final(image);
|
elf_unload_image_final(image);
|
||||||
|
|
||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
@@ -1003,7 +1007,7 @@ elf_unload_kspace(const char *path)
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto error0;
|
goto error0;
|
||||||
|
|
||||||
mutex_lock(&image_load_lock);
|
mutex_lock(&sImageLoadMutex);
|
||||||
|
|
||||||
image = find_image_by_vnode(vnode);
|
image = find_image_by_vnode(vnode);
|
||||||
if (!image) {
|
if (!image) {
|
||||||
@@ -1015,7 +1019,7 @@ elf_unload_kspace(const char *path)
|
|||||||
err = elf_unload_image(image);
|
err = elf_unload_image(image);
|
||||||
|
|
||||||
error:
|
error:
|
||||||
mutex_unlock(&image_load_lock);
|
mutex_unlock(&sImageLoadMutex);
|
||||||
error0:
|
error0:
|
||||||
if(vnode)
|
if(vnode)
|
||||||
vfs_put_vnode_ptr(vnode);
|
vfs_put_vnode_ptr(vnode);
|
||||||
@@ -1083,8 +1087,8 @@ elf_init(kernel_args *ka)
|
|||||||
|
|
||||||
image_init();
|
image_init();
|
||||||
|
|
||||||
mutex_init(&image_lock, "kimages_lock");
|
mutex_init(&sImageMutex, "kimages_lock");
|
||||||
mutex_init(&image_load_lock, "kimages_load_lock");
|
mutex_init(&sImageLoadMutex, "kimages_load_lock");
|
||||||
|
|
||||||
sImagesHash = hash_init(IMAGE_HASH_SIZE, 0, image_compare, image_hash);
|
sImagesHash = hash_init(IMAGE_HASH_SIZE, 0, image_compare, image_hash);
|
||||||
if (sImagesHash == NULL)
|
if (sImagesHash == NULL)
|
||||||
@@ -1093,36 +1097,36 @@ elf_init(kernel_args *ka)
|
|||||||
// Build a image structure for the kernel, which has already been loaded.
|
// Build a image structure for the kernel, which has already been loaded.
|
||||||
// The VM has created areas for it under a known name already
|
// The VM has created areas for it under a known name already
|
||||||
|
|
||||||
kernel_image = create_image_struct();
|
sKernelImage = create_image_struct();
|
||||||
kernel_image->name = strdup("kernel");
|
sKernelImage->name = strdup("kernel");
|
||||||
|
|
||||||
// text segment
|
// text segment
|
||||||
kernel_image->regions[0].id = find_area("kernel_ro");
|
sKernelImage->regions[0].id = find_area("kernel_ro");
|
||||||
if (kernel_image->regions[0].id < 0)
|
if (sKernelImage->regions[0].id < 0)
|
||||||
panic("elf_init: could not look up kernel text segment region\n");
|
panic("elf_init: could not look up kernel text segment region\n");
|
||||||
|
|
||||||
get_area_info(kernel_image->regions[0].id, &areaInfo);
|
get_area_info(sKernelImage->regions[0].id, &areaInfo);
|
||||||
kernel_image->regions[0].start = (addr)areaInfo.address;
|
sKernelImage->regions[0].start = (addr)areaInfo.address;
|
||||||
kernel_image->regions[0].size = areaInfo.size;
|
sKernelImage->regions[0].size = areaInfo.size;
|
||||||
|
|
||||||
// data segment
|
// data segment
|
||||||
kernel_image->regions[1].id = find_area("kernel_rw");
|
sKernelImage->regions[1].id = find_area("kernel_rw");
|
||||||
if (kernel_image->regions[1].id < 0)
|
if (sKernelImage->regions[1].id < 0)
|
||||||
panic("elf_init: could not look up kernel data segment region\n");
|
panic("elf_init: could not look up kernel data segment region\n");
|
||||||
|
|
||||||
get_area_info(kernel_image->regions[1].id, &areaInfo);
|
get_area_info(sKernelImage->regions[1].id, &areaInfo);
|
||||||
kernel_image->regions[1].start = (addr)areaInfo.address;
|
sKernelImage->regions[1].start = (addr)areaInfo.address;
|
||||||
kernel_image->regions[1].size = areaInfo.size;
|
sKernelImage->regions[1].size = areaInfo.size;
|
||||||
|
|
||||||
// we know where the dynamic section is
|
// we know where the dynamic section is
|
||||||
kernel_image->dynamic_ptr = (addr)ka->kernel_dynamic_section_addr.start;
|
sKernelImage->dynamic_ptr = (addr)ka->kernel_dynamic_section_addr.start;
|
||||||
|
|
||||||
// parse the dynamic section
|
// parse the dynamic section
|
||||||
if (elf_parse_dynamic_section(kernel_image) < 0)
|
if (elf_parse_dynamic_section(sKernelImage) < 0)
|
||||||
dprintf("elf_init: WARNING elf_parse_dynamic_section couldn't find dynamic section.\n");
|
dprintf("elf_init: WARNING elf_parse_dynamic_section couldn't find dynamic section.\n");
|
||||||
|
|
||||||
// insert it first in the list of kernel images loaded
|
// insert it first in the list of kernel images loaded
|
||||||
register_elf_image(kernel_image);
|
register_elf_image(sKernelImage);
|
||||||
|
|
||||||
// Build image structures for all preloaded images.
|
// Build image structures for all preloaded images.
|
||||||
// Again, the VM has already created areas for them.
|
// Again, the VM has already created areas for them.
|
||||||
|
|||||||
Reference in New Issue
Block a user