From: khalid.aziz at oracle.com (Khalid Aziz)
Subject: [PATCH v15 00/17] arm64: untag user pointers passed to the kernel
Date: Thu, 23 May 2019 15:49:05 -0600 [thread overview]
Message-ID: <ffe58af3-7c70-d559-69f6-1f6ebcb0fec6@oracle.com> (raw)
In-Reply-To: <20190523201105.oifkksus4rzcwqt4@mbp>
On 5/23/19 2:11 PM, Catalin Marinas wrote:
> Hi Khalid,
>
> On Thu, May 23, 2019 at 11:51:40AM -0600, Khalid Aziz wrote:
>> On 5/21/19 6:04 PM, Kees Cook wrote:
>>> As an aside: I think Sparc ADI support in Linux actually side-stepped
>>> this[1] (i.e. chose "solution 1"): "All addresses passed to kernel must
>>> be non-ADI tagged addresses." (And sadly, "Kernel does not enable ADI
>>> for kernel code.") I think this was a mistake we should not repeat for
>>> arm64 (we do seem to be at least in agreement about this, I think).
>>>
>>> [1] https://lore.kernel.org/patchwork/patch/654481/
>>
>> That is a very early version of the sparc ADI patch. Support for tagged
>> addresses in syscalls was added in later versions and is in the patch
>> that is in the kernel.
>
> I tried to figure out but I'm not familiar with the sparc port. How did
> you solve the tagged address going into various syscall implementations
> in the kernel (e.g. sys_write)? Is the tag removed on kernel entry or it
> ends up deeper in the core code?
>
Another spot I should point out in ADI patch - Tags are not stored in
VMAs and IOMMU does not support ADI tags on M7. ADI tags are stripped
before userspace addresses are passed to IOMMU in the following snippet
from the patch:
diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c
index 5335ba3c850e..357b6047653a 100644
--- a/arch/sparc/mm/gup.c
+++ b/arch/sparc/mm/gup.c
@@ -201,6 +202,24 @@ int __get_user_pages_fast(unsigned long start, int
nr_pages
, int write,
pgd_t *pgdp;
int nr = 0;
+#ifdef CONFIG_SPARC64
+ if (adi_capable()) {
+ long addr = start;
+
+ /* If userspace has passed a versioned address, kernel
+ * will not find it in the VMAs since it does not store
+ * the version tags in the list of VMAs. Storing version
+ * tags in list of VMAs is impractical since they can be
+ * changed any time from userspace without dropping into
+ * kernel. Any address search in VMAs will be done with
+ * non-versioned addresses. Ensure the ADI version bits
+ * are dropped here by sign extending the last bit before
+ * ADI bits. IOMMU does not implement version tags.
+ */
+ addr = (addr << (long)adi_nbits()) >> (long)adi_nbits();
+ start = addr;
+ }
+#endif
start &= PAGE_MASK;
addr = start;
len = (unsigned long) nr_pages << PAGE_SHIFT;
--
Khalid
WARNING: multiple messages have this Message-ID (diff)
From: khalid.aziz@oracle.com (Khalid Aziz)
Subject: [PATCH v15 00/17] arm64: untag user pointers passed to the kernel
Date: Thu, 23 May 2019 15:49:05 -0600 [thread overview]
Message-ID: <ffe58af3-7c70-d559-69f6-1f6ebcb0fec6@oracle.com> (raw)
Message-ID: <20190523214905.S79MXjYDv5cwg4jEBw-QNYUB4D3ctGqAHw_9T9-_6lg@z> (raw)
In-Reply-To: <20190523201105.oifkksus4rzcwqt4@mbp>
On 5/23/19 2:11 PM, Catalin Marinas wrote:
> Hi Khalid,
>
> On Thu, May 23, 2019@11:51:40AM -0600, Khalid Aziz wrote:
>> On 5/21/19 6:04 PM, Kees Cook wrote:
>>> As an aside: I think Sparc ADI support in Linux actually side-stepped
>>> this[1] (i.e. chose "solution 1"): "All addresses passed to kernel must
>>> be non-ADI tagged addresses." (And sadly, "Kernel does not enable ADI
>>> for kernel code.") I think this was a mistake we should not repeat for
>>> arm64 (we do seem to be at least in agreement about this, I think).
>>>
>>> [1] https://lore.kernel.org/patchwork/patch/654481/
>>
>> That is a very early version of the sparc ADI patch. Support for tagged
>> addresses in syscalls was added in later versions and is in the patch
>> that is in the kernel.
>
> I tried to figure out but I'm not familiar with the sparc port. How did
> you solve the tagged address going into various syscall implementations
> in the kernel (e.g. sys_write)? Is the tag removed on kernel entry or it
> ends up deeper in the core code?
>
Another spot I should point out in ADI patch - Tags are not stored in
VMAs and IOMMU does not support ADI tags on M7. ADI tags are stripped
before userspace addresses are passed to IOMMU in the following snippet
from the patch:
diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c
index 5335ba3c850e..357b6047653a 100644
--- a/arch/sparc/mm/gup.c
+++ b/arch/sparc/mm/gup.c
@@ -201,6 +202,24 @@ int __get_user_pages_fast(unsigned long start, int
nr_pages
, int write,
pgd_t *pgdp;
int nr = 0;
+#ifdef CONFIG_SPARC64
+ if (adi_capable()) {
+ long addr = start;
+
+ /* If userspace has passed a versioned address, kernel
+ * will not find it in the VMAs since it does not store
+ * the version tags in the list of VMAs. Storing version
+ * tags in list of VMAs is impractical since they can be
+ * changed any time from userspace without dropping into
+ * kernel. Any address search in VMAs will be done with
+ * non-versioned addresses. Ensure the ADI version bits
+ * are dropped here by sign extending the last bit before
+ * ADI bits. IOMMU does not implement version tags.
+ */
+ addr = (addr << (long)adi_nbits()) >> (long)adi_nbits();
+ start = addr;
+ }
+#endif
start &= PAGE_MASK;
addr = start;
len = (unsigned long) nr_pages << PAGE_SHIFT;
--
Khalid
next prev parent reply other threads:[~2019-05-23 21:49 UTC|newest]
Thread overview: 198+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-06 16:30 [PATCH v15 00/17] arm64: untag user pointers passed to the kernel andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-06 16:30 ` [PATCH v15 01/17] uaccess: add untagged_addr definition for other arches andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-29 14:49 ` khalid.aziz
2019-05-29 14:49 ` Khalid Aziz
2019-05-06 16:30 ` [PATCH v15 02/17] arm64: untag user pointers in access_ok and __uaccess_mask_ptr andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-06 16:30 ` [PATCH v15 03/17] lib, arm64: untag user pointers in strn*_user andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-22 10:41 ` catalin.marinas
2019-05-22 10:41 ` Catalin Marinas
2019-05-06 16:30 ` [PATCH v15 04/17] mm: add ksys_ wrappers to memory syscalls andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-22 10:56 ` catalin.marinas
2019-05-22 10:56 ` Catalin Marinas
2019-05-06 16:30 ` [PATCH v15 05/17] arms64: untag user pointers passed " andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-22 11:49 ` catalin.marinas
2019-05-22 11:49 ` Catalin Marinas
2019-05-22 21:16 ` eugenis
2019-05-22 21:16 ` Evgenii Stepanov
2019-05-23 9:04 ` catalin.marinas
2019-05-23 9:04 ` Catalin Marinas
2019-05-24 4:23 ` eugenis
2019-05-24 4:23 ` Evgenii Stepanov
2019-05-24 15:41 ` andrew.murray
2019-05-24 15:41 ` Andrew Murray
2019-05-25 9:57 ` catalin.marinas
2019-05-25 9:57 ` Catalin Marinas
2019-05-27 9:42 ` catalin.marinas
2019-05-27 9:42 ` Catalin Marinas
2019-05-27 14:37 ` catalin.marinas
2019-05-27 14:37 ` Catalin Marinas
2019-05-28 14:54 ` andrew.murray
2019-05-28 14:54 ` Andrew Murray
2019-05-28 15:40 ` catalin.marinas
2019-05-28 15:40 ` Catalin Marinas
2019-05-28 15:56 ` Dave.Martin
2019-05-28 15:56 ` Dave Martin
2019-05-28 16:34 ` catalin.marinas
2019-05-28 16:34 ` Catalin Marinas
2019-05-29 12:42 ` Dave.Martin
2019-05-29 12:42 ` Dave Martin
2019-05-29 13:23 ` catalin.marinas
2019-05-29 13:23 ` Catalin Marinas
2019-05-29 15:18 ` Dave.Martin
2019-05-29 15:18 ` Dave Martin
2019-05-28 23:33 ` khalid.aziz
2019-05-28 23:33 ` Khalid Aziz
2019-05-29 14:20 ` catalin.marinas
2019-05-29 14:20 ` Catalin Marinas
2019-05-29 19:16 ` khalid.aziz
2019-05-29 19:16 ` Khalid Aziz
2019-05-30 15:11 ` catalin.marinas
2019-05-30 15:11 ` Catalin Marinas
2019-05-30 16:05 ` khalid.aziz
2019-05-30 16:05 ` Khalid Aziz
2019-05-30 16:57 ` catalin.marinas
2019-05-30 16:57 ` Catalin Marinas
2019-05-28 13:05 ` catalin.marinas
2019-05-28 13:05 ` Catalin Marinas
2019-05-06 16:30 ` [PATCH v15 06/17] mm: untag user pointers in do_pages_move andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-22 11:51 ` catalin.marinas
2019-05-22 11:51 ` Catalin Marinas
2019-05-06 16:30 ` [PATCH v15 07/17] mm, arm64: untag user pointers in mm/gup.c andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-22 11:56 ` catalin.marinas
2019-05-22 11:56 ` Catalin Marinas
2019-05-06 16:30 ` [PATCH v15 08/17] mm, arm64: untag user pointers in get_vaddr_frames andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-06 16:30 ` [PATCH v15 09/17] fs, arm64: untag user pointers in copy_mount_options andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-22 12:09 ` catalin.marinas
2019-05-22 12:09 ` Catalin Marinas
2019-05-06 16:30 ` [PATCH v15 10/17] fs, arm64: untag user pointers in fs/userfaultfd.c andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-06 16:30 ` [PATCH v15 11/17] drm/amdgpu, arm64: untag user pointers andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-07 16:43 ` Felix.Kuehling
2019-05-07 16:43 ` Kuehling, Felix
2019-05-06 16:30 ` [PATCH v15 12/17] drm/radeon, arm64: untag user pointers in radeon_gem_userptr_ioctl andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-07 16:44 ` Felix.Kuehling
2019-05-07 16:44 ` Kuehling, Felix
2019-05-06 16:30 ` [PATCH v15 13/17] IB, arm64: untag user pointers in ib_uverbs_(re)reg_mr() andreyknvl
2019-05-06 16:30 ` Andrey Konovalov
2019-05-06 19:50 ` jgg
2019-05-06 19:50 ` Jason Gunthorpe
2019-05-07 6:33 ` leon
2019-05-07 6:33 ` Leon Romanovsky
2019-05-06 16:31 ` [PATCH v15 14/17] media/v4l2-core, arm64: untag user pointers in videobuf_dma_contig_user_get andreyknvl
2019-05-06 16:31 ` Andrey Konovalov
2019-05-24 13:13 ` mchehab+samsung
2019-05-24 13:13 ` Mauro Carvalho Chehab
2019-05-06 16:31 ` [PATCH v15 15/17] tee, arm64: untag user pointers in tee_shm_register andreyknvl
2019-05-06 16:31 ` Andrey Konovalov
2019-05-06 16:31 ` [PATCH v15 16/17] vfio/type1, arm64: untag user pointers in vaddr_get_pfn andreyknvl
2019-05-06 16:31 ` Andrey Konovalov
2019-05-06 16:31 ` [PATCH v15 17/17] selftests, arm64: add a selftest for passing tagged pointers to kernel andreyknvl
2019-05-06 16:31 ` Andrey Konovalov
2019-05-22 14:16 ` catalin.marinas
2019-05-22 14:16 ` Catalin Marinas
2019-05-31 14:21 ` andreyknvl
2019-05-31 14:21 ` Andrey Konovalov
2019-05-31 16:22 ` catalin.marinas
2019-05-31 16:22 ` Catalin Marinas
2019-05-17 14:49 ` [PATCH v15 00/17] arm64: untag user pointers passed to the kernel catalin.marinas
2019-05-17 14:49 ` Catalin Marinas
2019-05-20 23:53 ` eugenis
2019-05-20 23:53 ` Evgenii Stepanov
2019-05-21 18:29 ` catalin.marinas
2019-05-21 18:29 ` Catalin Marinas
2019-05-22 0:04 ` keescook
2019-05-22 0:04 ` Kees Cook
2019-05-22 10:11 ` catalin.marinas
2019-05-22 10:11 ` Catalin Marinas
2019-05-22 15:30 ` enh
2019-05-22 15:30 ` enh
2019-05-22 16:35 ` catalin.marinas
2019-05-22 16:35 ` Catalin Marinas
2019-05-22 16:58 ` enh
2019-05-22 16:58 ` enh
2019-05-23 15:21 ` catalin.marinas
2019-05-23 15:21 ` Catalin Marinas
2019-05-22 20:47 ` keescook
2019-05-22 20:47 ` Kees Cook
2019-05-22 23:03 ` eugenis
2019-05-22 23:03 ` Evgenii Stepanov
2019-05-22 23:09 ` enh
2019-05-22 23:09 ` enh
2019-05-23 7:34 ` catalin.marinas
2019-05-23 7:34 ` Catalin Marinas
2019-05-23 14:44 ` catalin.marinas
2019-05-23 14:44 ` Catalin Marinas
2019-05-23 15:44 ` enh
2019-05-23 15:44 ` enh
2019-05-23 17:00 ` catalin.marinas
2019-05-23 17:00 ` Catalin Marinas
2019-05-23 16:38 ` keescook
2019-05-23 16:38 ` Kees Cook
2019-05-23 17:43 ` catalin.marinas
2019-05-23 17:43 ` Catalin Marinas
2019-05-23 21:31 ` keescook
2019-05-23 21:31 ` Kees Cook
2019-05-24 11:20 ` catalin.marinas
2019-05-24 11:20 ` Catalin Marinas
2019-05-28 17:02 ` catalin.marinas
2019-05-28 17:02 ` Catalin Marinas
2019-06-02 5:06 ` keescook
2019-06-02 5:06 ` Kees Cook
2019-05-22 19:21 ` keescook
2019-05-22 19:21 ` Kees Cook
2019-05-22 20:15 ` enh
2019-05-22 20:15 ` enh
2019-05-23 15:08 ` catalin.marinas
2019-05-23 15:08 ` Catalin Marinas
2019-05-23 17:51 ` khalid.aziz
2019-05-23 17:51 ` Khalid Aziz
2019-05-23 20:11 ` catalin.marinas
2019-05-23 20:11 ` Catalin Marinas
2019-05-23 21:42 ` khalid.aziz
2019-05-23 21:42 ` Khalid Aziz
2019-05-23 21:49 ` khalid.aziz [this message]
2019-05-23 21:49 ` Khalid Aziz
2019-05-24 10:11 ` catalin.marinas
2019-05-24 10:11 ` Catalin Marinas
2019-05-24 14:25 ` khalid.aziz
2019-05-24 14:25 ` Khalid Aziz
2019-05-28 14:14 ` andreyknvl
2019-05-28 14:14 ` Andrey Konovalov
2019-05-29 6:11 ` hch
2019-05-29 6:11 ` Christoph Hellwig
2019-05-29 12:12 ` catalin.marinas
2019-05-29 12:12 ` Catalin Marinas
2019-05-30 17:15 ` catalin.marinas
2019-05-30 17:15 ` Catalin Marinas
2019-05-31 14:29 ` andreyknvl
2019-05-31 14:29 ` Andrey Konovalov
2019-05-31 16:19 ` catalin.marinas
2019-05-31 16:19 ` Catalin Marinas
2019-05-31 16:24 ` andreyknvl
2019-05-31 16:24 ` Andrey Konovalov
2019-05-31 16:46 ` catalin.marinas
2019-05-31 16:46 ` Catalin Marinas
2019-05-21 18:48 ` jgg
2019-05-21 18:48 ` Jason Gunthorpe
2019-05-22 13:49 ` Dave.Martin
2019-05-22 13:49 ` Dave Martin
2019-05-23 0:20 ` jgg
2019-05-23 0:20 ` Jason Gunthorpe
2019-05-23 10:42 ` Dave.Martin
2019-05-23 10:42 ` Dave Martin
2019-05-23 16:57 ` catalin.marinas
2019-05-23 16:57 ` Catalin Marinas
2019-05-24 14:23 ` Dave.Martin
2019-05-24 14:23 ` Dave Martin
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=ffe58af3-7c70-d559-69f6-1f6ebcb0fec6@oracle.com \
--to=linux-kselftest@vger.kernel.org \
/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