Unbreak ksym loading and make reading /proc/PID/stack not crash.

This commit is contained in:
Andreas Kling 2019-01-01 02:20:01 +01:00
parent 683185e4aa
commit 4b6a8f8a08
7 changed files with 7 additions and 10 deletions

View file

@ -91,13 +91,13 @@ void dump_backtrace(bool use_ksyms)
};
Vector<RecognizedSymbol> recognized_symbols;
if (use_ksyms) {
for (dword* stackPtr = (dword*)&use_ksyms; current->isValidAddressForKernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
for (dword* stackPtr = (dword*)&use_ksyms; current->validate_read_from_kernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
dword retaddr = stackPtr[1];
if (auto* ksym = ksymbolicate(retaddr))
recognized_symbols.append({ retaddr, ksym });
}
} else{
for (dword* stackPtr = (dword*)&use_ksyms; current->isValidAddressForKernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
for (dword* stackPtr = (dword*)&use_ksyms; current->validate_read_from_kernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
dword retaddr = stackPtr[1];
kprintf("%x (next: %x)\n", retaddr, stackPtr ? (dword*)*stackPtr : 0);
}

View file

@ -10,6 +10,7 @@ struct KSym {
const KSym* ksymbolicate(dword address) PURE;
void load_ksyms();
void init_ksyms();
extern bool ksyms_ready;
extern dword ksym_lowest_address;

View file

@ -110,7 +110,7 @@ ByteBuffer procfs$pid_stack(Process& process)
Vector<RecognizedSymbol> recognizedSymbols;
if (auto* eipKsym = ksymbolicate(process.tss().eip))
recognizedSymbols.append({ process.tss().eip, eipKsym });
for (dword* stackPtr = (dword*)process.framePtr(); process.isValidAddressForKernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
for (dword* stackPtr = (dword*)process.framePtr(); process.validate_read_from_kernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
dword retaddr = stackPtr[1];
if (auto* ksym = ksymbolicate(retaddr))
recognizedSymbols.append({ retaddr, ksym });

View file

@ -1553,7 +1553,7 @@ void sleep(dword ticks)
sched_yield();
}
bool Process::isValidAddressForKernel(LinearAddress laddr) const
bool Process::validate_read_from_kernel(LinearAddress laddr) const
{
// We check extra carefully here since the first 4MB of the address space is identity-mapped.
// This code allows access outside of the known used address ranges to get caught.

View file

@ -201,7 +201,7 @@ public:
dword stackPtr() const { return m_tss.esp; }
dword stackTop() const { return m_tss.ss == 0x10 ? m_stackTop0 : m_stackTop3; }
bool isValidAddressForKernel(LinearAddress) const;
bool validate_read_from_kernel(LinearAddress) const;
bool validate_read(const void*, size_t) const;
bool validate_write(void*, size_t) const;

Binary file not shown.

View file

@ -111,12 +111,8 @@ void init()
{
cli();
#ifdef KSYMS
s_ksyms = nullptr;
s_ksyms_ready = false;
#endif
kmalloc_init();
init_ksyms();
auto console = make<Console>();