Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RISC-V: Add VDSO entries for clock_get/gettimeofday/getcpu

For now these are just placeholders that execute the syscall. We will
later optimize them to avoid kernel crossings, but we'd like to have the
VDSO entries from the first released kernel version to make the ABI
simpler.

Signed-off-by: Andrew Waterman <andrew@sifive.com>
Signed-off-by: Palmer Dabbelt <palmer@sifive.com>

authored by

Andrew Waterman and committed by
Palmer Dabbelt
28dfbe6e b7e5a591

+113 -1
+5 -1
arch/riscv/kernel/vdso/Makefile
··· 1 1 # Copied from arch/tile/kernel/vdso/Makefile 2 2 3 3 # Symbols present in the vdso 4 - vdso-syms = rt_sigreturn 4 + vdso-syms = rt_sigreturn 5 + vdso-syms += gettimeofday 6 + vdso-syms += clock_gettime 7 + vdso-syms += clock_getres 8 + vdso-syms += getcpu 5 9 6 10 # Files to link into the vdso 7 11 obj-vdso = $(patsubst %, %.o, $(vdso-syms))
+26
arch/riscv/kernel/vdso/clock_getres.S
··· 1 + /* 2 + * Copyright (C) 2017 SiFive 3 + * 4 + * This program is free software; you can redistribute it and/or 5 + * modify it under the terms of the GNU General Public License 6 + * as published by the Free Software Foundation, version 2. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #include <linux/linkage.h> 15 + #include <asm/unistd.h> 16 + 17 + .text 18 + /* int __vdso_clock_getres(clockid_t clock_id, struct timespec *res); */ 19 + ENTRY(__vdso_clock_getres) 20 + .cfi_startproc 21 + /* For now, just do the syscall. */ 22 + li a7, __NR_clock_getres 23 + ecall 24 + ret 25 + .cfi_endproc 26 + ENDPROC(__vdso_clock_getres)
+26
arch/riscv/kernel/vdso/clock_gettime.S
··· 1 + /* 2 + * Copyright (C) 2017 SiFive 3 + * 4 + * This program is free software; you can redistribute it and/or 5 + * modify it under the terms of the GNU General Public License 6 + * as published by the Free Software Foundation, version 2. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #include <linux/linkage.h> 15 + #include <asm/unistd.h> 16 + 17 + .text 18 + /* int __vdso_clock_gettime(clockid_t clock_id, struct timespec *tp); */ 19 + ENTRY(__vdso_clock_gettime) 20 + .cfi_startproc 21 + /* For now, just do the syscall. */ 22 + li a7, __NR_clock_gettime 23 + ecall 24 + ret 25 + .cfi_endproc 26 + ENDPROC(__vdso_clock_gettime)
+26
arch/riscv/kernel/vdso/getcpu.S
··· 1 + /* 2 + * Copyright (C) 2017 SiFive 3 + * 4 + * This program is free software; you can redistribute it and/or 5 + * modify it under the terms of the GNU General Public License 6 + * as published by the Free Software Foundation, version 2. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #include <linux/linkage.h> 15 + #include <asm/unistd.h> 16 + 17 + .text 18 + /* int __vdso_getcpu(unsigned *cpu, unsigned *node, void *unused); */ 19 + ENTRY(__vdso_getcpu) 20 + .cfi_startproc 21 + /* For now, just do the syscall. */ 22 + li a7, __NR_getcpu 23 + ecall 24 + ret 25 + .cfi_endproc 26 + ENDPROC(__vdso_getcpu)
+26
arch/riscv/kernel/vdso/gettimeofday.S
··· 1 + /* 2 + * Copyright (C) 2017 SiFive 3 + * 4 + * This program is free software; you can redistribute it and/or 5 + * modify it under the terms of the GNU General Public License 6 + * as published by the Free Software Foundation, version 2. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #include <linux/linkage.h> 15 + #include <asm/unistd.h> 16 + 17 + .text 18 + /* int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz); */ 19 + ENTRY(__vdso_gettimeofday) 20 + .cfi_startproc 21 + /* For now, just do the syscall. */ 22 + li a7, __NR_gettimeofday 23 + ecall 24 + ret 25 + .cfi_endproc 26 + ENDPROC(__vdso_gettimeofday)
+4
arch/riscv/kernel/vdso/vdso.lds.S
··· 70 70 LINUX_4.15 { 71 71 global: 72 72 __vdso_rt_sigreturn; 73 + __vdso_gettimeofday; 74 + __vdso_clock_gettime; 75 + __vdso_clock_getres; 76 + __vdso_getcpu; 73 77 local: *; 74 78 }; 75 79 }