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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [testbench/] [uos/] [except_or32.S] - Blame information for rev 511

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 222 markom
/* This file is part of test microkernel for OpenRISC 1000. */
2
/* (C) 2000 Damjan Lampret, lampret@opencores.org */
3
 
4
#include "spr_defs.h"
5
 
6
/*
7
 * Context is saved to area pointed by pointer in R3. Original
8
 * R3 is at memory location 0 and task's PC is at memory location 4.
9
 */
10
#define SAVEREGS                                        \
11
        l.lwz   r3,0(r3);                               \
12
        l.sw    4(r3),r1;                               \
13
        l.sw    8(r3),r2;                               \
14
        l.lwz   r2,0(r0);       /* saving original r3*/ \
15
        l.sw    12(r3),r2;                              \
16
        l.sw    16(r3),r4;                              \
17
        l.sw    20(r3),r5;                              \
18
        l.sw    24(r3),r6;                              \
19
        l.sw    28(r3),r7;                              \
20
        l.sw    32(r3),r8;                              \
21
        l.sw    36(r3),r9;                              \
22
        l.sw    40(r3),r10;                             \
23
        l.sw    44(r3),r11;                             \
24
        l.sw    48(r3),r12;                             \
25
        l.sw    52(r3),r13;                             \
26
        l.sw    56(r3),r14;                             \
27
        l.sw    60(r3),r15;                             \
28
        l.sw    64(r3),r16;                             \
29
        l.sw    68(r3),r17;                             \
30
        l.sw    72(r3),r18;                             \
31
        l.sw    76(r3),r19;                             \
32
        l.sw    80(r3),r20;                             \
33
        l.sw    84(r3),r21;                             \
34
        l.sw    88(r3),r22;                             \
35
        l.sw    92(r3),r23;                             \
36
        l.sw    96(r3),r24;                             \
37
        l.sw    100(r3),r25;                            \
38
        l.sw    104(r3),r26;                            \
39
        l.sw    108(r3),r27;                            \
40
        l.sw    112(r3),r28;                            \
41
        l.sw    116(r3),r29;                            \
42
        l.sw    120(r3),r30;                            \
43
        l.sw    124(r3),r31;                            \
44
        l.lwz   r2,4(r0);       /* saving original PC*/ \
45
        l.sw    0(r3),r2;                               \
46
                                                        \
47
        l.mfspr r2,r0,SPR_ESR_BASE;                             \
48
        l.sw    128(r3),r2      /* saving SR */
49
 
50
/*
51
 * Pointer to context is in R3. All registers are loaded and execution is
52
 * transfered to the loaded context's task
53
 */
54
#define LOADREGS_N_GO                           \
55
        l.lwz   r3,0(r3);                       \
56
        l.lwz   r2,0(r3);       /* prepare PC*/ \
57
        l.mtspr r0,r2,SPR_EPCR_BASE;            \
58
                                                \
59
        l.lwz   r2,128(r3);     /* prepare SR*/ \
60
        l.mtspr r0,r2,SPR_ESR_BASE;                     \
61
                                                \
62
        l.lwz   r1,4(r3);                       \
63
        l.lwz   r2,8(r3);                       \
64
        l.lwz   r4,16(r3);                      \
65
        l.lwz   r5,20(r3);                      \
66
        l.lwz   r6,24(r3);                      \
67
        l.lwz   r7,28(r3);                      \
68
        l.lwz   r8,32(r3);                      \
69
        l.lwz   r9,36(r3);                      \
70
        l.lwz   r10,40(r3);                     \
71
        l.lwz   r11,44(r3);                     \
72
        l.lwz   r12,48(r3);                     \
73
        l.lwz   r13,52(r3);                     \
74
        l.lwz   r14,56(r3);                     \
75
        l.lwz   r15,60(r3);                     \
76
        l.lwz   r16,64(r3);                     \
77
        l.lwz   r17,68(r3);                     \
78
        l.lwz   r18,72(r3);                     \
79
        l.lwz   r19,76(r3);                     \
80
        l.lwz   r20,80(r3);                     \
81
        l.lwz   r21,84(r3);                     \
82
        l.lwz   r22,88(r3);                     \
83
        l.lwz   r23,92(r3);                     \
84
        l.lwz   r24,96(r3);                     \
85
        l.lwz   r25,100(r3);                    \
86
        l.lwz   r26,104(r3);                    \
87
        l.lwz   r27,108(r3);                    \
88
        l.lwz   r28,112(r3);                    \
89
        l.lwz   r29,116(r3);                    \
90
        l.lwz   r30,120(r3);                    \
91
        l.lwz   r31,124(r3);                    \
92
                                                \
93
        l.lwz   r3,12(r3);      /* prepare r3*/ \
94
                                                \
95
        l.rfe;                  /* Call task */ \
96
        l.nop
97
 
98
/*
99
 * All registers are loaded from save area.
100
 */
101
#define LOADREGS                                \
102
        l.lwz   r3,0(r3);                       \
103
        l.lwz   r2,0(r3);       /* prepare PC*/ \
104
        l.mtspr r0,r2,SPR_EPCR_BASE;            \
105
                                                \
106
        l.lwz   r2,128(r3);     /* prepare SR*/ \
107
        l.mtspr r0,r2,SPR_ESR_BASE;                     \
108
                                                \
109
        l.lwz   r1,4(r3);                       \
110
        l.lwz   r2,8(r3);                       \
111
        l.lwz   r4,16(r3);                      \
112
        l.lwz   r5,20(r3);                      \
113
        l.lwz   r6,24(r3);                      \
114
        l.lwz   r7,28(r3);                      \
115
        l.lwz   r8,32(r3);                      \
116
        l.lwz   r9,36(r3);                      \
117
        l.lwz   r10,40(r3);                     \
118
        l.lwz   r11,44(r3);                     \
119
        l.lwz   r12,48(r3);                     \
120
        l.lwz   r13,52(r3);                     \
121
        l.lwz   r14,56(r3);                     \
122
        l.lwz   r15,60(r3);                     \
123
        l.lwz   r16,64(r3);                     \
124
        l.lwz   r17,68(r3);                     \
125
        l.lwz   r18,72(r3);                     \
126
        l.lwz   r19,76(r3);                     \
127
        l.lwz   r20,80(r3);                     \
128
        l.lwz   r21,84(r3);                     \
129
        l.lwz   r22,88(r3);                     \
130
        l.lwz   r23,92(r3);                     \
131
        l.lwz   r24,96(r3);                     \
132
        l.lwz   r25,100(r3);                    \
133
        l.lwz   r26,104(r3);                    \
134
        l.lwz   r27,108(r3);                    \
135
        l.lwz   r28,112(r3);                    \
136
        l.lwz   r29,116(r3);                    \
137
        l.lwz   r30,120(r3);                    \
138
        l.lwz   r31,124(r3);                    \
139
                                                \
140
        l.lwz   r3,12(r3);      /* prepare r3*/
141
 
142
/*
143
 * Set new PC in saved context
144
 */
145
#define SET_CONTEXTPC(AREA,SUBROUTINE,TMPREG)   \
146
        l.lwz   AREA,0(AREA);                   \
147
        l.movhi TMPREG,hi(SUBROUTINE);          \
148
        l.addi  TMPREG,r0,lo(SUBROUTINE);       \
149
        l.sw    0(AREA),TMPREG;
150
 
151
/*
152
 * Printf via or1ksim hook
153
 */
154
#if KERNEL_OUTPUT
155
#define PRINTF(REG,STR)                         \
156
        l.movhi REG,hi(STR);                    \
157
        l.addi  REG,r0,lo(STR);                 \
158 511 markom
        l.nop   NOP_PRINTF
159 222 markom
#else
160
#define PRINTF(REG,STR)
161
#endif
162
 
163
/*
164
 * Reset Exception handler
165
 */
166
.org 0x100
167
_reset_vector:
168
        l.nop
169 511 markom
  l.movhi r2,hi(_reset)
170
  l.ori   r2,r2,lo(_reset)
171
  l.jr    r2
172
  l.nop
173 222 markom
 
174
/*
175
 * Bus Error Exception handler
176
 */
177
.org 0x0200
178
_buserr:
179
        l.nop
180
        l.sw    0(r0),r3        /* Save r3 */
181
        PRINTF(r3, _buserr_str)
182
_hang:
183
        l.j     _hang
184
        l.nop
185
 
186
_buserr_str:
187
        .ascii  "Bus error exception.\n\000"
188
 
189
/*
190
 * External Interrupt Exception handler
191
 */
192
.org 0x800
193
_extint:
194
        l.nop
195
        l.sw    0(r0),r3        /* Save r3 */
196
        PRINTF(r3,_extint_str)
197
        l.mfspr r3,r0,SPR_EPCR_BASE     /* Get EPCR */
198
/*      l.addi  r3,r3,4         /* increment because EPCR instruction was already executed */
199
        l.sw    4(r0),r3        /* and save it */
200
 
201
        /* now save user task context */
202
        l.movhi r3,hi(_task_context)
203
        l.addi  r3,r0,lo(_task_context)
204
        SAVEREGS
205
 
206
        /* set kernel context's PC to kernel's scheduler */
207
        l.movhi r3,hi(_kernel_context)
208
        l.addi  r3,r0,lo(_kernel_context)
209
        SET_CONTEXTPC(r3,_int_main,r4)
210
 
211
        /* load kernel context */
212
        l.movhi r3,hi(_kernel_context)
213
        l.addi  r3,r0,lo(_kernel_context)
214
        LOADREGS
215 511 markom
 
216
        l.movhi r3,hi(_int_main)
217
        l.addi  r3,r0,lo(_int_main)
218
        l.jr    r3
219 222 markom
        l.nop
220
 
221
_extint_str:
222
        .ascii  "External interrupt exception.\n\000"
223
 
224
/*
225
 * System Call Exception handler
226
 */
227
.org 0x0c00
228
_syscall:
229
        l.nop
230
        l.sw    0(r0),r3        /* Save r3 */
231
        PRINTF(r3,_syscall_str)
232
        l.mfspr r3,r0,SPR_EPCR_BASE     /* Get EPCR */
233
        l.addi  r3,r3,4         /* increment because EPCR instruction was already executed */
234
        l.sw    4(r0),r3        /* and save it */
235
 
236
        /* now save user task context */
237
        l.movhi r3,hi(_task_context)
238
        l.addi  r3,r0,lo(_task_context)
239
        SAVEREGS
240
 
241
        /* set kernel context's PC to kernel's syscall entry */
242
        l.movhi r3,hi(_kernel_context)
243
        l.addi  r3,r0,lo(_kernel_context)
244
        SET_CONTEXTPC(r3,_kernel_syscall,r4)
245
 
246
        /* load kernel context */
247
        l.movhi r3,hi(_kernel_context)
248
        l.addi  r3,r0,lo(_kernel_context)
249
        LOADREGS_N_GO
250
 
251
_syscall_str:
252
        .ascii  "System call exception.\n\000"
253
 
254
/*
255
 * Switch to a new context pointed by _task_context
256
 */
257
.global _dispatch
258
.align 4
259
_dispatch:
260
        /* load user task GPRs and PC */
261
        l.movhi r3,hi(_task_context)
262
        l.addi  r3,r0,lo(_task_context)
263
        LOADREGS_N_GO
264
 

powered by: WebSVN 2.1.0

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