-/* 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/RemoteSimulation.hpp"
+#include "src/mc/sosp/RemoteProcessMemory.hpp"
#include <cstring>
#include <libunwind.h>
-using simgrid::mc::remote;
-
-namespace simgrid {
-namespace mc {
+namespace simgrid::mc {
// ***** Implementation
// ***** 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::RemoteSimulation* 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;
// 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.
return cursor;
}
-} // namespace mc
-} // namespace simgrid
+} // namespace simgrid::mc