From 6048591e9dd5c3f461dd3dd6cb5e6f4a17167439 Mon Sep 17 00:00:00 2001 From: "Ithamar R. Adema" Date: Sun, 7 Sep 2014 19:15:01 +0200 Subject: [PATCH] Revert "Added check to ensure KDL does not include frames beyond kernel entry in the backtrace. This prevents KDL from faulting when printing backtrace on ARM." This reverts commit 3fbb24680c819d0819f4f876fe6565c336a19139. As I mentioned in #11131, this fix is not correct, and works around the problem. The real reason was that arch_debug_call_with_fault_handler was not working properly, so the fault handler went crazy. With commit eb92810 that is fixed so this can be reverted. --- headers/private/kernel/arch/arm/arch_kernel.h | 2 +- src/system/boot/arch/arm/arch_mmu.cpp | 2 +- src/system/kernel/arch/arm/arch_debug.cpp | 19 ++++++++++--------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/headers/private/kernel/arch/arm/arch_kernel.h b/headers/private/kernel/arch/arm/arch_kernel.h index 9c8723bc19..766ab42b10 100644 --- a/headers/private/kernel/arch/arm/arch_kernel.h +++ b/headers/private/kernel/arch/arm/arch_kernel.h @@ -9,7 +9,7 @@ // memory layout #define KERNEL_BASE 0x80000000 -#define KERNEL_SIZE 0x800000 +#define KERNEL_SIZE 0x80000000 #define KERNEL_TOP (KERNEL_BASE + (KERNEL_SIZE - 1)) /* diff --git a/src/system/boot/arch/arm/arch_mmu.cpp b/src/system/boot/arch/arm/arch_mmu.cpp index 7e2f44a059..758a1f352c 100644 --- a/src/system/boot/arch/arm/arch_mmu.cpp +++ b/src/system/boot/arch/arm/arch_mmu.cpp @@ -59,7 +59,7 @@ TODO: // 8 MB for the kernel, kernel args, modules, driver settings, ... -static const size_t kMaxKernelSize = KERNEL_SIZE; +static const size_t kMaxKernelSize = 0x800000; // Base address for loader static const size_t kLoaderBaseAddress = KERNEL_LOAD_BASE + kMaxKernelSize; diff --git a/src/system/kernel/arch/arm/arch_debug.cpp b/src/system/kernel/arch/arm/arch_debug.cpp index 985ce7c383..1832ca2962 100644 --- a/src/system/kernel/arch/arm/arch_debug.cpp +++ b/src/system/kernel/arch/arm/arch_debug.cpp @@ -56,18 +56,19 @@ already_visited(uint32 *visited, int32 *_last, int32 *_num, uint32 fp) static status_t get_next_frame(addr_t fp, addr_t *next, addr_t *ip) { - addr_t _fp = *(((addr_t*)fp) -3); - addr_t _sp = *(((addr_t*)fp) -2); - addr_t _lr = *(((addr_t*)fp) -1); - addr_t _pc = *(((addr_t*)fp) -0); + if (fp != 0) { + addr_t _fp = *(((addr_t*)fp) -3); + addr_t _sp = *(((addr_t*)fp) -2); + addr_t _lr = *(((addr_t*)fp) -1); + addr_t _pc = *(((addr_t*)fp) -0); - if (_lr > KERNEL_TOP) { - return B_BAD_ADDRESS; + *ip = (_fp != 0) ? _lr : _pc; + *next = _fp; + + return B_OK; } - *ip = (_fp != 0) ? _lr : _pc; - *next = _fp; - return B_OK; + return B_BAD_VALUE; }