/* * Standard x86 syscalls for user programs running under Cygmon * * Copyright (c) 1998, 2000 Cygnus Support * * The authors hereby grant permission to use, copy, modify, distribute, * and license this software and its documentation for any purpose, provided * that existing copyright notices are retained in all copies and that this * notice is included verbatim in any distributions. No written agreement, * license, or royalty fee is required for any of the authorized uses. * Modifications to this software may be copyrighted by their authors * and need not follow the licensing terms described here, provided that * the new terms are clearly indicated on the first page of each file where * they apply. */ #include #include #include "cygmon-syscall.h" #include extern int errno; _syscall3(int,write,int,i,char *,c,int,len); #if 0 _syscall3(int,read,int,i,char *,c,int,len); #else int read (int des, char *dest, int len) { return -1; } #endif _syscall2(int,kill,int,pid,int,signal); _syscall2(void,__install_signal_handler,int,arg,void *,handler); _syscall1(char **,__get_program_arguments,int *,argc); _syscall1(void,__sys_exit,int,exitcode); _syscall1(void,putTtyChar,int,character); _syscall1(time_t,time,time_t *,ptr); _syscall2(int, gettimeofday, struct timeval *,time, void *,z); _syscall3(int, __open, const char *, filename, int, mode, int, filemode); _syscall4(void, profil, unsigned short *, buff, unsigned int, bufsiz, unsigned int, offset, unsigned int, scale); _syscall1(int, close, int, fd); /* Bleah. */ int open (const char *filename, int mode, ...) { #if 0 return __open (filename, mode, 0644); #else return -1; #endif } /* Ultra-super cheezy. */ int isatty (int i) { return i<3; } int unlink (const char *p) { return -1; } char * sbrk (int amt) { extern char _end; static char *ptr = 0; char *res; if (ptr == 0) ptr = &_end; if (amt == 0) return (char *)ptr; if (((long)ptr) % 8) ptr = ptr + (8 - (((long)(ptr)) % 8)); res = ptr; ptr += amt; return (char *)res; } void _exit(int i) { while(1) { __sys_exit (i); asm(" int $3"); } } int fstat(int des, struct stat *buf) { return -1; } int lseek(int des,unsigned long offset, int whence) { return -1; } int getpid () { return -1; } /* Simple replacement for the clock() syscall. */ clock_t clock () { struct timeval t; gettimeofday (&t, 0); return t.tv_sec * 1000 + (t.tv_usec / 1000); } #if ! defined(COFF) && ! defined(AOUT) typedef void (*ctp)(); void __do_global_ctors () { extern int __CTOR_LIST__; int *c = &__CTOR_LIST__; c++; while (*c) { ctp d = (ctp)*c; (d)(); c++; } } void __do_global_dtors () { extern int __DTOR_LIST__; int *c = &__DTOR_LIST__; int *cp = c; c++; while (*c) { c++; } c--; while (c > cp) { ctp d = (ctp)*c; (*d)(); c--; } } #endif void profil_write (int type, char *buffer, int len) { static int des = -1; if (des < 0) { des = open ("gmon.out", O_WRONLY | O_CREAT | O_TRUNC, 0644); } if (len == 0) { close (des); } else { write (des, buffer, len); } }