mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:27:35 +00:00
Kernel: Don't symbolicate symbol+offset for obvious non-kernel addresses.
This commit is contained in:
parent
f4b190c58b
commit
28244039a5
3 changed files with 28 additions and 11 deletions
|
@ -304,18 +304,25 @@ ByteBuffer procfs$pid_stack(InodeIdentifier identifier)
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
process.for_each_thread([&] (Thread& thread) {
|
process.for_each_thread([&] (Thread& thread) {
|
||||||
builder.appendf("Thread %d:\n", thread.tid());
|
builder.appendf("Thread %d:\n", thread.tid());
|
||||||
Vector<RecognizedSymbol> recognized_symbols;
|
Vector<RecognizedSymbol, 64> recognized_symbols;
|
||||||
if (auto* eip_ksym = ksymbolicate(thread.tss().eip))
|
recognized_symbols.append({ thread.tss().eip, ksymbolicate(thread.tss().eip) });
|
||||||
recognized_symbols.append({ thread.tss().eip, eip_ksym });
|
|
||||||
for (dword* stack_ptr = (dword*)thread.frame_ptr(); process.validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
for (dword* stack_ptr = (dword*)thread.frame_ptr(); process.validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
||||||
dword retaddr = stack_ptr[1];
|
dword retaddr = stack_ptr[1];
|
||||||
if (auto* ksym = ksymbolicate(retaddr))
|
recognized_symbols.append({ retaddr, ksymbolicate(retaddr) });
|
||||||
recognized_symbols.append({ retaddr, ksym });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& symbol : recognized_symbols) {
|
for (auto& symbol : recognized_symbols) {
|
||||||
|
if (!symbol.address)
|
||||||
|
break;
|
||||||
|
if (!symbol.ksym) {
|
||||||
|
builder.appendf("%p\n", symbol.address);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
unsigned offset = symbol.address - symbol.ksym->address;
|
unsigned offset = symbol.address - symbol.ksym->address;
|
||||||
builder.appendf("%p %s +%u\n", symbol.address, symbol.ksym->name, offset);
|
if (symbol.ksym->address == ksym_highest_address && offset > 4096)
|
||||||
|
builder.appendf("%p\n", symbol.address);
|
||||||
|
else
|
||||||
|
builder.appendf("%p %s +%u\n", symbol.address, symbol.ksym->name, offset);
|
||||||
}
|
}
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
});
|
});
|
||||||
|
|
|
@ -30,6 +30,8 @@ const KSym* ksymbolicate(dword address)
|
||||||
|
|
||||||
static void load_ksyms_from_data(const ByteBuffer& buffer)
|
static void load_ksyms_from_data(const ByteBuffer& buffer)
|
||||||
{
|
{
|
||||||
|
ksym_lowest_address = 0xffffffff;
|
||||||
|
ksym_highest_address = 0;
|
||||||
auto* bufptr = (const char*)buffer.pointer();
|
auto* bufptr = (const char*)buffer.pointer();
|
||||||
auto* start_of_name = bufptr;
|
auto* start_of_name = bufptr;
|
||||||
dword address = 0;
|
dword address = 0;
|
||||||
|
@ -92,8 +94,7 @@ static void load_ksyms_from_data(const ByteBuffer& buffer)
|
||||||
if (use_ksyms) {
|
if (use_ksyms) {
|
||||||
for (dword* stack_ptr = (dword*)ebp; current->process().validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
for (dword* stack_ptr = (dword*)ebp; current->process().validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
||||||
dword retaddr = stack_ptr[1];
|
dword retaddr = stack_ptr[1];
|
||||||
if (auto* ksym = ksymbolicate(retaddr))
|
recognized_symbols[recognized_symbol_count++] = { retaddr, ksymbolicate(retaddr) };
|
||||||
recognized_symbols[recognized_symbol_count++] = { retaddr, ksym };
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (dword* stack_ptr = (dword*)ebp; current->process().validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
for (dword* stack_ptr = (dword*)ebp; current->process().validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
||||||
|
@ -106,12 +107,21 @@ static void load_ksyms_from_data(const ByteBuffer& buffer)
|
||||||
size_t bytes_needed = 0;
|
size_t bytes_needed = 0;
|
||||||
for (int i = 0; i < recognized_symbol_count; ++i) {
|
for (int i = 0; i < recognized_symbol_count; ++i) {
|
||||||
auto& symbol = recognized_symbols[i];
|
auto& symbol = recognized_symbols[i];
|
||||||
bytes_needed += strlen(symbol.ksym->name) + 8 + 16;
|
bytes_needed += (symbol.ksym ? strlen(symbol.ksym->name) : 0) + 8 + 16;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < recognized_symbol_count; ++i) {
|
for (int i = 0; i < recognized_symbol_count; ++i) {
|
||||||
auto& symbol = recognized_symbols[i];
|
auto& symbol = recognized_symbols[i];
|
||||||
|
if (!symbol.address)
|
||||||
|
break;
|
||||||
|
if (!symbol.ksym) {
|
||||||
|
dbgprintf("%p\n", symbol.address);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
unsigned offset = symbol.address - symbol.ksym->address;
|
unsigned offset = symbol.address - symbol.ksym->address;
|
||||||
dbgprintf("%p %s +%u\n", symbol.address, symbol.ksym->name, offset);
|
if (symbol.ksym->address == ksym_highest_address && offset > 4096)
|
||||||
|
dbgprintf("%p\n", symbol.address);
|
||||||
|
else
|
||||||
|
dbgprintf("%p %s +%u\n", symbol.address, symbol.ksym->name, offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
tmp=$(mktemp)
|
tmp=$(mktemp)
|
||||||
nm -nC kernel | uniq > $tmp
|
nm -nC kernel | awk '{ if ($2 != "a") print; }' | uniq > $tmp
|
||||||
printf "%08x\n" $(wc -l $tmp | cut -f1 -d' ') > kernel.map
|
printf "%08x\n" $(wc -l $tmp | cut -f1 -d' ') > kernel.map
|
||||||
cat $tmp >> kernel.map
|
cat $tmp >> kernel.map
|
||||||
rm -f $tmp
|
rm -f $tmp
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue