trap-handler-internal.h 2.34 KB
Newer Older
eholk's avatar
eholk committed
1 2 3 4
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
#ifndef V8_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_
#define V8_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_
eholk's avatar
eholk committed
7 8 9 10 11 12 13 14 15 16 17 18

// This file should not be included (even transitively) by files outside of
// src/trap-handler.

#include "src/trap-handler/trap-handler.h"

#include <atomic>

namespace v8 {
namespace internal {
namespace trap_handler {

19
// This describes a chunk of code that the trap handler will be able to handle
eholk's avatar
eholk committed
20 21 22 23 24
// faults in. {base} points to the beginning of the chunk, and {size} is the
// number of bytes in the code chunk. The remainder of the struct is a list of
// protected memory access instructions and an offset to a landing pad to handle
// faults on that instruction.
struct CodeProtectionInfo {
25
  uintptr_t base;
eholk's avatar
eholk committed
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
  size_t size;
  size_t num_protected_instructions;
  ProtectedInstructionData instructions[1];
};

class MetadataLock {
  static std::atomic_flag spinlock_;

 public:
  MetadataLock();
  ~MetadataLock();

  MetadataLock(const MetadataLock&) = delete;
  void operator=(const MetadataLock&) = delete;
};

// To enable constant time registration of handler data, we keep a free list of
// entries in the gCodeObjects table. Each entry contains a {next_free} field,
// which can be used to figure out where the next entry should be inserted.
// In order to avoid having to initialize all the links to start with, we use
// 0 to indicate that this is a fresh, never-used list entry and that therefore
// the next entry is known to be free. If {next_entry} is greater than zero,
// then {next_entry - 1} is the index that we should insert into next.
struct CodeProtectionInfoListEntry {
  CodeProtectionInfo* code_info;
  size_t next_free;
};

extern size_t gNumCodeObjects;
extern CodeProtectionInfoListEntry* gCodeObjects;

57 58
extern std::atomic_size_t gRecoveredTrapCount;

59 60 61 62 63 64
// Searches the fault location table for an entry matching fault_addr. If found,
// returns true and sets landing_pad to the address of a fragment of code that
// can recover from this fault. Otherwise, returns false and leaves offset
// unchanged.
bool TryFindLandingPad(uintptr_t fault_addr, uintptr_t* landing_pad);

eholk's avatar
eholk committed
65 66 67 68
}  // namespace trap_handler
}  // namespace internal
}  // namespace v8

69
#endif  // V8_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_