diff options
Diffstat (limited to '05/stdc_common.h')
-rw-r--r-- | 05/stdc_common.h | 173 |
1 files changed, 167 insertions, 6 deletions
diff --git a/05/stdc_common.h b/05/stdc_common.h index a3a8e7f..1540f19 100644 --- a/05/stdc_common.h +++ b/05/stdc_common.h @@ -88,6 +88,111 @@ static unsigned char __syscall_data[] = { (((unsigned long (*)(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long))__syscall_data)\ (no, arg1, arg2, arg3, arg4, arg5, arg6)) +// we need to define ucontext_t +# define __ctx(fld) fld +typedef long long int greg_t; +#define __NGREG 23 +typedef greg_t gregset_t[__NGREG]; +#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) +typedef struct +{ + unsigned long int __val[_SIGSET_NWORDS]; +} __sigset_t, sigset_t; +typedef struct +{ + void *ss_sp; + int ss_flags; + size_t ss_size; +} stack_t; +enum +{ + REG_R8 = 0, +# define REG_R8 REG_R8 + REG_R9, +# define REG_R9 REG_R9 + REG_R10, +# define REG_R10 REG_R10 + REG_R11, +# define REG_R11 REG_R11 + REG_R12, +# define REG_R12 REG_R12 + REG_R13, +# define REG_R13 REG_R13 + REG_R14, +# define REG_R14 REG_R14 + REG_R15, +# define REG_R15 REG_R15 + REG_RDI, +# define REG_RDI REG_RDI + REG_RSI, +# define REG_RSI REG_RSI + REG_RBP, +# define REG_RBP REG_RBP + REG_RBX, +# define REG_RBX REG_RBX + REG_RDX, +# define REG_RDX REG_RDX + REG_RAX, +# define REG_RAX REG_RAX + REG_RCX, +# define REG_RCX REG_RCX + REG_RSP, +# define REG_RSP REG_RSP + REG_RIP, +# define REG_RIP REG_RIP + REG_EFL, +# define REG_EFL REG_EFL + REG_CSGSFS, /* Actually short cs, gs, fs, __pad0. */ +# define REG_CSGSFS REG_CSGSFS + REG_ERR, +# define REG_ERR REG_ERR + REG_TRAPNO, +# define REG_TRAPNO REG_TRAPNO + REG_OLDMASK, +# define REG_OLDMASK REG_OLDMASK + REG_CR2 +# define REG_CR2 REG_CR2 +}; +struct _libc_fpxreg +{ + unsigned short int __ctx(significand)[4]; + unsigned short int __ctx(exponent); + unsigned short int __glibc_reserved1[3]; +}; +struct _libc_xmmreg +{ + uint32_t __ctx(element)[4]; +}; +struct _libc_fpstate +{ + uint16_t __ctx(cwd); + uint16_t __ctx(swd); + uint16_t __ctx(ftw); + uint16_t __ctx(fop); + uint64_t __ctx(rip); + uint64_t __ctx(rdp); + uint32_t __ctx(mxcsr); + uint32_t __ctx(mxcr_mask); + struct _libc_fpxreg _st[8]; + struct _libc_xmmreg _xmm[16]; + uint32_t __glibc_reserved1[24]; +}; +typedef struct _libc_fpstate *fpregset_t; +typedef struct { + gregset_t __ctx(gregs); + fpregset_t __ctx(fpregs); + unsigned long long __reserved1 [8]; +} mcontext_t; +typedef struct ucontext_t { + unsigned long int __ctx(uc_flags); + struct ucontext_t *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + sigset_t uc_sigmask; + struct _libc_fpstate __fpregs_mem; + unsigned long long int __ssp[4]; +} ucontext_t; + long read(int fd, void *buf, size_t count) { return __syscall(0, fd, buf, count, 0, 0, 0); } @@ -116,6 +221,32 @@ int execve(const char *pathname, char *const argv[], char *const envp[]) { return __syscall(59, pathname, argv, envp, 0, 0, 0); } +int gettimeofday(struct timeval *tv, struct timezone *tz) { + return __syscall(96, tv, tz, 0, 0, 0, 0); +} + +typedef long time_t; + +struct timespec { + time_t tv_sec; + long tv_nsec; +}; + +struct timeval { + time_t tv_sec; + long tv_usec; +}; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; + +char *getcwd(char *buf, size_t size) { + long n = __syscall(79, buf, size, 0, 0, 0, 0); + if (n < 0) return NULL; + return buf; +} #define _WEXITSTATUS(status) (((status) & 0xff00) >> 8) #define _WIFEXITED(status) (__WTERMSIG(status) == 0) @@ -132,16 +263,11 @@ int wait4(int pid, int *status, int options, struct rusage *rusage) { #define SIGINT 2 #define SIGSEGV 11 #define SIGTERM 15 +#define SIGBUS 7 void abort(void) { kill(getpid(), SIGABRT); } -typedef long time_t; - -struct timespec { - time_t tv_sec; - long tv_nsec; -}; #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 @@ -183,6 +309,29 @@ int __assert_failed(const char *file, int line, const char *expr) { #define assert(x) (void)((x) || __assert_failed(__FILE__, __LINE__, #x)) #endif + +int _clamp_long_to_int(long x) { + if (x < INT_MIN) return INT_MIN; + if (x > INT_MAX) return INT_MAX; + return x; +} + +short _clamp_long_to_short(long x) { + if (x < SHRT_MIN) return SHRT_MIN; + if (x > SHRT_MAX) return SHRT_MAX; + return x; +} + +unsigned _clamp_ulong_to_uint(unsigned long x) { + if (x > UINT_MAX) return UINT_MAX; + return x; +} + +unsigned short _clamp_ulong_to_ushort(unsigned long x) { + if (x > USHRT_MAX) return USHRT_MAX; + return x; +} + #define EIO 5 #define EDOM 33 #define ERANGE 34 @@ -201,6 +350,10 @@ int munmap(void *addr, size_t length) { return __syscall(11, addr, length, 0, 0, 0, 0); } +int mprotect(void *addr, size_t len, int prot) { + return __syscall(10, addr, len, prot, 0, 0, 0); +} + #define MREMAP_MAYMOVE 1 void *_mremap(void *addr, size_t old_size, size_t new_size, int flags) { return __syscall(25, addr, old_size, new_size, flags, 0, 0); @@ -455,6 +608,14 @@ double strtod(const char *nptr, char **endptr) { return sum * sign; } +float strtof(const char *nptr, char **endptr) { + return strtod(nptr, endptr); +} + +long double strtold(const char *nptr, char **endptr) { + return strtod(nptr, endptr); +} + char *strerror(int errnum) { switch (errnum) { case ERANGE: return "Range error"; |