As of right now, all functionality in the vsyscall page is available through the vDSO on x86_64. The missing function was time(), but that landed here:
and is faster than the vsyscall version because of
Currently (AFAICT), glibc will use the gettimeofday vsyscall in static builds due to:
movq __vdso_gettimeofday(%rip), %rax
movq $VSYSCALL_ADDR_vgettimeofday, %rax
and will unconditionally use the vsyscall versions of time and getcpu.
It would be nice to kill off the vsyscall page entirely and replace it with some kind of emulation layer that keeps old code working (with a performance penalty) but doesn't leave a syscall instruction sitting at a fixed address.
Before doing that, glibc should stop using it in new code, at least on kernels that have a vDSO.
As an added benefit of the vDSO over vsyscalls: things like UML can replace the vDSO if they want to. This means that sched_getcpu and gettimeofday would have a better chance of returning the guest's answer (instead of the host's) on UML.
I did add code to use the vdso in dynamically linked code. But I don't change the static code. Just go ahead, make the vsyscalls slow. Noone should use statically linked code at all. It's OK to be slower.