| OLD | NEW |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. | 13 // limitations under the License. |
| 14 | 14 |
| 15 #ifndef CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ | 15 #ifndef CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ |
| 16 #define CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ | 16 #define CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ |
| 17 | 17 |
| 18 #include <mach/mach.h> | 18 #include <mach/mach.h> |
| 19 | 19 |
| 20 #include "build/build_config.h" |
| 20 #include "util/mach/mach_message_server.h" | 21 #include "util/mach/mach_message_server.h" |
| 21 | 22 |
| 22 namespace crashpad { | 23 namespace crashpad { |
| 23 | 24 |
| 24 // Routines to provide a single unified front-end to the interfaces in | 25 // Routines to provide a single unified front-end to the interfaces in |
| 25 // <mach/exc.defs> and <mach/mach_exc.defs>. The two interfaces are identical, | 26 // <mach/exc.defs> and <mach/mach_exc.defs>. The two interfaces are identical, |
| 26 // except that the latter allows for 64-bit exception codes, and is requested by | 27 // except that the latter allows for 64-bit exception codes, and is requested by |
| 27 // setting the MACH_EXCEPTION_CODES behavior bit associated with an exception | 28 // setting the MACH_EXCEPTION_CODES behavior bit associated with an exception |
| 28 // port. | 29 // port. |
| 29 | 30 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 | 106 |
| 106 bool MachMessageServerFunction(const mach_msg_header_t* in_header, | 107 bool MachMessageServerFunction(const mach_msg_header_t* in_header, |
| 107 mach_msg_header_t* out_header, | 108 mach_msg_header_t* out_header, |
| 108 bool* destroy_complex_request) override; | 109 bool* destroy_complex_request) override; |
| 109 | 110 |
| 110 mach_msg_size_t MachMessageServerRequestSize() override; | 111 mach_msg_size_t MachMessageServerRequestSize() override; |
| 111 mach_msg_size_t MachMessageServerReplySize() override; | 112 mach_msg_size_t MachMessageServerReplySize() override; |
| 112 | 113 |
| 113 private: | 114 private: |
| 114 Interface* interface_; // weak | 115 Interface* interface_; // weak |
| 116 |
| 117 DISALLOW_COPY_AND_ASSIGN(ExcServer); |
| 115 }; | 118 }; |
| 116 | 119 |
| 117 //! \brief A server interface for the `mach_exc` Mach subsystem. | 120 //! \brief A server interface for the `mach_exc` Mach subsystem. |
| 118 class MachExcServer : public MachMessageServer::Interface { | 121 class MachExcServer : public MachMessageServer::Interface { |
| 119 public: | 122 public: |
| 120 //! \brief An interface that the different request messages that are a part of | 123 //! \brief An interface that the different request messages that are a part of |
| 121 //! the `mach_exc` Mach subsystem can be dispatched to. | 124 //! the `mach_exc` Mach subsystem can be dispatched to. |
| 122 class Interface { | 125 class Interface { |
| 123 public: | 126 public: |
| 124 //! \brief Handles exceptions raised by `mach_exception_raise()`. | 127 //! \brief Handles exceptions raised by `mach_exception_raise()`. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 | 195 |
| 193 bool MachMessageServerFunction(const mach_msg_header_t* in_header, | 196 bool MachMessageServerFunction(const mach_msg_header_t* in_header, |
| 194 mach_msg_header_t* out_header, | 197 mach_msg_header_t* out_header, |
| 195 bool* destroy_complex_request) override; | 198 bool* destroy_complex_request) override; |
| 196 | 199 |
| 197 mach_msg_size_t MachMessageServerRequestSize() override; | 200 mach_msg_size_t MachMessageServerRequestSize() override; |
| 198 mach_msg_size_t MachMessageServerReplySize() override; | 201 mach_msg_size_t MachMessageServerReplySize() override; |
| 199 | 202 |
| 200 private: | 203 private: |
| 201 Interface* interface_; // weak | 204 Interface* interface_; // weak |
| 205 |
| 206 DISALLOW_COPY_AND_ASSIGN(MachExcServer); |
| 202 }; | 207 }; |
| 203 | 208 |
| 204 //! \brief A server interface for the `exc` Mach subsystem, simplified to have | 209 //! \brief A server interface for the `exc` Mach subsystem, simplified to have |
| 205 //! only a single interface method needing implementation. | 210 //! only a single interface method needing implementation. |
| 206 class SimplifiedExcServer : public ExcServer, public ExcServer::Interface { | 211 class SimplifiedExcServer : public ExcServer, public ExcServer::Interface { |
| 207 public: | 212 public: |
| 208 //! \brief An interface that the different request messages that are a part of | 213 //! \brief An interface that the different request messages that are a part of |
| 209 //! the `exc` Mach subsystem can be dispatched to. | 214 //! the `exc` Mach subsystem can be dispatched to. |
| 210 class Interface { | 215 class Interface { |
| 211 public: | 216 public: |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 mach_msg_type_number_t code_count, | 278 mach_msg_type_number_t code_count, |
| 274 thread_state_flavor_t* flavor, | 279 thread_state_flavor_t* flavor, |
| 275 const natural_t* old_state, | 280 const natural_t* old_state, |
| 276 mach_msg_type_number_t old_state_count, | 281 mach_msg_type_number_t old_state_count, |
| 277 thread_state_t new_state, | 282 thread_state_t new_state, |
| 278 mach_msg_type_number_t* new_state_count, | 283 mach_msg_type_number_t* new_state_count, |
| 279 bool* destroy_request) override; | 284 bool* destroy_request) override; |
| 280 | 285 |
| 281 private: | 286 private: |
| 282 Interface* interface_; // weak | 287 Interface* interface_; // weak |
| 288 |
| 289 DISALLOW_COPY_AND_ASSIGN(SimplifiedExcServer); |
| 283 }; | 290 }; |
| 284 | 291 |
| 285 //! \brief A server interface for the `mach_exc` Mach subsystem, simplified to | 292 //! \brief A server interface for the `mach_exc` Mach subsystem, simplified to |
| 286 //! have only a single interface method needing implementation. | 293 //! have only a single interface method needing implementation. |
| 287 class SimplifiedMachExcServer : public MachExcServer, | 294 class SimplifiedMachExcServer : public MachExcServer, |
| 288 public MachExcServer::Interface { | 295 public MachExcServer::Interface { |
| 289 public: | 296 public: |
| 290 //! \brief An interface that the different request messages that are a part of | 297 //! \brief An interface that the different request messages that are a part of |
| 291 //! the `mach_exc` Mach subsystem can be dispatched to. | 298 //! the `mach_exc` Mach subsystem can be dispatched to. |
| 292 class Interface { | 299 class Interface { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 mach_msg_type_number_t code_count, | 371 mach_msg_type_number_t code_count, |
| 365 thread_state_flavor_t* flavor, | 372 thread_state_flavor_t* flavor, |
| 366 const natural_t* old_state, | 373 const natural_t* old_state, |
| 367 mach_msg_type_number_t old_state_count, | 374 mach_msg_type_number_t old_state_count, |
| 368 thread_state_t new_state, | 375 thread_state_t new_state, |
| 369 mach_msg_type_number_t* new_state_count, | 376 mach_msg_type_number_t* new_state_count, |
| 370 bool* destroy_request) override; | 377 bool* destroy_request) override; |
| 371 | 378 |
| 372 private: | 379 private: |
| 373 Interface* interface_; // weak | 380 Interface* interface_; // weak |
| 381 |
| 382 DISALLOW_COPY_AND_ASSIGN(SimplifiedMachExcServer); |
| 374 }; | 383 }; |
| 375 | 384 |
| 376 } // namespace internal | 385 } // namespace internal |
| 377 | 386 |
| 378 //! \brief A server interface for the `exc` and `mach_exc` Mach subsystems, | 387 //! \brief A server interface for the `exc` and `mach_exc` Mach subsystems, |
| 379 //! unified to handle exceptions delivered to either subsystem, and | 388 //! unified to handle exceptions delivered to either subsystem, and |
| 380 //! simplified to have only a single interface method needing | 389 //! simplified to have only a single interface method needing |
| 381 //! implementation. | 390 //! implementation. |
| 382 //! | 391 //! |
| 383 //! UniversalMachExcServer operates by translating messages received in the | 392 //! UniversalMachExcServer operates by translating messages received in the |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 thread_state_flavor_t* flavor, | 425 thread_state_flavor_t* flavor, |
| 417 const natural_t* old_state, | 426 const natural_t* old_state, |
| 418 mach_msg_type_number_t old_state_count, | 427 mach_msg_type_number_t old_state_count, |
| 419 thread_state_t new_state, | 428 thread_state_t new_state, |
| 420 mach_msg_type_number_t* new_state_count, | 429 mach_msg_type_number_t* new_state_count, |
| 421 bool* destroy_complex_request) override; | 430 bool* destroy_complex_request) override; |
| 422 | 431 |
| 423 private: | 432 private: |
| 424 internal::SimplifiedExcServer exc_server_; | 433 internal::SimplifiedExcServer exc_server_; |
| 425 internal::SimplifiedMachExcServer mach_exc_server_; | 434 internal::SimplifiedMachExcServer mach_exc_server_; |
| 435 |
| 436 DISALLOW_COPY_AND_ASSIGN(UniversalMachExcServer); |
| 426 }; | 437 }; |
| 427 | 438 |
| 428 //! \brief Recovers the original exception, first exception code, and signal | 439 //! \brief Recovers the original exception, first exception code, and signal |
| 429 //! from the encoded form of the first exception code delivered with | 440 //! from the encoded form of the first exception code delivered with |
| 430 //! `EXC_CRASH` exceptions. | 441 //! `EXC_CRASH` exceptions. |
| 431 //! | 442 //! |
| 432 //! `EXC_CRASH` exceptions are generated when the kernel has committed to | 443 //! `EXC_CRASH` exceptions are generated when the kernel has committed to |
| 433 //! terminating a process as a result of a core-generating POSIX signal and, for | 444 //! terminating a process as a result of a core-generating POSIX signal and, for |
| 434 //! hardware exceptions, an earlier Mach exception. Information about this | 445 //! hardware exceptions, an earlier Mach exception. Information about this |
| 435 //! earlier exception and signal is made available to the `EXC_CRASH` handler | 446 //! earlier exception and signal is made available to the `EXC_CRASH` handler |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 //! \a behavior is not a state-carrying behavior, or when it is a | 516 //! \a behavior is not a state-carrying behavior, or when it is a |
| 506 //! state-carrying behavior and \a set_thread_state is `true`. | 517 //! state-carrying behavior and \a set_thread_state is `true`. |
| 507 //! `MACH_RCV_PORT_DIED` is used when \a behavior is a state-carrying | 518 //! `MACH_RCV_PORT_DIED` is used when \a behavior is a state-carrying |
| 508 //! behavior and \a set_thread_state is `false`. | 519 //! behavior and \a set_thread_state is `false`. |
| 509 kern_return_t ExcServerSuccessfulReturnValue(exception_behavior_t behavior, | 520 kern_return_t ExcServerSuccessfulReturnValue(exception_behavior_t behavior, |
| 510 bool set_thread_state); | 521 bool set_thread_state); |
| 511 | 522 |
| 512 } // namespace crashpad | 523 } // namespace crashpad |
| 513 | 524 |
| 514 #endif // CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ | 525 #endif // CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ |
| OLD | NEW |