diff --git a/compiler-rt/lib/hwasan/hwasan_report.cpp b/compiler-rt/lib/hwasan/hwasan_report.cpp index 051c68ee2e846f5f37347652cf9321ba5ff0417b..1d2d019ee545c8a2b2e0919b649aeebd72bed329 100644 --- a/compiler-rt/lib/hwasan/hwasan_report.cpp +++ b/compiler-rt/lib/hwasan/hwasan_report.cpp @@ -785,7 +785,9 @@ void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size, if (registers_frame) { ReportRegisters(registers_frame, pc); - ReportMemoryNearRegisters(registers_frame, pc); // OHOS_LOCAL + ReportMemoryNearRegisters(registers_frame, + reinterpret_cast(registers_frame) + 256, + pc); // OHOS_LOCAL } ReportErrorSummary(bug_type, stack); @@ -793,19 +795,18 @@ void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size, // OHOS_LOCAL begin void PrintMemoryAroundAddress(MemoryMappingLayout &proc_maps, int reg_num, - uptr addr, uptr len, bool is_pc) { + uptr addr, uptr len, bool is_sp, bool is_pc) { const sptr kBufSize = 4095; char *filename = (char *)MmapOrDie(kBufSize, __func__); MemoryMappedSegment segment(filename, kBufSize); while (proc_maps.Next(&segment)) { if (segment.start <= addr && addr < segment.end && segment.IsReadable()) { - if (!is_pc) { - if (reg_num < 31) - Printf("x%d(%s):\n", reg_num, segment.filename); - else - Printf("sp(%s):\n", segment.filename); - } else { + if (is_sp) { + Printf("sp(%s):\n", segment.filename); + } else if (is_pc) { Printf("pc(%s):\n", segment.filename); + } else { + Printf("x%d(%s):\n", reg_num, segment.filename); } uptr beg = RoundDownTo(addr - (addr < len ? addr : len), 8); if (segment.start > beg) @@ -822,18 +823,20 @@ void PrintMemoryAroundAddress(MemoryMappingLayout &proc_maps, int reg_num, break; } } + proc_maps.Reset(); } -void ReportMemoryNearRegisters(uptr *frame, uptr pc) { +void ReportMemoryNearRegisters(uptr *frame, uptr sp, uptr pc) { Printf("Memory near registers:\n"); MemoryMappingLayout proc_maps(/*cache_enabled*/ true); for (int i = 0; i <= 31; ++i) { PrintMemoryAroundAddress(proc_maps, i, UntagAddr(frame[i]), flags()->memory_around_register_size); - proc_maps.Reset(); } - PrintMemoryAroundAddress(proc_maps, -1, pc, + PrintMemoryAroundAddress(proc_maps, -1, sp, flags()->memory_around_register_size, true); + PrintMemoryAroundAddress(proc_maps, -1, pc, + flags()->memory_around_register_size, false, true); } // OHOS_LOCAL end diff --git a/compiler-rt/lib/hwasan/hwasan_report.h b/compiler-rt/lib/hwasan/hwasan_report.h index 9ba8a1f6658b8440287363b20863bdb8c67a8fa1..756fea704773d09c6b932506f20a5308334ca06b 100644 --- a/compiler-rt/lib/hwasan/hwasan_report.h +++ b/compiler-rt/lib/hwasan/hwasan_report.h @@ -29,9 +29,10 @@ void ReportTailOverwritten(StackTrace *stack, uptr addr, uptr orig_size, const u8 *expected); void ReportRegisters(uptr *registers_frame, uptr pc); // OHOS_LOCAL begin -void ReportMemoryNearRegisters(uptr *registers_frame, uptr pc); +void ReportMemoryNearRegisters(uptr *registers_frame, uptr sp, uptr pc); void PrintMemoryAroundAddress(MemoryMappingLayout &proc_maps, int reg_num, - uptr addr, uptr len, bool is_pc = false); + uptr addr, uptr len, bool is_sp = false, + bool is_pc = false); // OHOS_LOCAL end void ReportAtExitStatistics();