5#ifndef V8_SANDBOX_TRUSTED_POINTER_TABLE_H_
6#define V8_SANDBOX_TRUSTED_POINTER_TABLE_H_
16#ifdef V8_ENABLE_SANDBOX
23class TrustedPointerPublishingScope;
30struct TrustedPointerTableEntry {
33 inline void MakeTrustedPointerEntry(Address pointer, IndirectPointerTag tag,
38 inline void MakeFreelistEntry(uint32_t next_entry_index);
41 inline void MakeZappedEntry();
46 inline Address GetPointer(IndirectPointerTag tag)
const;
50 inline void SetPointer(Address pointer, IndirectPointerTag tag);
53 inline bool HasPointer(IndirectPointerTag tag)
const;
56 inline void OverwriteTag(IndirectPointerTag tag);
59 inline bool IsFreelistEntry()
const;
65 inline uint32_t GetNextFreelistEntryIndex()
const;
74 inline bool IsMarked()
const;
76 static constexpr bool IsWriteProtected =
false;
79 friend class TrustedPointerTable;
83 struct TrustedPointerTaggingScheme {
88 static constexpr bool kSupportsEvacuation =
false;
89 static constexpr bool kSupportsZapping =
false;
92 struct Payload : TaggedPayload<TrustedPointerTaggingScheme> {
93 static Payload ForTrustedPointerEntry(Address pointer,
94 IndirectPointerTag tag) {
97 DCHECK_EQ(pointer & kHeapObjectTag, kHeapObjectTag);
98 DCHECK_EQ(pointer & kTrustedPointerTableMarkBit, 0);
99 DCHECK_EQ(pointer & kIndirectPointerTagMask, 0);
100 return Payload(pointer, tag);
103 static Payload ForFreelistEntry(uint32_t next_entry) {
104 return Payload(next_entry, kFreeTrustedPointerTableEntryTag);
107 static Payload ForZappedEntry() {
108 return Payload(0, kIndirectPointerNullTag);
112 Payload(Address pointer, IndirectPointerTag tag)
113 : TaggedPayload(pointer, tag) {}
116 std::atomic<Payload> payload_;
119static_assert(
sizeof(TrustedPointerTableEntry) ==
137 :
public ExternalEntityTable<TrustedPointerTableEntry,
138 kTrustedPointerTableReservationSize> {
141 static_assert(!kSupportsCompaction);
143 TrustedPointerTable() =
default;
144 TrustedPointerTable(
const TrustedPointerTable&) =
delete;
145 TrustedPointerTable& operator=(
const TrustedPointerTable&) =
delete;
148 using Space = ExternalEntityTable<
149 TrustedPointerTableEntry,
155 inline Address Get(TrustedPointerHandle handle, IndirectPointerTag tag)
const;
157 inline Address GetMaybeUnpublished(TrustedPointerHandle handle,
158 IndirectPointerTag tag)
const;
163 inline void Set(TrustedPointerHandle handle, Address pointer,
164 IndirectPointerTag tag);
170 Space* space, Address pointer, IndirectPointerTag tag,
171 TrustedPointerPublishingScope* scope);
176 inline void Mark(Space* space, TrustedPointerHandle handle);
184 uint32_t Sweep(Space* space, Counters* counters);
189 inline void Zap(TrustedPointerHandle handle);
192 inline bool IsUnpublished(TrustedPointerHandle handle)
const;
199 template <
typename Callback>
200 void IterateActiveEntriesIn(Space* space, Callback
callback);
206 inline uint32_t HandleToIndex(TrustedPointerHandle handle)
const;
210 inline void Validate(Address pointer, IndirectPointerTag tag);
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
IndirectPointerHandle TrustedPointerHandle
@ kFreeTrustedPointerTableEntryTag
constexpr int kTrustedPointerTableEntrySize
constexpr size_t kMaxTrustedPointers
constexpr uint64_t kIndirectPointerTagMask
constexpr size_t kTrustedPointerTableReservationSize
constexpr uint64_t kTrustedPointerTableMarkBit
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE