v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
trap-handler-internal.h
Go to the documentation of this file.
1// Copyright 2016 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#ifndef V8_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_
6#define V8_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_
7
8// This file should not be included (even transitively) by files outside of
9// src/trap-handler.
10
12
13#include <atomic>
14
15namespace v8 {
16namespace internal {
17namespace trap_handler {
18
19// This describes a chunk of code that the trap handler will be able to handle
20// faults in. {base} points to the beginning of the chunk, and {size} is the
21// number of bytes in the code chunk. The remainder of the struct is a list of
22// protected memory access instructions and an offset to a landing pad to handle
23// faults on that instruction.
25 uintptr_t base;
26 size_t size;
28 ProtectedInstructionData instructions[1];
29};
30
32 static std::atomic_flag spinlock_;
33
34 public:
37
38 MetadataLock(const MetadataLock&) = delete;
39 void operator=(const MetadataLock&) = delete;
40};
41
42// To enable constant time registration of handler data, we keep a free list of
43// entries in the gCodeObjects table. Each entry contains a {next_free} field,
44// which can be used to figure out where the next entry should be inserted.
45// In order to avoid having to initialize all the links to start with, we use
46// 0 to indicate that this is a fresh, never-used list entry and that therefore
47// the next entry is known to be free. If {next_entry} is greater than zero,
48// then {next_entry - 1} is the index that we should insert into next.
53
54extern size_t gNumCodeObjects;
56
57// This list describes sandboxes as bases and sizes.
59 uintptr_t base;
60 size_t size;
62};
63
65 static std::atomic_flag spinlock_;
66
67 public:
70
72 void operator=(const SandboxRecordsLock&) = delete;
73};
74
76
77extern std::atomic_size_t gRecoveredTrapCount;
78
79extern std::atomic<uintptr_t> gLandingPad;
80
81// Searches the fault location table for an entry matching fault_addr. If found,
82// returns true, otherwise, returns false.
83bool IsFaultAddressCovered(uintptr_t fault_addr);
84
85// Checks whether the accessed memory is covered by the trap handler. In
86// particular, when the V8 sandbox is enabled, only faulting accesses to memory
87// inside the sandbox are handled by the trap handler since all Wasm memory
88// objects are inside the sandbox.
89bool IsAccessedMemoryCovered(uintptr_t accessed_addr);
90
91} // namespace trap_handler
92} // namespace internal
93} // namespace v8
94
95#endif // V8_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_
MetadataLock(const MetadataLock &)=delete
void operator=(const MetadataLock &)=delete
void operator=(const SandboxRecordsLock &)=delete
SandboxRecordsLock(const SandboxRecordsLock &)=delete
SandboxRecord * gSandboxRecordsHead
bool IsFaultAddressCovered(uintptr_t fault_addr)
CodeProtectionInfoListEntry * gCodeObjects
std::atomic< uintptr_t > gLandingPad
std::atomic_size_t gRecoveredTrapCount
bool IsAccessedMemoryCovered(uintptr_t accessed_addr)