Ignore:
File:
1 edited

Legend:

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

    rf6069801 r7e752b2  
    2727 */
    2828
    29 /** @addtogroup genericdebug 
     29/** @addtogroup genericdebug
    3030 * @{
    3131 */
     
    3535#include <stacktrace.h>
    3636#include <interrupt.h>
    37 #include <arch/types.h>
     37#include <typedefs.h>
    3838#include <symtab.h>
     39#include <print.h>
    3940
    4041#define STACK_FRAMES_MAX        20
    4142
    42 void
    43 stack_trace_fp_pc(stack_trace_ops_t *ops, uintptr_t fp, uintptr_t pc)
     43void stack_trace_ctx(stack_trace_ops_t *ops, stack_trace_context_t *ctx)
    4444{
    4545        int cnt = 0;
    46         char *symbol;
     46        const char *symbol;
    4747        uintptr_t offset;
    48 
    49         while (cnt++ < STACK_FRAMES_MAX && ops->frame_pointer_validate(fp)) {
     48        uintptr_t fp;
     49        uintptr_t pc;
     50       
     51        while (cnt++ < STACK_FRAMES_MAX &&
     52            ops->stack_trace_context_validate(ctx)) {
    5053                if (ops->symbol_resolve &&
    51                     ops->symbol_resolve(pc, &symbol, &offset)) {
    52                         if (offset)
    53                                 printf("%p: %s+%p()\n", fp, symbol, offset);
     54                    ops->symbol_resolve(ctx->pc, &symbol, &offset)) {
     55                        if (offset)
     56                                printf("%p: %s()+%p\n", (void *) ctx->fp,
     57                                    symbol, (void *) offset);
    5458                        else
    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))
     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))
    6064                        break;
    61                 if (!ops->frame_pointer_prev(fp, &fp))
     65               
     66                if (!ops->frame_pointer_prev(ctx, &fp))
    6267                        break;
     68               
     69                ctx->fp = fp;
     70                ctx->pc = pc;
    6371        }
    6472}
     
    6674void stack_trace(void)
    6775{
    68         stack_trace_fp_pc(&kst_ops, frame_pointer_get(), program_counter_get());
     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);
    6983
    7084        /*
     
    7791void stack_trace_istate(istate_t *istate)
    7892{
     93        stack_trace_context_t ctx = {
     94                .fp = istate_get_fp(istate),
     95                .pc = istate_get_pc(istate),
     96                .istate = istate
     97        };
     98       
    7999        if (istate_from_uspace(istate))
    80                 stack_trace_fp_pc(&ust_ops, istate_get_fp(istate),
    81                     istate_get_pc(istate));
     100                stack_trace_ctx(&ust_ops, &ctx);
    82101        else
    83                 stack_trace_fp_pc(&kst_ops, istate_get_fp(istate),
    84                     istate_get_pc(istate));
     102                stack_trace_ctx(&kst_ops, &ctx);
    85103}
    86104
    87 static bool kernel_symbol_resolve(uintptr_t addr, char **sp, uintptr_t *op)
     105static bool
     106kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op)
    88107{
    89108        return (symtab_name_lookup(addr, sp, op) == 0);
     
    91110
    92111stack_trace_ops_t kst_ops = {
    93         .frame_pointer_validate = kernel_frame_pointer_validate,
     112        .stack_trace_context_validate = kernel_stack_trace_context_validate,
    94113        .frame_pointer_prev = kernel_frame_pointer_prev,
    95114        .return_address_get = kernel_return_address_get,
     
    98117
    99118stack_trace_ops_t ust_ops = {
    100         .frame_pointer_validate = uspace_frame_pointer_validate,
     119        .stack_trace_context_validate = uspace_stack_trace_context_validate,
    101120        .frame_pointer_prev = uspace_frame_pointer_prev,
    102121        .return_address_get = uspace_return_address_get,
Note: See TracChangeset for help on using the changeset viewer.