mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 23:00:07 +00: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
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>
|
||||
|
||||
* sysdeps/x86_64/fpu/Makefile: New file.
|
||||
|
@ -165,6 +165,7 @@
|
||||
/* List of system calls which are supported as vsyscalls. */
|
||||
# define HAVE_CLOCK_GETRES_VSYSCALL 1
|
||||
# define HAVE_CLOCK_GETTIME_VSYSCALL 1
|
||||
# define HAVE_GETCPU_VSYSCALL 1
|
||||
|
||||
|
||||
# define LOADARGS_0(name, dummy) \
|
||||
|
@ -80,6 +80,7 @@
|
||||
/* List of system calls which are supported as vsyscalls. */
|
||||
#define HAVE_CLOCK_GETRES_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
|
||||
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 <sysdep.h>
|
||||
|
||||
#ifdef HAVE_GETCPU_VSYSCALL
|
||||
# define HAVE_VSYSCALL
|
||||
#endif
|
||||
#include <sysdep-vdso.h>
|
||||
|
||||
int
|
||||
sched_getcpu (void)
|
||||
{
|
||||
#ifdef __NR_getcpu
|
||||
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;
|
||||
#else
|
||||
|
@ -29,6 +29,8 @@
|
||||
extern long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *)
|
||||
attribute_hidden;
|
||||
|
||||
extern long int (*VDSO_SYMBOL(getcpu)) (unsigned *, unsigned *, void *);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _LIBC_VDSO_H */
|
||||
|
@ -42,10 +42,6 @@ __vdso_platform_setup (void)
|
||||
VDSO_SYMBOL(clock_gettime) = p;
|
||||
|
||||
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);
|
||||
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. */
|
||||
# define HAVE_CLOCK_GETTIME_VSYSCALL 1
|
||||
# define HAVE_GETTIMEOFDAY_VSYSCALL 1
|
||||
# define HAVE_GETCPU_VSYSCALL 1
|
||||
|
||||
# define LOAD_ARGS_0()
|
||||
# define LOAD_REGS_0
|
||||
|
@ -4,7 +4,3 @@ default-abi := x32
|
||||
ifeq ($(subdir),misc)
|
||||
sysdep_routines += arch_prctl
|
||||
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…
Reference in New Issue
Block a user