aboutsummaryrefslogtreecommitdiff
path: root/core/os/os_linux.odin
diff options
context:
space:
mode:
Diffstat (limited to 'core/os/os_linux.odin')
-rw-r--r--core/os/os_linux.odin213
1 files changed, 143 insertions, 70 deletions
diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin
index dc3cdde93..cf03dac71 100644
--- a/core/os/os_linux.odin
+++ b/core/os/os_linux.odin
@@ -15,37 +15,138 @@ Syscall :: distinct int;
INVALID_HANDLE :: ~Handle(0);
-ERROR_NONE: Errno : 0;
-EPERM: Errno : 1;
-ENOENT: Errno : 2;
-EINTR: Errno : 4;
-EIO: Errno : 5;
-ENXIO: Errno : 6;
-EBADF: Errno : 9;
-EAGAIN: Errno : 11;
-EWOULDBLOCK: Errno : EAGAIN;
-ENOMEM: Errno : 12;
-EACCES: Errno : 13;
-EFAULT: Errno : 14;
-EEXIST: Errno : 17;
-ENODEV: Errno : 19;
-ENOTDIR: Errno : 20;
-EISDIR: Errno : 21;
-EINVAL: Errno : 22;
-ENFILE: Errno : 23;
-EMFILE: Errno : 24;
-ETXTBSY: Errno : 26;
-EFBIG: Errno : 27;
-ENOSPC: Errno : 28;
-ESPIPE: Errno : 29;
-EROFS: Errno : 30;
-EPIPE: Errno : 32;
-ENAMETOOLONG: Errno : 36;
-ELOOP: Errno : 40;
-EOVERFLOW: Errno : 75;
-EDESTADDRREQ: Errno : 89;
-EOPNOTSUPP: Errno : 95;
-EDQUOT: Errno : 122;
+ERROR_NONE: Errno : 0;
+EPERM: Errno : 1;
+ENOENT: Errno : 2;
+ESRCH: Errno : 3;
+EINTR: Errno : 4;
+EIO: Errno : 5;
+ENXIO: Errno : 6;
+EBADF: Errno : 9;
+EAGAIN: Errno : 11;
+ENOMEM: Errno : 12;
+EACCES: Errno : 13;
+EFAULT: Errno : 14;
+EEXIST: Errno : 17;
+ENODEV: Errno : 19;
+ENOTDIR: Errno : 20;
+EISDIR: Errno : 21;
+EINVAL: Errno : 22;
+ENFILE: Errno : 23;
+EMFILE: Errno : 24;
+ETXTBSY: Errno : 26;
+EFBIG: Errno : 27;
+ENOSPC: Errno : 28;
+ESPIPE: Errno : 29;
+EROFS: Errno : 30;
+EPIPE: Errno : 32;
+
+EDEADLK: Errno : 35; /* Resource deadlock would occur */
+ENAMETOOLONG: Errno : 36; /* File name too long */
+ENOLCK: Errno : 37; /* No record locks available */
+
+ENOSYS: Errno : 38; /* Invalid system call number */
+
+ENOTEMPTY: Errno : 39; /* Directory not empty */
+ELOOP: Errno : 40; /* Too many symbolic links encountered */
+EWOULDBLOCK: Errno : EAGAIN; /* Operation would block */
+ENOMSG: Errno : 42; /* No message of desired type */
+EIDRM: Errno : 43; /* Identifier removed */
+ECHRNG: Errno : 44; /* Channel number out of range */
+EL2NSYNC: Errno : 45; /* Level 2 not synchronized */
+EL3HLT: Errno : 46; /* Level 3 halted */
+EL3RST: Errno : 47; /* Level 3 reset */
+ELNRNG: Errno : 48; /* Link number out of range */
+EUNATCH: Errno : 49; /* Protocol driver not attached */
+ENOCSI: Errno : 50; /* No CSI structure available */
+EL2HLT: Errno : 51; /* Level 2 halted */
+EBADE: Errno : 52; /* Invalid exchange */
+EBADR: Errno : 53; /* Invalid request descriptor */
+EXFULL: Errno : 54; /* Exchange full */
+ENOANO: Errno : 55; /* No anode */
+EBADRQC: Errno : 56; /* Invalid request code */
+EBADSLT: Errno : 57; /* Invalid slot */
+EDEADLOCK: Errno : EDEADLK;
+EBFONT: Errno : 59; /* Bad font file format */
+ENOSTR: Errno : 60; /* Device not a stream */
+ENODATA: Errno : 61; /* No data available */
+ETIME: Errno : 62; /* Timer expired */
+ENOSR: Errno : 63; /* Out of streams resources */
+ENONET: Errno : 64; /* Machine is not on the network */
+ENOPKG: Errno : 65; /* Package not installed */
+EREMOTE: Errno : 66; /* Object is remote */
+ENOLINK: Errno : 67; /* Link has been severed */
+EADV: Errno : 68; /* Advertise error */
+ESRMNT: Errno : 69; /* Srmount error */
+ECOMM: Errno : 70; /* Communication error on send */
+EPROTO: Errno : 71; /* Protocol error */
+EMULTIHOP: Errno : 72; /* Multihop attempted */
+EDOTDOT: Errno : 73; /* RFS specific error */
+EBADMSG: Errno : 74; /* Not a data message */
+EOVERFLOW: Errno : 75; /* Value too large for defined data type */
+ENOTUNIQ: Errno : 76; /* Name not unique on network */
+EBADFD: Errno : 77; /* File descriptor in bad state */
+EREMCHG: Errno : 78; /* Remote address changed */
+ELIBACC: Errno : 79; /* Can not access a needed shared library */
+ELIBBAD: Errno : 80; /* Accessing a corrupted shared library */
+ELIBSCN: Errno : 81; /* .lib section in a.out corrupted */
+ELIBMAX: Errno : 82; /* Attempting to link in too many shared libraries */
+ELIBEXEC: Errno : 83; /* Cannot exec a shared library directly */
+EILSEQ: Errno : 84; /* Illegal byte sequence */
+ERESTART: Errno : 85; /* Interrupted system call should be restarted */
+ESTRPIPE: Errno : 86; /* Streams pipe error */
+EUSERS: Errno : 87; /* Too many users */
+ENOTSOCK: Errno : 88; /* Socket operation on non-socket */
+EDESTADDRREQ: Errno : 89; /* Destination address required */
+EMSGSIZE: Errno : 90; /* Message too long */
+EPROTOTYPE: Errno : 91; /* Protocol wrong type for socket */
+ENOPROTOOPT: Errno : 92; /* Protocol not available */
+EPROTONOSUPPORT: Errno : 93; /* Protocol not supported */
+ESOCKTNOSUPPORT: Errno : 94; /* Socket type not supported */
+EOPNOTSUPP: Errno : 95; /* Operation not supported on transport endpoint */
+EPFNOSUPPORT: Errno : 96; /* Protocol family not supported */
+EAFNOSUPPORT: Errno : 97; /* Address family not supported by protocol */
+EADDRINUSE: Errno : 98; /* Address already in use */
+EADDRNOTAVAIL: Errno : 99; /* Cannot assign requested address */
+ENETDOWN: Errno : 100; /* Network is down */
+ENETUNREACH: Errno : 101; /* Network is unreachable */
+ENETRESET: Errno : 102; /* Network dropped connection because of reset */
+ECONNABORTED: Errno : 103; /* Software caused connection abort */
+ECONNRESET: Errno : 104; /* Connection reset by peer */
+ENOBUFS: Errno : 105; /* No buffer space available */
+EISCONN: Errno : 106; /* Transport endpoint is already connected */
+ENOTCONN: Errno : 107; /* Transport endpoint is not connected */
+ESHUTDOWN: Errno : 108; /* Cannot send after transport endpoint shutdown */
+ETOOMANYREFS: Errno : 109; /* Too many references: cannot splice */
+ETIMEDOUT: Errno : 110; /* Connection timed out */
+ECONNREFUSED: Errno : 111; /* Connection refused */
+EHOSTDOWN: Errno : 112; /* Host is down */
+EHOSTUNREACH: Errno : 113; /* No route to host */
+EALREADY: Errno : 114; /* Operation already in progress */
+EINPROGRESS: Errno : 115; /* Operation now in progress */
+ESTALE: Errno : 116; /* Stale file handle */
+EUCLEAN: Errno : 117; /* Structure needs cleaning */
+ENOTNAM: Errno : 118; /* Not a XENIX named type file */
+ENAVAIL: Errno : 119; /* No XENIX semaphores available */
+EISNAM: Errno : 120; /* Is a named type file */
+EREMOTEIO: Errno : 121; /* Remote I/O error */
+EDQUOT: Errno : 122; /* Quota exceeded */
+
+ENOMEDIUM: Errno : 123; /* No medium found */
+EMEDIUMTYPE: Errno : 124; /* Wrong medium type */
+ECANCELED: Errno : 125; /* Operation Canceled */
+ENOKEY: Errno : 126; /* Required key not available */
+EKEYEXPIRED: Errno : 127; /* Key has expired */
+EKEYREVOKED: Errno : 128; /* Key has been revoked */
+EKEYREJECTED: Errno : 129; /* Key was rejected by service */
+
+/* for robust mutexes */
+EOWNERDEAD: Errno : 130; /* Owner died */
+ENOTRECOVERABLE: Errno : 131; /* State not recoverable */
+
+ERFKILL: Errno : 132; /* Operation not possible due to RF-kill */
+
+EHWPOISON: Errno : 133; /* Memory page has hardware error */
O_RDONLY :: 0x00000;
O_WRONLY :: 0x00001;
@@ -152,22 +253,6 @@ X_OK :: 1; // Test for execute permission
W_OK :: 2; // Test for write permission
R_OK :: 4; // Test for read permission
-TimeSpec :: struct {
- tv_sec : i64, /* seconds */
- tv_nsec : i64, /* nanoseconds */
-};
-
-CLOCK_REALTIME :: 0;
-CLOCK_MONOTONIC :: 1;
-CLOCK_PROCESS_CPUTIME_ID :: 2;
-CLOCK_THREAD_CPUTIME_ID :: 3;
-CLOCK_MONOTONIC_RAW :: 4;
-CLOCK_REALTIME_COARSE :: 5;
-CLOCK_MONOTONIC_COARSE :: 6;
-CLOCK_BOOTTIME :: 7;
-CLOCK_REALTIME_ALARM :: 8;
-CLOCK_BOOTTIME_ALARM :: 9;
-
SYS_GETTID: Syscall : 186;
foreign libc {
@@ -180,6 +265,7 @@ foreign libc {
@(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: int) -> int ---;
@(link_name="lseek64") _unix_seek :: proc(fd: Handle, offset: i64, whence: i32) -> i64 ---;
@(link_name="gettid") _unix_gettid :: proc() -> u64 ---;
+ @(link_name="getpagesize") _unix_getpagesize :: proc() -> i32 ---;
@(link_name="stat") _unix_stat :: proc(path: cstring, stat: ^Stat) -> int ---;
@(link_name="fstat") _unix_fstat :: proc(fd: Handle, stat: ^Stat) -> int ---;
@(link_name="access") _unix_access :: proc(path: cstring, mask: int) -> int ---;
@@ -190,10 +276,6 @@ foreign libc {
@(link_name="realloc") _unix_realloc :: proc(ptr: rawptr, size: int) -> rawptr ---;
@(link_name="getenv") _unix_getenv :: proc(cstring) -> cstring ---;
- @(link_name="clock_gettime") _unix_clock_gettime :: proc(clock_id: u64, timespec: ^TimeSpec) ---;
- @(link_name="nanosleep") _unix_nanosleep :: proc(requested: ^TimeSpec, remaining: ^TimeSpec) -> int ---;
- @(link_name="sleep") _unix_sleep :: proc(seconds: u64) -> int ---;
-
@(link_name="exit") _unix_exit :: proc(status: int) -> ! ---;
}
foreign dl {
@@ -349,25 +431,6 @@ exit :: proc(code: int) -> ! {
_unix_exit(code);
}
-clock_gettime :: proc(clock_id: u64) -> TimeSpec {
- ts : TimeSpec;
- _unix_clock_gettime(clock_id, &ts);
- return ts;
-}
-
-sleep :: proc(seconds: u64) -> int {
-
- return _unix_sleep(seconds);
-}
-
-nanosleep :: proc(nanoseconds: i64) -> int {
- assert(nanoseconds <= 999999999);
- requested, remaining : TimeSpec;
- requested = TimeSpec{tv_nsec = nanoseconds};
-
- return _unix_nanosleep(&requested, &remaining);
-}
-
current_thread_id :: proc "contextless" () -> int {
return syscall(SYS_GETTID);
}
@@ -393,6 +456,16 @@ dlerror :: proc() -> string {
return string(_unix_dlerror());
}
+get_page_size :: proc() -> int {
+ // NOTE(tetra): The page size never changes, so why do anything complicated
+ // if we don't have to.
+ @static page_size := -1;
+ if page_size != -1 do return page_size;
+
+ page_size = int(_unix_getpagesize());
+ return page_size;
+}
+
_alloc_command_line_arguments :: proc() -> []string {
res := make([]string, len(runtime.args__));