Changeset 7c8e1e1 in mainline for kernel/arch/sparc64/src/debug


Ignore:
Timestamp:
2010-05-21T23:02:10Z (16 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ecbd287d
Parents:
3500f75 (diff), 0242621 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge initial support for sparc64 kernel stack tracing.

Location:
kernel/arch/sparc64/src/debug
Files:
2 edited

Legend:

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

    r3500f75 r7c8e1e1  
    3737#include <typedefs.h>
    3838
     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
    3952bool kernel_frame_pointer_validate(uintptr_t fp)
    4053{
    41         return false;
     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 && (fp == kstack))
     66                return false;
     67        return fp != 0;
    4268}
    4369
    4470bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    4571{
    46         return false;
     72        uint64_t *stack = (void *) fp;
     73        alloc_window_and_flush();
     74        *prev = stack[FRAME_OFFSET_FP_PREV] + STACK_BIAS;
     75        return true;
    4776}
    4877
    4978bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    5079{
    51         return false;
     80        uint64_t *stack = (void *) fp;
     81        alloc_window_and_flush();
     82        *ra = stack[FRAME_OFFSET_RA];
     83        return true;
    5284}
    5385
  • kernel/arch/sparc64/src/debug/stacktrace_asm.S

    r3500f75 r7c8e1e1  
    2727#
    2828
     29#include <arch/stack.h>
     30
    2931.text
    3032
    3133.global frame_pointer_get
    3234.global program_counter_get
     35.global alloc_window_and_flush
    3336
    3437frame_pointer_get:
     38        # Add the stack bias to %sp to get the actual address.
    3539        retl
    36         nop
     40        add %sp, STACK_BIAS, %o0
    3741
    3842program_counter_get:
    3943        retl
    40         nop
     44        mov %o7, %o0
    4145
     46alloc_window_and_flush:
     47        save %sp, -(STACK_WINDOW_SAVE_AREA_SIZE+STACK_ARG_SAVE_AREA_SIZE), %sp
     48        # Flush all other windows to memory so that we can read their contents.
     49        flushw
     50        ret
     51        restore
     52
Note: See TracChangeset for help on using the changeset viewer.