[Patch] Do not assume output registers be reservered.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We found an issue in pal.S.

According to the software runtime SPEC, 
The caller's output registers do not need to be preserved for 
caller. The callee may reuse input registers for any other 
purpose within the procedure.

in ia64_pal_call_phys_stacked,

input registers are copied to output registers before call 
into ia64_switch_mode_phys, then used to call into PAL. This 
assumes output registers are preserved in ia64_switch_mode_phys,
which may not be true.

In this particular case, ia64_switch_mode_phys alloc a null frame 
, and mask off psr.i.
If an interrupt comes at this small window, 
or an MCA comes inside the procedure, output registers 
maybe changed, 
then the pal call may got some staled input registers.
 
This patch moves the copies from input to output 
after ia64_switch_mode_phys to follow the software 
runtime convention.

It  also removed some unused labels in 
ia64_pal_call_phys_stacked.

Signed-off-by: Zou Nan hai <nanhai.zou@xxxxxxxxx>

--- linux-2.6.18-rc2/arch/ia64/kernel/pal.S	2006-07-26 11:59:06.000000000 +0800
+++ linux-2.6.18-rc2-fix/arch/ia64/kernel/pal.S	2006-07-26 12:04:18.000000000 +0800
@@ -217,12 +217,7 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
 	.body
 	;;
 	ld8 loc2 = [loc2]		// loc2 <- entry point
-	mov out0 = in0		// first argument
-	mov out1 = in1		// copy arg2
-	mov out2 = in2		// copy arg3
-	mov out3 = in3		// copy arg3
-	;;
-	mov loc3 = psr		// save psr
+	mov loc3 = psr			// save psr
 	;;
 	mov loc4=ar.rsc			// save RSE configuration
 	dep.z loc2=loc2,0,61		// convert pal entry point to physical
@@ -236,18 +231,23 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
 	;;
 	andcm r16=loc3,r16		// removes bits to clear from psr
 	br.call.sptk.many rp=ia64_switch_mode_phys
-.ret6:
+
+	mov out0 = in0			// first argument
+	mov out1 = in1			// copy arg2
+	mov out2 = in2			// copy arg3
+	mov out3 = in3			// copy arg3
 	mov loc5 = r19
 	mov loc6 = r20
+
 	br.call.sptk.many rp=b7		// now make the call
-.ret7:
+
 	mov ar.rsc=0			// put RSE in enforced lazy, LE mode
 	mov r16=loc3			// r16= original psr
 	mov r19=loc5
 	mov r20=loc6
 	br.call.sptk.many rp=ia64_switch_mode_virt	// return to virtual mode
 
-.ret8:	mov psr.l  = loc3		// restore init PSR
+	mov psr.l  = loc3		// restore init PSR
 	mov ar.pfs = loc1
 	mov rp = loc0
 	;;




-
: send the line "unsubscribe linux-ia64" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Sparc Linux]     [DCCP]     [Linux ARM]     [Yosemite News]     [Linux SCSI]     [Linux x86_64]     [Linux for Ham Radio]

  Powered by Linux