From 28244039a5ca469bfdd1103dd5ef933680f52ebd Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 30 Apr 2019 14:47:22 +0200 Subject: [PATCH] Kernel: Don't symbolicate symbol+offset for obvious non-kernel addresses. --- Kernel/FileSystem/ProcFS.cpp | 19 +++++++++++++------ Kernel/KSyms.cpp | 18 ++++++++++++++---- Kernel/mkmap.sh | 2 +- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index 5ca1d4dc8a..1397872f5d 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -304,18 +304,25 @@ ByteBuffer procfs$pid_stack(InodeIdentifier identifier) StringBuilder builder; process.for_each_thread([&] (Thread& thread) { builder.appendf("Thread %d:\n", thread.tid()); - Vector recognized_symbols; - if (auto* eip_ksym = ksymbolicate(thread.tss().eip)) - recognized_symbols.append({ thread.tss().eip, eip_ksym }); + Vector recognized_symbols; + recognized_symbols.append({ thread.tss().eip, ksymbolicate(thread.tss().eip) }); 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]; - if (auto* ksym = ksymbolicate(retaddr)) - recognized_symbols.append({ retaddr, ksym }); + recognized_symbols.append({ retaddr, ksymbolicate(retaddr) }); } 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; - 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; }); diff --git a/Kernel/KSyms.cpp b/Kernel/KSyms.cpp index 92ad15d785..95d2feca21 100644 --- a/Kernel/KSyms.cpp +++ b/Kernel/KSyms.cpp @@ -30,6 +30,8 @@ const KSym* ksymbolicate(dword address) static void load_ksyms_from_data(const ByteBuffer& buffer) { + ksym_lowest_address = 0xffffffff; + ksym_highest_address = 0; auto* bufptr = (const char*)buffer.pointer(); auto* start_of_name = bufptr; dword address = 0; @@ -92,8 +94,7 @@ static void load_ksyms_from_data(const ByteBuffer& buffer) if (use_ksyms) { 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]; - if (auto* ksym = ksymbolicate(retaddr)) - recognized_symbols[recognized_symbol_count++] = { retaddr, ksym }; + recognized_symbols[recognized_symbol_count++] = { retaddr, ksymbolicate(retaddr) }; } } else { 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; for (int i = 0; i < recognized_symbol_count; ++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) { 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; - 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); } } diff --git a/Kernel/mkmap.sh b/Kernel/mkmap.sh index b554769a68..3c2d7b5cff 100644 --- a/Kernel/mkmap.sh +++ b/Kernel/mkmap.sh @@ -1,6 +1,6 @@ #!/bin/sh 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 cat $tmp >> kernel.map rm -f $tmp