5#ifndef V8_SANDBOX_TRUSTED_POINTER_TABLE_INL_H_
6#define V8_SANDBOX_TRUSTED_POINTER_TABLE_INL_H_
15#ifdef V8_ENABLE_SANDBOX
20void TrustedPointerTableEntry::MakeTrustedPointerEntry(
Address pointer,
23 auto payload = Payload::ForTrustedPointerEntry(pointer, tag);
24 if (mark_as_alive) payload.SetMarkBit();
25 payload_.store(payload, std::memory_order_relaxed);
28void TrustedPointerTableEntry::MakeFreelistEntry(uint32_t next_entry_index) {
29 auto payload = Payload::ForFreelistEntry(next_entry_index);
30 payload_.store(payload, std::memory_order_relaxed);
33void TrustedPointerTableEntry::MakeZappedEntry() {
34 auto payload = Payload::ForZappedEntry();
35 payload_.store(payload, std::memory_order_relaxed);
39 DCHECK(!IsFreelistEntry());
40 return payload_.load(std::memory_order_relaxed).Untag(tag);
43void TrustedPointerTableEntry::SetPointer(
Address pointer,
45 DCHECK(!IsFreelistEntry());
49 DCHECK(!payload_.load(std::memory_order_relaxed).HasMarkBitSet());
50 auto new_payload = Payload::ForTrustedPointerEntry(pointer, tag);
51 DCHECK(!new_payload.HasMarkBitSet());
52 payload_.store(new_payload, std::memory_order_relaxed);
56 auto payload = payload_.load(std::memory_order_relaxed);
57 if (!payload.ContainsPointer())
return false;
64 CHECK_EQ(tag, kUnpublishedIndirectPointerTag);
66 auto old_payload = payload_.load(std::memory_order_relaxed);
67 auto new_payload = old_payload;
68 new_payload.SetTag(tag);
70 bool success = payload_.compare_exchange_strong(old_payload, new_payload,
71 std::memory_order_relaxed);
72 DCHECK(success || old_payload.IsTaggedWith(kUnpublishedIndirectPointerTag));
76bool TrustedPointerTableEntry::IsFreelistEntry()
const {
77 auto payload = payload_.load(std::memory_order_relaxed);
78 return payload.ContainsFreelistLink();
81uint32_t TrustedPointerTableEntry::GetNextFreelistEntryIndex()
const {
82 return payload_.load(std::memory_order_relaxed).ExtractFreelistLink();
85void TrustedPointerTableEntry::Mark() {
86 auto old_payload = payload_.load(std::memory_order_relaxed);
87 DCHECK(old_payload.ContainsPointer());
89 auto new_payload = old_payload;
90 new_payload.SetMarkBit();
95 bool success = payload_.compare_exchange_strong(old_payload, new_payload,
96 std::memory_order_relaxed);
97 DCHECK(success || old_payload.HasMarkBitSet());
101void TrustedPointerTableEntry::Unmark() {
102 auto payload = payload_.load(std::memory_order_relaxed);
103 payload.ClearMarkBit();
104 payload_.store(payload, std::memory_order_relaxed);
107bool TrustedPointerTableEntry::IsMarked()
const {
108 return payload_.load(std::memory_order_relaxed).HasMarkBitSet();
112 uint32_t index = HandleToIndex(
handle);
113 return at(index).HasPointer(kUnpublishedIndirectPointerTag);
118 uint32_t index = HandleToIndex(
handle);
119#if defined(V8_USE_ADDRESS_SANITIZER)
131 CHECK(index == 0 || at(index).HasPointer(tag));
134 DCHECK(index == 0 || at(index).HasPointer(tag));
136 return at(index).GetPointer(tag);
141 uint32_t index = HandleToIndex(
handle);
142 const TrustedPointerTableEntry& entry = at(index);
143 if (entry.HasPointer(kUnpublishedIndirectPointerTag)) {
144 return entry.GetPointer(kUnpublishedIndirectPointerTag);
146#if defined(V8_USE_ADDRESS_SANITIZER)
148 CHECK(index == 0 || entry.HasPointer(tag));
150 DCHECK(index == 0 || entry.HasPointer(tag));
152 return entry.GetPointer(tag);
158 Validate(pointer, tag);
159 uint32_t index = HandleToIndex(
handle);
160 at(index).SetPointer(pointer, tag);
165 TrustedPointerPublishingScope* scope) {
166 DCHECK(space->BelongsTo(
this));
167 Validate(pointer, tag);
168 uint32_t index = AllocateEntry(space);
169 at(index).MakeTrustedPointerEntry(pointer, tag, space->allocate_black());
170 if (scope !=
nullptr) scope->TrackPointer(&at(index));
171 return IndexToHandle(index);
175 DCHECK(space->BelongsTo(
this));
179 uint32_t index = HandleToIndex(
handle);
180 DCHECK(space->Contains(index));
186 uint32_t index = HandleToIndex(
handle);
187 at(index).MakeZappedEntry();
190template <
typename Callback>
191void TrustedPointerTable::IterateActiveEntriesIn(Space* space,
193 IterateEntriesIn(space, [&](uint32_t index) {
194 if (!at(index).IsFreelistEntry()) {
196 callback(IndexToHandle(index), pointer);
218 DCHECK(Sandbox::current()->Contains(pointer));
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
IndirectPointerHandle TrustedPointerHandle
@ kUnknownIndirectPointerTag
constexpr TrustedPointerHandle kNullTrustedPointerHandle
constexpr uint32_t kTrustedPointerHandleShift
V8_INLINE constexpr bool IsTrustedSpaceMigrationInProgressForObjectsWithTag(IndirectPointerTag tag)
V8_INLINE bool InsideSandbox(uintptr_t address)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)