Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25cd2516 authored by Christopher Ferris's avatar Christopher Ferris Committed by Gerrit Code Review
Browse files

Merge "Use elf offset in signal step check."

parents 028e1d44 f0c82e7b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -251,6 +251,7 @@ cc_defaults {
        "tests/files/offline/shared_lib_in_apk_arm64/*",
        "tests/files/offline/shared_lib_in_apk_memory_only_arm64/*",
        "tests/files/offline/shared_lib_in_apk_single_map_arm64/*",
        "tests/files/offline/signal_load_bias_arm/*",
        "tests/files/offline/straddle_arm/*",
        "tests/files/offline/straddle_arm64/*",
    ],
+6 −1
Original line number Diff line number Diff line
@@ -173,7 +173,12 @@ bool Elf::StepIfSignalHandler(uint64_t rel_pc, Regs* regs, Memory* process_memor
  if (!valid_) {
    return false;
  }
  return regs->StepIfSignalHandler(rel_pc, this, process_memory);

  // Convert the rel_pc to an elf_offset.
  if (rel_pc < static_cast<uint64_t>(load_bias_)) {
    return false;
  }
  return regs->StepIfSignalHandler(rel_pc - load_bias_, this, process_memory);
}

// The relative pc is always relative to the start of the map from which it comes.
+2 −2
Original line number Diff line number Diff line
@@ -127,12 +127,12 @@ Regs* RegsArm::CreateFromUcontext(void* ucontext) {
  return regs;
}

bool RegsArm::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_memory) {
bool RegsArm::StepIfSignalHandler(uint64_t elf_offset, Elf* elf, Memory* process_memory) {
  uint32_t data;
  Memory* elf_memory = elf->memory();
  // Read from elf memory since it is usually more expensive to read from
  // process memory.
  if (!elf_memory->ReadFully(rel_pc, &data, sizeof(data))) {
  if (!elf_memory->ReadFully(elf_offset, &data, sizeof(data))) {
    return false;
  }

+2 −2
Original line number Diff line number Diff line
@@ -126,12 +126,12 @@ Regs* RegsArm64::CreateFromUcontext(void* ucontext) {
  return regs;
}

bool RegsArm64::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_memory) {
bool RegsArm64::StepIfSignalHandler(uint64_t elf_offset, Elf* elf, Memory* process_memory) {
  uint64_t data;
  Memory* elf_memory = elf->memory();
  // Read from elf memory since it is usually more expensive to read from
  // process memory.
  if (!elf_memory->ReadFully(rel_pc, &data, sizeof(data))) {
  if (!elf_memory->ReadFully(elf_offset, &data, sizeof(data))) {
    return false;
  }

+2 −2
Original line number Diff line number Diff line
@@ -129,13 +129,13 @@ Regs* RegsMips::CreateFromUcontext(void* ucontext) {
  return regs;
}

bool RegsMips::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_memory) {
bool RegsMips::StepIfSignalHandler(uint64_t elf_offset, Elf* elf, Memory* process_memory) {
  uint64_t data;
  uint64_t offset = 0;
  Memory* elf_memory = elf->memory();
  // Read from elf memory since it is usually more expensive to read from
  // process memory.
  if (!elf_memory->ReadFully(rel_pc, &data, sizeof(data))) {
  if (!elf_memory->ReadFully(elf_offset, &data, sizeof(data))) {
    return false;
  }

Loading