1#include "threads_impl.h"
2
3#include <errno.h>
4#include <stdint.h>
5#include <time.h>
6
7#include <zircon/syscalls.h>
8
9#include "libc.h"
10
11int __clock_gettime(clockid_t clk, struct timespec* ts) {
12    uint32_t zx_clock;
13    switch (clk) {
14    case CLOCK_MONOTONIC:
15    case CLOCK_MONOTONIC_RAW:
16        zx_clock = ZX_CLOCK_MONOTONIC;
17        break;
18    case CLOCK_REALTIME:
19        zx_clock = ZX_CLOCK_UTC;
20        break;
21    case CLOCK_THREAD_CPUTIME_ID:
22        zx_clock = ZX_CLOCK_THREAD;
23        break;
24    default:
25        errno = EINVAL;
26        return -1;
27    }
28    zx_time_t now;
29    zx_status_t status = _zx_clock_get_new(zx_clock, &now);
30    if (status != ZX_OK) {
31        __builtin_trap();
32    }
33    ts->tv_sec = now / ZX_SEC(1);
34    ts->tv_nsec = now % ZX_SEC(1);
35    return 0;
36}
37
38weak_alias(__clock_gettime, clock_gettime);
39