debug: update debug kit to correctly recognize commpage
This commit is contained in:
@@ -13,7 +13,6 @@
|
|||||||
#include <Locker.h>
|
#include <Locker.h>
|
||||||
|
|
||||||
#include <AutoLocker.h>
|
#include <AutoLocker.h>
|
||||||
#include <commpage_defs.h>
|
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
#include <system_info.h>
|
#include <system_info.h>
|
||||||
#include <util/DoublyLinkedList.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;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -400,3 +400,65 @@ KernelImage::Init(const image_info& info)
|
|||||||
fSymbolTable, &fSymbolCount, fStringTable, &fStringTableSize,
|
fSymbolTable, &fSymbolCount, fStringTable, &fStringTableSize,
|
||||||
&fLoadDelta);
|
&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);
|
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 Debug
|
||||||
} // namespace BPrivate
|
} // namespace BPrivate
|
||||||
|
|
||||||
|
|||||||
@@ -295,6 +295,14 @@ SymbolLookup::Init()
|
|||||||
|
|
||||||
error = kernelImage->Init(imageInfo);
|
error = kernelImage->Init(imageInfo);
|
||||||
image = kernelImage;
|
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 {
|
} else {
|
||||||
// userland image -- try to load an image file
|
// userland image -- try to load an image file
|
||||||
ImageFile* imageFile = new(std::nothrow) ImageFile;
|
ImageFile* imageFile = new(std::nothrow) ImageFile;
|
||||||
|
|||||||
@@ -79,8 +79,8 @@ commpage_init(void)
|
|||||||
sFreeCommPageSpace = ALIGN_ENTRY(&sCommPageAddress[COMMPAGE_TABLE_ENTRIES]);
|
sFreeCommPageSpace = ALIGN_ENTRY(&sCommPageAddress[COMMPAGE_TABLE_ENTRIES]);
|
||||||
|
|
||||||
// create the image for the commpage
|
// create the image for the commpage
|
||||||
sCommPageImage = elf_create_memory_image("commpage", 0,
|
sCommPageImage = elf_create_memory_image("commpage", 0, COMMPAGE_SIZE, 0,
|
||||||
COMMPAGE_SIZE, 0, 0);
|
0);
|
||||||
elf_add_memory_image_symbol(sCommPageImage, "commpage_table",
|
elf_add_memory_image_symbol(sCommPageImage, "commpage_table",
|
||||||
0, COMMPAGE_TABLE_ENTRIES * sizeof(addr_t),
|
0, COMMPAGE_TABLE_ENTRIES * sizeof(addr_t),
|
||||||
B_SYMBOL_TYPE_DATA);
|
B_SYMBOL_TYPE_DATA);
|
||||||
|
|||||||
Reference in New Issue
Block a user