Skip to content

Commit de7b207

Browse files
Merge pull request #491 from glaubitz/sparc64-support
Add basic support for SPARC64
2 parents a0e5fa1 + 41dfee8 commit de7b207

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

src/engines/ptrace.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ static unsigned long arch_setupBreakpoint(unsigned long addr, unsigned long old_
5858
unsigned long shift = 8 * offs;
5959

6060
val = (old_data & ~(0xffffffffUL << shift)) | (0x002a0004UL << shift); /* break 0x4 */
61+
#elif defined(__sparc__) && defined(__arch64__)
62+
unsigned long aligned_addr = getAligned(addr);
63+
unsigned long offs = addr - aligned_addr;
64+
unsigned long shift = 8 * offs;
65+
66+
val = (old_data & ~(0xffffffffUL << shift)) | (0x91d02001UL << shift); /* ta 0x01 */
6167
#else
6268
# error Unsupported architecture
6369
#endif

src/engines/ptrace_linux.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
enum
2121
{
2222
i386_EIP = 12, x86_64_RIP = 16, ppc_NIP = 32, arm_PC = 15, aarch64_PC = 32, // See Linux arch/arm64/include/asm/ptrace.h
23-
riscv_EPC = 0, loongarch_ERA = 33
23+
riscv_EPC = 0, loongarch_ERA = 33, sparc64_TPC = 2
2424
};
2525

2626
static void arch_adjustPcAfterBreakpoint(unsigned long *regs);
@@ -41,7 +41,7 @@ static void arch_adjustPcAfterBreakpoint(unsigned long *regs)
4141
regs[i386_EIP]--;
4242
#elif defined(__x86_64__)
4343
regs[x86_64_RIP]--;
44-
#elif defined(__powerpc__) || defined(__arm__) || defined(__aarch64__) || defined(__riscv) || defined(__loongarch__)
44+
#elif defined(__powerpc__) || defined(__arm__) || defined(__aarch64__) || defined(__riscv) || defined(__loongarch__) || (defined(__sparc__) && defined(__arch64__))
4545
// Do nothing
4646
#else
4747
# error Unsupported architecture
@@ -66,6 +66,8 @@ static unsigned long arch_getPcFromRegs(unsigned long *regs)
6666
out = regs[riscv_EPC];
6767
#elif defined(__loongarch__)
6868
out = regs[loongarch_ERA];
69+
#elif defined(__sparc__) && defined(__arch64__)
70+
out = regs[sparc64_TPC];
6971
#else
7072
# error Unsupported architecture
7173
#endif
@@ -405,8 +407,10 @@ void ptrace_sys::skipInstruction(pid_t pid)
405407
regs[aarch64_PC] += 4;
406408
# elif defined(__arm__)
407409
regs[arm_PC] += 4;
408-
# else
410+
# elif defined(__loongarch__)
409411
regs[loongarch_ERA] += 4;
412+
# elif defined(__sparc__) && defined(__arch64__)
413+
regs[sparc64_TPC] += 4;
410414
# endif
411415
setRegs(pid, NULL, regs, sizeof regs);
412416
#endif

src/solib-parser/lib.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ static void force_breakpoint(void)
9999
"ebreak\n"
100100
#elif defined(__loongarch__)
101101
"break 0x4\n"
102+
#elif defined(__sparc__) && defined(__arch64__)
103+
"ta 0x01\n"
102104
#else
103105
# error Unsupported architecture
104106
#endif

0 commit comments

Comments
 (0)