From owner-svn-src-head@freebsd.org Sun Feb 26 22:07:27 2017 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id D49E2CEE495; Sun, 26 Feb 2017 22:07:27 +0000 (UTC) (envelope-from oshogbo@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8A4299EE; Sun, 26 Feb 2017 22:07:27 +0000 (UTC) (envelope-from oshogbo@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v1QM7QmD028205; Sun, 26 Feb 2017 22:07:26 GMT (envelope-from oshogbo@FreeBSD.org) Received: (from oshogbo@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v1QM7QBk028204; Sun, 26 Feb 2017 22:07:26 GMT (envelope-from oshogbo@FreeBSD.org) Message-Id: <201702262207.v1QM7QBk028204@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: oshogbo set sender to oshogbo@FreeBSD.org using -f From: Mariusz Zaborski Date: Sun, 26 Feb 2017 22:07:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r314319 - head/lib/libc/x86/sys X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Feb 2017 22:07:27 -0000 Author: oshogbo Date: Sun Feb 26 22:07:26 2017 New Revision: 314319 URL: https://svnweb.freebsd.org/changeset/base/314319 Log: Don't try to open devices in the gettc() function which will always fail in the Capability mode. Instead silently fallback to the syscall method, which is done for example in the gettimeofday(2) function. Reviewed by: kib Modified: head/lib/libc/x86/sys/__vdso_gettc.c Modified: head/lib/libc/x86/sys/__vdso_gettc.c ============================================================================== --- head/lib/libc/x86/sys/__vdso_gettc.c Sun Feb 26 22:05:22 2017 (r314318) +++ head/lib/libc/x86/sys/__vdso_gettc.c Sun Feb 26 22:07:26 2017 (r314319) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include "namespace.h" +#include #include #include #include @@ -124,6 +125,7 @@ __vdso_init_hpet(uint32_t u) static const char devprefix[] = "/dev/hpet"; char devname[64], *c, *c1, t; volatile char *new_map, *old_map; + unsigned int mode; uint32_t u1; int fd; @@ -144,18 +146,26 @@ __vdso_init_hpet(uint32_t u) if (old_map != NULL) return; + mode = 0; + if (cap_getmode(&mode) == 0 && mode != 0) + goto fail; + fd = _open(devname, O_RDONLY); - if (fd == -1) { - atomic_cmpset_rel_ptr((volatile uintptr_t *)&hpet_dev_map[u], - (uintptr_t)old_map, (uintptr_t)MAP_FAILED); - return; - } + if (fd == -1) + goto fail; + new_map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, 0); _close(fd); if (atomic_cmpset_rel_ptr((volatile uintptr_t *)&hpet_dev_map[u], (uintptr_t)old_map, (uintptr_t)new_map) == 0 && new_map != MAP_FAILED) - munmap((void *)new_map, PAGE_SIZE); + munmap((void *)new_map, PAGE_SIZE); + + return; +fail: + /* Prevent the caller from re-entering. */ + atomic_cmpset_rel_ptr((volatile uintptr_t *)&hpet_dev_map[u], + (uintptr_t)old_map, (uintptr_t)MAP_FAILED); } #ifdef WANT_HYPERV @@ -174,16 +184,23 @@ static void __vdso_init_hyperv_tsc(void) { int fd; + unsigned int mode; + + mode = 0; + if (cap_getmode(&mode) == 0 && mode != 0) + goto fail; fd = _open(HYPERV_REFTSC_DEVPATH, O_RDONLY); - if (fd < 0) { - /* Prevent the caller from re-entering. */ - hyperv_ref_tsc = MAP_FAILED; - return; - } + if (fd < 0) + goto fail; hyperv_ref_tsc = mmap(NULL, sizeof(*hyperv_ref_tsc), PROT_READ, MAP_SHARED, fd, 0); _close(fd); + + return; +fail: + /* Prevent the caller from re-entering. */ + hyperv_ref_tsc = MAP_FAILED; } static int