OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [armnommu/] [lib/] [backtrace.S] - Diff between revs 1765 and 1782

Only display areas with differences | Details | Blame | View Log

Rev 1765 Rev 1782
/*
/*
 * linux/arch/arm/lib/backtrace.S
 * linux/arch/arm/lib/backtrace.S
 *
 *
 * Copyright (C) 1995, 1996 Russell King
 * Copyright (C) 1995, 1996 Russell King
 */
 */
#include 
#include 
                .text
                .text
@ fp is 0 or stack frame
@ fp is 0 or stack frame
#define frame   r4
#define frame   r4
#define next    r5
#define next    r5
#define save    r6
#define save    r6
#define mask    r7
#define mask    r7
#define offset  r8
#define offset  r8
                .global ___backtrace,__backtrace
                .global ___backtrace,__backtrace
__backtrace:
__backtrace:
___backtrace:
___backtrace:
#ifdef __arm6__
#ifdef __arm6__
                mrs     r1, cpsr
                mrs     r1, cpsr
#else
#else
                mov     r1, pc
                mov     r1, pc
                and     r1, r1, #0xfc000003
                and     r1, r1, #0xfc000003
#endif
#endif
                mov     r0, fp
                mov     r0, fp
                .global _c_backtrace,c_backtrace
                .global _c_backtrace,c_backtrace
c_backtrace:
c_backtrace:
_c_backtrace:   stmfd   sp!, {r4 - r8, lr}      @ Save an extra register so we have a location...
_c_backtrace:   stmfd   sp!, {r4 - r8, lr}      @ Save an extra register so we have a location...
                tst     r1, #0x10               @ 26 or 32-bit?
                tst     r1, #0x10               @ 26 or 32-bit?
                moveq   mask, #0xfc000003
                moveq   mask, #0xfc000003
                movne   mask, #0
                movne   mask, #0
                tst     mask, r0
                tst     mask, r0
                movne   r0, #0
                movne   r0, #0
                movs    frame, r0
                movs    frame, r0
Lbadbacktrace:  moveq   r0, #-2
Lbadbacktrace:  moveq   r0, #-2
                LOADREGS(eqfd, sp!, {r4 - r8, pc})
                LOADREGS(eqfd, sp!, {r4 - r8, pc})
Lst:            stmfd   sp!, {pc}                       @ calculate offset of PC in STMIA instruction
Lst:            stmfd   sp!, {pc}                       @ calculate offset of PC in STMIA instruction
                ldr     r0, [sp], #4
                ldr     r0, [sp], #4
                adr     r1, Lst - 4
                adr     r1, Lst - 4
                sub     offset, r0, r1
                sub     offset, r0, r1
Lloop:          tst     frame, mask                     @ Check for address exceptions...
Lloop:          tst     frame, mask                     @ Check for address exceptions...
                bne     Lbadbacktrace
                bne     Lbadbacktrace
                ldmda   frame, {r0, r1, r2, r3}         @ fp, sp, lr, pc
                ldmda   frame, {r0, r1, r2, r3}         @ fp, sp, lr, pc
                mov     next, r0
                mov     next, r0
                sub     save, r3, offset                @ Correct PC for prefetching
                sub     save, r3, offset                @ Correct PC for prefetching
                bic     save, save, mask
                bic     save, save, mask
                adr     r0, Lfe
                adr     r0, Lfe
                mov     r1, save
                mov     r1, save
                bic     r2, r2, mask
                bic     r2, r2, mask
                bl      printk
                bl      printk
                sub     r0, frame, #16
                sub     r0, frame, #16
                ldr     r1, [save, #4]
                ldr     r1, [save, #4]
                mov     r3, r1, lsr #10
                mov     r3, r1, lsr #10
                ldr     r2, Ldsi+4
                ldr     r2, Ldsi+4
                teq     r3, r2                  @ Check for stmia sp!, {args}
                teq     r3, r2                  @ Check for stmia sp!, {args}
                addeq   save, save, #4          @ next instruction
                addeq   save, save, #4          @ next instruction
                bleq    Ldumpstm
                bleq    Ldumpstm
                ldr     r1, [save, #4]          @ Get 'stmia sp!, {rlist, fp, ip, lr, pc}' instruction
                ldr     r1, [save, #4]          @ Get 'stmia sp!, {rlist, fp, ip, lr, pc}' instruction
                mov     r3, r1, lsr #10
                mov     r3, r1, lsr #10
                ldr     r2, Ldsi
                ldr     r2, Ldsi
                teq     r3, r2
                teq     r3, r2
                bleq    Ldumpstm
                bleq    Ldumpstm
                teq     frame, next
                teq     frame, next
                movne   frame, next
                movne   frame, next
                teqne   frame, #0
                teqne   frame, #0
                bne     Lloop
                bne     Lloop
                LOADREGS(fd, sp!, {r4 - r8, pc})
                LOADREGS(fd, sp!, {r4 - r8, pc})
#define instr r4
#define instr r4
#define reg   r5
#define reg   r5
#define stack r6
#define stack r6
Ldumpstm:       stmfd   sp!, {instr, reg, stack, lr}
Ldumpstm:       stmfd   sp!, {instr, reg, stack, lr}
                mov     stack, r0
                mov     stack, r0
                mov     instr, r1
                mov     instr, r1
                mov     reg, #9
                mov     reg, #9
1:              mov     r3, #1
1:              mov     r3, #1
                tst     instr, r3, lsl reg
                tst     instr, r3, lsl reg
                beq     2f
                beq     2f
                ldr     r2, [stack], #-4
                ldr     r2, [stack], #-4
                mov     r1, reg
                mov     r1, reg
                adr     r0, Lfp
                adr     r0, Lfp
                bl      printk
                bl      printk
2:              subs    reg, reg, #1
2:              subs    reg, reg, #1
                bpl     1b
                bpl     1b
                mov     r0, stack
                mov     r0, stack
                LOADREGS(fd, sp!, {instr, reg, stack, pc})
                LOADREGS(fd, sp!, {instr, reg, stack, pc})
Lfe:            .ascii  "Function entered at [<%p>] from [<%p>]\n"
Lfe:            .ascii  "Function entered at [<%p>] from [<%p>]\n"
                .byte 0
                .byte 0
Lfp:            .ascii  "  r%d = %p\n"
Lfp:            .ascii  "  r%d = %p\n"
                .byte 0
                .byte 0
                .align
                .align
Ldsi:           .word   0x00e92dd8 >> 2
Ldsi:           .word   0x00e92dd8 >> 2
                .word   0x00e92d00 >> 2
                .word   0x00e92d00 >> 2
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.