1// Copyright 2021 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_SANDBOX_SANDBOXED_POINTER_INL_H_
6#define V8_SANDBOX_SANDBOXED_POINTER_INL_H_
7
8#include "include/v8-internal.h"
9#include "src/common/ptr-compr.h"
10#include "src/execution/isolate.h"
11#include "src/sandbox/sandboxed-pointer.h"
12
13namespace v8 {
14namespace internal {
15
16V8_INLINE Address ReadSandboxedPointerField(Address field_address,
17                                            PtrComprCageBase cage_base) {
18#ifdef V8_SANDBOXED_POINTERS
19  SandboxedPointer_t sandboxed_pointer =
20      base::ReadUnalignedValue<SandboxedPointer_t>(field_address);
21
22  Address offset = sandboxed_pointer >> kSandboxedPointerShift;
23  Address pointer = cage_base.address() + offset;
24  return pointer;
25#else
26  return ReadMaybeUnalignedValue<Address>(field_address);
27#endif
28}
29
30V8_INLINE void WriteSandboxedPointerField(Address field_address,
31                                          PtrComprCageBase cage_base,
32                                          Address pointer) {
33#ifdef V8_SANDBOXED_POINTERS
34  // The pointer must point into the sandbox.
35  CHECK(GetProcessWideSandbox()->Contains(pointer));
36
37  Address offset = pointer - cage_base.address();
38  SandboxedPointer_t sandboxed_pointer = offset << kSandboxedPointerShift;
39  base::WriteUnalignedValue<SandboxedPointer_t>(field_address,
40                                                sandboxed_pointer);
41#else
42  WriteMaybeUnalignedValue<Address>(field_address, pointer);
43#endif
44}
45
46}  // namespace internal
47}  // namespace v8
48
49#endif  // V8_SANDBOX_SANDBOXED_POINTER_INL_H_
50