tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

WasmSignalHandlers.h (2802B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 *
      4 * Copyright 2014 Mozilla Foundation
      5 *
      6 * Licensed under the Apache License, Version 2.0 (the "License");
      7 * you may not use this file except in compliance with the License.
      8 * You may obtain a copy of the License at
      9 *
     10 *     http://www.apache.org/licenses/LICENSE-2.0
     11 *
     12 * Unless required by applicable law or agreed to in writing, software
     13 * distributed under the License is distributed on an "AS IS" BASIS,
     14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15 * See the License for the specific language governing permissions and
     16 * limitations under the License.
     17 */
     18 
     19 #ifndef wasm_signal_handlers_h
     20 #define wasm_signal_handlers_h
     21 
     22 #include "js/ProfilingFrameIterator.h"
     23 #include "wasm/WasmProcess.h"
     24 
     25 namespace js {
     26 namespace wasm {
     27 
     28 using RegisterState = JS::ProfilingFrameIterator::RegisterState;
     29 
     30 // This function performs the low-overhead signal handler initialization that we
     31 // want to do eagerly to ensure a more-deterministic global process state. This
     32 // is especially relevant for signal handlers since handler ordering depends on
     33 // installation order: the wasm signal handler must run *before* the other crash
     34 // handlers (breakpad) and since POSIX signal handlers work LIFO, this function
     35 // needs to be called at the end of the startup process, after the other two
     36 // handlers have been installed. Currently, this is achieved by having
     37 // JSRuntime() call this function. There can be multiple JSRuntimes per process
     38 // so this function can thus be called multiple times, having no effect after
     39 // the first call.
     40 void EnsureEagerProcessSignalHandlers();
     41 
     42 // Assuming EnsureEagerProcessSignalHandlers() has already been called,
     43 // this function performs the full installation of signal handlers which must
     44 // be performed per-thread/JSContext. This operation may incur some overhead and
     45 // so should be done only when needed to use wasm. Currently, this is done in
     46 // wasm::HasPlatformSupport() which is called when deciding whether to expose
     47 // the 'WebAssembly' object on the global object.
     48 bool EnsureFullSignalHandlers(JSContext* cx);
     49 
     50 // Return whether, with the given simulator register state, a memory access to
     51 // 'addr' of size 'numBytes' needs to trap and, if so, where the simulator
     52 // should redirect pc to.
     53 bool MemoryAccessTraps(const RegisterState& regs, uint8_t* addr,
     54                       uint32_t numBytes, uint8_t** newPC);
     55 
     56 // Return whether, with the given simulator register state, an illegal
     57 // instruction fault is expected and, if so, the value of the next PC.
     58 bool HandleIllegalInstruction(const RegisterState& regs, uint8_t** newPC);
     59 
     60 }  // namespace wasm
     61 }  // namespace js
     62 
     63 #endif  // wasm_signal_handlers_h