2026-08-20 23:57:10 +02:00
|
|
|
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
|
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
|
|
|
|
|
|
//go:build linux && arm64
|
|
|
|
|
|
|
|
|
|
package debug
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
|
2026-09-14 18:47:08 +02:00
|
|
|
"sourcedock.dev/petrbalvin/gasm-devkit/arch"
|
|
|
|
|
"sourcedock.dev/petrbalvin/gasm-devkit/disasm"
|
2026-08-20 23:57:10 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Disassemble decodes the instruction at the given address in the debuggee's
|
|
|
|
|
// memory and returns its text representation and length in bytes.
|
|
|
|
|
func (s *Session) Disassemble(addr uint64) (string, int, error) {
|
|
|
|
|
mem, err := s.ReadMemory(addr, 4)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", 0, err
|
|
|
|
|
}
|
2026-09-14 18:47:08 +02:00
|
|
|
ins, err := disasm.Decode(arch.ARM64, mem, addr)
|
2026-08-20 23:57:10 +02:00
|
|
|
if err != nil {
|
2026-09-14 18:47:08 +02:00
|
|
|
return "", 0, err
|
2026-08-20 23:57:10 +02:00
|
|
|
}
|
2026-09-14 18:47:08 +02:00
|
|
|
return ins.Text, ins.Len, nil
|
2026-08-20 23:57:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// DisassembleN decodes up to n instructions starting at addr.
|
|
|
|
|
func (s *Session) DisassembleN(addr uint64, n int) string {
|
|
|
|
|
var result string
|
|
|
|
|
pc := addr
|
2026-08-30 11:27:54 +02:00
|
|
|
for range n {
|
2026-08-20 23:57:10 +02:00
|
|
|
text, length, err := s.Disassemble(pc)
|
|
|
|
|
if err != nil {
|
|
|
|
|
result += fmt.Sprintf(" %#08x: <error: %v>\n", pc, err)
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
result += fmt.Sprintf(" %#08x: %s\n", pc, text)
|
|
|
|
|
if length == 0 {
|
|
|
|
|
length = 4
|
|
|
|
|
}
|
|
|
|
|
pc += uint64(length)
|
|
|
|
|
}
|
|
|
|
|
return result
|
|
|
|
|
}
|