debug: update debug kit to correctly recognize commpage
This commit is contained in:
@@ -13,7 +13,6 @@
|
||||
#include <Locker.h>
|
||||
|
||||
#include <AutoLocker.h>
|
||||
#include <commpage_defs.h>
|
||||
#include <OS.h>
|
||||
#include <system_info.h>
|
||||
#include <util/DoublyLinkedList.h>
|
||||
@@ -496,24 +495,6 @@ DebuggerInterface::GetImageInfos(BObjectList<ImageInfo>& 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user