blob: ea1cf594f4331575aee965a12255c084752ce477 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation
* All rights reserved.
* This program and the accompanying materials
* are made available under the terms of the BSD License
* which accompanies this distribution, and is available at
* http://www.opensource.org/licenses/bsd-license.php
*
* Contributors:
* IBM Corporation - initial implementation
*****************************************************************************/
#include "macros.h"
#include "../../llfw/boot_abort.h"
/*#################### defines #####################*/
#define STACK_SIZE 0x4000
/*#################### code ########################*/
.text
.globl .gluon_c_entry
.globl __toc_start
.globl __toc_end
.globl __stack_end
.globl __bss_start
.globl __bss_size
.globl __start
ASM_ENTRY(__startC)
/* clear out bss section */
LOAD64(r3, (__bss_start - 8))
LOAD64(r4, __bss_size)
/* divide __bss_size by 8 to get number */
/* of dwords to clear */
srwi. r4, r4, 3
beq bsscdone
li r5, 0
mtctr r4
bssc: stdu r5, 8(r3)
bdnz bssc
bsscdone:
/* setup stack */
LOAD64(r1, __stack_end + STACK_SIZE)
/* save return address beside stack */
addi r3, r1, 128
mflr r0
std r0, 0(r3)
/* setup toc */
bl toc_init
/* ------------------------------------ */
/* jump to c-code */
/* r10 = cpu_init_slave address - r3 */
/* r11 = slave_setup address - r4 */
/* ------------------------------------ */
mr r3, r10
mr r4, r11
bl .early_c_entry
/* return to caller... */
LOAD64(r1, __stack_end + STACK_SIZE)
addi r1, r1, 128
ld r3, 0(r1)
mtlr r3
blr
/* #################################### */
/* Basic Additional Functions */
/* for extended lib functions see */
/* external library */
/* #################################### */
.align 2
/* ------------------------------------ */
/* updates toc in r2 */
/* ------------------------------------ */
ASM_ENTRY(toc_init)
LOAD64(r2, __toc_start)
addi r2,r2,0x4000
addi r2,r2,0x4000
blr
/* ------------------------------------ */
/* stores arg#1 in r27 and stops */
/* ------------------------------------ */
ENTRY(do_panic)
ENTRY(halt_sys)
BOOT_ABORT_R3HINT(ABORT_CANIO, ALTBOOT, msg_e_ierror);