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

Commit 17191002 authored by David Srbecky's avatar David Srbecky Committed by Automerger Merge Worker
Browse files

Merge "Update API of MapInfo from libunwindstack" am: 1cbdc2a5

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1705307

Change-Id: I2a6925ede88a55f75279489443fca2d6acca844a
parents 4e122e05 1cbdc2a5
Loading
Loading
Loading
Loading
+16 −16
Original line number Original line Diff line number Diff line
@@ -106,9 +106,9 @@ static std::string get_stack_overflow_cause(uint64_t fault_addr, uint64_t sp,
    unwindstack::MapInfo* map_info = maps->Find(sp);
    unwindstack::MapInfo* map_info = maps->Find(sp);
    if (map_info == nullptr) {
    if (map_info == nullptr) {
      return "stack pointer is in a non-existent map; likely due to stack overflow.";
      return "stack pointer is in a non-existent map; likely due to stack overflow.";
    } else if ((map_info->flags & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE)) {
    } else if ((map_info->flags() & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE)) {
      return "stack pointer is not in a rw map; likely due to stack overflow.";
      return "stack pointer is not in a rw map; likely due to stack overflow.";
    } else if ((sp - map_info->start) <= kMaxDifferenceBytes) {
    } else if ((sp - map_info->start()) <= kMaxDifferenceBytes) {
      return "stack pointer is close to top of stack; likely stack overflow.";
      return "stack pointer is close to top of stack; likely stack overflow.";
    }
    }
  }
  }
@@ -137,7 +137,7 @@ static void dump_probable_cause(log_t* log, const siginfo_t* si, unwindstack::Ma
  } else if (si->si_signo == SIGSEGV && si->si_code == SEGV_ACCERR) {
  } else if (si->si_signo == SIGSEGV && si->si_code == SEGV_ACCERR) {
    uint64_t fault_addr = reinterpret_cast<uint64_t>(si->si_addr);
    uint64_t fault_addr = reinterpret_cast<uint64_t>(si->si_addr);
    unwindstack::MapInfo* map_info = maps->Find(fault_addr);
    unwindstack::MapInfo* map_info = maps->Find(fault_addr);
    if (map_info != nullptr && map_info->flags == PROT_EXEC) {
    if (map_info != nullptr && map_info->flags() == PROT_EXEC) {
      cause = "execute-only (no-read) memory access error; likely due to data in .text.";
      cause = "execute-only (no-read) memory access error; likely due to data in .text.";
    } else {
    } else {
      cause = get_stack_overflow_cause(fault_addr, regs->sp(), maps);
      cause = get_stack_overflow_cause(fault_addr, regs->sp(), maps);
@@ -244,7 +244,7 @@ static void dump_all_maps(log_t* log, unwindstack::Unwinder* unwinder, uint64_t
       "memory map (%zu entr%s):",
       "memory map (%zu entr%s):",
       maps->Total(), maps->Total() == 1 ? "y" : "ies");
       maps->Total(), maps->Total() == 1 ? "y" : "ies");
  if (print_fault_address_marker) {
  if (print_fault_address_marker) {
    if (maps->Total() != 0 && addr < maps->Get(0)->start) {
    if (maps->Total() != 0 && addr < maps->Get(0)->start()) {
      _LOG(log, logtype::MAPS, "\n--->Fault address falls at %s before any mapped regions\n",
      _LOG(log, logtype::MAPS, "\n--->Fault address falls at %s before any mapped regions\n",
           get_addr_string(addr).c_str());
           get_addr_string(addr).c_str());
      print_fault_address_marker = false;
      print_fault_address_marker = false;
@@ -261,37 +261,37 @@ static void dump_all_maps(log_t* log, unwindstack::Unwinder* unwinder, uint64_t
  for (auto const& map_info : *maps) {
  for (auto const& map_info : *maps) {
    line = "    ";
    line = "    ";
    if (print_fault_address_marker) {
    if (print_fault_address_marker) {
      if (addr < map_info->start) {
      if (addr < map_info->start()) {
        _LOG(log, logtype::MAPS, "--->Fault address falls at %s between mapped regions\n",
        _LOG(log, logtype::MAPS, "--->Fault address falls at %s between mapped regions\n",
             get_addr_string(addr).c_str());
             get_addr_string(addr).c_str());
        print_fault_address_marker = false;
        print_fault_address_marker = false;
      } else if (addr >= map_info->start && addr < map_info->end) {
      } else if (addr >= map_info->start() && addr < map_info->end()) {
        line = "--->";
        line = "--->";
        print_fault_address_marker = false;
        print_fault_address_marker = false;
      }
      }
    }
    }
    line += get_addr_string(map_info->start) + '-' + get_addr_string(map_info->end - 1) + ' ';
    line += get_addr_string(map_info->start()) + '-' + get_addr_string(map_info->end() - 1) + ' ';
    if (map_info->flags & PROT_READ) {
    if (map_info->flags() & PROT_READ) {
      line += 'r';
      line += 'r';
    } else {
    } else {
      line += '-';
      line += '-';
    }
    }
    if (map_info->flags & PROT_WRITE) {
    if (map_info->flags() & PROT_WRITE) {
      line += 'w';
      line += 'w';
    } else {
    } else {
      line += '-';
      line += '-';
    }
    }
    if (map_info->flags & PROT_EXEC) {
    if (map_info->flags() & PROT_EXEC) {
      line += 'x';
      line += 'x';
    } else {
    } else {
      line += '-';
      line += '-';
    }
    }
    line += StringPrintf("  %8" PRIx64 "  %8" PRIx64, map_info->offset,
    line += StringPrintf("  %8" PRIx64 "  %8" PRIx64, map_info->offset(),
                         map_info->end - map_info->start);
                         map_info->end() - map_info->start());
    bool space_needed = true;
    bool space_needed = true;
    if (!map_info->name.empty()) {
    if (!map_info->name().empty()) {
      space_needed = false;
      space_needed = false;
      line += "  " + map_info->name;
      line += "  " + map_info->name();
      std::string build_id = map_info->GetPrintableBuildID();
      std::string build_id = map_info->GetPrintableBuildID();
      if (!build_id.empty()) {
      if (!build_id.empty()) {
        line += " (BuildId: " + build_id + ")";
        line += " (BuildId: " + build_id + ")";
@@ -369,8 +369,8 @@ void dump_memory_and_code(log_t* log, unwindstack::Maps* maps, unwindstack::Memo
    std::string label{"memory near "s + reg_name};
    std::string label{"memory near "s + reg_name};
    if (maps) {
    if (maps) {
      unwindstack::MapInfo* map_info = maps->Find(untag_address(reg_value));
      unwindstack::MapInfo* map_info = maps->Find(untag_address(reg_value));
      if (map_info != nullptr && !map_info->name.empty()) {
      if (map_info != nullptr && !map_info->name().empty()) {
        label += " (" + map_info->name + ")";
        label += " (" + map_info->name() + ")";
      }
      }
    }
    }
    dump_memory(log, memory, reg_value, label);
    dump_memory(log, memory, reg_value, label);
+11 −11
Original line number Original line Diff line number Diff line
@@ -102,9 +102,9 @@ static std::optional<std::string> get_stack_overflow_cause(uint64_t fault_addr,
    unwindstack::MapInfo* map_info = maps->Find(sp);
    unwindstack::MapInfo* map_info = maps->Find(sp);
    if (map_info == nullptr) {
    if (map_info == nullptr) {
      return "stack pointer is in a non-existent map; likely due to stack overflow.";
      return "stack pointer is in a non-existent map; likely due to stack overflow.";
    } else if ((map_info->flags & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE)) {
    } else if ((map_info->flags() & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE)) {
      return "stack pointer is not in a rw map; likely due to stack overflow.";
      return "stack pointer is not in a rw map; likely due to stack overflow.";
    } else if ((sp - map_info->start) <= kMaxDifferenceBytes) {
    } else if ((sp - map_info->start()) <= kMaxDifferenceBytes) {
      return "stack pointer is close to top of stack; likely stack overflow.";
      return "stack pointer is close to top of stack; likely stack overflow.";
    }
    }
  }
  }
@@ -221,7 +221,7 @@ static void dump_probable_cause(Tombstone* tombstone, unwindstack::Unwinder* unw
    }
    }
  } else if (si->si_signo == SIGSEGV && si->si_code == SEGV_ACCERR) {
  } else if (si->si_signo == SIGSEGV && si->si_code == SEGV_ACCERR) {
    unwindstack::MapInfo* map_info = maps->Find(fault_addr);
    unwindstack::MapInfo* map_info = maps->Find(fault_addr);
    if (map_info != nullptr && map_info->flags == PROT_EXEC) {
    if (map_info != nullptr && map_info->flags() == PROT_EXEC) {
      cause = "execute-only (no-read) memory access error; likely due to data in .text.";
      cause = "execute-only (no-read) memory access error; likely due to data in .text.";
    } else {
    } else {
      cause = get_stack_overflow_cause(fault_addr, main_thread.registers->sp(), maps);
      cause = get_stack_overflow_cause(fault_addr, main_thread.registers->sp(), maps);
@@ -359,7 +359,7 @@ static void dump_thread(Tombstone* tombstone, unwindstack::Unwinder* unwinder,
          dump.set_register_name(name);
          dump.set_register_name(name);
          unwindstack::MapInfo* map_info = maps->Find(untag_address(value));
          unwindstack::MapInfo* map_info = maps->Find(untag_address(value));
          if (map_info) {
          if (map_info) {
            dump.set_mapping_name(map_info->name);
            dump.set_mapping_name(map_info->name());
          }
          }


          char buf[256];
          char buf[256];
@@ -426,21 +426,21 @@ static void dump_mappings(Tombstone* tombstone, unwindstack::Unwinder* unwinder)


  for (const auto& map_info : *maps) {
  for (const auto& map_info : *maps) {
    auto* map = tombstone->add_memory_mappings();
    auto* map = tombstone->add_memory_mappings();
    map->set_begin_address(map_info->start);
    map->set_begin_address(map_info->start());
    map->set_end_address(map_info->end);
    map->set_end_address(map_info->end());
    map->set_offset(map_info->offset);
    map->set_offset(map_info->offset());


    if (map_info->flags & PROT_READ) {
    if (map_info->flags() & PROT_READ) {
      map->set_read(true);
      map->set_read(true);
    }
    }
    if (map_info->flags & PROT_WRITE) {
    if (map_info->flags() & PROT_WRITE) {
      map->set_write(true);
      map->set_write(true);
    }
    }
    if (map_info->flags & PROT_EXEC) {
    if (map_info->flags() & PROT_EXEC) {
      map->set_execute(true);
      map->set_execute(true);
    }
    }


    map->set_mapping_name(map_info->name);
    map->set_mapping_name(map_info->name());


    std::string build_id = map_info->GetPrintableBuildID();
    std::string build_id = map_info->GetPrintableBuildID();
    if (!build_id.empty()) {
    if (!build_id.empty()) {