From dd1c278d4b64ef9c143903384a85d4c5aabc2770 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 3 Sep 2008 14:47:26 +0000 Subject: [PATCH] Added elf_get_image_info_for_address() to get an image info for a kernel image. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27300 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/elf.h | 3 ++- src/system/kernel/elf.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/headers/private/kernel/elf.h b/headers/private/kernel/elf.h index 1eab64dd83..3dee0dd275 100644 --- a/headers/private/kernel/elf.h +++ b/headers/private/kernel/elf.h @@ -1,7 +1,7 @@ /* * Copyright 2005, Haiku Inc. All Rights Reserved. * Distributed under the terms of the MIT license. - * + * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. * Distributed under the terms of the NewOS License. */ @@ -31,6 +31,7 @@ status_t elf_debug_lookup_symbol_address(addr_t address, addr_t *_baseAddress, status_t elf_debug_lookup_user_symbol_address(struct team* team, addr_t address, addr_t *_baseAddress, const char **_symbolName, const char **_imageName, bool *_exactMatch); +status_t elf_get_image_info_for_address(addr_t address, image_info* info); status_t elf_init(struct kernel_args *args); #ifdef __cplusplus diff --git a/src/system/kernel/elf.cpp b/src/system/kernel/elf.cpp index 882dfd4605..b8e24eeb1d 100644 --- a/src/system/kernel/elf.cpp +++ b/src/system/kernel/elf.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -1819,6 +1820,33 @@ unload_kernel_add_on(image_id id) } +status_t +elf_get_image_info_for_address(addr_t address, image_info* info) +{ + MutexLocker _(sImageMutex); + struct elf_image_info* elfInfo = find_image_at_address(address); + if (elfInfo == NULL) + return B_ENTRY_NOT_FOUND; + + info->id = elfInfo->id; + info->type = B_SYSTEM_IMAGE; + info->sequence = 0; + info->init_order = 0; + info->init_routine = NULL; + info->term_routine = NULL; + info->device = -1; + info->node = -1; + // TODO: We could actually fill device/node in. + strlcpy(info->name, elfInfo->name, sizeof(info->name)); + info->text = (void*)elfInfo->text_region.start; + info->data = (void*)elfInfo->data_region.start; + info->text_size = elfInfo->text_region.size; + info->data_size = elfInfo->data_region.size; + + return B_OK; +} + + status_t elf_init(kernel_args *args) {