Changeset 238388 in webkit


Ignore:
Timestamp:
Nov 19, 2018 6:16:31 PM (5 years ago)
Author:
achristensen@apple.com
Message:

Add SPI to disable JIT in a WKWebView
https://bugs.webkit.org/show_bug.cgi?id=191822
<rdar://problem/28119360>

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

  • jit/ExecutableAllocator.cpp:

(JSC::jitDisabled):
(JSC::allowJIT):
(JSC::ExecutableAllocator::setJITEnabled):

  • jit/ExecutableAllocator.h:

(JSC::ExecutableAllocator::setJITEnabled):

Source/WebKit:

  • Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.h:

(WebKit::XPCServiceInitializer):

  • UIProcess/API/APIProcessPoolConfiguration.h:
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _canUseJIT:]):

  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
  • UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:

(-[_WKProcessPoolConfiguration enableJIT]):
(-[_WKProcessPoolConfiguration setEnableJIT:]):

  • UIProcess/Launcher/ProcessLauncher.h:

(WebKit::ProcessLauncher::Client::enableJIT const):

  • UIProcess/Launcher/mac/ProcessLauncherMac.mm:

(WebKit::ProcessLauncher::launchProcess):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::canUseJIT):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::enableJIT const):

  • UIProcess/WebProcessProxy.h:

(WebKit::WebProcessProxy::processPool const):
(WebKit::WebProcessProxy::processPool): Deleted.

  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::canUseJIT):

  • WebProcess/WebProcess.h:
  • WebProcess/WebProcess.messages.in:

Tools:

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKitCocoa/DisableJIT.mm: Added.

(TEST):

Location:
trunk
Files:
1 added
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r238386 r238388  
     12018-11-19  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to disable JIT in a WKWebView
     4        https://bugs.webkit.org/show_bug.cgi?id=191822
     5        <rdar://problem/28119360>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        * jit/ExecutableAllocator.cpp:
     10        (JSC::jitDisabled):
     11        (JSC::allowJIT):
     12        (JSC::ExecutableAllocator::setJITEnabled):
     13        * jit/ExecutableAllocator.h:
     14        (JSC::ExecutableAllocator::setJITEnabled):
     15
    1162018-11-19  Fujii Hironori  <Hironori.Fujii@sony.com>
    217
  • trunk/Source/JavaScriptCore/jit/ExecutableAllocator.cpp

    r237400 r238388  
    114114#endif
    115115
    116 static bool allowJIT()
     116class FixedVMPoolExecutableAllocator;
     117static FixedVMPoolExecutableAllocator* allocator = nullptr;
     118static ExecutableAllocator* executableAllocator = nullptr;
     119
     120static bool s_isJITEnabled = true;
     121static bool isJITEnabled()
    117122{
    118123#if PLATFORM(IOS_FAMILY) && (CPU(ARM64) || CPU(ARM))
    119     return processHasEntitlement("dynamic-codesigning");
     124    return processHasEntitlement("dynamic-codesigning") && s_isJITEnabled;
    120125#else
    121     return true;
     126    return s_isJITEnabled;
     127#endif
     128}
     129
     130void ExecutableAllocator::setJITEnabled(bool enabled)
     131{
     132    ASSERT(!allocator);
     133    if (s_isJITEnabled == enabled)
     134        return;
     135
     136    s_isJITEnabled = enabled;
     137
     138#if PLATFORM(IOS_FAMILY) && (CPU(ARM64) || CPU(ARM))
     139    if (!enabled) {
     140        constexpr size_t size = 1;
     141        constexpr int protection = PROT_READ | PROT_WRITE | PROT_EXEC;
     142        constexpr int flags = MAP_PRIVATE | MAP_ANON | MAP_JIT;
     143        constexpr int fd = OSAllocator::JSJITCodePages;
     144        void* allocation = mmap(nullptr, size, protection, flags, fd, 0);
     145        const void* executableMemoryAllocationFailure = reinterpret_cast<void*>(-1);
     146        RELEASE_ASSERT_WITH_MESSAGE(allocation && allocation != executableMemoryAllocationFailure, "We should not have allocated executable memory before disabling the JIT.");
     147        RELEASE_ASSERT_WITH_MESSAGE(!munmap(allocation, size), "Unmapping executable memory should succeed so we do not have any executable memory in the address space");
     148        RELEASE_ASSERT_WITH_MESSAGE(mmap(nullptr, size, protection, flags, fd, 0) == executableMemoryAllocationFailure, "Allocating executable memory should fail after setJITEnabled(false) is called.");
     149    }
    122150#endif
    123151}
     
    129157        : MetaAllocator(jitAllocationGranule) // round up all allocations to 32 bytes
    130158    {
    131         if (!allowJIT())
     159        if (!isJITEnabled())
    132160            return;
    133161
     
    376404    MacroAssemblerCodePtr<ExecutableMemoryPtrTag> m_memoryEnd;
    377405};
    378 
    379 static FixedVMPoolExecutableAllocator* allocator;
    380 static ExecutableAllocator* executableAllocator;
    381406
    382407void ExecutableAllocator::initializeAllocator()
  • trunk/Source/JavaScriptCore/jit/ExecutableAllocator.h

    r237266 r238388  
    141141    static void dumpProfile() { }
    142142#endif
     143   
     144    JS_EXPORT_PRIVATE static void setJITEnabled(bool);
    143145
    144146    RefPtr<ExecutableMemoryHandle> allocate(size_t sizeInBytes, void* ownerUID, JITCompilationEffort);
     
    174176    RefPtr<ExecutableMemoryHandle> allocate(size_t, void*, JITCompilationEffort) { return nullptr; }
    175177
     178    static void setJITEnabled(bool) { };
     179   
    176180    bool isValidExecutableMemory(const AbstractLocker&, void*) { return false; }
    177181
  • trunk/Source/WebKit/ChangeLog

    r238387 r238388  
     12018-11-19  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to disable JIT in a WKWebView
     4        https://bugs.webkit.org/show_bug.cgi?id=191822
     5        <rdar://problem/28119360>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        * Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.h:
     10        (WebKit::XPCServiceInitializer):
     11        * UIProcess/API/APIProcessPoolConfiguration.h:
     12        * UIProcess/API/Cocoa/WKWebView.mm:
     13        (-[WKWebView _canUseJIT:]):
     14        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
     15        * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
     16        * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
     17        (-[_WKProcessPoolConfiguration enableJIT]):
     18        (-[_WKProcessPoolConfiguration setEnableJIT:]):
     19        * UIProcess/Launcher/ProcessLauncher.h:
     20        (WebKit::ProcessLauncher::Client::enableJIT const):
     21        * UIProcess/Launcher/mac/ProcessLauncherMac.mm:
     22        (WebKit::ProcessLauncher::launchProcess):
     23        * UIProcess/WebPageProxy.cpp:
     24        (WebKit::WebPageProxy::canUseJIT):
     25        * UIProcess/WebPageProxy.h:
     26        * UIProcess/WebProcessProxy.cpp:
     27        (WebKit::WebProcessProxy::enableJIT const):
     28        * UIProcess/WebProcessProxy.h:
     29        (WebKit::WebProcessProxy::processPool const):
     30        (WebKit::WebProcessProxy::processPool): Deleted.
     31        * WebProcess/WebProcess.cpp:
     32        (WebKit::WebProcess::canUseJIT):
     33        * WebProcess/WebProcess.h:
     34        * WebProcess/WebProcess.messages.in:
     35
    1362018-11-19  Basuke Suzuki  <basuke.suzuki@sony.com>
    237
  • trunk/Source/WebKit/Scripts/webkit/messages.py

    r238330 r238388  
    191191
    192192    for message in receiver.messages:
    193         if message.reply_parameters != None and message.has_attribute(DELAYED_ATTRIBUTE):
     193        if message.reply_parameters != None:
    194194            headers.add('<wtf/ThreadSafeRefCounted.h>')
    195195            types_by_namespace['IPC'].update([('class', 'Connection')])
  • trunk/Source/WebKit/Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.h

    r237703 r238388  
    2424 */
    2525
    26 #ifndef XPCServiceEntryPoint_h
    27 #define XPCServiceEntryPoint_h
     26#pragma once
    2827
    2928#import "ChildProcess.h"
    3029#import "WebKit2Initialize.h"
     30#import <JavaScriptCore/ExecutableAllocator.h>
    3131#import <wtf/OSObjectPtr.h>
    3232#import <wtf/spi/darwin/XPCSPI.h>
     
    7171void XPCServiceInitializer(OSObjectPtr<xpc_connection_t> connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage)
    7272{
     73    if (initializerMessage && xpc_dictionary_get_bool(initializerMessage, "disable-jit"))
     74        JSC::ExecutableAllocator::setJITEnabled(false);
     75
    7376    XPCServiceInitializerDelegateType delegate(WTFMove(connection), initializerMessage);
    7477
     
    125128
    126129} // namespace WebKit
    127 
    128 #endif // XPCServiceEntryPoint_h
  • trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp

    r238183 r238388  
    117117    copy->m_shouldCaptureAudioInUIProcess = this->m_shouldCaptureAudioInUIProcess;
    118118    copy->m_shouldCaptureDisplayInUIProcess = this->m_shouldCaptureDisplayInUIProcess;
     119    copy->m_isJITEnabled = this->m_isJITEnabled;
    119120#if PLATFORM(IOS_FAMILY)
    120121    copy->m_ctDataConnectionServiceType = this->m_ctDataConnectionServiceType;
  • trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h

    r238294 r238388  
    148148    void setShouldCaptureDisplayInUIProcess(bool shouldCaptureDisplayInUIProcess) { m_shouldCaptureDisplayInUIProcess = shouldCaptureDisplayInUIProcess; }
    149149
     150    bool isJITEnabled() const { return m_isJITEnabled; }
     151    void setJITEnabled(bool enabled) { m_isJITEnabled = enabled; }
     152   
    150153#if PLATFORM(IOS_FAMILY)
    151154    const WTF::String& ctDataConnectionServiceType() const { return m_ctDataConnectionServiceType; }
     
    221224    std::optional<bool> m_isAutomaticProcessWarmingEnabledByClient;
    222225    WTF::String m_customWebContentServiceBundleIdentifier;
     226    bool m_isJITEnabled { true };
    223227
    224228#if PLATFORM(IOS_FAMILY)
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r238342 r238388  
    47694769}
    47704770
     4771- (void)_isJITEnabled:(void(^)(BOOL))completionHandler
     4772{
     4773    _page->isJITEnabled([completionHandler = makeBlockPtr(completionHandler)] (bool enabled) {
     4774        completionHandler(enabled);
     4775    });
     4776}
     4777
    47714778- (void)_evaluateJavaScriptWithoutUserGesture:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler
    47724779{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r238342 r238388  
    193193- (void)_showSafeBrowsingWarningWithTitle:(NSString *)title warning:(NSString *)warning details:(NSAttributedString *)details completionHandler:(void(^)(BOOL))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    194194
     195- (void)_isJITEnabled:(void(^)(BOOL))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    195196- (IBAction)_alignCenter:(id)sender WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    196197- (IBAction)_alignJustified:(id)sender WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h

    r235961 r238388  
    6969@property (nonatomic) BOOL pageCacheEnabled WK_API_AVAILABLE(macosx(10.14), ios(12.0));
    7070@property (nonatomic) BOOL suppressesConnectionTerminationOnSystemChange WK_API_AVAILABLE(macosx(10.14), ios(12.0));
     71@property (nonatomic, getter=isJITEnabled) BOOL JITEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    7172
    7273@end
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm

    r237266 r238388  
    299299}
    300300
     301- (BOOL)isJITEnabled
     302{
     303    return _processPoolConfiguration->isJITEnabled();
     304}
     305
     306- (void)setJITEnabled:(BOOL)enabled
     307{
     308    _processPoolConfiguration->setJITEnabled(enabled);
     309}
     310
    301311- (void)setSuppressesConnectionTerminationOnSystemChange:(BOOL)suppressesConnectionTerminationOnSystemChange
    302312{
  • trunk/Source/WebKit/UIProcess/Launcher/ProcessLauncher.h

    r237154 r238388  
    4949       
    5050        virtual void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) = 0;
     51        virtual bool isJITEnabled() const { return true; }
    5152    };
    5253   
  • trunk/Source/WebKit/UIProcess/Launcher/mac/ProcessLauncherMac.mm

    r238341 r238388  
    174174    // FIXME: Switch to xpc_connection_set_bootstrap once it's available everywhere we need.
    175175    auto bootstrapMessage = adoptOSObject(xpc_dictionary_create(nullptr, nullptr, 0));
     176   
     177    if (m_client && !m_client->isJITEnabled())
     178        xpc_dictionary_set_bool(bootstrapMessage.get(), "disable-jit", true);
     179
    176180    xpc_dictionary_set_string(bootstrapMessage.get(), "message-name", "bootstrap");
    177181
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r238368 r238388  
    65346534}
    65356535
     6536void WebPageProxy::isJITEnabled(CompletionHandler<void(bool)>&& completionHandler)
     6537{
     6538    m_process->connection()->sendWithAsyncReply(Messages::WebProcess::IsJITEnabled(), WTFMove(completionHandler));
     6539}
     6540
    65366541void WebPageProxy::enterAcceleratedCompositingMode(const LayerTreeContext& layerTreeContext)
    65376542{
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r238353 r238388  
    874874    bool paginationLineGridEnabled() const { return m_paginationLineGridEnabled; }
    875875    unsigned pageCount() const { return m_pageCount; }
    876        
     876
     877    void isJITEnabled(CompletionHandler<void(bool)>&&);
     878
    877879#if PLATFORM(MAC)
    878880    void setUseSystemAppearance(bool);
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r238332 r238388  
    12221222}
    12231223
     1224bool WebProcessProxy::isJITEnabled() const
     1225{
     1226    return processPool().configuration().isJITEnabled();
     1227}
     1228
    12241229void WebProcessProxy::didReceiveMainThreadPing()
    12251230{
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.h

    r238335 r238388  
    111111    WebConnection* webConnection() const { return m_webConnection.get(); }
    112112
    113     WebProcessPool& processPool() { ASSERT(m_processPool); return *m_processPool.get(); }
     113    WebProcessPool& processPool() const { ASSERT(m_processPool); return *m_processPool.get(); }
    114114
    115115    // FIXME: WebsiteDataStores should be made per-WebPageProxy throughout WebKit2
     
    259259#endif
    260260
     261    bool isJITEnabled() const final;
     262   
    261263private:
    262264    // IPC message handlers.
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r238332 r238388  
    931931}
    932932
     933void WebProcess::isJITEnabled(CompletionHandler<void(bool)>&& completionHandler)
     934{
     935    completionHandler(JSC::VM::canUseJIT());
     936}
     937
    933938void WebProcess::clearPluginClientPolicies()
    934939{
  • trunk/Source/WebKit/WebProcess/WebProcess.h

    r238332 r238388  
    205205    void sendPrewarmInformation(const WebCore::URL&);
    206206
     207    void isJITEnabled(CompletionHandler<void(bool)>&&);
     208
    207209#if PLATFORM(IOS_FAMILY)
    208210    void resetAllGeolocationPermissions();
  • trunk/Source/WebKit/WebProcess/WebProcess.messages.in

    r238332 r238388  
    142142#endif
    143143
     144    IsJITEnabled() -> (bool enabled) Async
     145
    144146#if PLATFORM(COCOA)
    145147    SetMediaMIMETypes(Vector<String> types)
  • trunk/Tools/ChangeLog

    r238387 r238388  
     12018-11-19  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SPI to disable JIT in a WKWebView
     4        https://bugs.webkit.org/show_bug.cgi?id=191822
     5        <rdar://problem/28119360>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     10        * TestWebKitAPI/Tests/WebKitCocoa/DisableJIT.mm: Added.
     11        (TEST):
     12
    1132018-11-19  Basuke Suzuki  <basuke.suzuki@sony.com>
    214
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r238368 r238388  
    273273                57F4AAA0208FAEF000A68E9E /* SSLKeyGenerator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 57F4AA9F208FA83D00A68E9E /* SSLKeyGenerator.mm */; };
    274274                57F56A5C1C7F8CC100F31D7E /* IsNavigationActionTrusted.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 57F56A5B1C7F8A4000F31D7E /* IsNavigationActionTrusted.html */; };
     275                5C0160C121A132460077FA32 /* JITEnabled.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C0160C021A132320077FA32 /* JITEnabled.mm */; };
    275276                5C0BF88D1DD5964D00B00328 /* MemoryPressureHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C0BF88C1DD5957400B00328 /* MemoryPressureHandler.mm */; };
    276277                5C0BF8911DD599A900B00328 /* WebViewCanPasteZeroPng.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C0BF88F1DD5999B00B00328 /* WebViewCanPasteZeroPng.mm */; };
     
    16071608                57F4AA9F208FA83D00A68E9E /* SSLKeyGenerator.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SSLKeyGenerator.mm; sourceTree = "<group>"; };
    16081609                57F56A5B1C7F8A4000F31D7E /* IsNavigationActionTrusted.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = IsNavigationActionTrusted.html; sourceTree = "<group>"; };
     1610                5C0160C021A132320077FA32 /* JITEnabled.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = JITEnabled.mm; sourceTree = "<group>"; };
    16091611                5C0BF88C1DD5957400B00328 /* MemoryPressureHandler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MemoryPressureHandler.mm; sourceTree = "<group>"; };
    16101612                5C0BF88F1DD5999B00B00328 /* WebViewCanPasteZeroPng.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebViewCanPasteZeroPng.mm; sourceTree = "<group>"; };
     
    24252427                                2DB0232E1E4E871800707123 /* InteractionDeadlockAfterCrash.mm */,
    24262428                                5C69BDD41F82A7EB000F4F4B /* JavaScriptDuringNavigation.mm */,
     2429                                5C0160C021A132320077FA32 /* JITEnabled.mm */,
    24272430                                C25CCA051E51380B0026CB8A /* LineBreaking.mm */,
    24282431                                37D36ED61AF42ECD00BAF5D9 /* LoadAlternateHTMLString.mm */,
     
    39533956                                7CCE7EAD1A411A3400447C4C /* JavaScriptTest.cpp in Sources */,
    39543957                                7CCE7EA51A411A0800447C4C /* JavaScriptTestMac.mm in Sources */,
     3958                                5C0160C121A132460077FA32 /* JITEnabled.mm in Sources */,
    39553959                                7CCE7EC41A411A7E00447C4C /* JSWrapperForNodeInWebFrame.mm in Sources */,
    39563960                                F45E15732112CE2900307E82 /* KeyboardInputTestsIOS.mm in Sources */,
Note: See TracChangeset for help on using the changeset viewer.