diff mbox series

util/osdep: Avoid mprotect() RWX->NONE on Big Sur 11.2

Message ID 20210210105527.74943-1-r.bolshakov@yadro.com (mailing list archive)
State New, archived
Headers show
Series util/osdep: Avoid mprotect() RWX->NONE on Big Sur 11.2 | expand

Commit Message

Roman Bolshakov Feb. 10, 2021, 10:55 a.m. UTC
There's a change in mprotect() behaviour [1] in the latest macOS on M1
and it's not yet clear if it's going to be fixed by Apple. For now we
can avoid unsupported mprotect() calls. QEMU and qtests work fine
without it.

1. https://gist.github.com/hikalium/75ae822466ee4da13cbbe486498a191f

Buglink: https://bugs.launchpad.net/qemu/+bug/1914849
Apple-Feedback: FB8994773
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
---
 util/osdep.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Joelle van Dyne March 8, 2021, 6:47 a.m. UTC | #1
On Wed, Feb 10, 2021 at 2:55 AM Roman Bolshakov <r.bolshakov@yadro.com> wrote:
>
> There's a change in mprotect() behaviour [1] in the latest macOS on M1
> and it's not yet clear if it's going to be fixed by Apple. For now we
> can avoid unsupported mprotect() calls. QEMU and qtests work fine
> without it.
>
> 1. https://gist.github.com/hikalium/75ae822466ee4da13cbbe486498a191f
>
> Buglink: https://bugs.launchpad.net/qemu/+bug/1914849
> Apple-Feedback: FB8994773
> Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>

Reviewed-by: Joelle van Dyne <j@getutm.app>

FYI the "macOS 11.2, *" means it applies to all versions of iOS. I
think it only broke in iOS 14.2 but making it return on other versions
seems to be fine from my tests.

-j
Roman Bolshakov March 9, 2021, 1:31 p.m. UTC | #2
On Sun, Mar 07, 2021 at 10:47:06PM -0800, Joelle van Dyne wrote:
> On Wed, Feb 10, 2021 at 2:55 AM Roman Bolshakov <r.bolshakov@yadro.com> wrote:
> >
> > There's a change in mprotect() behaviour [1] in the latest macOS on M1
> > and it's not yet clear if it's going to be fixed by Apple. For now we
> > can avoid unsupported mprotect() calls. QEMU and qtests work fine
> > without it.
> >
> > 1. https://gist.github.com/hikalium/75ae822466ee4da13cbbe486498a191f
> >
> > Buglink: https://bugs.launchpad.net/qemu/+bug/1914849
> > Apple-Feedback: FB8994773
> > Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
> 
> Reviewed-by: Joelle van Dyne <j@getutm.app>
> 

Thanks!

> FYI the "macOS 11.2, *" means it applies to all versions of iOS. I
> think it only broke in iOS 14.2 but making it return on other versions
> seems to be fine from my tests.
> 

Hm... do you know how to say "for macOS 11.2 and above only"?

Regards,
Roman
Richard Henderson March 9, 2021, 2:03 p.m. UTC | #3
On 2/10/21 2:55 AM, Roman Bolshakov wrote:
> There's a change in mprotect() behaviour [1] in the latest macOS on M1
> and it's not yet clear if it's going to be fixed by Apple. For now we
> can avoid unsupported mprotect() calls. QEMU and qtests work fine
> without it.
> 
> 1.https://gist.github.com/hikalium/75ae822466ee4da13cbbe486498a191f

This is an unfortunate OS bug.

But I can use this as an opportunity to tidy up some memory management, and in 
the process go from NONE -> {RX,RW} instead.


r~
Joelle van Dyne March 9, 2021, 6:06 p.m. UTC | #4
On Tue, Mar 9, 2021 at 5:31 AM Roman Bolshakov <r.bolshakov@yadro.com> wrote:
>
> On Sun, Mar 07, 2021 at 10:47:06PM -0800, Joelle van Dyne wrote:
> > On Wed, Feb 10, 2021 at 2:55 AM Roman Bolshakov <r.bolshakov@yadro.com> wrote:
> > >
> > > There's a change in mprotect() behaviour [1] in the latest macOS on M1
> > > and it's not yet clear if it's going to be fixed by Apple. For now we
> > > can avoid unsupported mprotect() calls. QEMU and qtests work fine
> > > without it.
> > >
> > > 1. https://gist.github.com/hikalium/75ae822466ee4da13cbbe486498a191f
> > >
> > > Buglink: https://bugs.launchpad.net/qemu/+bug/1914849
> > > Apple-Feedback: FB8994773
> > > Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
> >
> > Reviewed-by: Joelle van Dyne <j@getutm.app>
> >
>
> Thanks!
>
> > FYI the "macOS 11.2, *" means it applies to all versions of iOS. I
> > think it only broke in iOS 14.2 but making it return on other versions
> > seems to be fine from my tests.
> >
>
> Hm... do you know how to say "for macOS 11.2 and above only"?
>
> Regards,
> Roman

What you have is fine for "macOS 11.2 and above" but the "*" means "OR
any version of any platform not macOS". If you have
"__builtin_available(macOS 11.2, iOS 14.4, *)" would mean macOS 11.2
and above OR iOS 14.4 and above (which is the release aligned with
macOS 11.2, not iOS 14.2 as I originally mistyped) OR any version of
any platform not macOS. However, I think it's fine here as making this
change doesn't break anything on older versions of iOS (or macOS as
well). Btw, there's also tvOS and watchOS which I'm not sure if this
bug applies (I assume yes) but QEMU doesn't run on those platforms
(yet).

-j
diff mbox series

Patch

diff --git a/util/osdep.c b/util/osdep.c
index 66d01b9160..1edd7b1caf 100644
--- a/util/osdep.c
+++ b/util/osdep.c
@@ -111,6 +111,12 @@  int qemu_mprotect_none(void *addr, size_t size)
 #ifdef _WIN32
     return qemu_mprotect__osdep(addr, size, PAGE_NOACCESS);
 #else
+# if defined(__APPLE__) && defined(__arm64__)
+    if (__builtin_available(macOS 11.2, *)) {
+        /* mprotect() in macOS 11.2 can't switch RWX to NONE */
+        return 0;
+    }
+# endif
     return qemu_mprotect__osdep(addr, size, PROT_NONE);
 #endif
 }