diff options
Diffstat (limited to 'lib/csu/mips64/crt0.c')
-rw-r--r-- | lib/csu/mips64/crt0.c | 207 |
1 files changed, 0 insertions, 207 deletions
diff --git a/lib/csu/mips64/crt0.c b/lib/csu/mips64/crt0.c deleted file mode 100644 index 409227b122a..00000000000 --- a/lib/csu/mips64/crt0.c +++ /dev/null @@ -1,207 +0,0 @@ -/* $OpenBSD: crt0.c,v 1.6 2010/09/12 12:13:51 kettenis Exp $ */ -/* $NetBSD: crt0.c,v 1.7 1995/06/03 13:16:15 pk Exp $ */ -/* - * Copyright (c) 1993 Paul Kranenburg - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Paul Kranenburg. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include <sys/param.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -extern void __init __P((void)); -extern void _mcleanup __P((void)); -extern unsigned char eprol asm ("eprol"); -extern unsigned char etext; - -char **environ; -static char empty[1]; -char *__progname = empty; -void __perf_init __P((void)); - -static inline int -_perfcall(int func, void *arg) -{ - int status = 0; -#if 0 - __asm__ volatile ( "move $4, %1\n\t" - "move $5, %2\n\t" - "teqi $0, 0\n\t" - "move %0, $2" - : "=r" (status) - : "r" (func), "r" (arg) - : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", - "$11", "$12","$13","$14","$15","$24","$25", "memory"); -#endif - return(status); -} - -void -__start() -{ - struct kframe { - long kargc; - char *kargv[1]; /* size depends on kargc */ - char kargstr[1]; /* size varies */ - char kenvstr[1]; /* size varies */ - }; - - register struct kframe *kfp; - register char **argv, *ap; - -/* - * Do GP register setup. Differs depending on shared lib stuff or not. - */ -#if defined(_NO_ABICALLS) - asm(" dla $28,_gp"); - asm(" daddiu %0,$29,32" : "=r" (kfp)); -#else -#if defined(__GNUC__) && __GNUC__ > 3 - asm(" daddiu %0,$29,64" : "=r" (kfp)); -#else - asm(" daddiu %0,$29,80" : "=r" (kfp)); -#endif -#endif - /* just above the saved frame pointer - kfp = (struct kframe *) (¶m-1);*/ - argv = &kfp->kargv[0]; - environ = argv + kfp->kargc + 1; - - if (ap = argv[0]) - if ((__progname = strrchr(ap, '/')) == NULL) - __progname = ap; - else - ++__progname; - -asm("eprol:"); - -#ifdef MCRT0 - atexit(_mcleanup); - monstartup((u_long)&eprol, (u_long)&etext); -#endif /*MCRT0*/ - - __init(); - __perf_init(); - -asm ("_callmain:"); /* Defined for the benefit of debuggers */ - exit(main(kfp->kargc, argv, environ)); -} - -#ifdef MCRT0 -asm (" .text"); -asm ("_eprol:"); -#endif - -/************/ -#include <stdio.h> - -void _perf_cleanup __P((void)); - -#define PCNT_CE 0x0400 /* Count enable */ -#define PCNT_UM 0x0200 /* Count in User mode */ -#define PCNT_KM 0x0100 /* Count in kernel mode */ - -#define PCNT_FNC_SELECT 0x0001 /* Select counter source */ -#define PCNT_FNC_READ 0x0002 /* Read current value of counter */ - -struct cname { - char *name; - int cval; -} cn_tab[] = { - { "CLOCKS", 0x00 }, - { "INSTR", 0x01 }, - { "FPINSTR", 0x02 }, - { "IINSTR", 0x03 }, - { "LOAD", 0x04 }, - { "STORE", 0x05 }, - { "DUAL", 0x06 }, - { "BRPREF", 0x07 }, - { "EXTMISS", 0x08 }, - { "STALL", 0x09 }, - { "SECMISS", 0x0a }, - { "INSMISS", 0x0b }, - { "DTAMISS", 0x0c }, - { "DTLBMISS", 0x0d }, - { "ITLBMISS", 0x0e }, - { "JTLBIMISS", 0x0f }, - { "JTLBDMISS", 0x10 }, - { "BRTAKEN", 0x11 }, - { "BRISSUED", 0x12 }, - { "SECWBACK", 0x13 }, - { "PRIWBACK", 0x14 }, - { "DCSTALL", 0x15 }, - { "MISS", 0x16 }, - { "FPEXC", 0x17 }, - { "MULSLIP", 0x18 }, - { "CP0SLIP", 0x19 }, - { "LDSLIP", 0x1a }, - { "WBFULL", 0x1b }, - { "CISTALL", 0x1c }, - { "MULSTALL", 0x1d }, - { "ELDSTALL", 0x1e }, -}; -#define NCNTAB (sizeof(cn_tab) / sizeof(struct cname)) - -void -__perf_init() -{ - long pselect; - char *cn; - - if((cn = getenv("__PERF_SELECT")) == NULL) { - return; - } - - for(pselect = 0; pselect < NCNTAB; pselect++) { - if(strcmp(cn, cn_tab[pselect].name) == 0) { - pselect = cn_tab[pselect].cval; - break; - } - } - if(pselect >= NCNTAB) { - fprintf(stderr, "!! Invalid __PERF_SELECT !!\n"); - exit(255); - } - _perfcall(PCNT_FNC_SELECT, (void *)(PCNT_CE|PCNT_UM|pselect)); /*XXX*/ - atexit(_perf_cleanup); - - if((cn = getenv("__PERF_START")) == NULL) { - return; - } -} - -void -_perf_cleanup() -{ - quad_t countvalue; - - _perfcall(PCNT_FNC_READ, &countvalue); - printf("\ncount = %qd.\n", countvalue); -} |