161b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung/*
261b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * Copyright (C) 2017 The Android Open Source Project
361b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung *
461b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * Licensed under the Apache License, Version 2.0 (the "License");
561b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * you may not use this file except in compliance with the License.
661b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * You may obtain a copy of the License at
761b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung *
861b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung *      http://www.apache.org/licenses/LICENSE-2.0
961b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung *
1061b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * Unless required by applicable law or agreed to in writing, software
1161b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * distributed under the License is distributed on an "AS IS" BASIS,
1261b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * See the License for the specific language governing permissions and
1461b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung * limitations under the License.
1561b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung */
1661b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
1761b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung#ifndef _LIBUNWINDSTACK_REGS_MIPS64_H
1861b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung#define _LIBUNWINDSTACK_REGS_MIPS64_H
1961b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
2061b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung#include <stdint.h>
2161b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
2261b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung#include <functional>
2361b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
2461b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung#include <unwindstack/Elf.h>
2561b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung#include <unwindstack/Regs.h>
2661b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
2761b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leungnamespace unwindstack {
2861b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
2961b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung// Forward declarations.
3061b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leungclass Memory;
3161b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
3261b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leungclass RegsMips64 : public RegsImpl<uint64_t> {
3361b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung public:
3461b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung  RegsMips64();
3561b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung  virtual ~RegsMips64() = default;
3661b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
37414df3e583c21023a22a11b64e703cd4ab38b29aYabin Cui  ArchEnum Arch() override final;
3861b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
39a2ec50bf57c9dba78459ef011cd13f8525ea57b4Christopher Ferris  uint64_t GetPcAdjustment(uint64_t rel_pc, Elf* elf) override;
4061b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
4161b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung  bool SetPcFromReturnAddress(Memory* process_memory) override;
4261b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
4361b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung  bool StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_memory) override;
4461b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
45414df3e583c21023a22a11b64e703cd4ab38b29aYabin Cui  void IterateRegisters(std::function<void(const char*, uint64_t)>) override final;
46414df3e583c21023a22a11b64e703cd4ab38b29aYabin Cui
47414df3e583c21023a22a11b64e703cd4ab38b29aYabin Cui  uint64_t pc() override;
48414df3e583c21023a22a11b64e703cd4ab38b29aYabin Cui  uint64_t sp() override;
49414df3e583c21023a22a11b64e703cd4ab38b29aYabin Cui
50414df3e583c21023a22a11b64e703cd4ab38b29aYabin Cui  void set_pc(uint64_t pc) override;
51414df3e583c21023a22a11b64e703cd4ab38b29aYabin Cui  void set_sp(uint64_t sp) override;
5261b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
53fe3963143f16833b14b505cf41a2e19a9e304efbJosh Gao  Regs* Clone() override final;
54fe3963143f16833b14b505cf41a2e19a9e304efbJosh Gao
5561b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung  static Regs* Read(void* data);
5661b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
5761b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung  static Regs* CreateFromUcontext(void* ucontext);
5861b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung};
5961b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
6061b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung}  // namespace unwindstack
6161b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung
6261b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung#endif  // _LIBUNWINDSTACK_REGS_MIPS64_H
63