5#ifndef V8_SANDBOX_SANDBOX_H_
6#define V8_SANDBOX_SANDBOX_H_
14#if V8_ENABLE_WEBASSEMBLY
18#include "testing/gtest/include/gtest/gtest_prod.h"
23#ifdef V8_ENABLE_SANDBOX
64 Sandbox(
const Sandbox&) =
delete;
65 Sandbox& operator=(Sandbox&) =
delete;
72 static constexpr bool kFallbackToPartiallyReservedSandboxAllowed =
true;
98 bool is_initialized()
const {
return initialized_; }
110 bool is_partially_reserved()
const {
return reservation_size_ <
size_; }
120 bool smi_address_range_is_inaccessible()
const {
121 return first_four_gb_of_address_space_are_reserved_;
152 size_t reservation_size()
const {
return reservation_size_; }
160 return address_space_.get();
167 return sandbox_page_allocator_.get();
173 bool Contains(Address addr)
const {
180 bool Contains(
void* ptr)
const {
181 return Contains(
reinterpret_cast<Address>(ptr));
197 bool ReservationContains(Address addr)
const {
198 return base::IsInHalfOpenRange(addr, reservation_base_,
199 reservation_base_ + reservation_size_);
202 class SandboxedPointerConstants final {
204 Address empty_backing_store_buffer()
const {
205 return empty_backing_store_buffer_;
207 Address empty_backing_store_buffer_address()
const {
208 return reinterpret_cast<Address>(&empty_backing_store_buffer_);
210 void set_empty_backing_store_buffer(Address value) {
211 empty_backing_store_buffer_ =
value;
214 void Reset() { empty_backing_store_buffer_ = 0; }
217 Address empty_backing_store_buffer_ = 0;
219 const SandboxedPointerConstants& constants()
const {
return constants_; }
226 static void TearDownDefault();
233#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
234#ifdef USING_V8_SHARED_PRIVATE
235 static Sandbox*
current() {
return current_non_inlined(); }
236 static void set_current(Sandbox* sandbox) {
237 set_current_non_inlined(sandbox);
241 static void set_current(Sandbox* sandbox) {
current_ = sandbox; }
244 static Sandbox*
current() {
return GetDefault(); }
247 V8_INLINE static Sandbox* GetDefault() {
return default_sandbox_; }
252 friend class SequentialUnmapperTest;
255 FRIEND_TEST(SandboxTest, InitializationWithSize);
256 FRIEND_TEST(SandboxTest, PartiallyReservedSandbox);
259 static Sandbox* default_sandbox_;
268 bool use_guard_regions);
277 size_t size_to_reserve);
281 void FinishInitialization();
284 void InitializeConstants();
286#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
289 static Sandbox* current_non_inlined();
290 static void set_current_non_inlined(Sandbox* sandbox);
301 size_t reservation_size_ = 0;
303 bool initialized_ =
false;
305#if V8_ENABLE_WEBASSEMBLY && V8_TRAP_HANDLER_SUPPORTED
306 bool trap_handler_initialized_ =
false;
310 std::unique_ptr<v8::VirtualAddressSpace> address_space_;
313 std::unique_ptr<v8::PageAllocator> sandbox_page_allocator_;
316 SandboxedPointerConstants constants_;
322 static bool first_four_gb_of_address_space_are_reserved_;
324#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
325 thread_local static Sandbox*
current_;
335#ifdef V8_ENABLE_SANDBOX
336 Sandbox* sandbox = Sandbox::current();
339 return sandbox->ReservationContains(address);
346#ifdef V8_ENABLE_SANDBOX
347 return reinterpret_cast<void*
>(
348 Sandbox::current()->constants().empty_backing_store_buffer());
const v8::base::TimeTicks end_
constexpr Address kNullAddress
V8_INLINE void * EmptyBackingStoreBuffer()
V8_INLINE bool InsideSandbox(uintptr_t address)
#define V8_EXPORT_PRIVATE
std::unique_ptr< ValueMirror > value