/* | |
* entry.h - routines for context saving and restoring (for interrupts/exceptions) | |
* | |
* Copyright (c) 2005-2007 Analog Devices Inc. | |
* | |
* SPDX-License-Identifier: GPL-2.0+ | |
*/ | |
#ifndef __BLACKFIN_ENTRY_H | |
#define __BLACKFIN_ENTRY_H | |
#ifdef __ASSEMBLY__ | |
#define SAVE_ALL_INT save_context_no_interrupts | |
#define SAVE_ALL_SYS save_context_no_interrupts | |
#define SAVE_CONTEXT save_context_with_interrupts | |
#define RESTORE_ALL restore_context_no_interrupts | |
#define RESTORE_ALL_SYS restore_context_no_interrupts | |
#define RESTORE_CONTEXT restore_context_with_interrupts | |
/* | |
* Code to save processor context. | |
* We even save the register which are preserved by a function call | |
* - r4, r5, r6, r7, p3, p4, p5 | |
*/ | |
.macro save_context_with_interrupts | |
[--sp] = R0; | |
[--sp] = ( R7:0, P5:0 ); | |
[--sp] = fp; | |
[--sp] = usp; | |
[--sp] = i0; | |
[--sp] = i1; | |
[--sp] = i2; | |
[--sp] = i3; | |
[--sp] = m0; | |
[--sp] = m1; | |
[--sp] = m2; | |
[--sp] = m3; | |
[--sp] = l0; | |
[--sp] = l1; | |
[--sp] = l2; | |
[--sp] = l3; | |
[--sp] = b0; | |
[--sp] = b1; | |
[--sp] = b2; | |
[--sp] = b3; | |
[--sp] = a0.x; | |
[--sp] = a0.w; | |
[--sp] = a1.x; | |
[--sp] = a1.w; | |
[--sp] = LC0; | |
[--sp] = LC1; | |
[--sp] = LT0; | |
[--sp] = LT1; | |
[--sp] = LB0; | |
[--sp] = LB1; | |
[--sp] = ASTAT; | |
[--sp] = r0; /* Skip reserved */ | |
[--sp] = RETS; | |
[--sp] = RETI; | |
[--sp] = RETX; | |
[--sp] = RETN; | |
[--sp] = RETE; | |
[--sp] = SEQSTAT; | |
[--sp] = SYSCFG; | |
#ifdef CONFIG_CMD_KGDB | |
p0.l = lo(IPEND) | |
p0.h = hi(IPEND) | |
r0 = [p0]; | |
#endif | |
[--sp] = r0; /* Skip IPEND as well. */ | |
.endm | |
.macro save_context_no_interrupts | |
[--sp] = R0; | |
[--sp] = ( R7:0, P5:0 ); | |
[--sp] = fp; | |
[--sp] = usp; | |
[--sp] = i0; | |
[--sp] = i1; | |
[--sp] = i2; | |
[--sp] = i3; | |
[--sp] = m0; | |
[--sp] = m1; | |
[--sp] = m2; | |
[--sp] = m3; | |
[--sp] = l0; | |
[--sp] = l1; | |
[--sp] = l2; | |
[--sp] = l3; | |
[--sp] = b0; | |
[--sp] = b1; | |
[--sp] = b2; | |
[--sp] = b3; | |
[--sp] = a0.x; | |
[--sp] = a0.w; | |
[--sp] = a1.x; | |
[--sp] = a1.w; | |
[--sp] = LC0; | |
[--sp] = LC1; | |
[--sp] = LT0; | |
[--sp] = LT1; | |
[--sp] = LB0; | |
[--sp] = LB1; | |
[--sp] = ASTAT; | |
[--sp] = r0; /* Skip reserved */ | |
[--sp] = RETS; | |
r0 = RETI; | |
[--sp] = r0; | |
[--sp] = RETX; | |
[--sp] = RETN; | |
[--sp] = RETE; | |
[--sp] = SEQSTAT; | |
[--sp] = SYSCFG; | |
#ifdef CONFIG_CMD_KGDB | |
p0.l = lo(IPEND) | |
p0.h = hi(IPEND) | |
r0 = [p0]; | |
#endif | |
[--sp] = r0; /* Skip IPEND as well. */ | |
.endm | |
.macro restore_context_no_interrupts | |
sp += 4; | |
SYSCFG = [sp++]; | |
SEQSTAT = [sp++]; | |
RETE = [sp++]; | |
RETN = [sp++]; | |
RETX = [sp++]; | |
r0 = [sp++]; | |
RETI = r0; | |
RETS = [sp++]; | |
sp += 4; | |
ASTAT = [sp++]; | |
LB1 = [sp++]; | |
LB0 = [sp++]; | |
LT1 = [sp++]; | |
LT0 = [sp++]; | |
LC1 = [sp++]; | |
LC0 = [sp++]; | |
a1.w = [sp++]; | |
a1.x = [sp++]; | |
a0.w = [sp++]; | |
a0.x = [sp++]; | |
b3 = [sp++]; | |
b2 = [sp++]; | |
b1 = [sp++]; | |
b0 = [sp++]; | |
l3 = [sp++]; | |
l2 = [sp++]; | |
l1 = [sp++]; | |
l0 = [sp++]; | |
m3 = [sp++]; | |
m2 = [sp++]; | |
m1 = [sp++]; | |
m0 = [sp++]; | |
i3 = [sp++]; | |
i2 = [sp++]; | |
i1 = [sp++]; | |
i0 = [sp++]; | |
sp += 4; | |
fp = [sp++]; | |
( R7 : 0, P5 : 0) = [ SP ++ ]; | |
sp += 4; | |
.endm | |
.macro restore_context_with_interrupts | |
sp += 4; | |
SYSCFG = [sp++]; | |
SEQSTAT = [sp++]; | |
RETE = [sp++]; | |
RETN = [sp++]; | |
RETX = [sp++]; | |
RETI = [sp++]; | |
RETS = [sp++]; | |
sp += 4; | |
ASTAT = [sp++]; | |
LB1 = [sp++]; | |
LB0 = [sp++]; | |
LT1 = [sp++]; | |
LT0 = [sp++]; | |
LC1 = [sp++]; | |
LC0 = [sp++]; | |
a1.w = [sp++]; | |
a1.x = [sp++]; | |
a0.w = [sp++]; | |
a0.x = [sp++]; | |
b3 = [sp++]; | |
b2 = [sp++]; | |
b1 = [sp++]; | |
b0 = [sp++]; | |
l3 = [sp++]; | |
l2 = [sp++]; | |
l1 = [sp++]; | |
l0 = [sp++]; | |
m3 = [sp++]; | |
m2 = [sp++]; | |
m1 = [sp++]; | |
m0 = [sp++]; | |
i3 = [sp++]; | |
i2 = [sp++]; | |
i1 = [sp++]; | |
i0 = [sp++]; | |
sp += 4; | |
fp = [sp++]; | |
( R7 : 0, P5 : 0) = [ SP ++ ]; | |
sp += 4; | |
.endm | |
#endif | |
#endif |