|
@@ -195,6 +195,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,75 +219,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;
|
|
|
+ call __init_clear_bss
|
|
|
|
|
|
/* In case there is a NULL pointer reference,
|
|
|
* zero out region before stext
|