Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of framagit.org:simgrid/simgrid
[simgrid.git] / src / mc / inspect / mc_unw.cpp
index a51a8fb..c93f195 100644 (file)
@@ -1,18 +1,16 @@
-/* Copyright (c) 2015-2020. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2015-2023. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-/** \file
- *  Libunwind support for mc_address_space objects.
- */
+/** \file Libunwind support for mc_address_space objects. */
 
 // We need this for the register indices:
 // #define _GNU_SOURCE
 
 #include "src/mc/inspect/mc_unw.hpp"
 #include "src/mc/inspect/Frame.hpp"
-#include "src/mc/remote/RemoteClient.hpp"
+#include "src/mc/sosp/RemoteProcessMemory.hpp"
 
 #include <cstring>
 
@@ -25,10 +23,7 @@ typedef register_t greg_t;
 
 #include <libunwind.h>
 
-using simgrid::mc::remote;
-
-namespace simgrid {
-namespace mc {
+namespace simgrid::mc {
 
 // ***** Implementation
 
@@ -172,8 +167,8 @@ void* UnwindContext::get_reg(unw_context_t* context, unw_regnum_t regnum) noexce
 int UnwindContext::access_reg(unw_addr_space_t /*as*/, unw_regnum_t regnum, unw_word_t* valp, int write,
                               void* arg) noexcept
 {
-  simgrid::mc::UnwindContext* as_context = (simgrid::mc::UnwindContext*)arg;
-  unw_context_t* context                 = &as_context->unwind_context_;
+  auto* as_context       = static_cast<simgrid::mc::UnwindContext*>(arg);
+  unw_context_t* context = &as_context->unwind_context_;
   if (write)
     return -UNW_EREADONLYREG;
   const greg_t* preg = (greg_t*)get_reg(context, regnum);
@@ -183,7 +178,7 @@ int UnwindContext::access_reg(unw_addr_space_t /*as*/, unw_regnum_t regnum, unw_
   return 0;
 }
 
-/** Find informations about a function (libunwind method)
+/** Find information about a function (libunwind method)
  */
 int UnwindContext::get_proc_name(unw_addr_space_t /*as*/, unw_word_t addr, char* bufp, size_t buf_len, unw_word_t* offp,
                                  void* arg) noexcept
@@ -205,28 +200,33 @@ int UnwindContext::get_proc_name(unw_addr_space_t /*as*/, unw_word_t addr, char*
 
 // ***** Init
 
-/** Virtual table for our `libunwind` implementation
- *
- *  Stack unwinding on a `simgrid::mc::Process*` (for memory, unwinding information)
- *  and `ucontext_t` (for processor registers).
- *
- * It works with the `simgrid::mc::UnwindContext` context.
- *
- * Use nullptr as access_fpreg and resume, as we don't need them.
- */
-unw_accessors_t UnwindContext::accessors = {&find_proc_info, &put_unwind_info, &get_dyn_info_list_addr,
-                                            &access_mem,     &access_reg,      nullptr,
-                                            nullptr,         &get_proc_name};
-
 unw_addr_space_t UnwindContext::createUnwindAddressSpace()
 {
-  return unw_create_addr_space(&UnwindContext::accessors, BYTE_ORDER);
+  /** Virtual table for our `libunwind` implementation
+   *
+   *  Stack unwinding on a `simgrid::mc::Process*` (for memory, unwinding information)
+   *  and `ucontext_t` (for processor registers).
+   *
+   * It works with the `simgrid::mc::UnwindContext` context.
+   *
+   * Use nullptr as access_fpreg and resume, as we don't need them.
+   */
+  unw_accessors_t accessors        = {};
+  accessors.find_proc_info         = &find_proc_info;
+  accessors.put_unwind_info        = &put_unwind_info;
+  accessors.get_dyn_info_list_addr = &get_dyn_info_list_addr;
+  accessors.access_mem             = &access_mem;
+  accessors.access_reg             = &access_reg;
+  accessors.access_fpreg           = nullptr;
+  accessors.resume                 = nullptr;
+  accessors.get_proc_name          = &get_proc_name;
+  return unw_create_addr_space(&accessors, BYTE_ORDER);
 }
 
-void UnwindContext::initialize(simgrid::mc::RemoteClient* process, unw_context_t* c)
+void UnwindContext::initialize(simgrid::mc::RemoteProcessMemory& process_memory, const unw_context_t* c)
 {
-  this->address_space_ = process;
-  this->process_      = process;
+  this->address_space_ = &process_memory;
+  this->process_       = &process_memory;
 
   // Take a copy of the context for our own purpose:
   this->unwind_context_ = *c;
@@ -239,6 +239,12 @@ void UnwindContext::initialize(simgrid::mc::RemoteClient* process, unw_context_t
   // Let's ignore this and see what happens:
   this->unwind_context_.uc_mcontext.fpregs = nullptr;
 #endif
+#elif SIMGRID_PROCESSOR_arm64
+#ifdef __linux__
+  // On ARM64, ucontext_t doesn't contain `fpregs` and the FP registers
+  // are instead held in the `__reserved` field of the struct. It doesn't
+  // appear anything needs to be done here, although this should be verified
+#endif
 #else
   // Do we need to do any fixup like this?
 #error Target CPU type is not handled.
@@ -254,5 +260,4 @@ unw_cursor_t UnwindContext::cursor()
   return cursor;
 }
 
-} // namespace mc
-} // namespace simgrid
+} // namespace simgrid::mc