Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 Mar 2003 16:50:42 -0800 (PST)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 27270 for review
Message-ID:  <200303240050.h2O0ogmQ001389@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=27270

Change 27270 by marcel@marcel_nfs on 2003/03/23 16:50:13

	Implement _get_caller_saved.
	
	This function saves the non-FP, non-stacked scratch registers.
	The primary (only?) use is to save the scratch registers at
	interruption and thus determines most of what can and cannot
	be done. In short:
	o  We don't call this function. We jump to it and explicitly
	   pass the return address to jump back to.
	o  We don't pass arguments in the stacked registers, because
	   we may not have a register stack usable.
	o  We assume the function is called with register bank 0
	   selected and we have to save the registers in bank 1. This
	   is normal procedure for interrupt handling.
	o  We leave register bank 1 selected on exit.
	o  Assume we cannot use the preserved registers because saving
	   those requires the use of scratch registers, which we're
	   trying to save here. Break the circular dependency with this
	   assumption.

Affected files ...

.. //depot/projects/ia64_epc/sys/ia64/ia64/context.s#3 edit

Differences ...

==== //depot/projects/ia64_epc/sys/ia64/ia64/context.s#3 (text+ko) ====

@@ -285,12 +285,142 @@
 /*
  * _get_caller_saved
  *
- * PRECONDITION:	Must be called with register bank 0 selected
- * POSTCONDITION:	Will return with register bank 1 selected
+ * Does not follow runtime specification:
+ * inputs:		r16 = pointer to struct _caller_saved
+ *			r17 = return address (no call/ret semantics)
+ * precondition:	Must be called with register bank 0 selected,
+ *
+ * postcondition:	Will return with register bank 1 selected.
  */
-ENTRY(_get_caller_saved, 1)
-	br.ret.sptk	rp
+ENTRY(_get_caller_saved, 0)
+	mov		r18=ar.unat
+	mov		r19=r2
+	add		r2=8,r16
+	mov		r20=r3
+	add		r3=16,r16
+	mov		r21=r8
+	;;
+{	.mmi
+	.mem.offset	8,0
+	st8.spill	[r2]=r19,16		// r2
+	.mem.offset	16,0
+	st8.spill	[r3]=r20,16		// r3
+	mov		r8=r16
+	;;
+}
+{	.mmi
+	.mem.offset	24,0
+	st8.spill	[r2]=r21,16		// r8
+	.mem.offset	32,0
+	st8.spill	[r3]=r9,16		// r9
+	mov		r9=r17
+	;;
+}
+{	.mmi
+	.mem.offset	40,0
+	st8.spill	[r2]=r10,16		// r10
+	.mem.offset	48,0
+	st8.spill	[r3]=r11,16		// r11
+	mov		r10=r18
+	;;
+}
+{	.mmb
+	.mem.offset	56,0
+	st8.spill	[r2]=r14,16		// r14
+	.mem.offset	64,0
+	st8.spill	[r3]=r15,16		// r15
+	bsw.1
+	;;
+}
+	/* We're using register bank 1 now. */
+{	.mmi
+	.mem.offset	72,0
+	st8.spill	[r2]=r16,16		// r16
+	.mem.offset	80,0
+	st8.spill	[r3]=r17,16		// r17
+	mov		r14=b6
+	;;
+}
+{	.mmi
+	.mem.offset	88,0
+	st8.spill	[r2]=r18,16		// r18
+	.mem.offset	96,0
+	st8.spill	[r3]=r19,16		// r19
+	mov		r15=b7
+	;;
+}
+{	.mmi
+	.mem.offset	104,0
+	st8.spill	[r2]=r20,16		// r20
+	.mem.offset	112,0
+	st8.spill	[r3]=r21,16		// r21
+	mov		b6=r9
+	;;
+}
+{	.mmb
+	.mem.offset	120,0
+	st8.spill	[r2]=r22,16		// r22
+	.mem.offset	128,0
+	st8.spill	[r3]=r23,16		// r23
+	nop		0
+	;;
+}
+{	.mmi
+	.mem.offset	136,0
+	st8.spill	[r2]=r24,16		// r24
+	.mem.offset	144,0
+	st8.spill	[r3]=r25,16		// r25
+	nop		1
+	;;
+}
+{	.mmb
+	.mem.offset	152,0
+	st8.spill	[r2]=r26,16		// r26
+	.mem.offset	160,0
+	st8.spill	[r3]=r27,16		// r27
+	nop		2
+	;;
+}
+{	.mmi
+	.mem.offset	168,0
+	st8.spill	[r2]=r28,16		// r28
+	.mem.offset	176,0
+	st8.spill	[r3]=r29,16		// r29
+	nop		3
+	;;
+}
+{	.mmb
+	.mem.offset	184,0
+	st8.spill	[r2]=r30,16		// r30
+	.mem.offset	192,0
+	st8.spill	[r3]=r31,16		// r31
+	nop		4
+	;;
+}
+{	.mmi
+	st8		[r2]=r10,16		// unat (before)
+	mov		r9=ar.unat
+	nop		5
+	;;
+}
+{	.mmb
+	st8		[r3]=r14,16		// b6
+	st8		[r2]=r15,16		// b7
+	nop		6
+	;;
+}
+{	.mmi
+	st8		[r8]=r9,16		// nat (after)
+	mov		r10=ar.ccv
+	nop		7
+	;;
+}
+{	.mmb
+	st8		[r3]=r10		// ccv
+	st8		[r2]=r0			// __spare
+	br.sptk		b6
 	;;
+}
 END(_get_caller_saved)
 
 /*

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe p4-projects" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200303240050.h2O0ogmQ001389>