mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
Consolidate sched_getcpu
This patch consolidates the sched_getcpu implementations across all arches (except tile, which requires its own). This patch removes the powerpc, x86_64 and x32 specific files and change the default linux one to use INLINE_VSYSCALL where possible (for ports that implements it).
This commit is contained in:
parent
2a523216d5
commit
dd26c44403
13 changed files with 32 additions and 203 deletions
22
ChangeLog
22
ChangeLog
|
@ -1,3 +1,25 @@
|
||||||
|
2015-06-09 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
|
||||||
|
(HAVE_GETCPU_VSYSCALL): Define.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
|
||||||
|
(HAVE_GETCPU_VSYSCALL): Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/sched_getcpu.c: Remove file.
|
||||||
|
* sysdeps/unix/sysv/linux/sched_getcpu.c
|
||||||
|
(HAVE_VSYSCALL) [HAVE_GETCPU_VSYSCALL]: Define.
|
||||||
|
(sched_getcpu): Use INLINE_VSYSCALL instead of INLINE_SYSCALL.
|
||||||
|
* sysdeps/unix/sysv/linux/x86/libc-vdso.h (getcpu): Add vDSO
|
||||||
|
prototype.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/init-first.c
|
||||||
|
(__vdso_platform_setup): Remove vsyscall getcpu fallback.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sched_getcpu.S: Remove file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sysdep.h (HAVE_GETCPU_VSYSCALL):
|
||||||
|
Define.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/x32/Makefile: Remove file.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/x32/init-first.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu-static.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/x32/sched_getcpu.S: Likewise.
|
||||||
|
|
||||||
2015-06-09 Andrew Senkevich <andrew.senkevich@intel.com>
|
2015-06-09 Andrew Senkevich <andrew.senkevich@intel.com>
|
||||||
|
|
||||||
* sysdeps/x86_64/fpu/Makefile: New file.
|
* sysdeps/x86_64/fpu/Makefile: New file.
|
||||||
|
|
|
@ -165,6 +165,7 @@
|
||||||
/* List of system calls which are supported as vsyscalls. */
|
/* List of system calls which are supported as vsyscalls. */
|
||||||
# define HAVE_CLOCK_GETRES_VSYSCALL 1
|
# define HAVE_CLOCK_GETRES_VSYSCALL 1
|
||||||
# define HAVE_CLOCK_GETTIME_VSYSCALL 1
|
# define HAVE_CLOCK_GETTIME_VSYSCALL 1
|
||||||
|
# define HAVE_GETCPU_VSYSCALL 1
|
||||||
|
|
||||||
|
|
||||||
# define LOADARGS_0(name, dummy) \
|
# define LOADARGS_0(name, dummy) \
|
||||||
|
|
|
@ -80,6 +80,7 @@
|
||||||
/* List of system calls which are supported as vsyscalls. */
|
/* List of system calls which are supported as vsyscalls. */
|
||||||
#define HAVE_CLOCK_GETRES_VSYSCALL 1
|
#define HAVE_CLOCK_GETRES_VSYSCALL 1
|
||||||
#define HAVE_CLOCK_GETTIME_VSYSCALL 1
|
#define HAVE_CLOCK_GETTIME_VSYSCALL 1
|
||||||
|
#define HAVE_GETCPU_VSYSCALL 1
|
||||||
|
|
||||||
/* Define a macro which expands inline into the wrapper code for a system
|
/* Define a macro which expands inline into the wrapper code for a system
|
||||||
call. This use is for internal calls that do not need to handle errors
|
call. This use is for internal calls that do not need to handle errors
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
/* Copyright (C) 2013-2015 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <sched.h>
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <sysdep-vdso.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
sched_getcpu (void)
|
|
||||||
{
|
|
||||||
unsigned int cpu;
|
|
||||||
int r = INLINE_VSYSCALL (getcpu, 3, &cpu, NULL, NULL);
|
|
||||||
|
|
||||||
return r == -1 ? r : cpu;
|
|
||||||
}
|
|
|
@ -19,13 +19,17 @@
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_GETCPU_VSYSCALL
|
||||||
|
# define HAVE_VSYSCALL
|
||||||
|
#endif
|
||||||
|
#include <sysdep-vdso.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
sched_getcpu (void)
|
sched_getcpu (void)
|
||||||
{
|
{
|
||||||
#ifdef __NR_getcpu
|
#ifdef __NR_getcpu
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
int r = INLINE_SYSCALL (getcpu, 3, &cpu, NULL, NULL);
|
int r = INLINE_VSYSCALL (getcpu, 3, &cpu, NULL, NULL);
|
||||||
|
|
||||||
return r == -1 ? r : cpu;
|
return r == -1 ? r : cpu;
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *)
|
extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *)
|
||||||
attribute_hidden;
|
attribute_hidden;
|
||||||
|
|
||||||
|
extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _LIBC_VDSO_H */
|
#endif /* _LIBC_VDSO_H */
|
||||||
|
|
|
@ -42,10 +42,6 @@ __vdso_platform_setup (void)
|
||||||
VDSO_SYMBOL(clock_gettime) = p;
|
VDSO_SYMBOL(clock_gettime) = p;
|
||||||
|
|
||||||
p = _dl_vdso_vsym ("__vdso_getcpu", &linux26);
|
p = _dl_vdso_vsym ("__vdso_getcpu", &linux26);
|
||||||
/* If the vDSO is not available we fall back on the old vsyscall. */
|
|
||||||
#define VSYSCALL_ADDR_vgetcpu 0xffffffffff600800
|
|
||||||
if (p == NULL)
|
|
||||||
p = (void *) VSYSCALL_ADDR_vgetcpu;
|
|
||||||
PTR_MANGLE (p);
|
PTR_MANGLE (p);
|
||||||
VDSO_SYMBOL(getcpu) = p;
|
VDSO_SYMBOL(getcpu) = p;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
/* Copyright (C) 2007-2015 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <tls.h>
|
|
||||||
#define _ERRNO_H 1
|
|
||||||
#include <bits/errno.h>
|
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
/* For the calculation see asm/vsyscall.h. */
|
|
||||||
#define VSYSCALL_ADDR_vgetcpu 0xffffffffff600800
|
|
||||||
|
|
||||||
|
|
||||||
ENTRY (sched_getcpu)
|
|
||||||
/* Align stack and create local variable for result. */
|
|
||||||
sub $0x8, %rsp
|
|
||||||
cfi_adjust_cfa_offset(8)
|
|
||||||
|
|
||||||
movq %rsp, %rdi
|
|
||||||
xorl %esi, %esi
|
|
||||||
movl $VGETCPU_CACHE_OFFSET, %edx
|
|
||||||
addq %fs:0, %rdx
|
|
||||||
|
|
||||||
#ifdef SHARED
|
|
||||||
movq __vdso_getcpu(%rip), %rax
|
|
||||||
PTR_DEMANGLE (%rax)
|
|
||||||
callq *%rax
|
|
||||||
#else
|
|
||||||
# ifdef __NR_getcpu
|
|
||||||
movl $__NR_getcpu, %eax
|
|
||||||
syscall
|
|
||||||
# ifndef __ASSUME_GETCPU_SYSCALL
|
|
||||||
cmpq $-ENOSYS, %rax
|
|
||||||
jne 1f
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# ifndef __ASSUME_GETCPU_SYSCALL
|
|
||||||
movq $VSYSCALL_ADDR_vgetcpu, %rax
|
|
||||||
callq *%rax
|
|
||||||
1:
|
|
||||||
# else
|
|
||||||
# ifndef __NR_getcpu
|
|
||||||
# error "cannot happen"
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Local variable is result if the call is successful. */
|
|
||||||
movl (%rsp), %edx
|
|
||||||
/* Restore stack pointer before we might jump to
|
|
||||||
SYSCALL_ERROR_LABEL which returns to the caller. */
|
|
||||||
add $0x8, %rsp
|
|
||||||
cfi_adjust_cfa_offset(-8)
|
|
||||||
|
|
||||||
cmpq $-4095, %rax
|
|
||||||
jae SYSCALL_ERROR_LABEL
|
|
||||||
|
|
||||||
movl %edx, %eax
|
|
||||||
ret
|
|
||||||
PSEUDO_END(sched_getcpu)
|
|
|
@ -255,6 +255,7 @@
|
||||||
/* List of system calls which are supported as vsyscalls. */
|
/* List of system calls which are supported as vsyscalls. */
|
||||||
# define HAVE_CLOCK_GETTIME_VSYSCALL 1
|
# define HAVE_CLOCK_GETTIME_VSYSCALL 1
|
||||||
# define HAVE_GETTIMEOFDAY_VSYSCALL 1
|
# define HAVE_GETTIMEOFDAY_VSYSCALL 1
|
||||||
|
# define HAVE_GETCPU_VSYSCALL 1
|
||||||
|
|
||||||
# define LOAD_ARGS_0()
|
# define LOAD_ARGS_0()
|
||||||
# define LOAD_REGS_0
|
# define LOAD_REGS_0
|
||||||
|
|
|
@ -4,7 +4,3 @@ default-abi := x32
|
||||||
ifeq ($(subdir),misc)
|
ifeq ($(subdir),misc)
|
||||||
sysdep_routines += arch_prctl
|
sysdep_routines += arch_prctl
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(subdir),posix)
|
|
||||||
sysdep_routines += getcpu sched_getcpu-static
|
|
||||||
endif
|
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/* Initialization code run first thing by the ELF startup code. Linux/x32.
|
|
||||||
Copyright (C) 2012-2015 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifdef SHARED
|
|
||||||
# include <dl-vdso.h>
|
|
||||||
# include <libc-vdso.h>
|
|
||||||
|
|
||||||
long int (*__vdso_clock_gettime) (clockid_t, struct timespec *)
|
|
||||||
attribute_hidden;
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
_libc_vdso_platform_setup (void)
|
|
||||||
{
|
|
||||||
PREPARE_VERSION (linux26, "LINUX_2.6", 61765110);
|
|
||||||
|
|
||||||
void *p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux26);
|
|
||||||
PTR_MANGLE (p);
|
|
||||||
__vdso_clock_gettime = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
# define VDSO_SETUP _libc_vdso_platform_setup
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <csu/init-first.c>
|
|
|
@ -1,3 +0,0 @@
|
||||||
#ifndef SHARED
|
|
||||||
#include "../../sched_getcpu.c"
|
|
||||||
#endif
|
|
|
@ -1,49 +0,0 @@
|
||||||
/* Copyright (C) 2012-2015 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifdef SHARED
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <tls.h>
|
|
||||||
#define _ERRNO_H 1
|
|
||||||
#include <bits/errno.h>
|
|
||||||
|
|
||||||
ENTRY (sched_getcpu)
|
|
||||||
/* Align stack and create local variable for result. */
|
|
||||||
sub $0x8, %esp
|
|
||||||
cfi_adjust_cfa_offset(8)
|
|
||||||
|
|
||||||
mov %esp, %edi
|
|
||||||
xor %esi, %esi
|
|
||||||
mov $VGETCPU_CACHE_OFFSET, %edx
|
|
||||||
add %fs:0, %edx
|
|
||||||
|
|
||||||
call __getcpu
|
|
||||||
|
|
||||||
/* Local variable is result if the call is successful. */
|
|
||||||
mov (%rsp), %edx
|
|
||||||
/* Restore stack pointer before we might jump to
|
|
||||||
SYSCALL_ERROR_LABEL which returns to the caller. */
|
|
||||||
add $0x8, %esp
|
|
||||||
cfi_adjust_cfa_offset(-8)
|
|
||||||
|
|
||||||
cmp $-4095, %eax
|
|
||||||
jae SYSCALL_ERROR_LABEL
|
|
||||||
|
|
||||||
mov %edx, %eax
|
|
||||||
ret
|
|
||||||
PSEUDO_END(sched_getcpu)
|
|
||||||
#endif
|
|
Loading…
Add table
Reference in a new issue