Subversion Repositories HelenOS

Rev

Rev 443 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 443 Rev 444
Line 253... Line 253...
253
	br.ret.sptk.many rp
253
	br.ret.sptk.many rp
254
 
254
 
255
.global heavyweight_handler_finalize
255
.global heavyweight_handler_finalize
256
heavyweight_handler_finalize:
256
heavyweight_handler_finalize:
257
    /* 16. RSE switch to interrupted context */
257
    /* 16. RSE switch to interrupted context */
-
 
258
 
-
 
259
/********************************************************************************************/
-
 
260
 
-
 
261
 
-
 
262
 
-
 
263
	.auto
-
 
264
	cover			/*Allocate zerro size frame (Step 1(from Intel Docs))*/
-
 
265
 
-
 
266
	add r31 = STACK_SCRATCH_AREA_SIZE, r12;;
-
 
267
 
-
 
268
	mov r28 = ar.bspstore   /*Calculate loadrs (step 2)*/
-
 
269
	ld8 r29 = [r31], +8     
-
 
270
	sub r27 = r29 , r28
-
 
271
	shl r27 = r27, 16
-
 
272
 
-
 
273
	mov r24 = ar.rsc
-
 
274
	and r30 = ~3, r24
-
 
275
	or  r24 = r30 , r27     
-
 
276
	mov ar.rsc = r24	/* place RSE in enforced lazy mode */
-
 
277
 
-
 
278
 
-
 
279
 
-
 
280
	loadrs 			/*(Step 3)*/
-
 
281
 
-
 
282
 
-
 
283
				/*Read saved registers*/
-
 
284
	ld8 r28 = [r31], +8     /*ar.bspstore*/
-
 
285
	ld8 r27 = [r31], +8 	/*ar.rnat*/
-
 
286
	ld8 r26 = [r31], +8 	/*cr.ifs*/
-
 
287
	ld8 r25 = [r31], +8 	/*ar.pfs*/
-
 
288
	ld8 r24 = [r31], +8 	/*ar.rsc*/
-
 
289
 
-
 
290
 
-
 
291
	mov ar.bspstore = r28	/*(Step 4)*/
-
 
292
	mov ar.rnat = r27	/*(Step 5)*/
-
 
293
 
-
 
294
	mov ar.pfs = r25	/*(Step 6)*/
-
 
295
	mov cr.ifs = r26	
-
 
296
 
-
 
297
	mov ar.rsc = r24	/*(Step 7)*/
-
 
298
 
-
 
299
 
-
 
300
	.explicit	
-
 
301
 
-
 
302
 
-
 
303
/********************************************************************************************/
-
 
304
 
-
 
305
 
258
	
306
 
259
    /* 17. restore interruption state from memory stack */
307
    /* 17. restore interruption state from memory stack */
-
 
308
 
-
 
309
	ld8 r28 = [r31] , +8 ;;	/* load cr.ifa */		
-
 
310
	ld8 r27 = [r31] , +8 ;;	/* load cr.isr */
-
 
311
	ld8 r26 = [r31] , +8 ;;	/* load cr.iipa */
-
 
312
	ld8 r25 = [r31] , +8 ;;	/* load cr.ipsr */
-
 
313
	ld8 r24 = [r31] , +8 ;;	/* load cr.iip */
-
 
314
 
-
 
315
 
-
 
316
	mov cr.iip = r24
-
 
317
	mov cr.ipsr = r25
-
 
318
	mov cr.iipa = r26
-
 
319
	mov cr.isr = r27
-
 
320
	mov cr.ifa = r28
-
 
321
 
-
 
322
 
260
	
323
	
261
    /* 18. restore predicate registers from memory stack */
324
    /* 18. restore predicate registers from memory stack */
262
	
-
 
263
    /* 19. return from interruption */
-
 
264
	rfi
-
 
265
 
325
 
266
 
326
 
-
 
327
	ld8 r29 = [r31] , -8 ;;	/* load predicate registers */
-
 
328
	mov pr =r29 ;;
-
 
329
	
-
 
330
	add r12 = STACK_FRAME_SIZE,r12;;
-
 
331
	
-
 
332
    /* 19. return from interruption */
-
 
333
	rfi;;
267
 
334
 
268
 
335
 
269
dump_gregs:
336
dump_gregs:
270
mov r16 = REG_DUMP;;
337
mov r16 = REG_DUMP;;
271
st8 [r16] = r0;;
338
st8 [r16] = r0;;