linux/arch/arm/kernel/debug.S
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/kernel/debug.S
   3 *
   4 *  Copyright (C) 1994-1999 Russell King
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 *
  10 *  32-bit debugging code
  11 */
  12#include <linux/linkage.h>
  13#include <asm/assembler.h>
  14
  15                .text
  16
  17/*
  18 * Some debugging routines (useful if you've got MM problems and
  19 * printk isn't working).  For DEBUGGING ONLY!!!  Do not leave
  20 * references to these in a production kernel!
  21 */
  22
  23#if !defined(CONFIG_DEBUG_SEMIHOSTING)
  24#include CONFIG_DEBUG_LL_INCLUDE
  25#endif
  26
  27#ifdef CONFIG_MMU
  28                .macro  addruart_current, rx, tmp1, tmp2
  29                addruart        \tmp1, \tmp2, \rx
  30                mrc             p15, 0, \rx, c1, c0
  31                tst             \rx, #1
  32                moveq           \rx, \tmp1
  33                movne           \rx, \tmp2
  34                .endm
  35
  36#else /* !CONFIG_MMU */
  37                .macro  addruart_current, rx, tmp1, tmp2
  38                addruart        \rx, \tmp1, \tmp2
  39                .endm
  40
  41#endif /* CONFIG_MMU */
  42
  43/*
  44 * Useful debugging routines
  45 */
  46ENTRY(printhex8)
  47                mov     r1, #8
  48                b       printhex
  49ENDPROC(printhex8)
  50
  51ENTRY(printhex4)
  52                mov     r1, #4
  53                b       printhex
  54ENDPROC(printhex4)
  55
  56ENTRY(printhex2)
  57                mov     r1, #2
  58printhex:       adr     r2, hexbuf
  59                add     r3, r2, r1
  60                mov     r1, #0
  61                strb    r1, [r3]
  621:              and     r1, r0, #15
  63                mov     r0, r0, lsr #4
  64                cmp     r1, #10
  65                addlt   r1, r1, #'0'
  66                addge   r1, r1, #'a' - 10
  67                strb    r1, [r3, #-1]!
  68                teq     r3, r2
  69                bne     1b
  70                mov     r0, r2
  71                b       printascii
  72ENDPROC(printhex2)
  73
  74hexbuf:         .space 16
  75
  76                .ltorg
  77
  78#ifndef CONFIG_DEBUG_SEMIHOSTING
  79
  80ENTRY(printascii)
  81                addruart_current r3, r1, r2
  82                b       2f
  831:              waituart r2, r3
  84                senduart r1, r3
  85                busyuart r2, r3
  86                teq     r1, #'\n'
  87                moveq   r1, #'\r'
  88                beq     1b
  892:              teq     r0, #0
  90                ldrneb  r1, [r0], #1
  91                teqne   r1, #0
  92                bne     1b
  93                ret     lr
  94ENDPROC(printascii)
  95
  96ENTRY(printch)
  97                addruart_current r3, r1, r2
  98                mov     r1, r0
  99                mov     r0, #0
 100                b       1b
 101ENDPROC(printch)
 102
 103#ifdef CONFIG_MMU
 104ENTRY(debug_ll_addr)
 105                addruart r2, r3, ip
 106                str     r2, [r0]
 107                str     r3, [r1]
 108                ret     lr
 109ENDPROC(debug_ll_addr)
 110#endif
 111
 112#else
 113
 114ENTRY(printascii)
 115                mov     r1, r0
 116                mov     r0, #0x04               @ SYS_WRITE0
 117        ARM(    svc     #0x123456       )
 118        THUMB(  svc     #0xab           )
 119                ret     lr
 120ENDPROC(printascii)
 121
 122ENTRY(printch)
 123                adr     r1, hexbuf
 124                strb    r0, [r1]
 125                mov     r0, #0x03               @ SYS_WRITEC
 126        ARM(    svc     #0x123456       )
 127        THUMB(  svc     #0xab           )
 128                ret     lr
 129ENDPROC(printch)
 130
 131ENTRY(debug_ll_addr)
 132                mov     r2, #0
 133                str     r2, [r0]
 134                str     r2, [r1]
 135                ret     lr
 136ENDPROC(debug_ll_addr)
 137
 138#endif
 139