diff --git a/kernel-src/arch/x86-64/syscalllog.c b/kernel-src/arch/x86-64/syscalllog.c index 014590de..3a0cc343 100644 --- a/kernel-src/arch/x86-64/syscalllog.c +++ b/kernel-src/arch/x86-64/syscalllog.c @@ -222,7 +222,7 @@ __attribute__((no_caller_saved_registers)) void arch_syscall_log_return(uint64_t thread_t *thread = _cpu()->thread; proc_t *proc = thread->proc; - snprintf(printbuff, 1024, "\e[94msyscall return: pid %d tid %d: %lu %lu (%lu cached pages, %lu free pages)\n\e[0m", proc->pid, thread->tid, ret, errno, vmmcache_cachedpages, freepagecount); + snprintf(printbuff, 1024, "\e[94msyscall return: pid %d tid %d: %lu %s (%lu cached pages, %lu free pages)\n\e[0m", proc->pid, thread->tid, ret, strerror(errno), vmmcache_cachedpages, freepagecount); LOGSTR(printbuff); #endif } diff --git a/kernel-src/include/string.h b/kernel-src/include/string.h index d2c73689..8eea06b0 100644 --- a/kernel-src/include/string.h +++ b/kernel-src/include/string.h @@ -11,5 +11,6 @@ void *memset(void *dest, unsigned long what, size_t size); int strcmp(const char *a, const char *b); int strncmp(const char *a, const char *b, size_t c); int memcmp(const void *a, const void *b, size_t s); +char *strerror(int errno); #endif diff --git a/kernel-src/lib/string.c b/kernel-src/lib/string.c index de1a34ad..d610dc16 100644 --- a/kernel-src/lib/string.c +++ b/kernel-src/lib/string.c @@ -1,29 +1,30 @@ #include #include #include +#include void *memcpy(void *d, void *s, size_t c) { #ifdef __x86_64__ asm volatile ("rep movsb" : : "S"(s), "D"(d), "c"(c) : "memory"); #else - uint8_t *sc = (uint8_t *)s; - uint8_t *dc = (uint8_t *)d; + uint8_t *sc = (uint8_t *)s; + uint8_t *dc = (uint8_t *)d; - while (c--) - *dc++ = *sc++; + while (c--) + *dc++ = *sc++; #endif - return d; + return d; } void *memset(void *ptr, unsigned long value, size_t num) { #ifdef __x86_64__ asm volatile ("rep stosb" : : "D"(ptr), "a"(value), "c"(num) : "memory"); #else - char *p = (char *)ptr; - while (num--) - *p++ = value; + char *p = (char *)ptr; + while (num--) + *p++ = value; #endif - return ptr; + return ptr; } char *strcat(char *dest, const char *src) { @@ -35,12 +36,12 @@ char *strcat(char *dest, const char *src) { } int strcmp(const char *a, const char *b) { - while (*a && (*a == *b)) { + while (*a && (*a == *b)) { ++a; ++b; } - return *(const unsigned char *)a - *(const unsigned char *)b; + return *(const unsigned char *)a - *(const unsigned char *)b; } char *strcpy(char *p, const char *s) { @@ -56,21 +57,21 @@ char *strcpy(char *p, const char *s) { } size_t strlen(const char *a) { - size_t s = 0; + size_t s = 0; - while (a[s] != '\0') + while (a[s] != '\0') ++s; - return s; + return s; } int strncmp(const char *a, const char *b, size_t c) { - int diff = 0; + int diff = 0; - while (c-- && diff == 0) - diff += *a++ - *b++; + while (c-- && diff == 0) + diff += *a++ - *b++; - return diff; + return diff; } int memcmp(const void *_a, const void *_b, size_t s) { @@ -83,3 +84,147 @@ int memcmp(const void *_a, const void *_b, size_t s) { return diff; } + +#define DO_NAME(e) \ + case e: \ + return #e; + +char *strerror(int errno) { + switch (errno) { + case 0: + return "OK"; + DO_NAME(EPERM) + DO_NAME(ENOENT) + DO_NAME(ESRCH) + DO_NAME(EINTR) + DO_NAME(EIO) + DO_NAME(ENXIO) + DO_NAME(E2BIG) + DO_NAME(ENOEXEC) + DO_NAME(EBADF) + DO_NAME(ECHILD) + DO_NAME(EAGAIN) + DO_NAME(ENOMEM) + DO_NAME(EACCES) + DO_NAME(EFAULT) + DO_NAME(ENOTBLK) + DO_NAME(EBUSY) + DO_NAME(EEXIST) + DO_NAME(EXDEV) + DO_NAME(ENODEV) + DO_NAME(ENOTDIR) + DO_NAME(EISDIR) + DO_NAME(EINVAL) + DO_NAME(ENFILE) + DO_NAME(EMFILE) + DO_NAME(ENOTTY) + DO_NAME(ETXTBSY) + DO_NAME(EFBIG) + DO_NAME(ENOSPC) + DO_NAME(ESPIPE) + DO_NAME(EROFS) + DO_NAME(EMLINK) + DO_NAME(EPIPE) + DO_NAME(EDOM) + DO_NAME(ERANGE) + DO_NAME(EDEADLK) + DO_NAME(ENAMETOOLONG) + DO_NAME(ENOLCK) + DO_NAME(ENOSYS) + DO_NAME(ENOTEMPTY) + DO_NAME(ELOOP) + DO_NAME(ENOMSG) + DO_NAME(EIDRM) + DO_NAME(ECHRNG) + DO_NAME(EL2NSYNC) + DO_NAME(EL3HLT) + DO_NAME(EL3RST) + DO_NAME(ELNRNG) + DO_NAME(EUNATCH) + DO_NAME(ENOCSI) + DO_NAME(EL2HLT) + DO_NAME(EBADE) + DO_NAME(EBADR) + DO_NAME(EXFULL) + DO_NAME(ENOANO) + DO_NAME(EBADRQC) + DO_NAME(EBADSLT) + DO_NAME(EBFONT) + DO_NAME(ENOSTR) + DO_NAME(ENODATA) + DO_NAME(ETIME) + DO_NAME(ENOSR) + DO_NAME(ENONET) + DO_NAME(ENOPKG) + DO_NAME(EREMOTE) + DO_NAME(ENOLINK) + DO_NAME(EADV) + DO_NAME(ESRMNT) + DO_NAME(ECOMM) + DO_NAME(EPROTO) + DO_NAME(EMULTIHOP) + DO_NAME(EDOTDOT) + DO_NAME(EBADMSG) + DO_NAME(EOVERFLOW) + DO_NAME(ENOTUNIQ) + DO_NAME(EBADFD) + DO_NAME(EREMCHG) + DO_NAME(ELIBACC) + DO_NAME(ELIBBAD) + DO_NAME(ELIBSCN) + DO_NAME(ELIBMAX) + DO_NAME(ELIBEXEC) + DO_NAME(EILSEQ) + DO_NAME(ERESTART) + DO_NAME(ESTRPIPE) + DO_NAME(EUSERS) + DO_NAME(ENOTSOCK) + DO_NAME(EDESTADDRREQ) + DO_NAME(EMSGSIZE) + DO_NAME(EPROTOTYPE) + DO_NAME(ENOPROTOOPT) + DO_NAME(EPROTONOSUPPORT) + DO_NAME(ESOCKTNOSUPPORT) + DO_NAME(EOPNOTSUPP) + DO_NAME(EPFNOSUPPORT) + DO_NAME(EAFNOSUPPORT) + DO_NAME(EADDRINUSE) + DO_NAME(EADDRNOTAVAIL) + DO_NAME(ENETDOWN) + DO_NAME(ENETUNREACH) + DO_NAME(ENETRESET) + DO_NAME(ECONNABORTED) + DO_NAME(ECONNRESET) + DO_NAME(ENOBUFS) + DO_NAME(EISCONN) + DO_NAME(ENOTCONN) + DO_NAME(ESHUTDOWN) + DO_NAME(ETOOMANYREFS) + DO_NAME(ETIMEDOUT) + DO_NAME(ECONNREFUSED) + DO_NAME(EHOSTDOWN) + DO_NAME(EHOSTUNREACH) + DO_NAME(EALREADY) + DO_NAME(EINPROGRESS) + DO_NAME(ESTALE) + DO_NAME(EUCLEAN) + DO_NAME(ENOTNAM) + DO_NAME(ENAVAIL) + DO_NAME(EISNAM) + DO_NAME(EREMOTEIO) + DO_NAME(EDQUOT) + DO_NAME(ENOMEDIUM) + DO_NAME(EMEDIUMTYPE) + DO_NAME(ECANCELED) + DO_NAME(ENOKEY) + DO_NAME(EKEYEXPIRED) + DO_NAME(EKEYREVOKED) + DO_NAME(EKEYREJECTED) + DO_NAME(EOWNERDEAD) + DO_NAME(ENOTRECOVERABLE) + DO_NAME(ERFKILL) + DO_NAME(EHWPOISON) + default: + return "?"; + } +}