uboot/arch/blackfin/lib/__kgdb.S
<<
>>
Prefs
   1
   2#include <asm/linkage.h>
   3
   4/* save stack context for non-local goto
   5 * int kgdb_setjmp(long *buf)
   6 */
   7
   8ENTRY(_kgdb_setjmp)
   9        [--SP] = p0;    /* Save P0 */
  10        p0 = r0;
  11        r0 = [SP++];    /* Load P0 into R0 */
  12
  13        [p0 + 0x00] = r0;       /* GP address registers */
  14        [p0 + 0x04] = p1;
  15        [p0 + 0x08] = p2;
  16        [p0 + 0x0C] = p3;
  17        [p0 + 0x10] = p4;
  18        [p0 + 0x14] = p5;
  19        [p0 + 0x18] = FP;       /* frame pointer */
  20        [p0 + 0x1C] = SP;       /* stack pointer */
  21
  22        [p0 + 0x20] = p0;       /* data regs */
  23        [p0 + 0x24] = r1;
  24        [p0 + 0x28] = r2;
  25        [p0 + 0x2C] = r3;
  26        [p0 + 0x30] = r4;
  27        [p0 + 0x34] = r5;
  28        [p0 + 0x38] = r6;
  29        [p0 + 0x3C] = r7;
  30
  31        r0 = ASTAT;     [p0 + 0x40] = r0;
  32
  33        /* loop counters */
  34        r0 = LC0;       [p0 + 0x44] = r0;
  35        r0 = LC1;       [p0 + 0x48] = r0;
  36
  37        /* Accumulator */
  38        r0 = A0.w;      [p0 + 0x4C] = r0;
  39        r0.l = A0.x;    [p0 + 0x50] = r0;
  40        r0 = A1.w;      [p0 + 0x54] = r0;
  41        r0.l = A1.x;    [p0 + 0x58] = r0;
  42
  43        /* index registers */
  44        r0 = i0;        [p0 + 0x5C] = r0;
  45        r0 = i1;        [p0 + 0x60] = r0;
  46        r0 = i2;        [p0 + 0x64] = r0;
  47        r0 = i3;        [p0 + 0x68] = r0;
  48
  49        /* modifier registers */
  50        r0 = m0;        [p0 + 0x6C] = r0;
  51        r0 = m1;        [p0 + 0x70] = r0;
  52        r0 = m2;        [p0 + 0x74] = r0;
  53        r0 = m3;        [p0 + 0x78] = r0;
  54
  55        /* length registers */
  56        r0 = l0;        [p0 + 0x7C] = r0;
  57        r0 = l1;        [p0 + 0x80] = r0;
  58        r0 = l2;        [p0 + 0x84] = r0;
  59        r0 = l3;        [p0 + 0x88] = r0;
  60
  61        /* base registers */
  62        r0 = b0;        [p0 + 0x8C] = r0;
  63        r0 = b1;        [p0 + 0x90] = r0;
  64        r0 = b2;        [p0 + 0x94] = r0;
  65        r0 = b3;        [p0 + 0x98] = r0;
  66
  67        /* store return address */
  68        r0 = RETS;      [p0 + 0x9C] = r0;
  69
  70        R0 = 0;
  71        RTS;
  72ENDPROC(_kgdb_setjmp)
  73
  74/*
  75 * non-local jump to a saved stack context
  76 * longjmp(long *buf, int val)
  77 */
  78
  79ENTRY(_kgdb_longjmp)
  80        p0 = r0;
  81        r0 = [p0 + 0x00];
  82        [--sp] = r0;
  83
  84        /* GP address registers - skip p0 for now*/
  85        p1 = [p0 + 0x04];
  86        p2 = [p0 + 0x08];
  87        p3 = [p0 + 0x0C];
  88        p4 = [p0 + 0x10];
  89        p5 = [p0 + 0x14];
  90        /* frame pointer */
  91        fp = [p0 + 0x18];
  92        /* stack pointer */
  93        r0 = [sp++];
  94        sp = [p0 + 0x1C];
  95        [--sp] = r0;
  96        [--sp] = r1;
  97
  98        /* data regs */
  99        r0 = [p0 + 0x20];
 100        r1 = [p0 + 0x24];
 101        r2 = [p0 + 0x28];
 102        r3 = [p0 + 0x2C];
 103        r4 = [p0 + 0x30];
 104        r5 = [p0 + 0x34];
 105        r6 = [p0 + 0x38];
 106        r7 = [p0 + 0x3C];
 107
 108        r0 = [p0 + 0x40];       ASTAT = r0;
 109
 110        /* loop counters */
 111        r0 = [p0 + 0x44];       LC0 = r0;
 112        r0 = [p0 + 0x48];       LC1 = r0;
 113
 114        /* Accumulator */
 115        r0 = [p0 + 0x4C];       A0.w = r0;
 116        r0 = [p0 + 0x50];       A0.x = r0;
 117        r0 = [p0 + 0x54];       A1.w = r0;
 118        r0 = [p0 + 0x58];       A1.x = r0;
 119
 120        /* index registers */
 121        r0 = [p0 + 0x5C];       i0 = r0;
 122        r0 = [p0 + 0x60];       i1 = r0;
 123        r0 = [p0 + 0x64];       i2 = r0;
 124        r0 = [p0 + 0x68];       i3 = r0;
 125
 126        /* modifier registers */
 127        r0 = [p0 + 0x6C];       m0 = r0;
 128        r0 = [p0 + 0x70];       m1 = r0;
 129        r0 = [p0 + 0x74];       m2 = r0;
 130        r0 = [p0 + 0x78];       m3 = r0;
 131
 132        /* length registers */
 133        r0 = [p0 + 0x7C];       l0 = r0;
 134        r0 = [p0 + 0x80];       l1 = r0;
 135        r0 = [p0 + 0x84];       l2 = r0;
 136        r0 = [p0 + 0x88];       l3 = r0;
 137
 138        /* base registers */
 139        r0 = [p0 + 0x8C];       b0 = r0;
 140        r0 = [p0 + 0x90];       b1 = r0;
 141        r0 = [p0 + 0x94];       b2 = r0;
 142        r0 = [p0 + 0x98];       b3 = r0;
 143
 144        /* store return address */
 145        r0 = [p0 + 0x9C];       RETS = r0;
 146
 147        /* fixup R0 & P0 */
 148        r0 = [sp++];
 149        p0 = [sp++];
 150        CC = R0 == 0;
 151        IF !CC JUMP .Lfinished;
 152        R0 = 1;
 153.Lfinished:
 154        RTS;
 155ENDPROC(_kgdb_longjmp)
 156