Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/debug/stacktrace.c

    r7e752b2 rf6069801  
    2727 */
    2828
    29 /** @addtogroup genericdebug
     29/** @addtogroup genericdebug 
    3030 * @{
    3131 */
     
    3535#include <stacktrace.h>
    3636#include <interrupt.h>
    37 #include <typedefs.h>
     37#include <arch/types.h>
    3838#include <symtab.h>
    39 #include <print.h>
    4039
    4140#define STACK_FRAMES_MAX        20
    4241
    43 void stack_trace_ctx(stack_trace_ops_t *ops, stack_trace_context_t *ctx)
     42void
     43stack_trace_fp_pc(stack_trace_ops_t *ops, uintptr_t fp, uintptr_t pc)
    4444{
    4545        int cnt = 0;
    46         const char *symbol;
     46        char *symbol;
    4747        uintptr_t offset;
    48         uintptr_t fp;
    49         uintptr_t pc;
    50        
    51         while (cnt++ < STACK_FRAMES_MAX &&
    52             ops->stack_trace_context_validate(ctx)) {
     48
     49        while (cnt++ < STACK_FRAMES_MAX && ops->frame_pointer_validate(fp)) {
    5350                if (ops->symbol_resolve &&
    54                     ops->symbol_resolve(ctx->pc, &symbol, &offset)) {
    55                         if (offset)
    56                                 printf("%p: %s()+%p\n", (void *) ctx->fp,
    57                                     symbol, (void *) offset);
     51                    ops->symbol_resolve(pc, &symbol, &offset)) {
     52                        if (offset)
     53                                printf("%p: %s+%p()\n", fp, symbol, offset);
    5854                        else
    59                                 printf("%p: %s()\n", (void *) ctx->fp, symbol);
    60                 } else
    61                         printf("%p: %p()\n", (void *) ctx->fp, (void *) ctx->pc);
    62                
    63                 if (!ops->return_address_get(ctx, &pc))
     55                                printf("%p: %s()\n", fp, symbol);
     56                } else {
     57                        printf("%p: %p()\n", fp, pc);
     58                }
     59                if (!ops->return_address_get(fp, &pc))
    6460                        break;
    65                
    66                 if (!ops->frame_pointer_prev(ctx, &fp))
     61                if (!ops->frame_pointer_prev(fp, &fp))
    6762                        break;
    68                
    69                 ctx->fp = fp;
    70                 ctx->pc = pc;
    7163        }
    7264}
     
    7466void stack_trace(void)
    7567{
    76         stack_trace_context_t ctx = {
    77                 .fp = frame_pointer_get(),
    78                 .pc = program_counter_get(),
    79                 .istate = NULL
    80         };
    81 
    82         stack_trace_ctx(&kst_ops, &ctx);
     68        stack_trace_fp_pc(&kst_ops, frame_pointer_get(), program_counter_get());
    8369
    8470        /*
     
    9177void stack_trace_istate(istate_t *istate)
    9278{
    93         stack_trace_context_t ctx = {
    94                 .fp = istate_get_fp(istate),
    95                 .pc = istate_get_pc(istate),
    96                 .istate = istate
    97         };
    98        
    9979        if (istate_from_uspace(istate))
    100                 stack_trace_ctx(&ust_ops, &ctx);
     80                stack_trace_fp_pc(&ust_ops, istate_get_fp(istate),
     81                    istate_get_pc(istate));
    10182        else
    102                 stack_trace_ctx(&kst_ops, &ctx);
     83                stack_trace_fp_pc(&kst_ops, istate_get_fp(istate),
     84                    istate_get_pc(istate));
    10385}
    10486
    105 static bool
    106 kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op)
     87static bool kernel_symbol_resolve(uintptr_t addr, char **sp, uintptr_t *op)
    10788{
    10889        return (symtab_name_lookup(addr, sp, op) == 0);
     
    11091
    11192stack_trace_ops_t kst_ops = {
    112         .stack_trace_context_validate = kernel_stack_trace_context_validate,
     93        .frame_pointer_validate = kernel_frame_pointer_validate,
    11394        .frame_pointer_prev = kernel_frame_pointer_prev,
    11495        .return_address_get = kernel_return_address_get,
     
    11798
    11899stack_trace_ops_t ust_ops = {
    119         .stack_trace_context_validate = uspace_stack_trace_context_validate,
     100        .frame_pointer_validate = uspace_frame_pointer_validate,
    120101        .frame_pointer_prev = uspace_frame_pointer_prev,
    121102        .return_address_get = uspace_return_address_get,
Note: See TracChangeset for help on using the changeset viewer.