Date: Wed, 22 Sep 2021 23:05:48 GMT From: Olivier Houchard <cognet@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: ebbc3140ca0d - main - truss: Decode correctly 64bits arguments on 32bits arm. Message-ID: <202109222305.18MN5mxe013139@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by cognet: URL: https://cgit.FreeBSD.org/src/commit/?id=ebbc3140ca0d7eee154f7a67ccdae7d3d88d13fd commit ebbc3140ca0d7eee154f7a67ccdae7d3d88d13fd Author: Olivier Houchard <cognet@FreeBSD.org> AuthorDate: 2021-09-22 22:45:42 +0000 Commit: Olivier Houchard <cognet@FreeBSD.org> CommitDate: 2021-09-22 23:04:16 +0000 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 --- usr.bin/truss/syscalls.c | 22 ++++++++++++++-------- 1 file 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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202109222305.18MN5mxe013139>