mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 19:37:35 +00:00
Unbreak ksym loading and make reading /proc/PID/stack not crash.
This commit is contained in:
parent
683185e4aa
commit
4b6a8f8a08
7 changed files with 7 additions and 10 deletions
|
@ -91,13 +91,13 @@ void dump_backtrace(bool use_ksyms)
|
||||||
};
|
};
|
||||||
Vector<RecognizedSymbol> recognized_symbols;
|
Vector<RecognizedSymbol> recognized_symbols;
|
||||||
if (use_ksyms) {
|
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];
|
dword retaddr = stackPtr[1];
|
||||||
if (auto* ksym = ksymbolicate(retaddr))
|
if (auto* ksym = ksymbolicate(retaddr))
|
||||||
recognized_symbols.append({ retaddr, ksym });
|
recognized_symbols.append({ retaddr, ksym });
|
||||||
}
|
}
|
||||||
} else{
|
} 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];
|
dword retaddr = stackPtr[1];
|
||||||
kprintf("%x (next: %x)\n", retaddr, stackPtr ? (dword*)*stackPtr : 0);
|
kprintf("%x (next: %x)\n", retaddr, stackPtr ? (dword*)*stackPtr : 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ struct KSym {
|
||||||
|
|
||||||
const KSym* ksymbolicate(dword address) PURE;
|
const KSym* ksymbolicate(dword address) PURE;
|
||||||
void load_ksyms();
|
void load_ksyms();
|
||||||
|
void init_ksyms();
|
||||||
|
|
||||||
extern bool ksyms_ready;
|
extern bool ksyms_ready;
|
||||||
extern dword ksym_lowest_address;
|
extern dword ksym_lowest_address;
|
||||||
|
|
|
@ -110,7 +110,7 @@ ByteBuffer procfs$pid_stack(Process& process)
|
||||||
Vector<RecognizedSymbol> recognizedSymbols;
|
Vector<RecognizedSymbol> recognizedSymbols;
|
||||||
if (auto* eipKsym = ksymbolicate(process.tss().eip))
|
if (auto* eipKsym = ksymbolicate(process.tss().eip))
|
||||||
recognizedSymbols.append({ process.tss().eip, eipKsym });
|
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];
|
dword retaddr = stackPtr[1];
|
||||||
if (auto* ksym = ksymbolicate(retaddr))
|
if (auto* ksym = ksymbolicate(retaddr))
|
||||||
recognizedSymbols.append({ retaddr, ksym });
|
recognizedSymbols.append({ retaddr, ksym });
|
||||||
|
|
|
@ -1553,7 +1553,7 @@ void sleep(dword ticks)
|
||||||
sched_yield();
|
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.
|
// 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.
|
// This code allows access outside of the known used address ranges to get caught.
|
||||||
|
|
|
@ -201,7 +201,7 @@ public:
|
||||||
dword stackPtr() const { return m_tss.esp; }
|
dword stackPtr() const { return m_tss.esp; }
|
||||||
dword stackTop() const { return m_tss.ss == 0x10 ? m_stackTop0 : m_stackTop3; }
|
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_read(const void*, size_t) const;
|
||||||
bool validate_write(void*, size_t) const;
|
bool validate_write(void*, size_t) const;
|
||||||
|
|
Binary file not shown.
|
@ -111,12 +111,8 @@ void init()
|
||||||
{
|
{
|
||||||
cli();
|
cli();
|
||||||
|
|
||||||
#ifdef KSYMS
|
|
||||||
s_ksyms = nullptr;
|
|
||||||
s_ksyms_ready = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
kmalloc_init();
|
kmalloc_init();
|
||||||
|
init_ksyms();
|
||||||
|
|
||||||
auto console = make<Console>();
|
auto console = make<Console>();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue