patch-2.1.16 linux/arch/sparc/boot/bare.S
Next file: linux/arch/sparc/boot/bare.h
Previous file: linux/arch/sparc/boot/README
Back to the patch index
Back to the overall index
- Lines: 161
- Date:
Thu Jan 1 02:00:00 1970
- Orig file:
v2.1.15/linux/arch/sparc/boot/bare.S
- Orig date:
Thu Apr 25 13:22:05 1996
diff -u --recursive --new-file v2.1.15/linux/arch/sparc/boot/bare.S linux/arch/sparc/boot/bare.S
@@ -1,160 +0,0 @@
-/* $Id: bare.S,v 1.4 1996/04/23 01:53:40 davem Exp $
- * base.S: Ugly low-level boot program entry code. The job of this
- * module is to parse the boot flags, try to mount the remote
- * root filesystem and load the kernel into virtual memory.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#include "bare.h"
-#include <asm/ptrace.h>
-
- .data
- .globl C_LABEL(romvec)
- .globl C_LABEL(idp_ptr)
-
-C_LABEL(romvec):
- .word 0
-C_LABEL(idp_ptr):
- .word 0
-
- .text
- .align 8
- .globl C_LABEL(first_adr_in_text)
-
-C_LABEL(first_adr_in_text):
-
- /* Grrr, boot block, scratching my head... */
- .globl C_LABEL(b_block) /* Start of actual boot block */
- .globl C_LABEL(b_block_size) /* In bytes */
- .globl C_LABEL(b_block_cksum) /* Checksum of boot block bytes */
-
- b start_of_execution /* XXX Hack */
- nop
-
- .align 8
-C_LABEL(b_block):
- .skip (BOOTBLOCK_NENTRIES * BOOTBLOCK_ENTSIZE)
-
-C_LABEL(b_block_size):
- .word 0
-
-C_LABEL(b_block_cksum):
- .word 0
-
-/* Ok, the prom has left in %o0 the PROM pointer. We leave it here
- * for when we jump into the kernel. So save out of this window before
- * you dick with %o0. As far as I know we could be loaded *anywhere*, so
- * we relocate ourselves to the "linked" location. Self modifying code rules.
- */
-
-start_of_execution:
- sethi %hi(C_LABEL(first_adr_in_text)), %o1 ! This is our top
- or %o1, %lo(C_LABEL(first_adr_in_text)), %o1 ! of stack too.
- sub %o1, REGWIN_SZ, %o1
- add %o1, 0x7, %o1
- andn %o1, 0x7, %o1
- save %o1, 0x0, %sp ! save is an add
-here:
- call there
- sethi %hi(here), %o4
-there:
- sub %o7, here-C_LABEL(first_adr_in_text), %o5
- or %o4, %lo(here), %o4
- cmp %o4, %o7
- be loaded_ok
- nop
-
- /* Gotta relocate, compute our size sans bss segment. */
- set C_LABEL(edata)+4, %o3
- set C_LABEL(first_adr_in_text), %o2
- sub %o3, %o2, %o3
-rel_loop:
- ld [%o5], %o4
- add %o5, 0x4, %o5
- st %o4, [%o2]
- subcc %o3, 0x4, %o3
- bg rel_loop
- add %o2, 0x4, %o2
-
- /* Pray that we are now in a sane place in memory */
- sethi %hi(loaded_ok), %o2
- or %o2, %lo(loaded_ok), %o2
- jmp %o2
- nop
-
-loaded_ok:
- /* Save the PROM pointer */
- sethi %hi(C_LABEL(romvec)), %o1
- or %o1, %lo(C_LABEL(romvec)), %o1
- st %i0, [%o1]
-
- /* Build a PSR we can live with */
- rd %psr, %o1
-
-#if 0
- andn %o1, PSR_PIL, %o1
- sethi %hi(SANE_PSR), %g4
- or %g4, %lo(SANE_PSR), %g4
- or %o1, %g4, %o1
-#endif
-
- /* V8 book says this works to calculate num_windows */
- sethi %hi(0xffffffff), %g2
- rd %wim, %g3
- or %g2, %lo(0xffffffff), %g2
- wr %g2, 0x0, %wim
- WRITE_PAUSE
-
- rd %wim, %g4
- WRITE_PAUSE
-
- wr %g3, 0x0, %wim
- WRITE_PAUSE
-
- /* Restore old %psr */
- wr %o1, 0x0, %psr
- WRITE_PAUSE
-
- or %g0, 0x0, %g3
-1:
- srl %g4, 0x1, %g4
- subcc %g4, 0x0, %g0
- bne 1b
- add %g3, 0x1, %g3
-
- /* %g3 now contains nwindows */
- sethi %hi(C_LABEL(nwindows)), %o4
- st %g3, [%o4 + %lo(C_LABEL(nwindows))]
-
- /* Now zero out our bss segment, lord knows the nasty prom monster
- * didn't do it for us.
- */
- sethi %hi(C_LABEL(end)), %g1
- or %g1, %lo(C_LABEL(end)), %g1
- add %g1, 0x4, %g1
- sethi %hi(C_LABEL(edata)), %g2
- or %g2, %lo(C_LABEL(edata)), %g2
-
- /* Slow, inefficient, who cares, this is messy boot code */
-bzero_bss_loop:
- st %g0, [%g2]
- add %g2, 0x4, %g2
- cmp %g2, %g1
- bl bzero_bss_loop
- nop
-
- call C_LABEL(init_me) ! Fun with empirical constants and prom
- nop
-
- /* Dump back into the prom */
-get_me_out_of_here:
- set C_LABEL(romvec), %g2
- ld [%g2], %g2
- ld [%g2 + 0x74], %g2
- restore
- call %g2
- nop
-
-
-
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov