aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/truss
diff options
context:
space:
mode:
authorOlivier Houchard <cognet@FreeBSD.org>2021-09-22 22:45:42 +0000
committerOlivier Houchard <cognet@FreeBSD.org>2021-09-22 23:04:16 +0000
commitebbc3140ca0d7eee154f7a67ccdae7d3d88d13fd (patch)
tree461d8281e9671d392e7626d50df6a494ba84c16c /usr.bin/truss
parent9bab18b8616bad4fa0adcd0e291903c55263640e (diff)
downloadsrc-ebbc3140ca0d7eee154f7a67ccdae7d3d88d13fd.tar.gz
src-ebbc3140ca0d7eee154f7a67ccdae7d3d88d13fd.zip
truss: Decode correctly 64bits arguments on 32bits arm.
When decoding 32bits arm syscall, make sure we account for the padding when decoding 64bits args. Do it too when using a 64bits truss on a 32bits binary. MFC After: 1 week PR: 256199
Diffstat (limited to 'usr.bin/truss')
-rw-r--r--usr.bin/truss/syscalls.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
index f7657f30b583..9cd53e71cc9b 100644
--- a/usr.bin/truss/syscalls.c
+++ b/usr.bin/truss/syscalls.c
@@ -792,11 +792,14 @@ print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), FILE *fp,
* decoding arguments.
*/
static void
-quad_fixup(struct syscall_decode *sc)
+quad_fixup(struct procabi *abi, struct syscall_decode *sc)
{
int offset, prev;
u_int i;
+#ifndef __aarch64__
+ (void)abi;
+#endif
offset = 0;
prev = -1;
for (i = 0; i < sc->nargs; i++) {
@@ -810,17 +813,20 @@ quad_fixup(struct syscall_decode *sc)
switch (sc->args[i].type & ARG_MASK) {
case Quad:
case QuadHex:
-#ifdef __powerpc__
+#if defined(__powerpc__) || defined(__arm__) || defined(__aarch64__)
/*
- * 64-bit arguments on 32-bit powerpc must be
+ * 64-bit arguments on 32-bit powerpc and arm must be
* 64-bit aligned. If the current offset is
* not aligned, the calling convention inserts
* a 32-bit pad argument that should be skipped.
*/
- if (sc->args[i].offset % 2 == 1) {
- sc->args[i].offset++;
- offset++;
- }
+#ifdef __aarch64__
+ if (abi->pointer_size == sizeof(uint32_t))
+#endif
+ if (sc->args[i].offset % 2 == 1) {
+ sc->args[i].offset++;
+ offset++;
+ }
#endif
offset++;
default:
@@ -854,7 +860,7 @@ add_syscall(struct procabi *abi, u_int number, struct syscall *sc)
* procabi instead.
*/
if (abi->pointer_size == 4)
- quad_fixup(&sc->decode);
+ quad_fixup(abi, &sc->decode);
if (number < nitems(abi->syscalls)) {
assert(abi->syscalls[number] == NULL);