• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 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_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_
6 #define V8_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_
7 
8 // This file should not be included (even transitively) by files outside of
9 // src/trap-handler.
10 
11 #include "src/trap-handler/trap-handler.h"
12 
13 #include <atomic>
14 
15 namespace v8 {
16 namespace internal {
17 namespace trap_handler {
18 
19 // This describes a chunk of code that the trap handler will be able to handle
20 // faults in. {base} points to the beginning of the chunk, and {size} is the
21 // number of bytes in the code chunk. The remainder of the struct is a list of
22 // protected memory access instructions and an offset to a landing pad to handle
23 // faults on that instruction.
24 struct CodeProtectionInfo {
25   uintptr_t base;
26   size_t size;
27   size_t num_protected_instructions;
28   ProtectedInstructionData instructions[1];
29 };
30 
31 class MetadataLock {
32   static std::atomic_flag spinlock_;
33 
34  public:
35   MetadataLock();
36   ~MetadataLock();
37 
38   MetadataLock(const MetadataLock&) = delete;
39   void operator=(const MetadataLock&) = delete;
40 };
41 
42 // To enable constant time registration of handler data, we keep a free list of
43 // entries in the gCodeObjects table. Each entry contains a {next_free} field,
44 // which can be used to figure out where the next entry should be inserted.
45 // In order to avoid having to initialize all the links to start with, we use
46 // 0 to indicate that this is a fresh, never-used list entry and that therefore
47 // the next entry is known to be free. If {next_entry} is greater than zero,
48 // then {next_entry - 1} is the index that we should insert into next.
49 struct CodeProtectionInfoListEntry {
50   CodeProtectionInfo* code_info;
51   size_t next_free;
52 };
53 
54 extern size_t gNumCodeObjects;
55 extern CodeProtectionInfoListEntry* gCodeObjects;
56 
57 extern std::atomic_size_t gRecoveredTrapCount;
58 
59 // Searches the fault location table for an entry matching fault_addr. If found,
60 // returns true and sets landing_pad to the address of a fragment of code that
61 // can recover from this fault. Otherwise, returns false and leaves offset
62 // unchanged.
63 bool TryFindLandingPad(uintptr_t fault_addr, uintptr_t* landing_pad);
64 
65 }  // namespace trap_handler
66 }  // namespace internal
67 }  // namespace v8
68 
69 #endif  // V8_TRAP_HANDLER_TRAP_HANDLER_INTERNAL_H_
70