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 |
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
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
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~
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 --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 }
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(+)