aboutsummaryrefslogtreecommitdiffstats
path: root/arch/tile/kernel/stack.c
diff options
context:
space:
mode:
authorChris Metcalf <cmetcalf@tilera.com>2013-08-07 15:33:32 -0400
committerChris Metcalf <cmetcalf@tilera.com>2013-08-13 16:26:21 -0400
commit4a556f4f56da3110b27e265b79f0e7582115445c (patch)
treef5af0b865c867160855e4722b49d7e850dddf944 /arch/tile/kernel/stack.c
parent0c1d1917c547c8e787fb58e20e2de577453c980c (diff)
tile: implement gettimeofday() via vDSO
This change creates the framework for vDSO calls, makes the existing rt_sigreturn() mechanism use it, and adds a fast gettimeofday(). Now that we need to expose the vDSO address to userspace, we add AT_SYSINFO_EHDR to the set of aux entries provided to userspace. (You can disable any extra vDSO support by booting with vdso=0, but the rt_sigreturn vDSO page will still be provided.) Note that glibc has supported the tile vDSO since release 2.17. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Diffstat (limited to 'arch/tile/kernel/stack.c')
-rw-r--r--arch/tile/kernel/stack.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/tile/kernel/stack.c b/arch/tile/kernel/stack.c
index 176ffe48eee9..a9db923bb9eb 100644
--- a/arch/tile/kernel/stack.c
+++ b/arch/tile/kernel/stack.c
@@ -29,6 +29,7 @@
29#include <asm/switch_to.h> 29#include <asm/switch_to.h>
30#include <asm/sigframe.h> 30#include <asm/sigframe.h>
31#include <asm/stack.h> 31#include <asm/stack.h>
32#include <asm/vdso.h>
32#include <arch/abi.h> 33#include <arch/abi.h>
33#include <arch/interrupts.h> 34#include <arch/interrupts.h>
34 35
@@ -119,7 +120,7 @@ static struct pt_regs *valid_fault_handler(struct KBacktraceIterator* kbt)
119/* Is the pc pointing to a sigreturn trampoline? */ 120/* Is the pc pointing to a sigreturn trampoline? */
120static int is_sigreturn(unsigned long pc) 121static int is_sigreturn(unsigned long pc)
121{ 122{
122 return (pc == VDSO_BASE); 123 return current->mm && (pc == VDSO_SYM(&__vdso_rt_sigreturn));
123} 124}
124 125
125/* Return a pt_regs pointer for a valid signal handler frame */ 126/* Return a pt_regs pointer for a valid signal handler frame */
@@ -128,7 +129,7 @@ static struct pt_regs *valid_sigframe(struct KBacktraceIterator* kbt,
128{ 129{
129 BacktraceIterator *b = &kbt->it; 130 BacktraceIterator *b = &kbt->it;
130 131
131 if (b->pc == VDSO_BASE && b->sp < PAGE_OFFSET && 132 if (is_sigreturn(b->pc) && b->sp < PAGE_OFFSET &&
132 b->sp % sizeof(long) == 0) { 133 b->sp % sizeof(long) == 0) {
133 int retval; 134 int retval;
134 pagefault_disable(); 135 pagefault_disable();