105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter/*
205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * crt0_s.S: Entry function for SPU-side context save.
305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter *
405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * Copyright (C) 2005 IBM
505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter *
605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * Entry function for SPU-side of the context save sequence.
705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * Saves all 128 GPRs, sets up an initial stack frame, then
805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * branches to 'main'.
905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter *
1005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter *
1105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * This program is free software; you can redistribute it and/or modify
1205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * it under the terms of the GNU General Public License as published by
1305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * the Free Software Foundation; either version 2, or (at your option)
1405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * any later version.
1505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter *
1605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * This program is distributed in the hope that it will be useful,
1705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * but WITHOUT ANY WARRANTY; without even the implied warranty of
1805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * GNU General Public License for more details.
2005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter *
2105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * You should have received a copy of the GNU General Public License
2205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * along with this program; if not, write to the Free Software
2305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
2405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter */
2505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
2605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter#include <asm/spu_csa.h>
2705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
2805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.data
2905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.align 7
3005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.globl regs_spill
3105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutterregs_spill:
3205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.space SIZEOF_SPU_SPILL_REGS, 0x0
3305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
3405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.text
3505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.global _start
3605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter_start:
3705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	/* SPU Context Save Step 1: Save the first 16 GPRs. */
3805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $0, regs_spill + 0
3905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $1, regs_spill + 16
4005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $2, regs_spill + 32
4105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $3, regs_spill + 48
4205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $4, regs_spill + 64
4305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $5, regs_spill + 80
4405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $6, regs_spill + 96
4505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $7, regs_spill + 112
4605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $8, regs_spill + 128
4705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $9, regs_spill + 144
4805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $10, regs_spill + 160
4905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $11, regs_spill + 176
5005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $12, regs_spill + 192
5105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $13, regs_spill + 208
5205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $14, regs_spill + 224
5305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqa $15, regs_spill + 240
5405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
5505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	/* SPU Context Save, Step 8: Save the remaining 112 GPRs. */
5605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	ila     $3, regs_spill + 256
5705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nuttersave_regs:
5805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	lqr     $4, save_reg_insts
5905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nuttersave_reg_loop:
6005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	ai      $4, $4, 4
6105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	.balignl 16, 0x40200000
6205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nuttersave_reg_insts:       /* must be quad-word aligned. */
6305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqd    $16, 0($3)
6405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqd    $17, 16($3)
6505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqd    $18, 32($3)
6605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqd    $19, 48($3)
6705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	andi    $5, $4, 0x7F
6805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqr    $4, save_reg_insts
6905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	ai      $3, $3, 64
7005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	brnz    $5, save_reg_loop
7105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
7205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	/* Initialize the stack pointer to point to 16368
7305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 * (16kb-16). The back chain pointer is initialized
7405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 * to NULL.
7505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 */
7605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	il	$0, 0
7705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	il	$SP, 16368
7805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqd	$0, 0($SP)
7905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
8005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	/* Allocate a minimum stack frame for the called main.
8105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 * This is needed so that main has a place to save the
8205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 * link register when it calls another function.
8305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 */
8405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stqd	$SP, -160($SP)
8505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	ai	$SP, $SP, -160
8605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
8705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	/* Call the program's main function. */
8805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	brsl	$0, main
8905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
9005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	/* In this case main should not return; if it does
9105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 * there has been an error in the sequence.  Execute
9205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 * stop-and-signal with code=0.
9305b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	 */
9405b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.global exit
9505b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.global	_exit
9605b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutterexit:
9705b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter_exit:
9805b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	stop	0x0
9905b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
10005b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter	/* Pad the size of this crt0.o to be multiple of 16 bytes. */
10105b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter.balignl 16, 0x0
10205b841174c289ca62a6b42d883b8791d9ac3a4bdMark Nutter
103