Skip to content

Commit

Permalink
Reimplement backtrace() in terms of _Unwind_Backtrace().
Browse files Browse the repository at this point in the history
Remove get_frame_pointer() entirely as it is now obsolete.
  • Loading branch information
foxostro committed Mar 20, 2019
1 parent 9e00d83 commit 072a783
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 96 deletions.
3 changes: 0 additions & 3 deletions Kernel/CMakeLists.txt
Expand Up @@ -15,7 +15,6 @@ set(PLATFORM_AGNOSTIC_SOURCE_FILES
"include/generic_interrupt_dispatcher.hpp"
"include/generic_interrupt_handler.hpp"
"include/simple_device_interrupt_handler.hpp"
"include/get_frame_pointer.h"
"include/halt.h"
"include/inout.h"
"include/interrupt_asm.h"
Expand Down Expand Up @@ -145,7 +144,6 @@ if(CMAKE_CROSSCOMPILING)
GenerateSourceFromTemplate("${PROJECT_SOURCE_DIR}/Kernel/src/${CMAKE_SYSTEM_PROCESSOR}/isr_wrapper_asm.S.erb"
"${CMAKE_CURRENT_BINARY_DIR}/isr_wrapper_asm.S")
list(APPEND PLATFORM_SPECIFIC_SOURCE_FILES
"src/${BUILD_ARCH}/get_frame_pointer.S"
"src/${BUILD_ARCH}/halt.S"
"src/${BUILD_ARCH}/inout.S"
"src/${BUILD_ARCH}/interrupt_asm.S"
Expand All @@ -155,7 +153,6 @@ else(CMAKE_CROSSCOMPILING)
GenerateSourceFromTemplate("${PROJECT_SOURCE_DIR}/Kernel/src/host/isr_wrapper.c.erb"
"${CMAKE_CURRENT_BINARY_DIR}/isr_wrapper.c")
list(APPEND PLATFORM_SPECIFIC_SOURCE_FILES
"src/host/get_frame_pointer.c"
"src/host/halt.c"
"src/host/inout.c"
"src/host/interrupt.c"
Expand Down
38 changes: 7 additions & 31 deletions Kernel/include/backtrace.hpp
@@ -1,38 +1,14 @@
#ifndef FLAPJACKOS_KERNEL_INCLUDE_BACKTRACE_HPP
#define FLAPJACKOS_KERNEL_INCLUDE_BACKTRACE_HPP

#include <common/text_terminal.hpp>
#include <get_frame_pointer.h>
#include <unwind.h> // for _Unwind_* symbols

template<typename Function>
void enumerate_stack_frames(Function&& function)
{
constexpr size_t MAXFRAMES = 16;
size_t frame;
uintptr_t* frame_pointer;
class StackWalker {
public:
virtual ~StackWalker() = default;
virtual void trace(void* ip) = 0;
};

frame_pointer = get_frame_pointer();

for (frame = 0; frame < MAXFRAMES; ++frame) {
uintptr_t return_address;

if(frame_pointer == nullptr) {
// We set ebp to zero at the root stack frame.
break;
}

return_address = frame_pointer[1];

if(return_address == 0) {
// No return address?
break;
}

frame_pointer = (uintptr_t *)(frame_pointer[0]);
function(return_address);
}
}

void backtrace(TextTerminal &term);
void backtrace(StackWalker& stack_walker);

#endif // FLAPJACKOS_KERNEL_INCLUDE_BACKTRACE_HPP
16 changes: 0 additions & 16 deletions Kernel/include/get_frame_pointer.h

This file was deleted.

23 changes: 13 additions & 10 deletions Kernel/src/backtrace.cpp
@@ -1,14 +1,17 @@
#include <backtrace.hpp>
#include <common/logger.hpp>

void backtrace(TextTerminal &term)
static _Unwind_Reason_Code backtrace_trace(struct _Unwind_Context* context, void* param)
{
TRACE("begin");
term.printf("Back Trace:\n");
enumerate_stack_frames([&](uintptr_t instruction_pointer){
TRACE("[%p]", reinterpret_cast<void*>(instruction_pointer));
term.printf("[%p]\n", reinterpret_cast<void*>(instruction_pointer));
});
TRACE("end");
term.printf("\n");
void* ip = reinterpret_cast<void*>(_Unwind_GetIP(context));
if (ip) {
reinterpret_cast<StackWalker*>(param)->trace(ip);
return _URC_NO_REASON;
} else {
return _URC_END_OF_STACK;
}
}

void backtrace(StackWalker& stack_walker)
{
_Unwind_Backtrace(backtrace_trace, reinterpret_cast<void*>(&stack_walker));
}
7 changes: 0 additions & 7 deletions Kernel/src/host/get_frame_pointer.c

This file was deleted.

4 changes: 0 additions & 4 deletions Kernel/src/i386/get_frame_pointer.S

This file was deleted.

29 changes: 8 additions & 21 deletions Kernel/src/platform/i386/panic.cpp
Expand Up @@ -4,14 +4,12 @@
#include <common/text_terminal.hpp>
#include <halt.h>
#include <interrupt_asm.h>
#include <unwind.h> // for _Unwind_* symbols
#include <backtrace.hpp>

#include <cstdio>
#include <cstdarg>

static _Unwind_Reason_Code trace(struct _Unwind_Context* context, void* param);

class PanicKernel : private KernelPolicy {
class PanicKernel : public StackWalker, private KernelPolicy {
public:
virtual ~PanicKernel() = default;

Expand Down Expand Up @@ -41,22 +39,16 @@ class PanicKernel : private KernelPolicy {
void backtrace()
{
puts("Back Trace:\n");
_Unwind_Backtrace(::trace, reinterpret_cast<void*>(this));
::backtrace(*this);
puts("End Back Trace\n");
}

_Unwind_Reason_Code trace(struct _Unwind_Context* context)
void trace(void *ip) override
{
void* ip = reinterpret_cast<void*>(_Unwind_GetIP(context));
if (ip) {
char buffer[32] = {0};
snprintf(buffer, sizeof(buffer), "[%p]\n",
reinterpret_cast<void*>(ip));
puts(buffer);
return _URC_NO_REASON;
} else {
return _URC_END_OF_STACK;
}
char buffer[32] = {0};
snprintf(buffer, sizeof(buffer), "[%p]\n",
reinterpret_cast<void*>(ip));
puts(buffer);
}

__attribute__((noreturn)) void interrupt() noexcept
Expand All @@ -75,11 +67,6 @@ class PanicKernel : private KernelPolicy {
LoggerTextOutputStream logger_;
};

static _Unwind_Reason_Code trace(struct _Unwind_Context* context, void* param)
{
return reinterpret_cast<PanicKernel*>(param)->trace(context);
}

static PanicKernel* g_panic_kernel;

// Prints a message to the screen and halts forever.
Expand Down
4 changes: 0 additions & 4 deletions Kernel/src/x86_64/get_frame_pointer.S

This file was deleted.

0 comments on commit 072a783

Please sign in to comment.