patch-2.4.25 linux-2.4.25/arch/ppc/boot/prep/head.S
Next file: linux-2.4.25/arch/ppc/boot/prep/misc.c
Previous file: linux-2.4.25/arch/ppc/boot/prep/Makefile
Back to the patch index
Back to the overall index
- Lines: 55
- Date:
2004-02-18 05:36:30.000000000 -0800
- Orig file:
linux-2.4.24/arch/ppc/boot/prep/head.S
- Orig date:
2003-06-13 07:51:31.000000000 -0700
diff -urN linux-2.4.24/arch/ppc/boot/prep/head.S linux-2.4.25/arch/ppc/boot/prep/head.S
@@ -34,14 +34,29 @@
isync
mr r11,r3 /* Save pointer to residual/board data */
- mr r25,r5 /* Save OFW pointer */
- /* Save the original MSR value */
- mfmsr r26
+/*
+ * Save the OF pointer to r25, but only if the entry point is in a sane
+ * location; if not we store 0. If there is no entry point, or it is
+ * invalid, we establish the default MSR value immediately. Otherwise,
+ * we defer doing that, to allow OF functions to be called, until we
+ * begin uncompressing the kernel.
+ */
+ lis r3,0x0fff /* r3 = 0x0fffffff */
+ ori r3,r3,0xffff
- /* Establish default MSR value */
- li r3,MSR_IP|MSR_FP
- mtmsr r3
+ subc r3,r3,r5 /* r3 = (r5 <= r3) ? ~0 : 0 */
+ subfe r3,r3,r3
+ nand r3,r3,r3
+
+ and. r5,r5,r3 /* r5 will be cleared if (r5 > r3) */
+ bne+ haveOF
+
+ li r3,MSR_IP|MSR_FP /* Not OF: set MSR immediately */
+ mtmsr r3
+ isync
+haveOF:
+ mr r25,r5
/* compute the size of the whole image in words. */
lis r4,start@h
@@ -110,17 +125,12 @@
li r2,0x000F /* Mask pointer to 16-byte boundary */
andc r1,r1,r2
- /* Store the original MSR into 'orig_MSR' */
- lis r3,orig_MSR@h
- ori r3,r3,orig_MSR@l
- stw r26,0(r3)
-
/* Run loader */
mr r3,r8 /* Load point */
mr r4,r7 /* Program length */
mr r5,r6 /* Checksum */
mr r6,r11 /* Residual data */
- mr r7,r25 /* OFW interfaces */
+ mr r7,r25 /* Validated OFW interface */
bl decompress_kernel
/*
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)