1// Copyright 2020 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#include <memory>
6
7#include "include/v8-unwinder-state.h"
8#include "include/v8-unwinder.h"
9#include "src/diagnostics/unwinder.h"
10#include "src/execution/frame-constants.h"
11
12namespace v8 {
13
14void GetCalleeSavedRegistersFromEntryFrame(void* fp,
15                                           RegisterState* register_state) {
16  const i::Address base_addr =
17      reinterpret_cast<i::Address>(fp) +
18      i::EntryFrameConstants::kDirectCallerGeneralRegistersOffset;
19
20  if (!register_state->callee_saved) {
21    register_state->callee_saved = std::make_unique<CalleeSavedRegisters>();
22  }
23
24  register_state->callee_saved->arm_r4 =
25      reinterpret_cast<void*>(Load(base_addr + 0 * i::kSystemPointerSize));
26  register_state->callee_saved->arm_r5 =
27      reinterpret_cast<void*>(Load(base_addr + 1 * i::kSystemPointerSize));
28  register_state->callee_saved->arm_r6 =
29      reinterpret_cast<void*>(Load(base_addr + 2 * i::kSystemPointerSize));
30  register_state->callee_saved->arm_r7 =
31      reinterpret_cast<void*>(Load(base_addr + 3 * i::kSystemPointerSize));
32  register_state->callee_saved->arm_r8 =
33      reinterpret_cast<void*>(Load(base_addr + 4 * i::kSystemPointerSize));
34  register_state->callee_saved->arm_r9 =
35      reinterpret_cast<void*>(Load(base_addr + 5 * i::kSystemPointerSize));
36  register_state->callee_saved->arm_r10 =
37      reinterpret_cast<void*>(Load(base_addr + 6 * i::kSystemPointerSize));
38}
39
40}  // namespace v8
41