v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
handler-shared.cc
Go to the documentation of this file.
1// Copyright 2017 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// PLEASE READ BEFORE CHANGING THIS FILE!
6//
7// This file contains code that is used both inside and outside the out of
8// bounds trap handler. Because this code runs in a trap handler context,
9// use extra care when modifying this file. Here are some rules to follow.
10//
11// 1. Do not introduce any new external dependencies. This file needs
12// to be self contained so it is easy to audit everything that a
13// trap handler might do.
14//
15// 2. Any changes must be reviewed by someone from the crash reporting
16// or security team. See OWNERS for suggested reviewers.
17//
18// For more information, see https://goo.gl/yMeyUY.
19
21
22namespace v8 {
23namespace internal {
24namespace trap_handler {
25
26// We declare this as int rather than bool as a workaround for a glibc bug, in
27// which the dynamic loader cannot handle executables whose TLS area is only
28// 1 byte in size; see https://sourceware.org/bugzilla/show_bug.cgi?id=14898.
29thread_local int g_thread_in_wasm_code;
30
31static_assert(sizeof(g_thread_in_wasm_code) > 1,
32 "sizeof(thread_local_var) must be > 1, see "
33 "https://sourceware.org/bugzilla/show_bug.cgi?id=14898");
34
35size_t gNumCodeObjects = 0;
38std::atomic_size_t gRecoveredTrapCount = {0};
39std::atomic<uintptr_t> gLandingPad = {0};
40
41#if !defined(__cpp_lib_atomic_value_initialization) || \
42 __cpp_lib_atomic_value_initialization < 201911L
43std::atomic_flag MetadataLock::spinlock_ = ATOMIC_FLAG_INIT;
44std::atomic_flag SandboxRecordsLock::spinlock_ = ATOMIC_FLAG_INIT;
45#else
46std::atomic_flag MetadataLock::spinlock_;
47std::atomic_flag SandboxRecordsLock::spinlock_;
48#endif
49
52 abort();
53 }
54
55 while (spinlock_.test_and_set(std::memory_order_acquire)) {
56 }
57}
58
61 abort();
62 }
63
64 spinlock_.clear(std::memory_order_release);
65}
66
68 while (spinlock_.test_and_set(std::memory_order_acquire)) {
69 }
70}
71
73 spinlock_.clear(std::memory_order_release);
74}
75
76} // namespace trap_handler
77} // namespace internal
78} // namespace v8
SandboxRecord * gSandboxRecordsHead
CodeProtectionInfoListEntry * gCodeObjects
thread_local int g_thread_in_wasm_code
std::atomic< uintptr_t > gLandingPad
std::atomic_size_t gRecoveredTrapCount