1*3e0c8044SRichard Lowe/* 2*3e0c8044SRichard Lowe * This file and its contents are supplied under the terms of the 3*3e0c8044SRichard Lowe * Common Development and Distribution License ("CDDL"), version 1.0. 4*3e0c8044SRichard Lowe * You may only use this file in accordance with the terms of version 5*3e0c8044SRichard Lowe * 1.0 of the CDDL. 6*3e0c8044SRichard Lowe * 7*3e0c8044SRichard Lowe * A full copy of the text of the CDDL should have accompanied this 8*3e0c8044SRichard Lowe * source. A copy of the CDDL is also available via the Internet at 9*3e0c8044SRichard Lowe * http://www.illumos.org/license/CDDL. 10*3e0c8044SRichard Lowe */ 11*3e0c8044SRichard Lowe 12*3e0c8044SRichard Lowe/* 13*3e0c8044SRichard Lowe * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 14*3e0c8044SRichard Lowe * Use is subject to license terms. 15*3e0c8044SRichard Lowe */ 16*3e0c8044SRichard Lowe 17*3e0c8044SRichard Lowe/* Copyright 2016, Richard Lowe. */ 18*3e0c8044SRichard Lowe 19*3e0c8044SRichard Lowe#include <sys/asm_linkage.h> 20*3e0c8044SRichard Lowe#include <sys/stack.h> 21*3e0c8044SRichard Lowe 22*3e0c8044SRichard Lowe .file "mach-crt1.s" 23*3e0c8044SRichard Lowe 24*3e0c8044SRichard Lowe .global _start_crt 25*3e0c8044SRichard Lowe 26*3e0c8044SRichard Lowe#if defined(__sparcv9) 27*3e0c8044SRichard Lowe#define EB_MAX_SIZE 128 28*3e0c8044SRichard Lowe#else 29*3e0c8044SRichard Lowe#define EB_MAX_SIZE 64 30*3e0c8044SRichard Lowe#endif 31*3e0c8044SRichard Lowe 32*3e0c8044SRichard LoweENTRY_NP(_start) 33*3e0c8044SRichard Lowe /* 34*3e0c8044SRichard Lowe * On entry, the stack is: 35*3e0c8044SRichard Lowe * 36*3e0c8044SRichard Lowe * .-----------------------. <--- %sp 37*3e0c8044SRichard Lowe * | | 38*3e0c8044SRichard Lowe * | Window | 39*3e0c8044SRichard Lowe * | | 40*3e0c8044SRichard Lowe * |-----------------------| 41*3e0c8044SRichard Lowe * | argc | 42*3e0c8044SRichard Lowe * |-----------------------| 43*3e0c8044SRichard Lowe * | argv[0] | 44*3e0c8044SRichard Lowe * | argv[1] | 45*3e0c8044SRichard Lowe * | argv[2] | 46*3e0c8044SRichard Lowe * | argv[3] | 47*3e0c8044SRichard Lowe * | ... | 48*3e0c8044SRichard Lowe * | argv[argc - 1] | 49*3e0c8044SRichard Lowe * |-----------------------| 50*3e0c8044SRichard Lowe * | NULL | 51*3e0c8044SRichard Lowe * |-----------------------| 52*3e0c8044SRichard Lowe * | envp[0] | 53*3e0c8044SRichard Lowe * | envp[1] | 54*3e0c8044SRichard Lowe * | envp[2] | 55*3e0c8044SRichard Lowe * | envp[3] | 56*3e0c8044SRichard Lowe * | ... | 57*3e0c8044SRichard Lowe * | envp[N] | 58*3e0c8044SRichard Lowe * |-----------------------| 59*3e0c8044SRichard Lowe * | NULL | 60*3e0c8044SRichard Lowe * .-----------------------. 61*3e0c8044SRichard Lowe * 62*3e0c8044SRichard Lowe * and an exit handler from the linker is in %g1 63*3e0c8044SRichard Lowe */ 64*3e0c8044SRichard Lowe clr %fp ! don't trace the stack past this point 65*3e0c8044SRichard Lowe 66*3e0c8044SRichard Lowe add %sp, WINDOWSIZE + STACK_BIAS, %l0 ! address of argc 67*3e0c8044SRichard Lowe 68*3e0c8044SRichard Lowe ! allocate a minimally sized frame, and align ourselves 69*3e0c8044SRichard Lowe add %sp, -SA(MINFRAME - EB_MAX_SIZE), %sp 70*3e0c8044SRichard Lowe 71*3e0c8044SRichard Lowe ldn [%l0], %o0 ! argc 72*3e0c8044SRichard Lowe add %l0, CPTRSIZE, %o1 ! argv 73*3e0c8044SRichard Lowe call _start_crt 74*3e0c8044SRichard Lowe mov %g1, %o2 ! exit_handler in delay slot 75*3e0c8044SRichard LoweSET_SIZE(_start) 76