root/sys/arch/ofppc/stand/ofwboot/ofwstart.S
/* $NetBSD: ofwstart.S,v 1.4 2014/09/20 23:10:46 phx Exp $ */

/*-
 * Copyright (c) 2008 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Tim Rightnour
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifdef XCOFF_GLUE
        .text
        .globl  _entry
_entry:
        .long   _start,0,0
#endif /* XCOFF_GLUE */

        .text
        .globl  _start
        /* This is the magical note section that IBM machines require
         * to boot.  This should be a note, but gnu ld will not let us
         * position it at the start of the file.
         */
        # length of name
        .long   8
        # note descriptor size
        .long   24
        # note type (IEEE 1275)
        .long   0x1275
        # name of owner
        .asciz  "PowerPC"
        .balign 4

        # note descriptor
        # real mode (-1) or virtual mode (0)
        .long   -1
        # real-base
        .long   -1
        # real-size
        .long   -1
        # virt-base
        .long   -1
        # virt-size
        .long   -1
        # load-base
        .long   0x4000

        /* note for dealing with IBM LPARs */
        # length of name
        .long 24
        # note descriptor size
        .long 28
        # note type
        .long 0x12759999
        # name of owner
        .asciz "IBM,RPA-Client-Config"
        .balign 4

        # lpar affinity
        .long 0
        # minimum size in megabytes
        .long 64
        # minimum percentage size
        .long 0
        # max pft size ( 2^48 bytes )
        .long 48
        # splpar
        .long 1
        # min load ?
        .long -1
        # new mem def ?
        .long 0
        
_start:
        sync
        isync
        lis     %r1,stack+0x20000@ha
        addi    %r1,%r1,stack+0x20000@l

        mfmsr   %r8
        li      %r0,0
        mtmsr   %r0
        isync

        mtibatu 0,%r0
        mtibatu 1,%r0
        mtibatu 2,%r0
        mtibatu 3,%r0
        mtdbatu 0,%r0
        mtdbatu 1,%r0
        mtdbatu 2,%r0
        mtdbatu 3,%r0

        li      %r9,0x12        /* BATL(0, BAT_M, BAT_PP_RW) */
        mtibatl 0,%r9
        mtdbatl 0,%r9
        li      %r9,0x1ffe      /* BATU(0, BAT_BL_256M, BAT_Vs) */
        mtibatu 0,%r9
        mtdbatu 0,%r9
        isync

        mtmsr   %r8
        isync

        /*
         * Make sure that .bss is zeroed
         */

        li      %r0,0
        lis     %r8,_edata@ha
        addi    %r8,%r8,_edata@l
        lis     %r9,_end@ha
        addi    %r9,%r9,_end@l

5:      cmpw    0,%r8,%r9
        bge     6f
        stw     %r0,0(%r8)
        addi    %r8,%r8,4
        b       5b

6:      b       startup