// Copyright (c) 2026 Petr BalvĂ­n (https://petrbalvin.org) // SPDX-License-Identifier: BSD-3-Clause //go:build linux && arm64 package debug import ( "encoding/binary" "fmt" ) func printRegs(regs *Regs, codeBase, funcOff uint64) { fmt.Printf(" PC = %#016x (func+%#x)\n", regs.PC, regs.PC-codeBase-funcOff) fmt.Printf(" SP = %#016x FP = %#016x\n", regs.SP, regs.X29) fmt.Printf(" LR = %#016x\n", regs.X30) fmt.Printf(" X0 = %#016x X1 = %#016x\n", regs.X0, regs.X1) fmt.Printf(" X2 = %#016x X3 = %#016x\n", regs.X2, regs.X3) fmt.Printf(" X4 = %#016x X5 = %#016x\n", regs.X4, regs.X5) fmt.Printf(" X6 = %#016x X7 = %#016x\n", regs.X6, regs.X7) fmt.Printf(" X8 = %#016x X9 = %#016x\n", regs.X8, regs.X9) fmt.Printf(" X10 = %#016x X11 = %#016x\n", regs.X10, regs.X11) fmt.Printf(" X12 = %#016x X13 = %#016x\n", regs.X12, regs.X13) fmt.Printf(" X14 = %#016x X15 = %#016x\n", regs.X14, regs.X15) fmt.Printf(" X16 = %#016x X17 = %#016x\n", regs.X16, regs.X17) fmt.Printf(" X18 = %#016x X19 = %#016x\n", regs.X18, regs.X19) fmt.Printf(" X20 = %#016x X21 = %#016x\n", regs.X20, regs.X21) fmt.Printf(" X22 = %#016x X23 = %#016x\n", regs.X22, regs.X23) fmt.Printf(" X24 = %#016x X25 = %#016x\n", regs.X24, regs.X25) fmt.Printf(" X26 = %#016x X27 = %#016x\n", regs.X26, regs.X27) fmt.Printf(" X28 = %#016x PSTATE = %#x\n", regs.X28, regs.PSTATE) } func printVectorRegs(v *VectorRegs) { fmt.Println("\n Vector registers (V0-V31):") for i := 0; i < 32; i += 2 { fmt.Printf(" V%-2d = %016x%016x\n", i, binary.LittleEndian.Uint64(v.V[i][8:16]), binary.LittleEndian.Uint64(v.V[i][0:8])) fmt.Printf(" V%-2d = %016x%016x\n", i+1, binary.LittleEndian.Uint64(v.V[i+1][8:16]), binary.LittleEndian.Uint64(v.V[i+1][0:8])) } } // archReturnAddr reads the return address from LR (arm64 convention). func archReturnAddr(s *Session, regs *Regs) (uint64, error) { return regs.X30, nil } // archSPLabel returns the SP register name for display. func archSPLabel() string { return "SP" }