diff --git a/src/apps/debugger/debugger_interface/DebuggerInterface.cpp b/src/apps/debugger/debugger_interface/DebuggerInterface.cpp index 585327d633..dccb2ef41a 100644 --- a/src/apps/debugger/debugger_interface/DebuggerInterface.cpp +++ b/src/apps/debugger/debugger_interface/DebuggerInterface.cpp @@ -13,7 +13,6 @@ #include #include -#include #include #include #include @@ -496,24 +495,6 @@ DebuggerInterface::GetImageInfos(BObjectList& infos) } } - // Also add the "commpage" image, which belongs to the kernel, but is used - // by userland teams. - cookie = 0; - while (get_next_image_info(B_SYSTEM_TEAM, &cookie, &imageInfo) == B_OK) { - if ((addr_t)imageInfo.text >= USER_COMMPAGE_ADDR - && (addr_t)imageInfo.text < USER_COMMPAGE_ADDR + COMMPAGE_SIZE) { - ImageInfo* info = new(std::nothrow) ImageInfo(B_SYSTEM_TEAM, - imageInfo.id, imageInfo.name, imageInfo.type, - (addr_t)imageInfo.text, imageInfo.text_size, - (addr_t)imageInfo.data, imageInfo.data_size); - if (info == NULL || !infos.AddItem(info)) { - delete info; - return B_NO_MEMORY; - } - break; - } - } - return B_OK; } diff --git a/src/kits/debug/Image.cpp b/src/kits/debug/Image.cpp index 1022792350..b2f23d3a3e 100644 --- a/src/kits/debug/Image.cpp +++ b/src/kits/debug/Image.cpp @@ -400,3 +400,65 @@ KernelImage::Init(const image_info& info) fSymbolTable, &fSymbolCount, fStringTable, &fStringTableSize, &fLoadDelta); } + + +CommPageImage::CommPageImage() +{ +} + + +CommPageImage::~CommPageImage() +{ + delete[] fSymbolTable; + delete[] fStringTable; +} + + +status_t +CommPageImage::Init(const image_info& info) +{ + // find kernel image for commpage + image_id commPageID = -1; + image_info commPageInfo; + + int32 cookie = 0; + while (_kern_get_next_image_info(B_SYSTEM_TEAM, &cookie, &commPageInfo, + sizeof(image_info)) == B_OK) { + if (!strcmp("commpage", commPageInfo.name)) { + commPageID = commPageInfo.id; + break; + } + } + if (commPageID < 0) + return B_ENTRY_NOT_FOUND; + + fInfo = commPageInfo; + fInfo.text = info.text; + + // get the table sizes + fSymbolCount = 0; + fStringTableSize = 0; + status_t error = _kern_read_kernel_image_symbols(commPageID, NULL, + &fSymbolCount, NULL, &fStringTableSize, NULL); + if (error != B_OK) + return error; + + // allocate the tables + fSymbolTable = new(std::nothrow) elf_sym[fSymbolCount]; + fStringTable = new(std::nothrow) char[fStringTableSize]; + if (fSymbolTable == NULL || fStringTable == NULL) + return B_NO_MEMORY; + + // get the info + error = _kern_read_kernel_image_symbols(commPageID, + fSymbolTable, &fSymbolCount, fStringTable, &fStringTableSize, NULL); + if (error != B_OK) { + delete[] fSymbolTable; + delete[] fStringTable; + return error; + } + + fLoadDelta = (addr_t)info.text; + + return B_OK; +} diff --git a/src/kits/debug/Image.h b/src/kits/debug/Image.h index aa4e76db89..4d4be64951 100644 --- a/src/kits/debug/Image.h +++ b/src/kits/debug/Image.h @@ -111,6 +111,15 @@ public: status_t Init(const image_info& info); }; + +class CommPageImage : public SymbolTableBasedImage { +public: + CommPageImage(); + virtual ~CommPageImage(); + + status_t Init(const image_info& info); +}; + } // namespace Debug } // namespace BPrivate diff --git a/src/kits/debug/SymbolLookup.cpp b/src/kits/debug/SymbolLookup.cpp index cb061064e6..2d259fb666 100644 --- a/src/kits/debug/SymbolLookup.cpp +++ b/src/kits/debug/SymbolLookup.cpp @@ -295,6 +295,14 @@ SymbolLookup::Init() error = kernelImage->Init(imageInfo); image = kernelImage; + } else if (!strcmp("commpage", imageInfo.name)) { + // commpage image + CommPageImage* commPageImage = new(std::nothrow) CommPageImage; + if (commPageImage == NULL) + return B_NO_MEMORY; + + error = commPageImage->Init(imageInfo); + image = commPageImage; } else { // userland image -- try to load an image file ImageFile* imageFile = new(std::nothrow) ImageFile; diff --git a/src/system/kernel/commpage.cpp b/src/system/kernel/commpage.cpp index be962fdd72..3172dd927e 100644 --- a/src/system/kernel/commpage.cpp +++ b/src/system/kernel/commpage.cpp @@ -79,8 +79,8 @@ commpage_init(void) sFreeCommPageSpace = ALIGN_ENTRY(&sCommPageAddress[COMMPAGE_TABLE_ENTRIES]); // create the image for the commpage - sCommPageImage = elf_create_memory_image("commpage", 0, - COMMPAGE_SIZE, 0, 0); + sCommPageImage = elf_create_memory_image("commpage", 0, COMMPAGE_SIZE, 0, + 0); elf_add_memory_image_symbol(sCommPageImage, "commpage_table", 0, COMMPAGE_TABLE_ENTRIES * sizeof(addr_t), B_SYMBOL_TYPE_DATA);