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