1*c9945492SAndroid Build Coastguard Worker #define _GNU_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include <errno.h>
3*c9945492SAndroid Build Coastguard Worker #include <sched.h>
4*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
5*c9945492SAndroid Build Coastguard Worker #include "atomic.h"
6*c9945492SAndroid Build Coastguard Worker
7*c9945492SAndroid Build Coastguard Worker #ifdef VDSO_GETCPU_SYM
8*c9945492SAndroid Build Coastguard Worker
9*c9945492SAndroid Build Coastguard Worker static void *volatile vdso_func;
10*c9945492SAndroid Build Coastguard Worker
11*c9945492SAndroid Build Coastguard Worker typedef long (*getcpu_f)(unsigned *, unsigned *, void *);
12*c9945492SAndroid Build Coastguard Worker
getcpu_init(unsigned * cpu,unsigned * node,void * unused)13*c9945492SAndroid Build Coastguard Worker static long getcpu_init(unsigned *cpu, unsigned *node, void *unused)
14*c9945492SAndroid Build Coastguard Worker {
15*c9945492SAndroid Build Coastguard Worker void *p = __vdsosym(VDSO_GETCPU_VER, VDSO_GETCPU_SYM);
16*c9945492SAndroid Build Coastguard Worker getcpu_f f = (getcpu_f)p;
17*c9945492SAndroid Build Coastguard Worker a_cas_p(&vdso_func, (void *)getcpu_init, p);
18*c9945492SAndroid Build Coastguard Worker return f ? f(cpu, node, unused) : -ENOSYS;
19*c9945492SAndroid Build Coastguard Worker }
20*c9945492SAndroid Build Coastguard Worker
21*c9945492SAndroid Build Coastguard Worker static void *volatile vdso_func = (void *)getcpu_init;
22*c9945492SAndroid Build Coastguard Worker
23*c9945492SAndroid Build Coastguard Worker #endif
24*c9945492SAndroid Build Coastguard Worker
sched_getcpu(void)25*c9945492SAndroid Build Coastguard Worker int sched_getcpu(void)
26*c9945492SAndroid Build Coastguard Worker {
27*c9945492SAndroid Build Coastguard Worker int r;
28*c9945492SAndroid Build Coastguard Worker unsigned cpu;
29*c9945492SAndroid Build Coastguard Worker
30*c9945492SAndroid Build Coastguard Worker #ifdef VDSO_GETCPU_SYM
31*c9945492SAndroid Build Coastguard Worker getcpu_f f = (getcpu_f)vdso_func;
32*c9945492SAndroid Build Coastguard Worker if (f) {
33*c9945492SAndroid Build Coastguard Worker r = f(&cpu, 0, 0);
34*c9945492SAndroid Build Coastguard Worker if (!r) return cpu;
35*c9945492SAndroid Build Coastguard Worker if (r != -ENOSYS) return __syscall_ret(r);
36*c9945492SAndroid Build Coastguard Worker }
37*c9945492SAndroid Build Coastguard Worker #endif
38*c9945492SAndroid Build Coastguard Worker
39*c9945492SAndroid Build Coastguard Worker r = __syscall(SYS_getcpu, &cpu, 0, 0);
40*c9945492SAndroid Build Coastguard Worker if (!r) return cpu;
41*c9945492SAndroid Build Coastguard Worker return __syscall_ret(r);
42*c9945492SAndroid Build Coastguard Worker }
43