| OLD | NEW | 
|     1 // Copyright 2013 the V8 project authors. All rights reserved. |     1 // Copyright 2013 the V8 project authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #ifndef V8_ARM64_SIMULATOR_ARM64_H_ |     5 #ifndef V8_ARM64_SIMULATOR_ARM64_H_ | 
|     6 #define V8_ARM64_SIMULATOR_ARM64_H_ |     6 #define V8_ARM64_SIMULATOR_ARM64_H_ | 
|     7  |     7  | 
|     8 #include <stdarg.h> |     8 #include <stdarg.h> | 
|     9 #include <vector> |     9 #include <vector> | 
|    10  |    10  | 
| (...skipping 2262 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2273   static const uintptr_t kExclusiveTaggedAddrMask = ~((1 << 11) - 1); |  2273   static const uintptr_t kExclusiveTaggedAddrMask = ~((1 << 11) - 1); | 
|  2274  |  2274  | 
|  2275   class LocalMonitor { |  2275   class LocalMonitor { | 
|  2276    public: |  2276    public: | 
|  2277     LocalMonitor(); |  2277     LocalMonitor(); | 
|  2278  |  2278  | 
|  2279     // These functions manage the state machine for the local monitor, but do |  2279     // These functions manage the state machine for the local monitor, but do | 
|  2280     // not actually perform loads and stores. NotifyStoreExcl only returns |  2280     // not actually perform loads and stores. NotifyStoreExcl only returns | 
|  2281     // true if the exclusive store is allowed; the global monitor will still |  2281     // true if the exclusive store is allowed; the global monitor will still | 
|  2282     // have to be checked to see whether the memory should be updated. |  2282     // have to be checked to see whether the memory should be updated. | 
|  2283     void NotifyLoad(uintptr_t addr); |  2283     void NotifyLoad(); | 
|  2284     void NotifyLoadExcl(uintptr_t addr, TransactionSize size); |  2284     void NotifyLoadExcl(uintptr_t addr, TransactionSize size); | 
|  2285     void NotifyStore(uintptr_t addr); |  2285     void NotifyStore(); | 
|  2286     bool NotifyStoreExcl(uintptr_t addr, TransactionSize size); |  2286     bool NotifyStoreExcl(uintptr_t addr, TransactionSize size); | 
|  2287  |  2287  | 
|  2288    private: |  2288    private: | 
|  2289     void Clear(); |  2289     void Clear(); | 
|  2290  |  2290  | 
|  2291     MonitorAccess access_state_; |  2291     MonitorAccess access_state_; | 
|  2292     uintptr_t tagged_addr_; |  2292     uintptr_t tagged_addr_; | 
|  2293     TransactionSize size_; |  2293     TransactionSize size_; | 
|  2294   }; |  2294   }; | 
|  2295  |  2295  | 
|  2296   class GlobalMonitor { |  2296   class GlobalMonitor { | 
|  2297    public: |  2297    public: | 
|  2298     GlobalMonitor(); |  2298     GlobalMonitor(); | 
|  2299  |  2299  | 
|  2300     class Processor { |  2300     class Processor { | 
|  2301      public: |  2301      public: | 
|  2302       Processor(); |  2302       Processor(); | 
|  2303  |  2303  | 
|  2304      private: |  2304      private: | 
|  2305       friend class GlobalMonitor; |  2305       friend class GlobalMonitor; | 
|  2306       // These functions manage the state machine for the global monitor, but do |  2306       // These functions manage the state machine for the global monitor, but do | 
|  2307       // not actually perform loads and stores. |  2307       // not actually perform loads and stores. | 
|  2308       void Clear_Locked(); |  2308       void Clear_Locked(); | 
|  2309       void NotifyLoadExcl_Locked(uintptr_t addr); |  2309       void NotifyLoadExcl_Locked(uintptr_t addr); | 
|  2310       void NotifyStore_Locked(uintptr_t addr, bool is_requesting_processor); |  2310       void NotifyStore_Locked(bool is_requesting_processor); | 
|  2311       bool NotifyStoreExcl_Locked(uintptr_t addr, bool is_requesting_processor); |  2311       bool NotifyStoreExcl_Locked(uintptr_t addr, bool is_requesting_processor); | 
|  2312  |  2312  | 
|  2313       MonitorAccess access_state_; |  2313       MonitorAccess access_state_; | 
|  2314       uintptr_t tagged_addr_; |  2314       uintptr_t tagged_addr_; | 
|  2315       Processor* next_; |  2315       Processor* next_; | 
|  2316       Processor* prev_; |  2316       Processor* prev_; | 
|  2317       // A stxr can fail due to background cache evictions. Rather than |  2317       // A stxr can fail due to background cache evictions. Rather than | 
|  2318       // simulating this, we'll just occasionally introduce cases where an |  2318       // simulating this, we'll just occasionally introduce cases where an | 
|  2319       // exclusive store fails. This will happen once after every |  2319       // exclusive store fails. This will happen once after every | 
|  2320       // kMaxFailureCounter exclusive stores. |  2320       // kMaxFailureCounter exclusive stores. | 
|  2321       static const int kMaxFailureCounter = 5; |  2321       static const int kMaxFailureCounter = 5; | 
|  2322       int failure_counter_; |  2322       int failure_counter_; | 
|  2323     }; |  2323     }; | 
|  2324  |  2324  | 
|  2325     // Exposed so it can be accessed by Simulator::{Read,Write}Ex*. |  2325     // Exposed so it can be accessed by Simulator::{Read,Write}Ex*. | 
|  2326     base::Mutex mutex; |  2326     base::Mutex mutex; | 
|  2327  |  2327  | 
|  2328     void NotifyLoadExcl_Locked(uintptr_t addr, Processor* processor); |  2328     void NotifyLoadExcl_Locked(uintptr_t addr, Processor* processor); | 
|  2329     void NotifyStore_Locked(uintptr_t addr, Processor* processor); |  2329     void NotifyStore_Locked(Processor* processor); | 
|  2330     bool NotifyStoreExcl_Locked(uintptr_t addr, Processor* processor); |  2330     bool NotifyStoreExcl_Locked(uintptr_t addr, Processor* processor); | 
|  2331  |  2331  | 
|  2332     // Called when the simulator is destroyed. |  2332     // Called when the simulator is destroyed. | 
|  2333     void RemoveProcessor(Processor* processor); |  2333     void RemoveProcessor(Processor* processor); | 
|  2334  |  2334  | 
|  2335    private: |  2335    private: | 
|  2336     bool IsProcessorInLinkedList_Locked(Processor* processor) const; |  2336     bool IsProcessorInLinkedList_Locked(Processor* processor) const; | 
|  2337     void PrependProcessor_Locked(Processor* processor); |  2337     void PrependProcessor_Locked(Processor* processor); | 
|  2338  |  2338  | 
|  2339     Processor* head_; |  2339     Processor* head_; | 
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2440     Simulator::current(isolate)->PopAddress(); |  2440     Simulator::current(isolate)->PopAddress(); | 
|  2441   } |  2441   } | 
|  2442 }; |  2442 }; | 
|  2443  |  2443  | 
|  2444 #endif  // !defined(USE_SIMULATOR) |  2444 #endif  // !defined(USE_SIMULATOR) | 
|  2445  |  2445  | 
|  2446 }  // namespace internal |  2446 }  // namespace internal | 
|  2447 }  // namespace v8 |  2447 }  // namespace v8 | 
|  2448  |  2448  | 
|  2449 #endif  // V8_ARM64_SIMULATOR_ARM64_H_ |  2449 #endif  // V8_ARM64_SIMULATOR_ARM64_H_ | 
| OLD | NEW |