* [PATCH v2 0/3] x86_64: Tidy up vsyscall emulation and make it optional
@ 2014-10-29 21:33 Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 1/3] x86_64,vsyscall: Turn vsyscalls all the way off when vsyscall=none Andy Lutomirski
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Andy Lutomirski @ 2014-10-29 21:33 UTC (permalink / raw)
To: x86, linux-kernel, Josh Triplett, Ingo Molnar
Cc: Konrad Rzeszutek Wilk, Andy Lutomirski
Now that arch/x86/kernel/vsyscall_64.c contains only vsyscall
emulation code, clean it up and make it optional.
Patch 1 makes vsyscall=none work be a bit more self-consistent: it
actually removes the fake vsyscall page instead of just segfaulting
anyone who tries to use it.
Patch 2 is pure cosmetic cleanup.
Patch 3 is the meat: it lets vsyscall emulation be configured out.
The config option to disable it is hidden under CONFIG_EXPERT, since
it will break legacy code.
Note that, last I checked, current userspace is unlikely to work if
the vDSO *and* vsyscalls are off. Take it up with the glibc
maintainers.
This applies on top of tip/x86/vdso.
Changes from v1:
- Added Josh's Reviewed-by
- Fixup up Xen bits in patch 3
Andy Lutomirski (3):
x86_64,vsyscall: Turn vsyscalls all the way off when vsyscall=none
x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code
x86_64,vsyscall: Make vsyscall emulation configurable
arch/x86/Kconfig | 18 ++++++++++++
arch/x86/include/asm/fixmap.h | 2 ++
arch/x86/include/asm/page_64.h | 4 ++-
arch/x86/include/asm/vsyscall.h | 8 +++++
arch/x86/kernel/Makefile | 3 +-
arch/x86/kernel/setup.c | 2 --
arch/x86/kernel/vsyscall_64.c | 65 +++++++++++++++++------------------------
arch/x86/xen/mmu.c | 6 ++--
8 files changed, 63 insertions(+), 45 deletions(-)
--
1.9.3
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 1/3] x86_64,vsyscall: Turn vsyscalls all the way off when vsyscall=none
2014-10-29 21:33 [PATCH v2 0/3] x86_64: Tidy up vsyscall emulation and make it optional Andy Lutomirski
@ 2014-10-29 21:33 ` Andy Lutomirski
2014-11-03 20:48 ` [tip:x86/vdso] x86_64, vsyscall: Turn vsyscalls all the way off when vsyscall==none tip-bot for Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 3/3] x86_64,vsyscall: Make vsyscall emulation configurable Andy Lutomirski
2 siblings, 1 reply; 11+ messages in thread
From: Andy Lutomirski @ 2014-10-29 21:33 UTC (permalink / raw)
To: x86, linux-kernel, Josh Triplett, Ingo Molnar
Cc: Konrad Rzeszutek Wilk, Andy Lutomirski
I see no point in having an unusable read-only page sitting at
0xffffffffff600000 when vsyscall=none. Instead, skip mapping it and
remove it from /proc/PID/maps.
I kept the ratelimited warning when programs try to use a vsyscall
in this mode, since it may help admins avoid confusion.
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
---
arch/x86/kernel/vsyscall_64.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
index 419e83b58436..2d912629c96e 100644
--- a/arch/x86/kernel/vsyscall_64.c
+++ b/arch/x86/kernel/vsyscall_64.c
@@ -307,6 +307,8 @@ struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
if (!mm || mm->context.ia32_compat)
return NULL;
#endif
+ if (vsyscall_mode == NONE)
+ return NULL;
return &gate_vma;
}
@@ -327,7 +329,7 @@ int in_gate_area(struct mm_struct *mm, unsigned long addr)
*/
int in_gate_area_no_mm(unsigned long addr)
{
- return (addr & PAGE_MASK) == VSYSCALL_ADDR;
+ return vsyscall_mode != NONE && (addr & PAGE_MASK) == VSYSCALL_ADDR;
}
void __init map_vsyscall(void)
@@ -335,10 +337,12 @@ void __init map_vsyscall(void)
extern char __vsyscall_page;
unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page);
- __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall,
- vsyscall_mode == NATIVE
- ? PAGE_KERNEL_VSYSCALL
- : PAGE_KERNEL_VVAR);
+ if (vsyscall_mode != NONE)
+ __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall,
+ vsyscall_mode == NATIVE
+ ? PAGE_KERNEL_VSYSCALL
+ : PAGE_KERNEL_VVAR);
+
BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) !=
(unsigned long)VSYSCALL_ADDR);
}
--
1.9.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code
2014-10-29 21:33 [PATCH v2 0/3] x86_64: Tidy up vsyscall emulation and make it optional Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 1/3] x86_64,vsyscall: Turn vsyscalls all the way off when vsyscall=none Andy Lutomirski
@ 2014-10-29 21:33 ` Andy Lutomirski
2014-11-03 20:31 ` Thomas Gleixner
2014-11-03 20:48 ` [tip:x86/vdso] x86_64, vsyscall: " tip-bot for Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 3/3] x86_64,vsyscall: Make vsyscall emulation configurable Andy Lutomirski
2 siblings, 2 replies; 11+ messages in thread
From: Andy Lutomirski @ 2014-10-29 21:33 UTC (permalink / raw)
To: x86, linux-kernel, Josh Triplett, Ingo Molnar
Cc: Konrad Rzeszutek Wilk, Andy Lutomirski
vsyscall_64.c is just vsyscall emulation. Tidy it up accordingly.
If my comment editing offends anyone, let me know and I can fix it.
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
---
arch/x86/kernel/vsyscall_64.c | 51 +++++++++++++++----------------------------
1 file changed, 18 insertions(+), 33 deletions(-)
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
index 2d912629c96e..ee622f8183f3 100644
--- a/arch/x86/kernel/vsyscall_64.c
+++ b/arch/x86/kernel/vsyscall_64.c
@@ -1,52 +1,37 @@
/*
- * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
- * Copyright 2003 Andi Kleen, SuSE Labs.
+ * Mostly copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
*
- * [ NOTE: this mechanism is now deprecated in favor of the vDSO. ]
+ * This file implements vsyscall emulation. vsyscalls are a legacy ABI:
+ * userspace can request certain kernel services by calling fixed
+ * addresses. This concept is problematic:
*
- * Thanks to hpa@transmeta.com for some useful hint.
- * Special thanks to Ingo Molnar for his early experience with
- * a different vsyscall implementation for Linux/IA32 and for the name.
+ * - It interferes with ASLR.
+ * - It's awkward to write code that lives in kernel addresses but is
+ * callable by userspace at fixed addresses.
+ * - The whole concept is impossible for 32-bit compat userspace.
+ * - UML cannot easily virtualize a vsyscall.
*
- * vsyscall 1 is located at -10Mbyte, vsyscall 2 is located
- * at virtual address -10Mbyte+1024bytes etc... There are at max 4
- * vsyscalls. One vsyscall can reserve more than 1 slot to avoid
- * jumping out of line if necessary. We cannot add more with this
- * mechanism because older kernels won't return -ENOSYS.
+ * As of mid-2014, I believe that there is no new userspace code that
+ * will use a vsyscall if the vDSO is present. I hope that there will
+ * soon be no new userspace code that will ever use a vsyscall.
*
- * Note: the concept clashes with user mode linux. UML users should
- * use the vDSO.
+ * The code in this file emulates vsyscalls when notified of a page
+ * fault to a vsyscall address.
+ *
+ * The original version of this code is:
+ * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
+ * Copyright 2003 Andi Kleen, SuSE Labs.
*/
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-#include <linux/time.h>
-#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/timer.h>
-#include <linux/seqlock.h>
-#include <linux/jiffies.h>
-#include <linux/sysctl.h>
-#include <linux/topology.h>
-#include <linux/timekeeper_internal.h>
-#include <linux/getcpu.h>
-#include <linux/cpu.h>
-#include <linux/smp.h>
-#include <linux/notifier.h>
#include <linux/syscalls.h>
#include <linux/ratelimit.h>
#include <asm/vsyscall.h>
-#include <asm/pgtable.h>
-#include <asm/compat.h>
-#include <asm/page.h>
#include <asm/unistd.h>
#include <asm/fixmap.h>
-#include <asm/errno.h>
-#include <asm/io.h>
-#include <asm/segment.h>
-#include <asm/desc.h>
-#include <asm/topology.h>
#include <asm/traps.h>
#define CREATE_TRACE_POINTS
--
1.9.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 3/3] x86_64,vsyscall: Make vsyscall emulation configurable
2014-10-29 21:33 [PATCH v2 0/3] x86_64: Tidy up vsyscall emulation and make it optional Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 1/3] x86_64,vsyscall: Turn vsyscalls all the way off when vsyscall=none Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code Andy Lutomirski
@ 2014-10-29 21:33 ` Andy Lutomirski
2014-11-03 20:49 ` [tip:x86/vdso] " tip-bot for Andy Lutomirski
2 siblings, 1 reply; 11+ messages in thread
From: Andy Lutomirski @ 2014-10-29 21:33 UTC (permalink / raw)
To: x86, linux-kernel, Josh Triplett, Ingo Molnar
Cc: Konrad Rzeszutek Wilk, Andy Lutomirski
This adds CONFIG_X86_VSYSCALL_EMULATION, guarded by CONFIG_EXPERT.
Turning it off completely disables vsyscall emulation, saving ~3.5k
for vsyscall_64.c, 4k for vsyscall_emu_64.S (the fake vsyscall
page), some tiny amount of core mm code that supports a gate area,
and possibly 4k for a wasted pagetable. The latter is because the
vsyscall addresses are misaligned and fit poorly in the fixmap.
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
---
arch/x86/Kconfig | 18 ++++++++++++++++++
arch/x86/include/asm/fixmap.h | 2 ++
arch/x86/include/asm/page_64.h | 4 +++-
arch/x86/include/asm/vsyscall.h | 8 ++++++++
arch/x86/kernel/Makefile | 3 +--
arch/x86/kernel/setup.c | 2 --
arch/x86/xen/mmu.c | 6 ++++--
7 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index f2327e88e07c..cd10436d7d1c 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -984,6 +984,24 @@ config X86_ESPFIX64
def_bool y
depends on X86_16BIT && X86_64
+config X86_VSYSCALL_EMULATION
+ bool "Enable vsyscall emulation" if EXPERT
+ default y
+ depends on X86_64
+ ---help---
+ This enables emulation of the legacy vsyscall page. Disabling
+ it is roughly equivalent to booting with vsyscall=none, except
+ that it will also disable the helpful warning if a program
+ tries to use a vsyscall. With this option set to N, offending
+ programs will just segfault, citing addresses of the form
+ 0xffffffffff600?00.
+
+ This option is required by many programs built before 2013, and
+ care should be used even with newer programs if set to N.
+
+ Disabling this option saves about 7K of kernel size and
+ possibly 4K of additional runtime pagetable memory.
+
config TOSHIBA
tristate "Toshiba Laptop support"
depends on X86_32
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h
index ffb1733ac91f..d8d5bcb2a0b5 100644
--- a/arch/x86/include/asm/fixmap.h
+++ b/arch/x86/include/asm/fixmap.h
@@ -69,7 +69,9 @@ enum fixed_addresses {
#ifdef CONFIG_X86_32
FIX_HOLE,
#else
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
VSYSCALL_PAGE = (FIXADDR_TOP - VSYSCALL_ADDR) >> PAGE_SHIFT,
+#endif
#ifdef CONFIG_PARAVIRT_CLOCK
PVCLOCK_FIXMAP_BEGIN,
PVCLOCK_FIXMAP_END = PVCLOCK_FIXMAP_BEGIN+PVCLOCK_VSYSCALL_NR_PAGES-1,
diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index f408caf73430..b3bebf9e5746 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -39,6 +39,8 @@ void copy_page(void *to, void *from);
#endif /* !__ASSEMBLY__ */
-#define __HAVE_ARCH_GATE_AREA 1
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+# define __HAVE_ARCH_GATE_AREA 1
+#endif
#endif /* _ASM_X86_PAGE_64_H */
diff --git a/arch/x86/include/asm/vsyscall.h b/arch/x86/include/asm/vsyscall.h
index 34f7d8857542..6ba66ee79710 100644
--- a/arch/x86/include/asm/vsyscall.h
+++ b/arch/x86/include/asm/vsyscall.h
@@ -4,6 +4,7 @@
#include <linux/seqlock.h>
#include <uapi/asm/vsyscall.h>
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
extern void map_vsyscall(void);
/*
@@ -11,5 +12,12 @@ extern void map_vsyscall(void);
* Returns true if handled.
*/
extern bool emulate_vsyscall(struct pt_regs *regs, unsigned long address);
+#else
+static inline void map_vsyscall(void) {}
+static inline bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
+{
+ return false;
+}
+#endif
#endif /* _ASM_X86_VSYSCALL_H */
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 8f1e77440b2b..5d4502c8b983 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -28,8 +28,7 @@ obj-$(CONFIG_X86_32) += i386_ksyms_32.o
obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o
obj-$(CONFIG_X86_64) += mcount_64.o
obj-y += syscall_$(BITS).o vsyscall_gtod.o
-obj-$(CONFIG_X86_64) += vsyscall_64.o
-obj-$(CONFIG_X86_64) += vsyscall_emu_64.o
+obj-$(CONFIG_X86_VSYSCALL_EMULATION) += vsyscall_64.o vsyscall_emu_64.o
obj-$(CONFIG_X86_ESPFIX64) += espfix_64.o
obj-$(CONFIG_SYSFS) += ksysfs.o
obj-y += bootflag.o e820.o
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 235cfd39e0d7..59a6f884fdad 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1190,9 +1190,7 @@ void __init setup_arch(char **cmdline_p)
tboot_probe();
-#ifdef CONFIG_X86_64
map_vsyscall();
-#endif
generic_apic_probe();
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index a8a1a3d08d4d..8906cf0e536f 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -1457,8 +1457,10 @@ static int xen_pgd_alloc(struct mm_struct *mm)
page->private = (unsigned long)user_pgd;
if (user_pgd != NULL) {
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
user_pgd[pgd_index(VSYSCALL_ADDR)] =
__pgd(__pa(level3_user_vsyscall) | _PAGE_TABLE);
+#endif
ret = 0;
}
@@ -2021,7 +2023,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
# ifdef CONFIG_HIGHMEM
case FIX_KMAP_BEGIN ... FIX_KMAP_END:
# endif
-#else
+#elif defined(CONFIG_X86_VSYSCALL_EMULATION)
case VSYSCALL_PAGE:
#endif
case FIX_TEXT_POKE0:
@@ -2060,7 +2062,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
__native_set_fixmap(idx, pte);
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
/* Replicate changes to map the vsyscall page into the user
pagetable vsyscall mapping. */
if (idx == VSYSCALL_PAGE) {
--
1.9.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code
2014-10-29 21:33 ` [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code Andy Lutomirski
@ 2014-11-03 20:31 ` Thomas Gleixner
2014-11-03 20:34 ` Andy Lutomirski
2014-11-03 20:48 ` [tip:x86/vdso] x86_64, vsyscall: " tip-bot for Andy Lutomirski
1 sibling, 1 reply; 11+ messages in thread
From: Thomas Gleixner @ 2014-11-03 20:31 UTC (permalink / raw)
To: Andy Lutomirski
Cc: x86, linux-kernel, Josh Triplett, Ingo Molnar,
Konrad Rzeszutek Wilk
On Wed, 29 Oct 2014, Andy Lutomirski wrote:
> vsyscall_64.c is just vsyscall emulation. Tidy it up accordingly.
>
> If my comment editing offends anyone, let me know and I can fix it.
>
> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
> Signed-off-by: Andy Lutomirski <luto@amacapital.net>
> ---
> arch/x86/kernel/vsyscall_64.c | 51 +++++++++++++++----------------------------
> 1 file changed, 18 insertions(+), 33 deletions(-)
>
> diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
> index 2d912629c96e..ee622f8183f3 100644
> --- a/arch/x86/kernel/vsyscall_64.c
> +++ b/arch/x86/kernel/vsyscall_64.c
> @@ -1,52 +1,37 @@
> /*
> - * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
> - * Copyright 2003 Andi Kleen, SuSE Labs.
> + * Mostly copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
We usualy leave the old copyright notices around even if the code
which is related to them has been removed more or less completely.
So I change this to:
/*
* Copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
*
* Based on the original implementation:
* Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
* Copyright 2003 Andi Kleen, SuSE Labs.
and apply the whole lot.
Thanks,
tglx
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code
2014-11-03 20:31 ` Thomas Gleixner
@ 2014-11-03 20:34 ` Andy Lutomirski
2014-11-03 20:41 ` Thomas Gleixner
0 siblings, 1 reply; 11+ messages in thread
From: Andy Lutomirski @ 2014-11-03 20:34 UTC (permalink / raw)
To: Thomas Gleixner
Cc: X86 ML, linux-kernel@vger.kernel.org, Josh Triplett, Ingo Molnar,
Konrad Rzeszutek Wilk
On Mon, Nov 3, 2014 at 12:31 PM, Thomas Gleixner <tglx@linutronix.de> wrote:
> On Wed, 29 Oct 2014, Andy Lutomirski wrote:
>
>> vsyscall_64.c is just vsyscall emulation. Tidy it up accordingly.
>>
>> If my comment editing offends anyone, let me know and I can fix it.
>>
>> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
>> Signed-off-by: Andy Lutomirski <luto@amacapital.net>
>> ---
>> arch/x86/kernel/vsyscall_64.c | 51 +++++++++++++++----------------------------
>> 1 file changed, 18 insertions(+), 33 deletions(-)
>>
>> diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
>> index 2d912629c96e..ee622f8183f3 100644
>> --- a/arch/x86/kernel/vsyscall_64.c
>> +++ b/arch/x86/kernel/vsyscall_64.c
>> @@ -1,52 +1,37 @@
>> /*
>> - * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
>> - * Copyright 2003 Andi Kleen, SuSE Labs.
>> + * Mostly copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
>
> We usualy leave the old copyright notices around even if the code
> which is related to them has been removed more or less completely.
>
> So I change this to:
>
> /*
> * Copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
> *
> * Based on the original implementation:
> * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
> * Copyright 2003 Andi Kleen, SuSE Labs.
>
> and apply the whole lot.
Would it make more sense to move those copyright notices to
arch/x86/vdso/vma.c? That's where most of the code ended up.
--Andy
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code
2014-11-03 20:34 ` Andy Lutomirski
@ 2014-11-03 20:41 ` Thomas Gleixner
2014-11-03 20:42 ` Andy Lutomirski
0 siblings, 1 reply; 11+ messages in thread
From: Thomas Gleixner @ 2014-11-03 20:41 UTC (permalink / raw)
To: Andy Lutomirski
Cc: X86 ML, linux-kernel@vger.kernel.org, Josh Triplett, Ingo Molnar,
Konrad Rzeszutek Wilk
On Mon, 3 Nov 2014, Andy Lutomirski wrote:
> On Mon, Nov 3, 2014 at 12:31 PM, Thomas Gleixner <tglx@linutronix.de> wrote:
> > On Wed, 29 Oct 2014, Andy Lutomirski wrote:
> >
> >> vsyscall_64.c is just vsyscall emulation. Tidy it up accordingly.
> >>
> >> If my comment editing offends anyone, let me know and I can fix it.
> >>
> >> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
> >> Signed-off-by: Andy Lutomirski <luto@amacapital.net>
> >> ---
> >> arch/x86/kernel/vsyscall_64.c | 51 +++++++++++++++----------------------------
> >> 1 file changed, 18 insertions(+), 33 deletions(-)
> >>
> >> diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
> >> index 2d912629c96e..ee622f8183f3 100644
> >> --- a/arch/x86/kernel/vsyscall_64.c
> >> +++ b/arch/x86/kernel/vsyscall_64.c
> >> @@ -1,52 +1,37 @@
> >> /*
> >> - * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
> >> - * Copyright 2003 Andi Kleen, SuSE Labs.
> >> + * Mostly copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
> >
> > We usualy leave the old copyright notices around even if the code
> > which is related to them has been removed more or less completely.
> >
> > So I change this to:
> >
> > /*
> > * Copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
> > *
> > * Based on the original implementation:
> > * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
> > * Copyright 2003 Andi Kleen, SuSE Labs.
> >
> > and apply the whole lot.
>
> Would it make more sense to move those copyright notices to
> arch/x86/vdso/vma.c? That's where most of the code ended up.
That has already a notice from Andi and I cant figure out what parts
of that have been written by Andrea. We'll worry about that when we
remove vsyscall_64.c. Until then the git history will be our friend.
Thanks,
tglx
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code
2014-11-03 20:41 ` Thomas Gleixner
@ 2014-11-03 20:42 ` Andy Lutomirski
0 siblings, 0 replies; 11+ messages in thread
From: Andy Lutomirski @ 2014-11-03 20:42 UTC (permalink / raw)
To: Thomas Gleixner
Cc: X86 ML, linux-kernel@vger.kernel.org, Josh Triplett, Ingo Molnar,
Konrad Rzeszutek Wilk
On Mon, Nov 3, 2014 at 12:41 PM, Thomas Gleixner <tglx@linutronix.de> wrote:
> On Mon, 3 Nov 2014, Andy Lutomirski wrote:
>> On Mon, Nov 3, 2014 at 12:31 PM, Thomas Gleixner <tglx@linutronix.de> wrote:
>> > On Wed, 29 Oct 2014, Andy Lutomirski wrote:
>> >
>> >> vsyscall_64.c is just vsyscall emulation. Tidy it up accordingly.
>> >>
>> >> If my comment editing offends anyone, let me know and I can fix it.
>> >>
>> >> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
>> >> Signed-off-by: Andy Lutomirski <luto@amacapital.net>
>> >> ---
>> >> arch/x86/kernel/vsyscall_64.c | 51 +++++++++++++++----------------------------
>> >> 1 file changed, 18 insertions(+), 33 deletions(-)
>> >>
>> >> diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
>> >> index 2d912629c96e..ee622f8183f3 100644
>> >> --- a/arch/x86/kernel/vsyscall_64.c
>> >> +++ b/arch/x86/kernel/vsyscall_64.c
>> >> @@ -1,52 +1,37 @@
>> >> /*
>> >> - * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
>> >> - * Copyright 2003 Andi Kleen, SuSE Labs.
>> >> + * Mostly copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
>> >
>> > We usualy leave the old copyright notices around even if the code
>> > which is related to them has been removed more or less completely.
>> >
>> > So I change this to:
>> >
>> > /*
>> > * Copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
>> > *
>> > * Based on the original implementation:
>> > * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
>> > * Copyright 2003 Andi Kleen, SuSE Labs.
>> >
>> > and apply the whole lot.
>>
>> Would it make more sense to move those copyright notices to
>> arch/x86/vdso/vma.c? That's where most of the code ended up.
>
> That has already a notice from Andi and I cant figure out what parts
> of that have been written by Andrea. We'll worry about that when we
> remove vsyscall_64.c. Until then the git history will be our friend.
Works for me.
--Andy
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip:x86/vdso] x86_64, vsyscall: Turn vsyscalls all the way off when vsyscall==none
2014-10-29 21:33 ` [PATCH v2 1/3] x86_64,vsyscall: Turn vsyscalls all the way off when vsyscall=none Andy Lutomirski
@ 2014-11-03 20:48 ` tip-bot for Andy Lutomirski
0 siblings, 0 replies; 11+ messages in thread
From: tip-bot for Andy Lutomirski @ 2014-11-03 20:48 UTC (permalink / raw)
To: linux-tip-commits; +Cc: konrad.wilk, hpa, luto, mingo, tglx, linux-kernel, josh
Commit-ID: 87983c66bc02c9cd8e4a42e7924435145d52bb13
Gitweb: http://git.kernel.org/tip/87983c66bc02c9cd8e4a42e7924435145d52bb13
Author: Andy Lutomirski <luto@amacapital.net>
AuthorDate: Wed, 29 Oct 2014 14:33:45 -0700
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitDate: Mon, 3 Nov 2014 21:44:57 +0100
x86_64, vsyscall: Turn vsyscalls all the way off when vsyscall==none
I see no point in having an unusable read-only page sitting at
0xffffffffff600000 when vsyscall=none. Instead, skip mapping it and
remove it from /proc/PID/maps.
I kept the ratelimited warning when programs try to use a vsyscall
in this mode, since it may help admins avoid confusion.
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/0dddbadc1d4e3bfbaf887938ff42afc97a7cc1f2.1414618407.git.luto@amacapital.net
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/kernel/vsyscall_64.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
index 419e83b..2d91262 100644
--- a/arch/x86/kernel/vsyscall_64.c
+++ b/arch/x86/kernel/vsyscall_64.c
@@ -307,6 +307,8 @@ struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
if (!mm || mm->context.ia32_compat)
return NULL;
#endif
+ if (vsyscall_mode == NONE)
+ return NULL;
return &gate_vma;
}
@@ -327,7 +329,7 @@ int in_gate_area(struct mm_struct *mm, unsigned long addr)
*/
int in_gate_area_no_mm(unsigned long addr)
{
- return (addr & PAGE_MASK) == VSYSCALL_ADDR;
+ return vsyscall_mode != NONE && (addr & PAGE_MASK) == VSYSCALL_ADDR;
}
void __init map_vsyscall(void)
@@ -335,10 +337,12 @@ void __init map_vsyscall(void)
extern char __vsyscall_page;
unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page);
- __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall,
- vsyscall_mode == NATIVE
- ? PAGE_KERNEL_VSYSCALL
- : PAGE_KERNEL_VVAR);
+ if (vsyscall_mode != NONE)
+ __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall,
+ vsyscall_mode == NATIVE
+ ? PAGE_KERNEL_VSYSCALL
+ : PAGE_KERNEL_VVAR);
+
BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) !=
(unsigned long)VSYSCALL_ADDR);
}
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [tip:x86/vdso] x86_64, vsyscall: Rewrite comment and clean up headers in vsyscall code
2014-10-29 21:33 ` [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code Andy Lutomirski
2014-11-03 20:31 ` Thomas Gleixner
@ 2014-11-03 20:48 ` tip-bot for Andy Lutomirski
1 sibling, 0 replies; 11+ messages in thread
From: tip-bot for Andy Lutomirski @ 2014-11-03 20:48 UTC (permalink / raw)
To: linux-tip-commits; +Cc: luto, josh, mingo, tglx, hpa, konrad.wilk, linux-kernel
Commit-ID: 95c46b56922409ed8838b3b420b11cfebb8c6c88
Gitweb: http://git.kernel.org/tip/95c46b56922409ed8838b3b420b11cfebb8c6c88
Author: Andy Lutomirski <luto@amacapital.net>
AuthorDate: Wed, 29 Oct 2014 14:33:46 -0700
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitDate: Mon, 3 Nov 2014 21:44:57 +0100
x86_64, vsyscall: Rewrite comment and clean up headers in vsyscall code
vsyscall_64.c is just vsyscall emulation. Tidy it up accordingly.
[ tglx: Preserved the original copyright notices ]
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/9c448d5643d0fdb618f8cde9a54c21d2bcd486ce.1414618407.git.luto@amacapital.net
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/kernel/vsyscall_64.c | 50 ++++++++++++++++---------------------------
1 file changed, 18 insertions(+), 32 deletions(-)
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
index 2d91262..7d9eb4b 100644
--- a/arch/x86/kernel/vsyscall_64.c
+++ b/arch/x86/kernel/vsyscall_64.c
@@ -1,52 +1,38 @@
/*
+ * Copyright (c) 2012-2014 Andy Lutomirski <luto@amacapital.net>
+ *
+ * Based on the original implementation which is:
* Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
* Copyright 2003 Andi Kleen, SuSE Labs.
*
- * [ NOTE: this mechanism is now deprecated in favor of the vDSO. ]
+ * Parts of the original code have been moved to arch/x86/vdso/vma.c
+ *
+ * This file implements vsyscall emulation. vsyscalls are a legacy ABI:
+ * Userspace can request certain kernel services by calling fixed
+ * addresses. This concept is problematic:
*
- * Thanks to hpa@transmeta.com for some useful hint.
- * Special thanks to Ingo Molnar for his early experience with
- * a different vsyscall implementation for Linux/IA32 and for the name.
+ * - It interferes with ASLR.
+ * - It's awkward to write code that lives in kernel addresses but is
+ * callable by userspace at fixed addresses.
+ * - The whole concept is impossible for 32-bit compat userspace.
+ * - UML cannot easily virtualize a vsyscall.
*
- * vsyscall 1 is located at -10Mbyte, vsyscall 2 is located
- * at virtual address -10Mbyte+1024bytes etc... There are at max 4
- * vsyscalls. One vsyscall can reserve more than 1 slot to avoid
- * jumping out of line if necessary. We cannot add more with this
- * mechanism because older kernels won't return -ENOSYS.
+ * As of mid-2014, I believe that there is no new userspace code that
+ * will use a vsyscall if the vDSO is present. I hope that there will
+ * soon be no new userspace code that will ever use a vsyscall.
*
- * Note: the concept clashes with user mode linux. UML users should
- * use the vDSO.
+ * The code in this file emulates vsyscalls when notified of a page
+ * fault to a vsyscall address.
*/
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/time.h>
-#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/timer.h>
-#include <linux/seqlock.h>
-#include <linux/jiffies.h>
-#include <linux/sysctl.h>
-#include <linux/topology.h>
-#include <linux/timekeeper_internal.h>
-#include <linux/getcpu.h>
-#include <linux/cpu.h>
-#include <linux/smp.h>
-#include <linux/notifier.h>
#include <linux/syscalls.h>
#include <linux/ratelimit.h>
#include <asm/vsyscall.h>
-#include <asm/pgtable.h>
-#include <asm/compat.h>
-#include <asm/page.h>
#include <asm/unistd.h>
#include <asm/fixmap.h>
-#include <asm/errno.h>
-#include <asm/io.h>
-#include <asm/segment.h>
-#include <asm/desc.h>
-#include <asm/topology.h>
#include <asm/traps.h>
#define CREATE_TRACE_POINTS
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [tip:x86/vdso] x86_64,vsyscall: Make vsyscall emulation configurable
2014-10-29 21:33 ` [PATCH v2 3/3] x86_64,vsyscall: Make vsyscall emulation configurable Andy Lutomirski
@ 2014-11-03 20:49 ` tip-bot for Andy Lutomirski
0 siblings, 0 replies; 11+ messages in thread
From: tip-bot for Andy Lutomirski @ 2014-11-03 20:49 UTC (permalink / raw)
To: linux-tip-commits; +Cc: mingo, tglx, luto, hpa, linux-kernel, josh, konrad.wilk
Commit-ID: 1ad83c858c7d4ea210429142c99a1548e6715a35
Gitweb: http://git.kernel.org/tip/1ad83c858c7d4ea210429142c99a1548e6715a35
Author: Andy Lutomirski <luto@amacapital.net>
AuthorDate: Wed, 29 Oct 2014 14:33:47 -0700
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitDate: Mon, 3 Nov 2014 21:44:57 +0100
x86_64,vsyscall: Make vsyscall emulation configurable
This adds CONFIG_X86_VSYSCALL_EMULATION, guarded by CONFIG_EXPERT.
Turning it off completely disables vsyscall emulation, saving ~3.5k
for vsyscall_64.c, 4k for vsyscall_emu_64.S (the fake vsyscall
page), some tiny amount of core mm code that supports a gate area,
and possibly 4k for a wasted pagetable. The latter is because the
vsyscall addresses are misaligned and fit poorly in the fixmap.
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/406db88b8dd5f0cbbf38216d11be34bbb43c7eae.1414618407.git.luto@amacapital.net
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/Kconfig | 18 ++++++++++++++++++
arch/x86/include/asm/fixmap.h | 2 ++
arch/x86/include/asm/page_64.h | 4 +++-
arch/x86/include/asm/vsyscall.h | 8 ++++++++
arch/x86/kernel/Makefile | 3 +--
arch/x86/kernel/setup.c | 2 --
arch/x86/xen/mmu.c | 6 ++++--
7 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index f2327e8..cd10436 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -984,6 +984,24 @@ config X86_ESPFIX64
def_bool y
depends on X86_16BIT && X86_64
+config X86_VSYSCALL_EMULATION
+ bool "Enable vsyscall emulation" if EXPERT
+ default y
+ depends on X86_64
+ ---help---
+ This enables emulation of the legacy vsyscall page. Disabling
+ it is roughly equivalent to booting with vsyscall=none, except
+ that it will also disable the helpful warning if a program
+ tries to use a vsyscall. With this option set to N, offending
+ programs will just segfault, citing addresses of the form
+ 0xffffffffff600?00.
+
+ This option is required by many programs built before 2013, and
+ care should be used even with newer programs if set to N.
+
+ Disabling this option saves about 7K of kernel size and
+ possibly 4K of additional runtime pagetable memory.
+
config TOSHIBA
tristate "Toshiba Laptop support"
depends on X86_32
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h
index ffb1733..d8d5bcb 100644
--- a/arch/x86/include/asm/fixmap.h
+++ b/arch/x86/include/asm/fixmap.h
@@ -69,7 +69,9 @@ enum fixed_addresses {
#ifdef CONFIG_X86_32
FIX_HOLE,
#else
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
VSYSCALL_PAGE = (FIXADDR_TOP - VSYSCALL_ADDR) >> PAGE_SHIFT,
+#endif
#ifdef CONFIG_PARAVIRT_CLOCK
PVCLOCK_FIXMAP_BEGIN,
PVCLOCK_FIXMAP_END = PVCLOCK_FIXMAP_BEGIN+PVCLOCK_VSYSCALL_NR_PAGES-1,
diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index f408caf..b3bebf9 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -39,6 +39,8 @@ void copy_page(void *to, void *from);
#endif /* !__ASSEMBLY__ */
-#define __HAVE_ARCH_GATE_AREA 1
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+# define __HAVE_ARCH_GATE_AREA 1
+#endif
#endif /* _ASM_X86_PAGE_64_H */
diff --git a/arch/x86/include/asm/vsyscall.h b/arch/x86/include/asm/vsyscall.h
index 34f7d88..6ba66ee 100644
--- a/arch/x86/include/asm/vsyscall.h
+++ b/arch/x86/include/asm/vsyscall.h
@@ -4,6 +4,7 @@
#include <linux/seqlock.h>
#include <uapi/asm/vsyscall.h>
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
extern void map_vsyscall(void);
/*
@@ -11,5 +12,12 @@ extern void map_vsyscall(void);
* Returns true if handled.
*/
extern bool emulate_vsyscall(struct pt_regs *regs, unsigned long address);
+#else
+static inline void map_vsyscall(void) {}
+static inline bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
+{
+ return false;
+}
+#endif
#endif /* _ASM_X86_VSYSCALL_H */
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 8f1e774..5d4502c 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -28,8 +28,7 @@ obj-$(CONFIG_X86_32) += i386_ksyms_32.o
obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o
obj-$(CONFIG_X86_64) += mcount_64.o
obj-y += syscall_$(BITS).o vsyscall_gtod.o
-obj-$(CONFIG_X86_64) += vsyscall_64.o
-obj-$(CONFIG_X86_64) += vsyscall_emu_64.o
+obj-$(CONFIG_X86_VSYSCALL_EMULATION) += vsyscall_64.o vsyscall_emu_64.o
obj-$(CONFIG_X86_ESPFIX64) += espfix_64.o
obj-$(CONFIG_SYSFS) += ksysfs.o
obj-y += bootflag.o e820.o
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 235cfd3..59a6f884 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1190,9 +1190,7 @@ void __init setup_arch(char **cmdline_p)
tboot_probe();
-#ifdef CONFIG_X86_64
map_vsyscall();
-#endif
generic_apic_probe();
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index a8a1a3d..8906cf0 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -1457,8 +1457,10 @@ static int xen_pgd_alloc(struct mm_struct *mm)
page->private = (unsigned long)user_pgd;
if (user_pgd != NULL) {
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
user_pgd[pgd_index(VSYSCALL_ADDR)] =
__pgd(__pa(level3_user_vsyscall) | _PAGE_TABLE);
+#endif
ret = 0;
}
@@ -2021,7 +2023,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
# ifdef CONFIG_HIGHMEM
case FIX_KMAP_BEGIN ... FIX_KMAP_END:
# endif
-#else
+#elif defined(CONFIG_X86_VSYSCALL_EMULATION)
case VSYSCALL_PAGE:
#endif
case FIX_TEXT_POKE0:
@@ -2060,7 +2062,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
__native_set_fixmap(idx, pte);
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
/* Replicate changes to map the vsyscall page into the user
pagetable vsyscall mapping. */
if (idx == VSYSCALL_PAGE) {
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-11-03 20:49 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-29 21:33 [PATCH v2 0/3] x86_64: Tidy up vsyscall emulation and make it optional Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 1/3] x86_64,vsyscall: Turn vsyscalls all the way off when vsyscall=none Andy Lutomirski
2014-11-03 20:48 ` [tip:x86/vdso] x86_64, vsyscall: Turn vsyscalls all the way off when vsyscall==none tip-bot for Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 2/3] x86_64,vsyscall: Rewrite comment and clean up headers in vsyscall code Andy Lutomirski
2014-11-03 20:31 ` Thomas Gleixner
2014-11-03 20:34 ` Andy Lutomirski
2014-11-03 20:41 ` Thomas Gleixner
2014-11-03 20:42 ` Andy Lutomirski
2014-11-03 20:48 ` [tip:x86/vdso] x86_64, vsyscall: " tip-bot for Andy Lutomirski
2014-10-29 21:33 ` [PATCH v2 3/3] x86_64,vsyscall: Make vsyscall emulation configurable Andy Lutomirski
2014-11-03 20:49 ` [tip:x86/vdso] " tip-bot for Andy Lutomirski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox