diff -urN linux.f/arch/alpha/vmlinux.lds linux.bss/arch/alpha/vmlinux.lds --- linux.f/arch/alpha/vmlinux.lds Wed May 14 07:41:00 1997 +++ linux.bss/arch/alpha/vmlinux.lds Wed Apr 5 10:43:50 2000 @@ -39,9 +39,11 @@ .got : { *(.got) } .sdata : { *(.sdata) } _edata = .; - _bss = .; + + __bss_start = .; .sbss : { *(.sbss) *(.scommon) } .bss : { *(.bss) *(COMMON) } + __bss_stop = .; _end = .; .mdebug 0 : { *(.mdebug) } diff -urN linux.f/arch/i386/kernel/head.S linux.bss/arch/i386/kernel/head.S --- linux.f/arch/i386/kernel/head.S Fri Jan 15 07:57:25 1999 +++ linux.bss/arch/i386/kernel/head.S Wed Apr 5 10:43:50 2000 @@ -83,22 +83,12 @@ #ifdef __SMP__ orw %bx,%bx - jz 1f /* Initial CPU cleans BSS */ + jz 1f /* Initial CPU setup the system */ pushl $0 popfl jmp checkCPUtype 1: #endif __SMP__ -/* - * Clear BSS first so that there are no surprises... - */ - xorl %eax,%eax - movl $ SYMBOL_NAME(__bss_start),%edi - movl $ SYMBOL_NAME(_end),%ecx - subl %edi,%ecx - cld - rep - stosb /* * start system 32-bit setup. We need to re-do some of the things done * in 16-bit mode for the "real" operations. diff -urN linux.f/arch/i386/vmlinux.lds.S linux.bss/arch/i386/vmlinux.lds.S --- linux.f/arch/i386/vmlinux.lds.S Mon Aug 9 21:04:38 1999 +++ linux.bss/arch/i386/vmlinux.lds.S Wed Apr 5 10:43:50 2000 @@ -56,6 +56,7 @@ .bss : { *(.bss) } + __bss_stop = .; _end = . ; /* Stabs debugging sections. */ diff -urN linux.f/arch/ppc/vmlinux.lds linux.bss/arch/ppc/vmlinux.lds --- linux.f/arch/ppc/vmlinux.lds Wed Dec 30 19:55:07 1998 +++ linux.bss/arch/ppc/vmlinux.lds Wed Apr 5 10:45:19 2000 @@ -103,6 +103,7 @@ *(.bss) *(COMMON) } + __bss_stop = .; _end = . ; PROVIDE (end = .); } diff -urN linux.f/arch/sparc/vmlinux.lds linux.bss/arch/sparc/vmlinux.lds --- linux.f/arch/sparc/vmlinux.lds Thu Mar 11 01:53:36 1999 +++ linux.bss/arch/sparc/vmlinux.lds Wed Apr 5 10:45:44 2000 @@ -50,6 +50,7 @@ *(.bss) *(COMMON) } + __bss_stop = .; _end = . ; PROVIDE (end = .); /* Stabs debugging sections. */ diff -urN linux.f/arch/sparc64/vmlinux.lds linux.bss/arch/sparc64/vmlinux.lds --- linux.f/arch/sparc64/vmlinux.lds Wed Aug 5 01:03:35 1998 +++ linux.bss/arch/sparc64/vmlinux.lds Wed Apr 5 10:46:18 2000 @@ -49,6 +49,7 @@ *(.bss) *(COMMON) } + __bss_stop = .; _end = . ; PROVIDE (end = .); /* Stabs debugging sections. */ diff -urN linux.f/init/main.c linux.bss/init/main.c --- linux.f/init/main.c Wed Apr 5 10:42:03 2000 +++ linux.bss/init/main.c Wed Apr 5 10:43:50 2000 @@ -1252,6 +1252,13 @@ extern void initialize_secondary(void); +static void __init clear_bss(void) +{ + extern char * __bss_start, __bss_stop; + memset(__bss_start, 0, + (unsigned long) __bss_stop - (unsigned long) __bss_start); +} + /* * Activate the first processor. */ @@ -1259,9 +1266,13 @@ asmlinkage void __init start_kernel(void) { char * command_line; - #ifdef __SMP__ static int boot_cpu = 1; +#endif + + clear_bss(); + +#ifdef __SMP__ /* "current" has been set up, we need to load it now */ if (!boot_cpu) initialize_secondary();