From: Richard Weinberger <richard@nod.at>
To: akpm@linux-foundation.org
Cc: Richard Weinberger <richard@nod.at>,
linux-kernel@vger.kernel.org,
user-mode-linux-devel@lists.sourceforge.net
Subject: [uml-devel] [PATCH 06/10] um: Set __HAVE_ARCH_GATE_AREA for i386
Date: Thu, 21 Jul 2011 11:18:30 +0200 [thread overview]
Message-ID: <1311239914-8301-6-git-send-email-richard@nod.at> (raw)
In-Reply-To: <1311239914-8301-1-git-send-email-richard@nod.at>
When UML is unable to reuse the host's vDSO FIXADDR_USER_START
is zero.
To handle this special case correclty we have to implement custom
gate area helper methods.
Signed-off-by: Richard Weinberger <richard@nod.at>
---
arch/um/sys-i386/Makefile | 2 +-
arch/um/sys-i386/asm/elf.h | 2 +
arch/um/sys-i386/mem.c | 62 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 65 insertions(+), 1 deletions(-)
create mode 100644 arch/um/sys-i386/mem.c
diff --git a/arch/um/sys-i386/Makefile b/arch/um/sys-i386/Makefile
index b1da91c..daaea15 100644
--- a/arch/um/sys-i386/Makefile
+++ b/arch/um/sys-i386/Makefile
@@ -4,7 +4,7 @@
obj-y = bug.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \
ptrace_user.o setjmp.o signal.o stub.o stub_segv.o syscalls.o sysrq.o \
- sys_call_table.o tls.o atomic64_cx8_32.o
+ sys_call_table.o tls.o atomic64_cx8_32.o mem.o
obj-$(CONFIG_BINFMT_ELF) += elfcore.o
diff --git a/arch/um/sys-i386/asm/elf.h b/arch/um/sys-i386/asm/elf.h
index d964a41..4230555 100644
--- a/arch/um/sys-i386/asm/elf.h
+++ b/arch/um/sys-i386/asm/elf.h
@@ -105,6 +105,8 @@ extern unsigned long __kernel_vsyscall;
#define FIXADDR_USER_START VSYSCALL_BASE
#define FIXADDR_USER_END VSYSCALL_END
+#define __HAVE_ARCH_GATE_AREA 1
+
/*
* Architecture-neutral AT_ values in 0-17, leave some room
* for more of them, start the x86-specific ones at 32.
diff --git a/arch/um/sys-i386/mem.c b/arch/um/sys-i386/mem.c
new file mode 100644
index 0000000..639900a
--- /dev/null
+++ b/arch/um/sys-i386/mem.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2011 Richard Weinberger <richrd@nod.at>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/mm.h>
+#include <asm/page.h>
+#include <asm/mman.h>
+
+static struct vm_area_struct gate_vma;
+
+static int __init gate_vma_init(void)
+{
+ if (!FIXADDR_USER_START)
+ return 0;
+
+ gate_vma.vm_mm = NULL;
+ gate_vma.vm_start = FIXADDR_USER_START;
+ gate_vma.vm_end = FIXADDR_USER_END;
+ gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC;
+ gate_vma.vm_page_prot = __P101;
+
+ /*
+ * Make sure the vDSO gets into every core dump.
+ * Dumping its contents makes post-mortem fully interpretable later
+ * without matching up the same kernel and hardware config to see
+ * what PC values meant.
+ */
+ gate_vma.vm_flags |= VM_ALWAYSDUMP;
+
+ return 0;
+}
+__initcall(gate_vma_init);
+
+struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
+{
+ return FIXADDR_USER_START ? &gate_vma : NULL;
+}
+
+int in_gate_area_no_mm(unsigned long addr)
+{
+ if (!FIXADDR_USER_START)
+ return 0;
+
+ if ((addr >= FIXADDR_USER_START) && (addr < FIXADDR_USER_END))
+ return 1;
+
+ return 0;
+}
+
+int in_gate_area(struct mm_struct *mm, unsigned long addr)
+{
+ struct vm_area_struct *vma = get_gate_vma(mm);
+
+ if (!vma)
+ return 0;
+
+ return (addr >= vma->vm_start) && (addr < vma->vm_end);
+}
--
1.7.6
------------------------------------------------------------------------------
5 Ways to Improve & Secure Unified Communications
Unified Communications promises greater efficiencies for business. UC can
improve internal communications as well as offer faster, more efficient ways
to interact with customers and streamline customer service. Learn more!
http://www.accelacomm.com/jaw/sfnl/114/51426253/
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
next prev parent reply other threads:[~2011-07-21 9:18 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-21 9:18 [uml-devel] [PATCH 01/10] uml: cow_user.c warning corrections Richard Weinberger
2011-07-21 9:18 ` [uml-devel] [PATCH 02/10] uml: helper.c " Richard Weinberger
2011-07-21 9:18 ` [uml-devel] [PATCH 03/10] uml: drivers/slip_user.c memory leak fix Richard Weinberger
2011-07-21 9:18 ` [uml-devel] [PATCH 04/10] uml: free resources Richard Weinberger
2011-07-21 9:18 ` [uml-devel] [PATCH 05/10] um: Disable scan_elf_aux() on x86_64 Richard Weinberger
2011-07-21 9:18 ` Richard Weinberger [this message]
2011-07-21 9:18 ` [uml-devel] [PATCH 07/10] um: Set __HAVE_ARCH_GATE_AREA for x86_64 Richard Weinberger
2011-07-22 23:01 ` Andrew Morton
2011-07-23 12:15 ` [uml-devel] " Richard Weinberger
2011-07-21 9:18 ` [PATCH 08/10] um: Implement a x86_64 vDSO Richard Weinberger
2011-07-21 9:18 ` [uml-devel] [PATCH 09/10] um: Ajdust size of pid_buf Richard Weinberger
2011-07-21 9:38 ` Geert Uytterhoeven
2011-07-21 9:48 ` Richard Weinberger
2011-07-21 9:18 ` [uml-devel] [PATCH 10/10] um: Remove dead code Richard Weinberger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1311239914-8301-6-git-send-email-richard@nod.at \
--to=richard@nod.at \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=user-mode-linux-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox