Kernel: Add an errno.h header with definitions for each header, and return those, negated, from syscalls when there is an error. mmap() returns an invalid address with errno encoded, instead of returning a negated errno; this address is encoded as ffffffffffffffEE where EE is errno in hex. libc: make syscall() return -1 and set errno on error, instead of returning the raw return value of the system call. Also, add mmap() and munmap() wrappers in sys/mman.h :). userspace: make the memeater program show the value of errno when allocating memory fails. Things to improve: add perror() and strerror() to make the errno experience even better! >.<
74 lines
1.9 KiB
C++
74 lines
1.9 KiB
C++
#include <bits/error.h>
|
|
#include <luna.h>
|
|
#include <luna/syscall.h>
|
|
#include <stdarg.h>
|
|
#include <unistd.h>
|
|
|
|
extern "C"
|
|
{
|
|
int execv(const char*, char* const[])
|
|
{
|
|
NOT_IMPLEMENTED("execv");
|
|
}
|
|
int execve(const char*, char* const[], char* const[])
|
|
{
|
|
NOT_IMPLEMENTED("execve");
|
|
}
|
|
int execvp(const char*, char* const[])
|
|
{
|
|
NOT_IMPLEMENTED("execvp");
|
|
}
|
|
pid_t fork(void)
|
|
{
|
|
NOT_IMPLEMENTED("fork");
|
|
}
|
|
|
|
long syscall(long number, ...)
|
|
{
|
|
typedef unsigned long int arg;
|
|
long result;
|
|
va_list ap;
|
|
va_start(ap, number);
|
|
switch (number)
|
|
{
|
|
case SYS_exit:
|
|
case SYS_yield:
|
|
case SYS_gettid:
|
|
case SYS_rand: result = __luna_syscall0(number); break;
|
|
case SYS_sleep: result = __luna_syscall1(number, va_arg(ap, arg)); break;
|
|
case SYS_write:
|
|
case SYS_munmap:
|
|
case SYS_getversion: {
|
|
arg arg0 = va_arg(ap, arg);
|
|
arg arg1 = va_arg(ap, arg);
|
|
result = __luna_syscall2(number, arg0, arg1);
|
|
break;
|
|
}
|
|
case SYS_mmap: {
|
|
arg arg0 = va_arg(ap, arg);
|
|
arg arg1 = va_arg(ap, arg);
|
|
arg arg2 = va_arg(ap, arg);
|
|
result = __luna_syscall3(number, arg0, arg1, arg2);
|
|
break;
|
|
}
|
|
case SYS_paint: {
|
|
arg arg0 = va_arg(ap, arg);
|
|
arg arg1 = va_arg(ap, arg);
|
|
arg arg2 = va_arg(ap, arg);
|
|
arg arg3 = va_arg(ap, arg);
|
|
arg arg4 = va_arg(ap, arg);
|
|
result = __luna_syscall5(number, arg0, arg1, arg2, arg3, arg4);
|
|
break;
|
|
}
|
|
default: result = -1; break;
|
|
}
|
|
va_end(ap);
|
|
if (number == SYS_mmap) { _RETURN_WITH_MEMORY_ERRNO(result, long int); }
|
|
else { _RETURN_WITH_ERRNO(result, long); }
|
|
}
|
|
|
|
unsigned int sleep(unsigned int seconds)
|
|
{
|
|
return msleep(seconds * 1000);
|
|
}
|
|
} |