Thread (222 messages) flat view 222 messages, 21 authors, 2022-11-03

Re: [PATCH v2 22/39] mm: Don't allow write GUPs to shadow stack memory

From: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
Date: 2022-09-30 23:04:34
Also in: linux-arch, linux-doc, linux-mm, lkml

On Sat, 2022-10-01 at 01:00 +0200, Jann Horn wrote:
On Fri, Sep 30, 2022 at 9:16 PM Dave Hansen [off-list ref]
wrote:
quoted
On 9/29/22 15:29, Rick Edgecombe wrote:
quoted
@@ -1633,6 +1633,9 @@ static inline bool
__pte_access_permitted(unsigned long pteval, bool write)
  {
       unsigned long need_pte_bits = _PAGE_PRESENT|_PAGE_USER;

+     if (write && (pteval & (_PAGE_RW | _PAGE_DIRTY)) ==
_PAGE_DIRTY)
+             return 0;
Do we not have a helper for this?  Seems a bit messy to open-code
these
shadow-stack permissions.  Definitely at least needs a comment.
FWIW, if you look at more context around this diff, the function
looks
like this:

 static inline bool __pte_access_permitted(unsigned long pteval, bool
write)
 {
        unsigned long need_pte_bits = _PAGE_PRESENT|_PAGE_USER;

+       if (write && (pteval & (_PAGE_RW | _PAGE_DIRTY)) ==
_PAGE_DIRTY)
+               return 0;
+
        if (write)
                need_pte_bits |= _PAGE_RW;

        if ((pteval & need_pte_bits) != need_pte_bits)
                return 0;

        return __pkru_allows_pkey(pte_flags_pkey(pteval), write);
 }

So I think this change is actually a no-op - the only thing it does
is
to return 0 if write==1, !_PAGE_RW, and _PAGE_DIRTY. But the check
below will always return 0 if !_PAGE_RW, unless I'm misreading it?
And
this is the only patch in the series that touches this function, so
it's not like this becomes necessary with a later patch in the series
either.

Should this check go in anyway for clarity reasons, or should this
instead be a comment explaining that __pte_access_permitted() behaves
just like the hardware access check, which means shadow pages are
treated as readonly?
Thanks Jann, I was just realizing the same thing. Yes, I think it
doesn't do anything. I can add a comment of why there is no check, but
otherwise the check seems like unnecessary work.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help