summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/microblaze/microblaze-context-validate.S
blob: b12d5930f6e9378e0378e245c0d874b6294eceda (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#ifdef HAVE_CONFIG_H
  #include "config.h"
#endif

#include <rtems/asm.h>

#define FRAME_OFFSET_R19 0
#define FRAME_OFFSET_R20 4
#define FRAME_OFFSET_R21 8
#define FRAME_OFFSET_R22 12
#define FRAME_OFFSET_R23 16
#define FRAME_OFFSET_R24 20
#define FRAME_OFFSET_R25 24
#define FRAME_OFFSET_R26 28
#define FRAME_OFFSET_R27 32
#define FRAME_OFFSET_R28 36
#define FRAME_OFFSET_R29 40
#define FRAME_OFFSET_R30 44
#define FRAME_OFFSET_R31 48

#define FRAME_SIZE (FRAME_OFFSET_R31 + 4)

.text
.align 4

PUBLIC(_CPU_Context_validate)

SYM(_CPU_Context_validate):

	/* Save */
	addik r1, r1, -FRAME_SIZE
	swi r19, r1, FRAME_OFFSET_R19
	swi r20, r1, FRAME_OFFSET_R20
	swi r21, r1, FRAME_OFFSET_R21
	swi r22, r1, FRAME_OFFSET_R22
	swi r23, r1, FRAME_OFFSET_R23
	swi r24, r1, FRAME_OFFSET_R24
	swi r25, r1, FRAME_OFFSET_R25
	swi r26, r1, FRAME_OFFSET_R26
	swi r27, r1, FRAME_OFFSET_R27
	swi r28, r1, FRAME_OFFSET_R28
	swi r29, r1, FRAME_OFFSET_R29
	swi r30, r1, FRAME_OFFSET_R30
	swi r31, r1, FRAME_OFFSET_R31

	/* Fill */

	add r4, r0, r3

	/* r7 contains the stack pointer */
	add r7, r0, r1

.macro fill_register reg
	addi r4, r4, 1
	add \reg, r0, r4
.endm

	fill_register r21
	fill_register r22
	fill_register r23
	fill_register r24
	fill_register r25
	fill_register r26
	fill_register r27
	fill_register r28
	fill_register r29
	fill_register r30
	fill_register r31

	/* Check */
check:

.macro check_register reg
	addi r4, r4, 1
	cmp r6, \reg, r4
	bnei r6, restore
.endm

	cmp r6, r7, r1
	bnei r6, restore

	add r4, r0, r3

	check_register r21
	check_register r22
	check_register r23
	check_register r24
	check_register r25
	check_register r26
	check_register r27
	check_register r28
	check_register r29
	check_register r30
	check_register r31

	brai check

	/* Restore */
restore:

	lwi r19, r1, FRAME_OFFSET_R19
	lwi r20, r1, FRAME_OFFSET_R20
	lwi r21, r1, FRAME_OFFSET_R21
	lwi r22, r1, FRAME_OFFSET_R22
	lwi r23, r1, FRAME_OFFSET_R23
	lwi r24, r1, FRAME_OFFSET_R24
	lwi r25, r1, FRAME_OFFSET_R25
	lwi r26, r1, FRAME_OFFSET_R26
	lwi r27, r1, FRAME_OFFSET_R27
	lwi r28, r1, FRAME_OFFSET_R28
	lwi r29, r1, FRAME_OFFSET_R29
	lwi r30, r1, FRAME_OFFSET_R30
	lwi r31, r1, FRAME_OFFSET_R31

	addik r1, r1, FRAME_SIZE

	bra r15