Blackfin arch: do not bother initializing the first 4k
[cascardo/linux.git] / arch / blackfin / mach-common / head.S
index f123a62..c1dcaeb 100644 (file)
@@ -170,12 +170,8 @@ ENTRY(__start)
        [p0] = p1;
        csync;
 
-       p0.l = lo(IMASK);
-       p0.h = hi(IMASK);
-       p1.l = IMASK_IVG15;
-       p1.h = 0x0;
-       [p0] = p1;
-       csync;
+       r0 = EVT_IVG15 (z);
+       sti r0;
 
        raise 15;
        p0.l = .LWAIT_HERE;
@@ -195,6 +191,19 @@ ENDPROC(__start)
 # define WDOG_CTL WDOGA_CTL
 #endif
 
+ENTRY(__init_clear_bss)
+       r2 = r2 - r1;
+       cc = r2 == 0;
+       if cc jump .L_bss_done;
+       r2 >>= 2;
+       p1 = r1;
+       p2 = r2;
+       lsetup (1f, 1f) lc0 = p2;
+1:     [p1++] = r0;
+.L_bss_done:
+       rts;
+ENDPROC(__init_clear_bss)
+
 ENTRY(_real_start)
        /* Enable nested interrupts */
        [--sp] = reti;
@@ -206,87 +215,34 @@ ENTRY(_real_start)
        w[p0] = r0;
        ssync;
 
+       r0 = 0 (x);
+       /* Zero out all of the fun bss regions */
 #if L1_DATA_A_LENGTH > 0
        r1.l = __sbss_l1;
        r1.h = __sbss_l1;
        r2.l = __ebss_l1;
        r2.h = __ebss_l1;
-       r0 = 0 (z);
-       r2 = r2 - r1;
-       cc = r2 == 0;
-       if cc jump .L_a_l1_done;
-       r2 >>= 2;
-       p1 = r1;
-       p2 = r2;
-       lsetup (.L_clear_a_l1, .L_clear_a_l1 ) lc0 = p2;
-.L_clear_a_l1:
-       [p1++] = r0;
-.L_a_l1_done:
+       call __init_clear_bss
 #endif
-
 #if L1_DATA_B_LENGTH > 0
        r1.l = __sbss_b_l1;
        r1.h = __sbss_b_l1;
        r2.l = __ebss_b_l1;
        r2.h = __ebss_b_l1;
-       r0 = 0 (z);
-       r2 = r2 - r1;
-       cc = r2 == 0;
-       if cc jump .L_b_l1_done;
-       r2 >>= 2;
-       p1 = r1;
-       p2 = r2;
-       lsetup (.L_clear_b_l1, .L_clear_b_l1 ) lc0 = p2;
-.L_clear_b_l1:
-       [p1++] = r0;
-.L_b_l1_done:
+       call __init_clear_bss
 #endif
-
 #if L2_LENGTH > 0
        r1.l = __sbss_l2;
        r1.h = __sbss_l2;
        r2.l = __ebss_l2;
        r2.h = __ebss_l2;
-       r0 = 0 (z);
-       r2 = r2 - r1;
-       cc = r2 == 0;
-       if cc jump .L_l2_done;
-       r2 >>= 2;
-       p1 = r1;
-       p2 = r2;
-       lsetup (.L_clear_l2, .L_clear_l2 ) lc0 = p2;
-.L_clear_l2:
-       [p1++] = r0;
-.L_l2_done:
+       call __init_clear_bss
 #endif
-
-       /* Zero out the bss region
-        * Note: this will fail if bss is 0 bytes ...
-        */
-       r0 = 0 (z);
        r1.l = ___bss_start;
        r1.h = ___bss_start;
        r2.l = ___bss_stop;
        r2.h = ___bss_stop;
-       r2 = r2 - r1;
-       r2 >>= 2;
-       p1 = r1;
-       p2 = r2;
-       lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2;
-.L_clear_bss:
-       [p1++] = r0;
-
-       /* In case there is a NULL pointer reference,
-        * zero out region before stext
-        */
-       p1 = r0;
-       r2.l = __stext;
-       r2.h = __stext;
-       r2 >>= 2;
-       p2 = r2;
-       lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2;
-.L_clear_zero:
-       [p1++] = r0;
+       call __init_clear_bss
 
        /* Pass the u-boot arguments to the global value command line */
        R0 = R7;