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