Subversion Repositories HelenOS-historic

Rev

Rev 919 | Rev 962 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 919 Rev 921
Line 30... Line 30...
30
#include <arch/stack.h>
30
#include <arch/stack.h>
31
#include <arch/register.h>
31
#include <arch/register.h>
32
#include <arch/mm/page.h>
32
#include <arch/mm/page.h>
33
#include <align.h>
33
#include <align.h>
34
 
34
 
35
#define STACK_ITEMS		14
35
#define STACK_ITEMS		18
36
#define STACK_FRAME_SIZE	ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT)
36
#define STACK_FRAME_SIZE	ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT)
37
 
37
 
38
#if (STACK_ITEMS % 2 == 0)
38
#if (STACK_ITEMS % 2 == 0)
39
#	define STACK_FRAME_BIAS	8
39
#	define STACK_FRAME_BIAS	8
40
#else
40
#else
Line 43... Line 43...
43
 
43
 
44
/** Partitioning of bank 0 registers. */
44
/** Partitioning of bank 0 registers. */
45
#define R_OFFS 		r16
45
#define R_OFFS 		r16
46
#define R_HANDLER	r17
46
#define R_HANDLER	r17
47
#define R_RET		r18
47
#define R_RET		r18
-
 
48
#define R_TMP		r19
48
#define R_KSTACK_BSP	r22	/* keep in sync with before_thread_runs_arch() */
49
#define R_KSTACK_BSP	r22	/* keep in sync with before_thread_runs_arch() */
49
#define R_KSTACK	r23	/* keep in sync with before_thread_runs_arch() */
50
#define R_KSTACK	r23	/* keep in sync with before_thread_runs_arch() */
50
 
51
 
51
/** Heavyweight interrupt handler
52
/** Heavyweight interrupt handler
52
 *
53
 *
Line 114... Line 115...
114
	
115
	
115
	add r31 = -STACK_FRAME_BIAS, r12 ;;
116
	add r31 = -STACK_FRAME_BIAS, r12 ;;
116
	add r12 = -STACK_FRAME_SIZE, r12
117
	add r12 = -STACK_FRAME_SIZE, r12
117
 
118
 
118
    /* 4. save registers in bank 0 into memory stack */	
119
    /* 4. save registers in bank 0 into memory stack */
-
 
120
 
-
 
121
	/*
-
 
122
	 * If this is break_instruction handler,
-
 
123
	 * copy input parameters to stack.
-
 
124
	 */
-
 
125
    	mov R_TMP = 0x2c00 ;;
-
 
126
	cmp.eq p6,p5 = R_OFFS, R_TMP ;;
-
 
127
	
-
 
128
	/*
-
 
129
	 * From now on, if this is break_instruction handler, p6 is true and p5 is false.
-
 
130
	 * Otherwise p6 is false and p5 is true.
-
 
131
	 * Note that p5 is a preserved predicate register and we make use of it.
-
 
132
	 */
-
 
133
	
-
 
134
(p6)	st8 [r31] = r35, -8 ;;		/* save in3 */
-
 
135
(p6) 	st8 [r31] = r34, -8 ;;		/* save in2 */
-
 
136
(p6)	st8 [r31] = r33, -8 ;;		/* save in1 */
-
 
137
(p6)	st8 [r31] = r32, -8 ;;		/* save in0 */
-
 
138
(p5)	add r31 = -32, r31 ;;
-
 
139
    
119
	st8 [r31] = r30, -8 ;;		/* save old stack pointer */ 
140
	st8 [r31] = r30, -8 ;;		/* save old stack pointer */ 
120
	
141
	
121
	st8 [r31] = r29, -8 ;;		/* save predicate registers */
142
	st8 [r31] = r29, -8 ;;		/* save predicate registers */
122
 
143
 
123
	st8 [r31] = r24, -8 ;;		/* save cr.iip */
144
	st8 [r31] = r24, -8 ;;		/* save cr.iip */
Line 266... Line 287...
266
	mov loc19 = r3
287
	mov loc19 = r3
267
	mov loc20 = r4
288
	mov loc20 = r4
268
	mov loc21 = r5
289
	mov loc21 = r5
269
	mov loc22 = r6
290
	mov loc22 = r6
270
	mov loc23 = r7
291
	mov loc23 = r7
271
	mov loc24 = r8
292
(p5)	mov loc24 = r8		/* only if not in break_instruction handler */
272
	mov loc25 = r9
293
	mov loc25 = r9
273
	mov loc26 = r10
294
	mov loc26 = r10
274
	mov loc27 = r11
295
	mov loc27 = r11
275
	/* skip r12 (stack pointer) */
296
	/* skip r12 (stack pointer) */
276
	mov loc28 = r13
297
	mov loc28 = r13
Line 323... Line 344...
323
	mov r3 = loc19
344
	mov r3 = loc19
324
	mov r4 = loc20
345
	mov r4 = loc20
325
	mov r5 = loc21
346
	mov r5 = loc21
326
	mov r6 = loc22
347
	mov r6 = loc22
327
	mov r7 = loc23
348
	mov r7 = loc23
328
	mov r8 = loc24
349
(p5)	mov r8 = loc24		/* only if not in break_instruction handler */
329
	mov r9 = loc25
350
	mov r9 = loc25
330
	mov r10 = loc26
351
	mov r10 = loc26
331
	mov r11 = loc27
352
	mov r11 = loc27
332
	/* skip r12 (stack pointer) */
353
	/* skip r12 (stack pointer) */
333
	mov r13 = loc28
354
	mov r13 = loc28