Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/debug/stacktrace.c

    r6d7f9bfe r294f7a52  
    3535#include <stacktrace.h>
    3636#include <syscall/copy.h>
    37 #include <arch/types.h>
    3837#include <typedefs.h>
    3938
    40 bool kernel_frame_pointer_validate(uintptr_t fp)
     39#include <arch.h>
     40#include <arch/stack.h>
     41#include <arch/trap/trap_table.h>
     42
     43#if defined(SUN4V)
     44#include <arch/sun4v/arch.h>
     45#endif
     46
     47#define FRAME_OFFSET_FP_PREV    14
     48#define FRAME_OFFSET_RA         15
     49
     50extern void alloc_window_and_flush(void);
     51
     52bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
     53{
     54        uintptr_t kstack;
     55       
     56#if defined(SUN4U)
     57        kstack = read_from_ag_g6();
     58#elif defined(SUN4V)
     59        kstack = asi_u64_read(ASI_SCRATCHPAD, SCRATCHPAD_KSTACK);
     60#endif
     61
     62        kstack += STACK_BIAS;
     63        kstack -= PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE;
     64
     65        if (THREAD && (ctx->fp == kstack))
     66                return false;
     67        return ctx->fp != 0;
     68}
     69
     70bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     71{
     72        uint64_t *stack = (void *) ctx->fp;
     73        alloc_window_and_flush();
     74        *prev = stack[FRAME_OFFSET_FP_PREV] + STACK_BIAS;
     75        return true;
     76}
     77
     78bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     79{
     80        uint64_t *stack = (void *) ctx->fp;
     81        alloc_window_and_flush();
     82        *ra = stack[FRAME_OFFSET_RA];
     83        return true;
     84}
     85
     86bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
    4187{
    4288        return false;
    4389}
    4490
    45 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
     91bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    4692{
    4793        return false;
    4894}
    4995
    50 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    51 {
    52         return false;
    53 }
    54 
    55 bool uspace_frame_pointer_validate(uintptr_t fp)
    56 {
    57         return false;
    58 }
    59 
    60 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    61 {
    62         return false;
    63 }
    64 
    65 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
     96bool uspace_return_address_get(stack_trace_context_t *ctx , uintptr_t *ra)
    6697{
    6798        return false;
Note: See TracChangeset for help on using the changeset viewer.