You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(83) |
Oct
(89) |
Nov
(97) |
Dec
(30) |
2024 |
Jan
(25) |
Feb
(73) |
Mar
(76) |
Apr
(122) |
May
(46) |
Jun
(44) |
Jul
(27) |
Aug
(30) |
Sep
(33) |
Oct
(67) |
Nov
(91) |
Dec
(70) |
2025 |
Jan
(44) |
Feb
(36) |
Mar
(85) |
Apr
(100) |
May
(138) |
Jun
(55) |
Jul
(107) |
Aug
(54) |
Sep
|
Oct
|
Nov
|
Dec
|
From: Paul F. <pa...@so...> - 2024-09-29 18:24:46
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=4a634e5725623be65a4dbba49f947b2e7a784b59 commit 4a634e5725623be65a4dbba49f947b2e7a784b59 Author: Paul Floyd <pj...@wa...> Date: Sun Sep 29 18:22:10 2024 +0000 Linux regtest: fix for memcheck/tests/amd64/bug492210 On Arch Linux I get an error concerning the use of PIE and an uninitialized variable warning. Add the no PIE flag and also turn off the warning. Diff: --- memcheck/tests/amd64/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/memcheck/tests/amd64/Makefile.am b/memcheck/tests/amd64/Makefile.am index c0139bdb20..05299a752e 100644 --- a/memcheck/tests/amd64/Makefile.am +++ b/memcheck/tests/amd64/Makefile.am @@ -81,6 +81,7 @@ AM_CFLAGS += @FLAG_M64@ AM_CXXFLAGS += @FLAG_M64@ AM_CCASFLAGS += @FLAG_M64@ +bug492210_CFLAGS = ${AM_CFLAGS} @FLAG_NO_PIE@ @FLAG_W_NO_UNINITIALIZED@ fxsave_amd64_CFLAGS = $(AM_CFLAGS) @FLAG_NO_PIE@ insn_pcmpistri_CFLAGS = $(AM_CFLAGS) more_x87_fp_CFLAGS = $(AM_CFLAGS) -O -ffast-math -mfpmath=387 \ |
From: Paul F. <pa...@so...> - 2024-09-29 18:13:30
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=b3876521f080e13c68396520baa2b1d80baff575 commit b3876521f080e13c68396520baa2b1d80baff575 Author: Paul Floyd <pj...@wa...> Date: Sun Sep 29 20:08:21 2024 +0200 macOS: fix build after changes for Bug 492663 Missed updating the macOS sections. Diff: --- coregrind/m_debuginfo/debuginfo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c index a6a0f79b3b..ad05b9928d 100644 --- a/coregrind/m_debuginfo/debuginfo.c +++ b/coregrind/m_debuginfo/debuginfo.c @@ -1364,9 +1364,9 @@ ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd ) return 0; vg_assert(sr_Res(preadres) > 0 && sr_Res(preadres) <= sizeof(buf4k) ); - rw_load_count = 0; + expected_rw_load_count = 0; - if (!ML_(check_macho_and_get_rw_loads)( buf4k, (SizeT)sr_Res(preadres), &rw_load_count )) + if (!ML_(check_macho_and_get_rw_loads)( buf4k, (SizeT)sr_Res(preadres), &expected_rw_load_count )) return 0; #endif |
From: Paul F. <pa...@so...> - 2024-09-29 08:05:11
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=a215f02d49423ea78d00f8afbbfb1afcd7583b04 commit a215f02d49423ea78d00f8afbbfb1afcd7583b04 Author: Paul Floyd <pj...@wa...> Date: Sun Sep 29 10:02:33 2024 +0200 FreeBSD procctl syscall: change arg name in error messages The man page was inconsistent in the use of 'data' or 'arg' for the fourth argument. I chose to use 'arg'. The manpage has now been cleaned up and uses 'data'. So I'm switching to use the same name. Diff: --- coregrind/m_syswrap/syswrap-amd64-freebsd.c | 20 ++++++++------------ memcheck/tests/freebsd/scalar.stderr.exp | 4 ++-- memcheck/tests/freebsd/scalar.stderr.exp-amd64-141 | 4 ++-- memcheck/tests/freebsd/scalar.stderr.exp-arm64 | 4 ++-- memcheck/tests/freebsd/scalar.stderr.exp-arm64_2 | 4 ++-- memcheck/tests/freebsd/scalar.stderr.exp-x86 | 6 +++--- 6 files changed, 19 insertions(+), 23 deletions(-) diff --git a/coregrind/m_syswrap/syswrap-amd64-freebsd.c b/coregrind/m_syswrap/syswrap-amd64-freebsd.c index f28ae4f5fe..fb2e677ccf 100644 --- a/coregrind/m_syswrap/syswrap-amd64-freebsd.c +++ b/coregrind/m_syswrap/syswrap-amd64-freebsd.c @@ -881,17 +881,13 @@ POST(sys_wait6) } } -// the man page is inconsistent for the last argument -// See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=247386 -// will stick to 'arg' for simplicity - // SYS_procctl 544 -// int procctl(idtype_t idtype, id_t id, int cmd, void *arg); +// int procctl(idtype_t idtype, id_t id, int cmd, void *data); PRE(sys_procctl) { PRINT("sys_procctl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %" FMT_REGWORD"d, %#" FMT_REGWORD "x )", SARG1, SARG2, SARG3, ARG4); - PRE_REG_READ4(int, "procctl", vki_idtype_t, idtype, vki_id_t, id, int, cmd, void *, arg); + PRE_REG_READ4(int, "procctl", vki_idtype_t, idtype, vki_id_t, id, int, cmd, void *, data); switch (ARG3) { case VKI_PROC_ASLR_CTL: case VKI_PROC_SPROTECT: @@ -901,13 +897,13 @@ PRE(sys_procctl) case VKI_PROC_STACKGAP_CTL: case VKI_PROC_NO_NEW_PRIVS_CTL: case VKI_PROC_WXMAP_CTL: - PRE_MEM_READ("procctl(arg)", ARG4, sizeof(int)); + PRE_MEM_READ("procctl(data)", ARG4, sizeof(int)); break; case VKI_PROC_REAP_STATUS: - PRE_MEM_READ("procctl(arg)", ARG4, sizeof(struct vki_procctl_reaper_status)); + PRE_MEM_READ("procctl(data)", ARG4, sizeof(struct vki_procctl_reaper_status)); break; case VKI_PROC_REAP_GETPIDS: - PRE_MEM_READ("procctl(arg)", ARG4, sizeof(struct vki_procctl_reaper_pids)); + PRE_MEM_READ("procctl(data)", ARG4, sizeof(struct vki_procctl_reaper_pids)); break; case VKI_PROC_REAP_KILL: /* The first three fields are reads @@ -921,8 +917,8 @@ PRE(sys_procctl) * * There is also a pad field */ - PRE_MEM_READ("procctl(arg)", ARG4, sizeof(int) + sizeof(u_int) + sizeof(vki_pid_t)); - PRE_MEM_WRITE("procctl(arg)", ARG4+offsetof(struct vki_procctl_reaper_kill, rk_killed), sizeof(u_int) + sizeof(vki_pid_t)); + PRE_MEM_READ("procctl(data)", ARG4, sizeof(int) + sizeof(u_int) + sizeof(vki_pid_t)); + PRE_MEM_WRITE("procctl(data)", ARG4+offsetof(struct vki_procctl_reaper_kill, rk_killed), sizeof(u_int) + sizeof(vki_pid_t)); break; case VKI_PROC_ASLR_STATUS: case VKI_PROC_PDEATHSIG_STATUS: @@ -931,7 +927,7 @@ PRE(sys_procctl) case VKI_PROC_TRACE_STATUS: case VKI_PROC_NO_NEW_PRIVS_STATUS: case VKI_PROC_WXMAP_STATUS: - PRE_MEM_WRITE("procctl(arg)", ARG4, sizeof(int)); + PRE_MEM_WRITE("procctl(data)", ARG4, sizeof(int)); case VKI_PROC_REAP_ACQUIRE: case VKI_PROC_REAP_RELEASE: default: diff --git a/memcheck/tests/freebsd/scalar.stderr.exp b/memcheck/tests/freebsd/scalar.stderr.exp index 5ea7543b61..6cd6cf2eca 100644 --- a/memcheck/tests/freebsd/scalar.stderr.exp +++ b/memcheck/tests/freebsd/scalar.stderr.exp @@ -4953,10 +4953,10 @@ Syscall param procctl(id) contains uninitialised byte(s) Syscall param procctl(cmd) contains uninitialised byte(s) ... -Syscall param procctl(arg) contains uninitialised byte(s) +Syscall param procctl(data) contains uninitialised byte(s) ... -Syscall param procctl(arg) points to unaddressable byte(s) +Syscall param procctl(data) points to unaddressable byte(s) ... Address 0x........ is not stack'd, malloc'd or (recently) free'd diff --git a/memcheck/tests/freebsd/scalar.stderr.exp-amd64-141 b/memcheck/tests/freebsd/scalar.stderr.exp-amd64-141 index 4d22fdc834..0262328fab 100644 --- a/memcheck/tests/freebsd/scalar.stderr.exp-amd64-141 +++ b/memcheck/tests/freebsd/scalar.stderr.exp-amd64-141 @@ -4866,10 +4866,10 @@ Syscall param procctl(id) contains uninitialised byte(s) Syscall param procctl(cmd) contains uninitialised byte(s) ... -Syscall param procctl(arg) contains uninitialised byte(s) +Syscall param procctl(data) contains uninitialised byte(s) ... -Syscall param procctl(arg) points to unaddressable byte(s) +Syscall param procctl(data) points to unaddressable byte(s) ... Address 0x........ is not stack'd, malloc'd or (recently) free'd diff --git a/memcheck/tests/freebsd/scalar.stderr.exp-arm64 b/memcheck/tests/freebsd/scalar.stderr.exp-arm64 index 78f61f9aa2..ff5241eebf 100644 --- a/memcheck/tests/freebsd/scalar.stderr.exp-arm64 +++ b/memcheck/tests/freebsd/scalar.stderr.exp-arm64 @@ -4925,10 +4925,10 @@ Syscall param procctl(id) contains uninitialised byte(s) Syscall param procctl(cmd) contains uninitialised byte(s) ... -Syscall param procctl(arg) contains uninitialised byte(s) +Syscall param procctl(data) contains uninitialised byte(s) ... -Syscall param procctl(arg) points to unaddressable byte(s) +Syscall param procctl(data) points to unaddressable byte(s) ... Address 0x........ is not stack'd, malloc'd or (recently) free'd diff --git a/memcheck/tests/freebsd/scalar.stderr.exp-arm64_2 b/memcheck/tests/freebsd/scalar.stderr.exp-arm64_2 index 5ac5a583f4..0110be2d0e 100644 --- a/memcheck/tests/freebsd/scalar.stderr.exp-arm64_2 +++ b/memcheck/tests/freebsd/scalar.stderr.exp-arm64_2 @@ -4838,10 +4838,10 @@ Syscall param procctl(id) contains uninitialised byte(s) Syscall param procctl(cmd) contains uninitialised byte(s) ... -Syscall param procctl(arg) contains uninitialised byte(s) +Syscall param procctl(data) contains uninitialised byte(s) ... -Syscall param procctl(arg) points to unaddressable byte(s) +Syscall param procctl(data) points to unaddressable byte(s) ... Address 0x........ is not stack'd, malloc'd or (recently) free'd diff --git a/memcheck/tests/freebsd/scalar.stderr.exp-x86 b/memcheck/tests/freebsd/scalar.stderr.exp-x86 index 106381e112..b8cafee07b 100644 --- a/memcheck/tests/freebsd/scalar.stderr.exp-x86 +++ b/memcheck/tests/freebsd/scalar.stderr.exp-x86 @@ -4990,7 +4990,7 @@ Syscall param procctl(id_high) contains uninitialised byte(s) Syscall param procctl(cmd) contains uninitialised byte(s) ... -Syscall param procctl(arg) contains uninitialised byte(s) +Syscall param procctl(data) contains uninitialised byte(s) ... --------------------------------------------------------- @@ -5008,10 +5008,10 @@ Syscall param procctl(id_high) contains uninitialised byte(s) Syscall param procctl(cmd) contains uninitialised byte(s) ... -Syscall param procctl(arg) contains uninitialised byte(s) +Syscall param procctl(data) contains uninitialised byte(s) ... -Syscall param procctl(arg) points to unaddressable byte(s) +Syscall param procctl(data) points to unaddressable byte(s) ... Address 0x........ is not stack'd, malloc'd or (recently) free'd |
From: Paul F. <pa...@so...> - 2024-09-29 07:34:05
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=6c984d7bc4d78e7c63f596e09afa6cdcc7ddfef1 commit 6c984d7bc4d78e7c63f596e09afa6cdcc7ddfef1 Author: Paul Floyd <pj...@wa...> Date: Sun Sep 29 09:32:11 2024 +0200 FreeBSD: start reducing uses of FREEBSD_VERS The goal is to remove version checking from configure.ac, like Linux. There's a long way to go still. Diff: --- memcheck/tests/freebsd/scalar.c | 94 +++++++++++++++++++++-------------------- none/tests/freebsd/auxv.c | 18 +++----- 2 files changed, 55 insertions(+), 57 deletions(-) diff --git a/memcheck/tests/freebsd/scalar.c b/memcheck/tests/freebsd/scalar.c index 7532b7748f..bdacf23e0d 100644 --- a/memcheck/tests/freebsd/scalar.c +++ b/memcheck/tests/freebsd/scalar.c @@ -86,7 +86,7 @@ int main(void) SY(SYS_fchdir, x0-1); FAIL; /* SYS_freebsd11_mknod 14 */ -#if (FREEBSD_VERS >= FREEBSD_12) +#if defined(SYS_freebsd11_mknod) GO(SYS_freebsd11_mknod, "3s 1m"); SY(SYS_freebsd11_mknod, x0, x0, x0); FAIL; #else @@ -203,7 +203,7 @@ int main(void) #if !defined(VGP_arm64_freebsd) /* freebsd10_pipe 42 */ -#if (FREEBSD_VERS >= FREEBSD_11) +#if defined(SYS_freebsd10_pipe) GO(SYS_freebsd10_pipe, "0s 0m"); SY(SYS_freebsd10_pipe, x0); SUCC; #else @@ -309,7 +309,7 @@ int main(void) /* obsol vwrite 68 */ -#if (FREEBSD_VERS < FREEBSD_15) +#if defined(SYS_sbrk) /* SYS_sbrk 69 */ GO(SYS_sbrk, "1s 1m"); SY(SYS_sbrk, x0); FAIL; @@ -673,32 +673,35 @@ int main(void) /* unimpl lfs_segwait 187 */ - #if (FREEBSD_VERS >= FREEBSD_12) + #if defined(SYS_freebsd11_stat) /* SYS_freebsd11_stat 188 */ GO(SYS_freebsd11_stat, "2s 2m"); SY(SYS_freebsd11_stat, x0, x0); FAIL; - - /* SYS_freebsd11_fstat 189 */ - GO(SYS_freebsd11_fstat, "2s 1m"); - SY(SYS_freebsd11_fstat, x0, x0); FAIL; - - /* SYS_freebsd11_lstat 190 */ - GO(SYS_freebsd11_lstat, "2s 2m"); - SY(SYS_freebsd11_lstat, x0, x0); FAIL; - - #else +#else /* SYS_stat 188 */ GO(SYS_stat, "2s 2m"); SY(SYS_stat, x0, x0); FAIL; +#endif +#if defined(SYS_freebsd11_fstat) + /* SYS_freebsd11_fstat 189 */ + GO(SYS_freebsd11_fstat, "2s 1m"); + SY(SYS_freebsd11_fstat, x0, x0); FAIL; +#else /* SYS_fstat 189 */ GO(SYS_fstat, "2s 1m"); SY(SYS_fstat, x0, x0); FAIL; +#endif +#if defined(SYS_freebsd11_lstat) + /* SYS_freebsd11_lstat 190 */ + GO(SYS_freebsd11_lstat, "2s 2m"); + SY(SYS_freebsd11_lstat, x0, x0); FAIL; +#else /* SYS_lstat 190 */ GO(SYS_lstat, "2s 2m"); SY(SYS_lstat, x0, x0); FAIL; - #endif +#endif /* SYS_pathconf 191 */ GO(SYS_pathconf, "2s 1m"); @@ -719,7 +722,7 @@ int main(void) SY(SYS_setrlimit, x0, x0); FAIL; /* SYS_freebsd11_getdirentries 196 */ - #if (FREEBSD_VERS >= FREEBSD_12) + #if defined(SYS_freebsd11_getdirentries) GO(SYS_freebsd11_getdirentries, "4s 2m"); SY(SYS_freebsd11_getdirentries, x0, x0, x0+3, x0+1); FAIL; #else @@ -778,7 +781,7 @@ int main(void) SY(SYS_poll, &fds, 1, 1); SUCC; } -#if (FREEBSD_VERS <= FREEBSD_14_0) +#if defined(SYS_freebsd7___semctl) /* SYS_freebsd7___semctl 220 */ GO(SYS_freebsd7___semctl, "(IPC_STAT) 4s 1m"); SY(SYS_freebsd7___semctl, x0, x0, x0+IPC_STAT, x0+1); FAIL; @@ -797,7 +800,7 @@ int main(void) /* unimpl semconfig 223 */ -#if (FREEBSD_VERS <= FREEBSD_14_0) +#if defined(SYS_freebsd7_msgctl) /* SYS_freebsd7_msgctl 224 */ GO(SYS_freebsd7_msgctl, "(set) 3s 1m"); SY(SYS_freebsd7_msgctl, x0, x0+1, x0); FAIL; @@ -822,7 +825,7 @@ int main(void) GO(SYS_shmat, "3s 0m"); SY(SYS_shmat, x0, x0, x0); FAIL; -#if (FREEBSD_VERS <= FREEBSD_14_0) +#if defined(SYS_freebsd7_shmctl) /* SYS_freebsd7_shmctl 229 */ GO(SYS_freebsd7_shmctl, "3s 0m"); SY(SYS_freebsd7_shmctl, x0, x0, x0); FAIL; @@ -881,7 +884,7 @@ int main(void) // unimpl SYS_ffclock_getestimate 243 -#if (FREEBSD_VERS >= FREEBSD_11) +#if defined(SYS_clock_nanosleep) /* SYS_clock_nanosleep 244 */ GO(SYS_clock_nanosleep, "4s 2m"); SY(SYS_clock_nanosleep, x0+5000, x0+3000, x0+3, x0+1); SUCC; @@ -925,7 +928,7 @@ int main(void) SY(SYS_lio_listio, x0+0, x0+1, x0+10, x0+1); FAIL; /* SYS_freebsd11_getdents 272 */ -#if (FREEBSD_VERS >= FREEBSD_12) +#if defined(SYS_freebsd11_getdents) GO(SYS_freebsd11_getdents, "3s 1m"); SY(SYS_freebsd11_getdents, x0+9, x0+1, x0+2); FAIL; #else @@ -1216,7 +1219,7 @@ int main(void) SY(SYS_kqueue); SUCC; /* SYS_freebsd11_kevent 363 */ -#if (FREEBSD_VERS >= FREEBSD_12) +#if defined(SYS_freebsd11_kevent) GO(SYS_freebsd11_kevent, "6s 3m"); SY(SYS_freebsd11_kevent, x0+1, x0+2, x0+3, x0+4, x0+5, x0+6); FAIL; #else @@ -1300,39 +1303,44 @@ int main(void) // mac_syscall 394 -#if (FREEBSD_VERS >= FREEBSD_12) +#if defined(SYS_freebsd11_getfsstat) /* SYS_freebsd11_getfsstat 395*/ GO(SYS_freebsd11_getfsstat, "3s 1m"); SY(SYS_freebsd11_getfsstat, x0+1, x0+2, x0+3); FAIL; - - /* SYS_freebsd11_statfs 396 */ - GO(SYS_freebsd11_statfs, "2s 2m"); - SY(SYS_freebsd11_statfs, x0+1, x0+2); FAIL; - - /* SYS_freebsd11_fstatfs 397 */ - GO(SYS_freebsd11_fstatfs, "2s 1m"); - SY(SYS_freebsd11_fstatfs, x0+1, x0+2); FAIL; - - /* SYS_freebsd11_fhstatfs 398 */ - GO(SYS_freebsd11_fhstatfs, "2s 2m"); - SY(SYS_freebsd11_fhstatfs, x0+1, x0+2); FAIL; #else /* SYS_getfsstat 395*/ GO(SYS_getfsstat, "3s 1m"); SY(SYS_getfsstat, x0+1, x0+2, x0+3); FAIL; +#endif +#if defined(SYS_freebsd11_statfs) + /* SYS_freebsd11_statfs 396 */ + GO(SYS_freebsd11_statfs, "2s 2m"); + SY(SYS_freebsd11_statfs, x0+1, x0+2); FAIL; +#else /* SYS_statfs 396 */ GO(SYS_statfs, "2s 2m"); SY(SYS_statfs, x0+1, x0+2); FAIL; +#endif +#if defined(SYS_freebsd11_fstatfs) + /* SYS_freebsd11_fstatfs 397 */ + GO(SYS_freebsd11_fstatfs, "2s 1m"); + SY(SYS_freebsd11_fstatfs, x0+1, x0+2); FAIL; +#else /* SYS_fstatfs 397 */ GO(SYS_fstatfs, "2s 1m"); SY(SYS_fstatfs, x0+1, x0+2); FAIL; +#endif +#if defined(SYS_freebsd11_fhstatfs) + /* SYS_freebsd11_fhstatfs 398 */ + GO(SYS_freebsd11_fhstatfs, "2s 2m"); + SY(SYS_freebsd11_fhstatfs, x0+1, x0+2); FAIL; +#else /* SYS_fhstatfs 398 */ GO(SYS_fhstatfs, "2s 2m"); SY(SYS_fhstatfs, x0+1, x0+2); FAIL; - #endif // ksem_close 400 @@ -1394,7 +1402,7 @@ int main(void) GO(SYS_swapcontext, "2s 2m"); SY(SYS_swapcontext, x0+1, x0+2); FAIL; -#if (FREEBSD_VERS >= FREEBSD_13_1) +#if defined(SYS_freebsd13_swapoff) /* SYS_freebsd13_swapoff 424 */ GO(SYS_freebsd13_swapoff, "1s 1m"); SY(SYS_freebsd13_swapoff, x0+1); FAIL; @@ -1630,7 +1638,7 @@ int main(void) SY(SYS_thr_kill2, x0-1, x0-1, x0+9999); FAIL; /* SYS_shm_open 482 */ -#if (FREEBSD_VERS >= FREEBSD_13_0) +#if defined(SYS_freebsd12_shm_open) GO(SYS_freebsd12_shm_open, "(SHM_ANON) 3s 0m"); SY(SYS_freebsd12_shm_open, x0+SHM_ANON, x0+2, x0+9); SUCC; #else @@ -1688,7 +1696,7 @@ int main(void) SY(SYS_fexecve, x0-1, x0+1, x0+1); FAIL; /* SYS_freebsd11_fstatat 493 */ -#if (FREEBSD_VERS >= FREEBSD_12) +#if defined(SYS_freebsd11_fstatat) GO(SYS_freebsd11_fstatat, "4s 2m"); SY(SYS_freebsd11_fstatat, x0, x0+1, x0+1, x0); FAIL; #else @@ -1713,7 +1721,7 @@ int main(void) SY(SYS_mkfifoat, x0, x0, x0); FAIL; /* SYS_freebsd11_mknodat 498 */ -#if (FREEBSD_VERS >= FREEBSD_12) +#if defined(SYS_freebsd11_mknodat) GO(SYS_freebsd11_mknodat, "4s 1m"); SY(SYS_freebsd11_mknodat, x0, x0+1, x0, x0); FAIL; #else @@ -1763,7 +1771,7 @@ int main(void) SY(SYS_jail_remove, x0+1); FAIL; /* SYS_closefrom 509 */ -#if (FREEBSD_VERS >= FREEBSD_13_0) +#if defined(SYS_freebsd12_closefrom) GO(SYS_freebsd12_closefrom, "1s 0m"); SY(SYS_freebsd12_closefrom, x0+100000); SUCC; #else @@ -1951,8 +1959,6 @@ int main(void) GO(SYS_utimensat, "4s 2m"); SY(SYS_utimensat, x0+99999999, x0+1, x0+1, x0); FAIL; -#if (FREEBSD_VERS >= FREEBSD_11) - // 548 is obsolete numa_getaffinity // 549 is obsolete numa_setaffinity @@ -1961,8 +1967,6 @@ int main(void) GO(SYS_fdatasync, "1s 0m"); SY(SYS_fdatasync, x0+99999999); FAIL; -#endif // FREEBSD_VERS >= FREEBSD_11 - #if (FREEBSD_VERS >= FREEBSD_12) /* SYS_fstat 551 */ diff --git a/none/tests/freebsd/auxv.c b/none/tests/freebsd/auxv.c index f2e1299045..19e9232617 100644 --- a/none/tests/freebsd/auxv.c +++ b/none/tests/freebsd/auxv.c @@ -11,7 +11,7 @@ typedef struct { } Elf_AuxStr; Elf_AuxStr aux_map[AT_COUNT] = { - {"AT_NLL", 0}, + {"AT_NULL", 0}, {"AT_IGNORE", 1}, {"AT_EXECFD", 2}, {"AT_PHDR", 3}, @@ -38,27 +38,17 @@ Elf_AuxStr aux_map[AT_COUNT] = { {"AT_EHDRFLAGS", 24}, {"AT_HWCAP", 25}, {"AT_HWCAP2", 26}, -// FreeBSD 12 and 11 -// {"AT_COUNT", 27}, -#if (FREEBSD_VERS >= FREEBSD_13_0) {"AT_BSDFLAGS", 27}, {"AT_ARGC", 28}, {"AT_ARGV", 29}, {"AT_ENVC", 30}, {"AT_ENVV", 31}, {"AT_PS_STRINGS", 32}, -// {"AT_COUNT", 33}, -#endif -#if (FREEBSD_VERS >= FREEBSD_13_1) {"AT_FXRNG", 33}, {"AT_KPRELOAD", 34}, -// {"AT_COUNT", 35}, -#endif -#if (FREEBSD_VERS >= FREEBSD_13_2) {"AT_USRSTACKBASE", 35}, {"AT_USRSTACKLIM", 36}, // {"AT_COUNT", 37}, -#endif }; int main(int argc, char* argv[], char* envp[]) @@ -80,13 +70,15 @@ int main(int argc, char* argv[], char* envp[]) fprintf(stderr, "EXECPATH: %s\n", (char*)auxp->a_un.a_val); } break; -#if (FREEBSD_VERS >= FREEBSD_13_0) +#if defined(AT_ARGV) case AT_ARGV: if (auxp->a_un.a_val != 0) { fprintf(stderr, "ARGV: %s\n", *(char**)auxp->a_un.a_val); } break; +#endif +#if defined(AT_ENVV) case AT_ENVV: if (auxp->a_un.a_val != 0) { @@ -95,6 +87,8 @@ int main(int argc, char* argv[], char* envp[]) /*fprintf(stderr, "ENVV: %s\n", *(char**)auxp->a_un.a_val);*/ } break; +#endif +#if defined(AT_PS_STRINGS) case AT_PS_STRINGS: if (auxp->a_un.a_val != 0) { |
From: Paul F. <pa...@so...> - 2024-09-28 06:33:18
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=d224730c8861a1ac2578bcbcaf2f704f56257134 commit d224730c8861a1ac2578bcbcaf2f704f56257134 Author: Paul Floyd <pj...@wa...> Date: Sat Sep 28 08:32:35 2024 +0200 Compiler warning in ML_(check_elf_and_get_rw_loads) again This fime for p_vaddr Diff: --- coregrind/m_debuginfo/readelf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/coregrind/m_debuginfo/readelf.c b/coregrind/m_debuginfo/readelf.c index 1d6ec55a0b..da548048df 100644 --- a/coregrind/m_debuginfo/readelf.c +++ b/coregrind/m_debuginfo/readelf.c @@ -3904,6 +3904,7 @@ Bool ML_(check_elf_and_get_rw_loads) ( Int fd, const HChar* filename, previous_rw_a_phdr.p_memsz = 0; /* and silence compiler warnings */ previous_rw_a_phdr.p_filesz = 0; + previous_rw_a_phdr.p_vaddr = 0; for (i = 0U; i < phdr_mnent; i++) { ElfXX_Phdr a_phdr; |
From: Paul F. <pa...@so...> - 2024-09-28 06:30:17
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=9626d20f0151c1b34d511c82796d7b34aabc5939 commit 9626d20f0151c1b34d511c82796d7b34aabc5939 Author: Paul Floyd <pj...@wa...> Date: Sat Sep 28 08:20:25 2024 +0200 Compiler warning in ML_(check_elf_and_get_rw_loads) GCC 12.2 complains that previous_rw_a_phdr.p_vaddr + previous_rw_a_phdr.p_filesz may be using p_filesz uninitialized That's only possible if ML_(img_get) somehow fails to read all of a program header such that p_memsz is greater than 0 but p_filesz remains uninitialized. Hardly likely since p_memsz comes after p_filesz in the structure. Diff: --- coregrind/m_debuginfo/readelf.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coregrind/m_debuginfo/readelf.c b/coregrind/m_debuginfo/readelf.c index b037b9201a..1d6ec55a0b 100644 --- a/coregrind/m_debuginfo/readelf.c +++ b/coregrind/m_debuginfo/readelf.c @@ -3902,6 +3902,8 @@ Bool ML_(check_elf_and_get_rw_loads) ( Int fd, const HChar* filename, /* Sets p_memsz to 0 to indicate we have not yet a previous a_phdr. */ previous_rw_a_phdr.p_memsz = 0; + /* and silence compiler warnings */ + previous_rw_a_phdr.p_filesz = 0; for (i = 0U; i < phdr_mnent; i++) { ElfXX_Phdr a_phdr; |
From: Paul F. <pa...@so...> - 2024-09-27 20:28:18
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=f1c922ce5dc662260b5b8f7497eccb128772e31f commit f1c922ce5dc662260b5b8f7497eccb128772e31f Author: Paul Floyd <pj...@wa...> Date: Fri Sep 27 22:18:24 2024 +0200 FreeBSD: remove code for FreeBSD 10 FreeBSD 10 was never really tested - fully working FreeBSD support arrived around the time of FreeBSD 11.3 and 12.1. FreeBSD had already been EOL around 2 years by then. Diff: --- configure.ac | 13 +-- coregrind/m_syswrap/priv_syswrap-freebsd.h | 26 +++--- coregrind/m_syswrap/syswrap-amd64-freebsd.c | 96 ++-------------------- coregrind/m_syswrap/syswrap-freebsd.c | 119 +++++----------------------- coregrind/m_syswrap/syswrap-x86-freebsd.c | 97 ++--------------------- include/vki/vki-scnums-freebsd.h | 56 +++++-------- memcheck/tests/freebsd/scalar.c | 46 ++--------- 7 files changed, 69 insertions(+), 384 deletions(-) diff --git a/configure.ac b/configure.ac index c7f834e051..5e96f12521 100755 --- a/configure.ac +++ b/configure.ac @@ -399,8 +399,6 @@ case "${host_os}" in *freebsd*) AC_MSG_RESULT([ok (${host_os})]) VGCONF_OS="freebsd" - AC_DEFINE([FREEBSD_10], 1000, [FREEBSD_VERS value for FreeBSD 10.x]) - freebsd_10=1000 AC_DEFINE([FREEBSD_11], 1100, [FREEBSD_VERS value for FreeBSD 11.x]) freebsd_11=1100 AC_DEFINE([FREEBSD_12], 1200, [FREEBSD_VERS value for FreeBSD 12.0 to 12.1]) @@ -428,11 +426,6 @@ case "${host_os}" in kernel=`uname -r` case "${kernel}" in - 10.*) - AC_MSG_RESULT([FreeBSD 10.x (${kernel})]) - AC_DEFINE([FREEBSD_VERS], FREEBSD_10, [FreeBSD version]) - freebsd_vers=$freebsd_10 - ;; 11.*) AC_MSG_RESULT([FreeBSD 11.x (${kernel})]) AC_DEFINE([FREEBSD_VERS], FREEBSD_11, [FreeBSD version]) @@ -481,7 +474,7 @@ case "${host_os}" in ;; *) AC_MSG_RESULT([unsupported (${kernel})]) - AC_MSG_ERROR([Valgrind works on FreeBSD 10.x to 15.x]) + AC_MSG_ERROR([Valgrind works on FreeBSD 11.x to 15.x]) ;; esac ;; @@ -499,7 +492,7 @@ case "${host_os}" in ;; *) AC_MSG_RESULT([unsupported (${kernel})]) - AC_MSG_ERROR([Valgrind works on FreeBSD 10.x to 15.x]) + AC_MSG_ERROR([Valgrind works on FreeBSD 11.x to 15.x]) ;; esac ;; @@ -510,7 +503,7 @@ case "${host_os}" in ;; *) AC_MSG_RESULT([unsupported (${kernel})]) - AC_MSG_ERROR([Valgrind works on FreeBSD 10.x to 15.x]) + AC_MSG_ERROR([Valgrind works on FreeBSD 11.x to 15.x]) ;; esac diff --git a/coregrind/m_syswrap/priv_syswrap-freebsd.h b/coregrind/m_syswrap/priv_syswrap-freebsd.h index df049d907b..040f308d8e 100644 --- a/coregrind/m_syswrap/priv_syswrap-freebsd.h +++ b/coregrind/m_syswrap/priv_syswrap-freebsd.h @@ -153,20 +153,16 @@ DECL_TEMPLATE(freebsd, sys_quotactl) // 148 //DECL_TEMPLATE(freebsd, sys_nfssvc) 155 DECL_TEMPLATE(freebsd, sys_lgetfh) // 160 DECL_TEMPLATE(freebsd, sys_getfh) // 161 -#if (FREEBSD_VERS <= FREEBSD_10) -DECL_TEMPLATE(freebsd, sys_freebsd4_getdomainname) // 162 -DECL_TEMPLATE(freebsd, sys_freebsd4_setdomainname) // 163 -DECL_TEMPLATE(freebsd, sys_freebsd4_uname) // 164 -#endif +//DECL_TEMPLATE(freebsd, sys_freebsd4_getdomainname) // 162 +//DECL_TEMPLATE(freebsd, sys_freebsd4_setdomainname) // 163 +//DECL_TEMPLATE(freebsd, sys_freebsd4_uname) // 164 DECL_TEMPLATE(freebsd, sys_sysarch) // 165 DECL_TEMPLATE(freebsd, sys_rtprio) // 166 //DECL_TEMPLATE(freebsd, sys_semsys) 169 //DECL_TEMPLATE(freebsd, sys_msgsys) 170 //DECL_TEMPLATE(freebsd, sys_shmsys) 171 -#if (FREEBSD_VERS <= FREEBSD_10) -DECL_TEMPLATE(freebsd, sys_freebsd6_pread) // 173 -DECL_TEMPLATE(freebsd, sys_freebsd6_pwrite) // 174 -#endif +//DECL_TEMPLATE(freebsd, sys_freebsd6_pread) // 173 +//DECL_TEMPLATE(freebsd, sys_freebsd6_pwrite) // 174 DECL_TEMPLATE(freebsd, sys_setfib) // 175 //DECL_TEMPLATE(freebsd, sys_ntp_adjtime) 176 // generic setgid 181 @@ -191,15 +187,11 @@ DECL_TEMPLATE(freebsd, sys_freebsd11_getdirentries) // 196 DECL_TEMPLATE(freebsd, sys_getdirentries) // 196 #endif -#if (FREEBSD_VERS <= FREEBSD_10) -DECL_TEMPLATE(freebsd, sys_freebsd6_mmap) // 197 -#endif +//DECL_TEMPLATE(freebsd, sys_freebsd6_mmap) // 197 +//DECL_TEMPLATE(freebsd, sys_freebsd6_lseek) // 199 +//DECL_TEMPLATE(freebsd, sys_freebsd6_truncate) // 200 +//DECL_TEMPLATE(freebsd, sys_freebsd6_ftruncate) // 201 -#if (FREEBSD_VERS <= FREEBSD_10) -DECL_TEMPLATE(freebsd, sys_freebsd6_lseek) // 199 -DECL_TEMPLATE(freebsd, sys_freebsd6_truncate) // 200 -DECL_TEMPLATE(freebsd, sys_freebsd6_ftruncate) // 201 -#endif DECL_TEMPLATE(freebsd, sys___sysctl) // 202 // generic mlock 202 // generic munlock 203 diff --git a/coregrind/m_syswrap/syswrap-amd64-freebsd.c b/coregrind/m_syswrap/syswrap-amd64-freebsd.c index c2dd3ce276..f28ae4f5fe 100644 --- a/coregrind/m_syswrap/syswrap-amd64-freebsd.c +++ b/coregrind/m_syswrap/syswrap-amd64-freebsd.c @@ -187,106 +187,22 @@ POST(sys_sysarch) } // freebsd6_pread 173 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_pread) -{ - *flags |= SfMayBlock; - PRINT("sys_freebsd6_pread ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %lu, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3, ARG4, ARG5); - PRE_REG_READ5(ssize_t, "read", - unsigned int, fd, char *, buf, vki_size_t, count, - int, pad, unsigned long, off); - - if (!ML_(fd_allowed)(ARG1, "freebsd6_pread", tid, False)) - SET_STATUS_Failure( VKI_EBADF ); - else - PRE_MEM_WRITE( "freebsd6_pread(buf)", ARG2, ARG3 ); -} - -POST(sys_freebsd6_pread) -{ - vg_assert(SUCCESS); - POST_MEM_WRITE( ARG2, RES ); -} -#endif +// removed // freebsd6_pwrite 174 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_pwrite) -{ - Bool ok; - *flags |= SfMayBlock; - PRINT("sys_freebsd6_pwrite ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", SARG1, ARG2, ARG3, ARG4, ARG5); - PRE_REG_READ5(ssize_t, "write", - unsigned int, fd, const char *, buf, vki_size_t, count, - int, pad, unsigned long, off); - /* check to see if it is allowed. If not, try for an exemption from - --sim-hints=enable-outer (used for self hosting). */ - ok = ML_(fd_allowed)(ARG1, "freebsd6_pwrite", tid, False); - if (!ok && ARG1 == 2/*stderr*/ - && SimHintiS(SimHint_enable_outer, VG_(clo_sim_hints))) - ok = True; - if (!ok) - SET_STATUS_Failure( VKI_EBADF ); - else - PRE_MEM_READ( "freebsd6_pwrite(buf)", ARG2, ARG3 ); -} -#endif +// removed // SYS_freebsd6_mmap 197 -#if (FREEBSD_VERS <= FREEBSD_10) -/* This is here because on x86 the off_t is passed in 2 regs. Don't ask about pad. */ - -/* caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); */ -/* ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 */ - -PRE(sys_freebsd6_mmap) -{ - SysRes r; - - PRINT("sys_mmap ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, pad%" FMT_REGWORD "u, 0x%" FMT_REGWORD "x)", - ARG1, (UWord)ARG2, ARG3, ARG4, ARG5, ARG6, ARG7 ); - PRE_REG_READ7(long, "mmap", - char *, addr, unsigned long, len, int, prot, int, flags, - int, fd, int, pad, unsigned long, pos); - - r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, ARG7 ); - SET_STATUS_from_SysRes(r); -} -#endif +// removed // freebsd6_lseek 199 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_lseek) -{ - PRINT("sys_freebsd6_lseek ( %" FMT_REGWORD "u, 0x%" FMT_REGWORD "x, %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,ARG2,ARG3,ARG4); - PRE_REG_READ4(long, "lseek", - unsigned int, fd, int, pad, unsigned long, offset, - unsigned int, whence); -} -#endif +// removed // freebsd6_truncate 200 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_truncate) -{ - *flags |= SfMayBlock; - PRINT("sys_truncate ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1,(char *)ARG1,ARG3); - PRE_REG_READ3(long, "truncate", - const char *, path, int, pad, unsigned int, length); - PRE_MEM_RASCIIZ( "truncate(path)", ARG1 ); -} -#endif +// removed // freebsd6_ftruncate 201 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_ftruncate) -{ - *flags |= SfMayBlock; - PRINT("sys_ftruncate ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1,ARG3); - PRE_REG_READ3(long, "ftruncate", unsigned int, fd, int, pad, - unsigned int, length); -} -#endif +// removed // SYS_clock_getcpuclockid2 247 // no manpage for this, from syscalls.master diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index 071e6ab152..41372f4e15 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -1713,49 +1713,14 @@ POST(sys_getfh) POST_MEM_WRITE(ARG2, sizeof(vki_fhandle_t)); } -#if (FREEBSD_VERS <= FREEBSD_10) -// 162 -// int getdomainname(char *domainname, int len); -PRE(sys_freebsd4_getdomainname) -{ - PRINT("sys_freebsd4_getdomainname ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )",ARG1,ARG2); - PRE_REG_READ2(int, "getdomainname", - char *, domainname, int, len); - PRE_MEM_WRITE( "getdomainname(domainname)", ARG1, ARG2 ); -} - -POST(sys_freebsd4_getdomainname) -{ - if (ARG1 != 0) { - POST_MEM_WRITE( ARG1, ARG2 ); - } -} - -// 163 -// int setdomainname(char *domainname, int len); -PRE(sys_freebsd4_setdomainname) -{ - PRINT("sys_freebsd4_setdomainname ( %#" FMT_REGWORD "x )",ARG1); - PRE_REG_READ2(int, "setdomainname", char *, domainname, int, len); - PRE_MEM_RASCIIZ( "setdomainname(domainname)", ARG1 ); -} +// freebsd4 getdomainname 162 +// removed -// 164 -// int uname(struct utsname *name); -PRE(sys_freebsd4_uname) -{ - PRINT("sys_freebsd4_uname ( %#" FMT_REGWORD "x )", ARG1); - PRE_REG_READ1(int, "uname", struct utsname *, name); - PRE_MEM_WRITE( "uname(name)", ARG1, sizeof(struct vki_utsname) ); -} +// freebsd4 setdomainname 163 +// removed -POST(sys_freebsd4_uname) -{ - if (ARG1 != 0) { - POST_MEM_WRITE( ARG1, sizeof(struct vki_utsname) ); - } -} -#endif +// freebsd4 uname 164 +// removed // SYS_sysarch 165 // x86/amd64 @@ -4345,39 +4310,11 @@ POST(sys_thr_kill) } } -#if (FREEBSD_VERS <= FREEBSD_10) -// SYS__umtx_lock 434 -PRE(sys__umtx_lock) -{ - PRINT( "sys__umtx_lock ( %#" FMT_REGWORD "x )", ARG1); - PRE_REG_READ1(long, "_umtx_lock", struct vki_umtx *, umtx); - PRE_MEM_READ( "_umtx_lock(mtx)", ARG1, sizeof(struct vki_umtx) ); - PRE_MEM_WRITE( "_umtx_lock(mtx)", ARG1, sizeof(struct vki_umtx) ); -} +// SYS_freebsd10__umtx_lock 434 +// removed -POST(sys__umtx_lock) -{ - if (SUCCESS) { - POST_MEM_WRITE(ARG1, sizeof(struct vki_umtx)); - } -} - -// SYS__umtx_unlock 434 -PRE(sys__umtx_unlock) -{ - PRINT( "sys__umtx_unlock ( %#" FMT_REGWORD "x )", ARG1); - PRE_REG_READ1(long, "_umtx_unlock", struct vki_umtx *, umtx); - PRE_MEM_READ( "_umtx_unlock(mtx)", ARG1, sizeof(struct vki_umtx) ); - PRE_MEM_WRITE( "_umtx_unlock(mtx)", ARG1, sizeof(struct vki_umtx) ); -} - -POST(sys__umtx_unlock) -{ - if (SUCCESS) { - POST_MEM_WRITE(ARG1, sizeof(struct vki_umtx)); - } -} -#endif +// SYS_freebsd10__umtx_unlock 434 +// removed // SYS_jail_attach 436 // int jail_attach(int jid); @@ -7446,11 +7383,9 @@ const SyscallTableEntry ML_(syscall_table)[] = { BSDXY(__NR_lgetfh, sys_lgetfh), // 160 BSDXY(__NR_getfh, sys_getfh), // 161 -#if (FREEBSD_VERS <= FREEBSD_10) - BSDXY(__NR_freebsd4_getdomainname, sys_freebsd4_getdomainname), // 162 - BSDX_(__NR_freebsd4_setdomainname, sys_freebsd4_setdomainname), // 163 - BSDXY(__NR_freebsd4_uname, sys_freebsd4_uname), // 164 -#endif + //BSDXY(__NR_freebsd4_getdomainname, sys_freebsd4_getdomainname), // 162 + //BSDX_(__NR_freebsd4_setdomainname, sys_freebsd4_setdomainname), // 163 + //BSDXY(__NR_freebsd4_uname, sys_freebsd4_uname), // 164 BSDXY(__NR_sysarch, sys_sysarch), // 165 BSDXY(__NR_rtprio, sys_rtprio), // 166 @@ -7459,10 +7394,8 @@ const SyscallTableEntry ML_(syscall_table)[] = { // msgsys 170 // shmsys 171 -#if (FREEBSD_VERS <= FREEBSD_10) - BSDXY(__NR_freebsd6_pread, sys_freebsd6_pread), // 173 - BSDX_(__NR_freebsd6_pwrite, sys_freebsd6_pwrite), // 174 -#endif + //BSDXY(__NR_freebsd6_pread, sys_freebsd6_pread), // 173 + //BSDX_(__NR_freebsd6_pwrite, sys_freebsd6_pwrite), // 174 BSDX_(__NR_setfib, sys_setfib), // 175 // @todo PJF this exists on Darwin and Solaris as well @@ -7502,15 +7435,11 @@ const SyscallTableEntry ML_(syscall_table)[] = { #else BSDXY(__NR_getdirentries, sys_getdirentries), // 196 #endif -#if (FREEBSD_VERS <= FREEBSD_10) - BSDX_(__NR_freebsd6_mmap, sys_freebsd6_mmap), // 197 -#endif + //BSDX_(__NR_freebsd6_mmap, sys_freebsd6_mmap), // 197 // __syscall (handled specially) // 198 -#if (FREEBSD_VERS <= FREEBSD_10) - BSDX_(__NR_freebsd6_lseek, sys_freebsd6_lseek), // 199 - BSDX_(__NR_freebsd6_truncate, sys_freebsd6_truncate), // 200 - BSDX_(__NR_freebsd6_ftruncate, sys_freebsd6_ftruncate), // 201 -#endif + //BSDX_(__NR_freebsd6_lseek, sys_freebsd6_lseek), // 199 + //BSDX_(__NR_freebsd6_truncate, sys_freebsd6_truncate), // 200 + //BSDX_(__NR_freebsd6_ftruncate, sys_freebsd6_ftruncate), // 201 BSDXY(__NR___sysctl, sys___sysctl), // 202 GENX_(__NR_mlock, sys_mlock), // 203 @@ -7757,10 +7686,8 @@ const SyscallTableEntry ML_(syscall_table)[] = { BSDXY(__NR_thr_self, sys_thr_self), // 432 BSDXY(__NR_thr_kill, sys_thr_kill), // 433 -#if (FREEBSD_VERS <= FREEBSD_10) - BSDXY(__NR__umtx_lock, sys__umtx_lock), // 434 - BSDXY(__NR__umtx_unlock, sys__umtx_unlock), // 435 -#endif + //BSDXY(__NR__umtx_lock, sys__umtx_lock), // 434 + //BSDXY(__NR__umtx_unlock, sys__umtx_unlock), // 435 BSDX_(__NR_jail_attach, sys_jail_attach), // 436 BSDXY(__NR_extattr_list_fd, sys_extattr_list_fd), // 437 @@ -7892,13 +7819,11 @@ const SyscallTableEntry ML_(syscall_table)[] = { // 544 is the highest syscall on FreeBSD 9 -#if (FREEBSD_VERS >= FREEBSD_10) - BSDXY(__NR_ppoll, sys_ppoll), // 545 BSDX_(__NR_futimens, sys_futimens), // 546 BSDX_(__NR_utimensat, sys_utimensat), // 547 -#endif // FREEBSD_VERS >= FREEBSD_10 + // 547 is the highest syscall on FreeBSD 10 #if (FREEBSD_VERS >= FREEBSD_11) diff --git a/coregrind/m_syswrap/syswrap-x86-freebsd.c b/coregrind/m_syswrap/syswrap-x86-freebsd.c index bffc869043..069af4c2d7 100644 --- a/coregrind/m_syswrap/syswrap-x86-freebsd.c +++ b/coregrind/m_syswrap/syswrap-x86-freebsd.c @@ -602,107 +602,22 @@ POST(sys_sysarch) } // freebsd6_pread 173 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_pread) -{ - *flags |= SfMayBlock; - PRINT("sys_freebsd6_pread ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3, ARG5, ARG6); - PRE_REG_READ6(ssize_t, "pread", - unsigned int, fd, char *, buf, vki_size_t, count, - int, pad, unsigned int, off_low, unsigned int, off_high); - - if (!ML_(fd_allowed)(ARG1, "freebsd6_pread", tid, False)) - SET_STATUS_Failure( VKI_EBADF ); - else - PRE_MEM_WRITE( "freebsd6_pread(buf)", ARG2, ARG3 ); -} - -POST(sys_freebsd6_pread) -{ - vg_assert(SUCCESS); - POST_MEM_WRITE( ARG2, RES ); -} -#endif +// removed // freebsd6_pwrite 174 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_pwrite) -{ - Bool ok; - *flags |= SfMayBlock; - PRINT("sys_freebsd6_pwrite ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2, ARG3, ARG5, ARG6); - PRE_REG_READ6(ssize_t, "freebsd6_pwrite", - unsigned int, fd, const char *, buf, vki_size_t, count, - int, pad, unsigned int, off_low, unsigned int, off_high); - /* check to see if it is allowed. If not, try for an exemption from - --sim-hints=enable-outer (used for self hosting). */ - ok = ML_(fd_allowed)(ARG1, "freebsd6_pwrite", tid, False); - if (!ok && ARG1 == 2/*stderr*/ - && SimHintiS(SimHint_enable_outer, VG_(clo_sim_hints))) - ok = True; - if (!ok) - SET_STATUS_Failure( VKI_EBADF ); - else - PRE_MEM_READ( "freebsd6_write(buf)", ARG2, ARG3 ); -} -#endif +// removed // SYS_freebsd6_mmap 197 -#if (FREEBSD_VERS <= FREEBSD_10) -/* This is here because on x86 the off_t is passed in 2 regs. Don't ask about pad. */ - -/* caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); */ -/* ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7+ARG8 */ - -PRE(sys_freebsd6_mmap) -{ - SysRes r; - - PRINT("sys_freebsd6_mmap ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u, pad%" FMT_REGWORD "u, lo0x%" FMT_REGWORD "x hi0x%" FMT_REGWORD "x)", - ARG1, (UWord)ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8 ); - PRE_REG_READ8(long, "mmap", - char *, addr, unsigned long, len, int, prot, int, flags, - int, fd, int, pad, unsigned long, lo, unsigned long, hi); - - r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, MERGE64(ARG7,ARG8) ); - SET_STATUS_from_SysRes(r); -} -#endif +// removed // freebsd6_lseek 199 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_lseek) -{ - PRINT("sys_freebsd6_lseek ( %" FMT_REGWORD "u, 0x%" FMT_REGWORD "x, 0x%" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1,ARG3,ARG4,ARG5); - PRE_REG_READ5(long, "lseek", - unsigned int, fd, int, pad, unsigned int, offset_low, - unsigned int, offset_high, unsigned int, whence); -} -#endif +// removed // freebsd6_truncate 200 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_truncate) -{ - *flags |= SfMayBlock; - PRINT("sys_truncate ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1,(char *)ARG1,ARG3,ARG4); - PRE_REG_READ4(long, "truncate", - const char *, path, int, pad, - unsigned int, length_low, unsigned int, length_high); - PRE_MEM_RASCIIZ( "truncate(path)", ARG1 ); -} -#endif +// removed // freebsd6_ftruncate 201 -#if (FREEBSD_VERS <= FREEBSD_10) -PRE(sys_freebsd6_ftruncate) -{ - *flags |= SfMayBlock; - PRINT("sys_ftruncate ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1,ARG3,ARG4); - PRE_REG_READ4(long, "ftruncate", unsigned int, fd, int, pad, - unsigned int, length_low, unsigned int, length_high); -} -#endif +// removed // SYS_clock_getcpuclockid2 247 // no manpage for this, from syscalls.master diff --git a/include/vki/vki-scnums-freebsd.h b/include/vki/vki-scnums-freebsd.h index 17d8b11df1..399f14e5cc 100644 --- a/include/vki/vki-scnums-freebsd.h +++ b/include/vki/vki-scnums-freebsd.h @@ -198,29 +198,23 @@ #define __NR_nfssvc 155 /* old getdirentries 156 */ -#if (FREEBSD_VERS <= FREEBSD_10) // these were removed in FreeBSD 11 -#define __NR_freebsd4_statfs 157 -#define __NR_freebsd4_fstatfs 158 -#endif +//#define __NR_freebsd4_statfs 157 +//#define __NR_freebsd4_fstatfs 158 #define __NR_lgetfh 160 #define __NR_getfh 161 -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_freebsd4_getdomainname 162 -#define __NR_freebsd4_setdomainname 163 -#define __NR_freebsd4_uname 164 -#endif +//#define __NR_freebsd4_getdomainname 162 +//#define __NR_freebsd4_setdomainname 163 +//#define __NR_freebsd4_uname 164 #define __NR_sysarch 165 #define __NR_rtprio 166 #define __NR_semsys 169 #define __NR_msgsys 170 #define __NR_shmsys 171 -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_freebsd6_pread 173 -#define __NR_freebsd6_pwrite 174 -#endif +//#define __NR_freebsd6_pread 173 +//#define __NR_freebsd6_pwrite 174 #define __NR_setfib 175 #define __NR_ntp_adjtime 176 #define __NR_setgid 181 @@ -247,15 +241,11 @@ #else #define __NR_getdirentries 196 #endif -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_freebsd6_mmap 197 -#endif +//#define __NR_freebsd6_mmap 197 #define __NR___syscall 198 -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_freebsd6_lseek 199 -#define __NR_freebsd6_truncate 200 -#define __NR_freebsd6_ftruncate 201 -#endif +/* #define __NR_freebsd6_lseek 199 */ +/* #define __NR_freebsd6_truncate 200 */ +/* #define __NR_freebsd6_ftruncate 201 */ #define __NR___sysctl 202 #define __NR_mlock 203 #define __NR_munlock 204 @@ -317,9 +307,7 @@ #define __NR_preadv 289 #define __NR_pwritev 290 -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_freebsd4_fhstatfs 297 -#endif +/* #define __NR_freebsd4_fhstatfs 297 */ #define __NR_fhopen 298 @@ -347,11 +335,9 @@ #define __NR_aio_suspend 315 #define __NR_aio_cancel 316 #define __NR_aio_error 317 -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_oaio_read 318 -#define __NR_oaio_write 319 -#define __NR_olio_listio 320 -#endif +/* #define __NR_oaio_read 318 */ +/* #define __NR_oaio_write 319 */ +/* #define __NR_olio_listio 320 */ #define __NR_yield 321 /* obs thr_sleep 323 */ /* obs thr_wakeup 324 */ @@ -367,20 +353,14 @@ #define __NR_sched_get_priority_min 333 #define __NR_sched_rr_get_interval 334 #define __NR_utrace 335 -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_freebsd4_sendfile 342 -#endif +/* #define __NR_freebsd4_sendfile 342 */ #define __NR_kldsym 337 #define __NR_jail 338 #define __NR_sigprocmask 340 #define __NR_sigsuspend 341 -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_freebsd4_sigaction 342 -#endif +/* #define __NR_freebsd4_sigaction 342 */ #define __NR_sigpending 343 -#if (FREEBSD_VERS <= FREEBSD_10) -#define __NR_freebsd4_sigreturn 344 -#endif +/* #define __NR_freebsd4_sigreturn 344 */ #define __NR_sigtimedwait 345 #define __NR_sigwaitinfo 346 #define __NR___acl_get_file 347 diff --git a/memcheck/tests/freebsd/scalar.c b/memcheck/tests/freebsd/scalar.c index 67c47e133d..7532b7748f 100644 --- a/memcheck/tests/freebsd/scalar.c +++ b/memcheck/tests/freebsd/scalar.c @@ -604,19 +604,9 @@ int main(void) GO(SYS_getfh, "2s 2m"); SY(SYS_getfh, x0, x0); FAIL; -#if (FREEBSD_VERS <= FREEBSD_10) - /* SYS_getdomainname 162 */ - GO(SYS_freebsd4_getdomainname, "2s 1m"); - SY(SYS_freebsd4_getdomainname, x0, x0); FAIL; - - /* SYS_setdomainname 163 */ - GO(SYS_freebsd4_setdomainname, "2s 0m"); - SY(SYS_freebsd4_setdomainname, x0, x0); FAIL; - - /* SYS_uname 164 */ - GO(SYS_freebsd4_uname, "1s 1m"); - SY(SYS_freebsd4_uname, x0); FAIL; -#endif + /* SYS_freebsd4_getdomainname 162 */ + /* SYS_freebsd4_setdomainname 163 */ + /* SYS_freebsd_4uname 164 */ /* SYS_sysarch 165 */ #if defined (VGP_x86_freebsd) @@ -645,21 +635,12 @@ int main(void) SY(SYS_rtprio, x0+1, x0, x0); FAIL; /* following 3 not implemented in OS */ - /* SYS_semsys 169 */ - /* SYS_msgsys 170 */ - /* SYS_shmsys 171 */ -#if (FREEBSD_VERS <= FREEBSD_10) - - /* @todo PJF maybe one day */ - /* SYS_freebsd6_pread 173 */ - /* SYS_freebsd6_pwrite 174 */ -#endif /* SYS_setfib 175 */ GO(SYS_setfib, "1s 0m"); @@ -668,9 +649,7 @@ int main(void) // BSDXY(__NR_ntp_adjtime, sys_ntp_adjtime), // 176 /* bsd/os sfork 177 */ - /* bsd/os getdescriptor 178 */ - /* bsd/os setdescriptor 179 */ /* SYS_setgid, 181 */ @@ -748,19 +727,13 @@ int main(void) SY(SYS_getdirentries, x0, x0, x0+3, x0+1); FAIL; #endif -#if (FREEBSD_VERS <= FREEBSD_10) /* SYS_freebsd6_mmap 197*/ -#endif /* __syscall (handled specially) 198 */ -#if (FREEBSD_VERS <= FREEBSD_10) /* SYS_freebsd6_lseek 199 */ - /* SYS_freebsd6_truncate 200 */ - /* SYS_freebsd6_ftruncate 201 */ -#endif /* SYS___sysctl 202 */ GO(SYS___sysctl, "(getoldlen) 3s 2m"); @@ -1464,13 +1437,8 @@ int main(void) GO(SYS_thr_kill, "2s 0m"); SY(SYS_thr_kill, x0-10, x0-20); FAIL; -#if (FREEBSD_VERS <= FREEBSD_10) - - /* @todo PJF (maybe) FreeBSD 10 or earlier, hmmm */ - // BSDXY(__NR__umtx_lock, sys__umtx_lock), // 434 - - // BSDXY(__NR__umtx_unlock, sys__umtx_unlock), // 435 -#endif + /* SYS_freebsd10__umtx_lock 434 */ + /* SYS_freebsd10__umtx_unlock 435 */ /* SYS_jail_attach 436 */ GO(SYS_jail_attach, "1s 0m"); @@ -1964,8 +1932,6 @@ int main(void) // 544 is the highest syscall on FreeBSD 9 -#if (FREEBSD_VERS >= FREEBSD_10) - /* SYS_ppoll 545 */ GO(SYS_ppoll, "4s 2m"); SY(SYS_ppoll, x0+8, x0+1, x0+1, x0+1); FAIL; @@ -1985,8 +1951,6 @@ int main(void) GO(SYS_utimensat, "4s 2m"); SY(SYS_utimensat, x0+99999999, x0+1, x0+1, x0); FAIL; -#endif // FREEBSD_VERS >= FREEBSD_11 - #if (FREEBSD_VERS >= FREEBSD_11) // 548 is obsolete numa_getaffinity |
From: Mark W. <ma...@kl...> - 2024-09-21 23:31:52
|
Hi Florian, On Sat, Sep 21, 2024 at 11:40:43PM +0200, Florian Weimer wrote: > * Mark Wielaard: > > The readlink system call should work, but I see the readlinkat system > > call doesn't have a fuse marker in the valgrind PRE handler. > > That's odd. It's really using the readlink system call as far as I can > tell. > > To reproduce: > > git clone --depth=1 https://sourceware.org/git/glibc.git > cd glibc > mkdir build > cd build > ../configure --prefix=/usr --disable-nscd --disable-mathvec MAKEINFO=: > make -j`nproc` > make -j`nproc` subdirs=support check run-built-tests=no > > On Fedora 40 (glibc 2.39), it's still possible to run the test directly > because the version difference is not too great, so you can run the test > directly: > > valgrind --leak-check=full --sim-hints=fuse-compatible \ > support/tst-support_fuse --direct Interesting. I see valgrind reports: ==1530594== Syscall param mount(type) points to unaddressable byte(s) ==1530594== at 0x498C8FE: mount (syscall-template.S:117) ==1530594== by 0x10EC4E: support_enter_mount_namespace (support_enter_mount_namespace.c:36) ==1530594== by 0x10BDB4: support_fuse_init (support_fuse.c:236) ==1530594== by 0x10B095: do_test (tst-support_fuse.c:238) ==1530594== by 0x10DF81: support_test_main (support_test_main.c:413) ==1530594== by 0x10A67A: main (test-driver.c:171) ==1530594== Address 0x0 is not stack'd, malloc'd or (recently) free'd But in this case we should ignore the mount (filesystem)type argument. > If you terminate the FUSE service using > > echo 1 | tee /sys/fs/fuse/connections/*/abort > > the failure strongly suggests that readlink is at fault: > > error: xreadlink.c:34: readlink ("/tmp/glibc-tst-fuse.264432.1/264432.1//symlink"): Software caused connection abort > > And strace shows there is really a readlink system call. You are right. It is the plain readlink syscall. The problem is that valgrind tries to intercept it for /proc/self/exe so it returns the actual binary instead of the valgrind "wrapper". Because of that it seems to do a direct, "blocking" syscall. I am working on a workaround/fix. > > I found several other (at) syscalls missing the fuse marker so I filed > > a bug and submitted a patch: > > https://bugs.kde.org/show_bug.cgi?id=493454 > > The copy_file_range system call has a FUSE event, too. If I understand > it correctly, it should probably be marked as blocking unconditionally > because as a file system operation, it can potentially take quite some > time. Yes, you are probably right. > Furthermore, I think fcntl and fcntl64 do not handle the OFD locks: > > # if defined(VGP_x86_linux) > if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64) > # else > if (ARG2 == VKI_F_SETLKW) > # endif > *flags |= SfMayBlock; Nice catch. We seem to handle the File Locks and Open File Descriptor Locks mostly identical except here. Thanks, Mark |
From: Florian W. <fw...@re...> - 2024-09-21 21:41:00
|
* Mark Wielaard: > Hi Florian, > > On Sat, Sep 21, 2024 at 07:40:30PM +0200, Florian Weimer wrote: >> > Please let me know if this still doesn't work. This hint hasn't been >> > updated in a long time and there might be some newer syscalls that >> > should enable this hint, but don't (yet). >> >> Very interesting! It gets past a lot of things, but support for the >> readlink system call appears to be missing. Nevertheless, it already >> found test bugs: >> >> support: Fix memory leaks in FUSE tests >> <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=455c7622835d> > > Very nice. Happy it worked (partially). > > The readlink system call should work, but I see the readlinkat system > call doesn't have a fuse marker in the valgrind PRE handler. That's odd. It's really using the readlink system call as far as I can tell. To reproduce: git clone --depth=1 https://sourceware.org/git/glibc.git cd glibc mkdir build cd build ../configure --prefix=/usr --disable-nscd --disable-mathvec MAKEINFO=: make -j`nproc` make -j`nproc` subdirs=support check run-built-tests=no On Fedora 40 (glibc 2.39), it's still possible to run the test directly because the version difference is not too great, so you can run the test directly: valgrind --leak-check=full --sim-hints=fuse-compatible \ support/tst-support_fuse --direct If you terminate the FUSE service using echo 1 | tee /sys/fs/fuse/connections/*/abort the failure strongly suggests that readlink is at fault: error: xreadlink.c:34: readlink ("/tmp/glibc-tst-fuse.264432.1/264432.1//symlink"): Software caused connection abort And strace shows there is really a readlink system call. > I found several other (at) syscalls missing the fuse marker so I filed > a bug and submitted a patch: > https://bugs.kde.org/show_bug.cgi?id=493454 The copy_file_range system call has a FUSE event, too. If I understand it correctly, it should probably be marked as blocking unconditionally because as a file system operation, it can potentially take quite some time. Furthermore, I think fcntl and fcntl64 do not handle the OFD locks: # if defined(VGP_x86_linux) if (ARG2 == VKI_F_SETLKW || ARG2 == VKI_F_SETLKW64) # else if (ARG2 == VKI_F_SETLKW) # endif *flags |= SfMayBlock; Thanks, Florian |
From: Mark W. <ma...@kl...> - 2024-09-21 20:50:19
|
Hi Florian, On Sat, Sep 21, 2024 at 07:40:30PM +0200, Florian Weimer wrote: > > Please let me know if this still doesn't work. This hint hasn't been > > updated in a long time and there might be some newer syscalls that > > should enable this hint, but don't (yet). > > Very interesting! It gets past a lot of things, but support for the > readlink system call appears to be missing. Nevertheless, it already > found test bugs: > > support: Fix memory leaks in FUSE tests > <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=455c7622835d> Very nice. Happy it worked (partially). The readlink system call should work, but I see the readlinkat system call doesn't have a fuse marker in the valgrind PRE handler. I found several other (at) syscalls missing the fuse marker so I filed a bug and submitted a patch: https://bugs.kde.org/show_bug.cgi?id=493454 Cheers, Mark |
From: Florian W. <fw...@re...> - 2024-09-21 17:40:48
|
* Mark Wielaard: > There was also a question about using valgrind on a program that > implements a fuse file system, like the new glibc test support helper > by Florian. I didn't give a very good answer to that one. Because I > forgot that valgrind already should be able to handle that. Valgrind > obviously already has to handle blocking syscalls that could be > unblock by another thread. There is a "sim hint" to extend this to > syscalls that might block when the underlying file system managed by > the program itself. > > --sim-hints=hint1,hint2,... > Pass miscellaneous hints to Valgrind which slightly modify the > simulated behaviour in nonstandard or dangerous ways, possibly to > help the simulation of strange features. By default no hints are > enabled. Use with caution! Currently known hints are: > > [...] > > • fuse-compatible: Enable special handling for certain system > calls that may block in a FUSE file-system. This may be > necessary when running Valgrind on a multi-threaded program > that uses one thread to manage a FUSE file-system and another > thread to access that file-system. > > Please let me know if this still doesn't work. This hint hasn't been > updated in a long time and there might be some newer syscalls that > should enable this hint, but don't (yet). Very interesting! It gets past a lot of things, but support for the readlink system call appears to be missing. Nevertheless, it already found test bugs: support: Fix memory leaks in FUSE tests <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=455c7622835d> Thanks, Florian |
From: Mark W. <ma...@kl...> - 2024-09-21 12:57:29
|
Hi, At the Cauldron "Using the Valgrind error manager for file descriptor tracking" talk https://gcc.gnu.org/wiki/cauldron2024#cauldron2024talks.using_the_valgrind_error_manager_for_file_descriptor_tracking there were various questions and suggestions. I added several to bugzilla: Add bad fd usage errors for --track-fds in ML_(fd_allowed) https://bugs.kde.org/show_bug.cgi?id=493418 Add --track-fds=bad mode (no "leak" tracking) https://bugs.kde.org/show_bug.cgi?id=493434 Add a new fds only mode to --track-fds https://bugs.kde.org/show_bug.cgi?id=493433 Review all syscalls (and ioctls) that use or return (new) file descriptors https://bugs.kde.org/show_bug.cgi?id=493430 There was also a question about using valgrind on a program that implements a fuse file system, like the new glibc test support helper by Florian. I didn't give a very good answer to that one. Because I forgot that valgrind already should be able to handle that. Valgrind obviously already has to handle blocking syscalls that could be unblock by another thread. There is a "sim hint" to extend this to syscalls that might block when the underlying file system managed by the program itself. --sim-hints=hint1,hint2,... Pass miscellaneous hints to Valgrind which slightly modify the simulated behaviour in nonstandard or dangerous ways, possibly to help the simulation of strange features. By default no hints are enabled. Use with caution! Currently known hints are: [...] • fuse-compatible: Enable special handling for certain system calls that may block in a FUSE file-system. This may be necessary when running Valgrind on a multi-threaded program that uses one thread to manage a FUSE file-system and another thread to access that file-system. Please let me know if this still doesn't work. This hint hasn't been updated in a long time and there might be some newer syscalls that should enable this hint, but don't (yet). Cheers, Mark |
From: Feiyang C. <chr...@gm...> - 2024-09-20 05:04:59
|
Hi, I have rebased onto the latest commit and made some small fixes (the last two commits), but I'm uncertain about these fixes. https://github.com/FreeFlyingSheep/valgrind-loongarch64 The tests for close_range fail due to the if statement in POST(sys_close_range). - if (ARG2 == ~0U) + if ((UInt)ARG2 == ~0U) On LoongArch64/Linux, ARG2 is sign-extended, so I truncate it when comparing it to ~0U. The test for long_namespace_xml fails since Valgrind reports the following: Conditional jump or move depends on uninitialised value(s) at 0x40624F4: bcmp (vg_replace_strmem.c:1233) by 0x415E1DB: std::ctype<char>::_M_widen_init() const (in /usr/lib64/libstdc++.so.6.0.33) by 0x41D9067: std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) (in /usr/lib64/libstdc++.so.6.0.33) ... by 0x1200042BF: main (long_namespace_xml.cpp:45) I added a suppression for this issue. However, there are still two failures that I don't know how to solve. 1. The first one is pth_mutex_signal, which reports "The futex facility returned an unexpected error code." 2. The second one is libvexmultiarch_test, which causes an assertion failure in PPC: vex: priv/host_ppc_defs.c:4754(emit_PPCInstr): Assertion `delta >= 16 && delta <=32 && 0 == (delta & 3)' failed. //// failure exit called by libVEX I would appreciate your help with these issues and would like to know when you might be available to review my patches. Thanks, Feiyang |
From: Paul F. <pa...@so...> - 2024-09-16 06:14:06
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=78520578209d76c919bc0ea7180351151b65253c commit 78520578209d76c919bc0ea7180351151b65253c Author: Paul Floyd <pj...@wa...> Date: Mon Sep 16 08:13:15 2024 +0200 FreeBSD regtest: fix "filter_fdleak is missing in dist_noinst_SCRIPTS" Diff: --- none/tests/freebsd/Makefile.am | 2 +- none/tests/freebsd/filter_fdleak | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/none/tests/freebsd/Makefile.am b/none/tests/freebsd/Makefile.am index 0194dc474a..fe4f8db698 100644 --- a/none/tests/freebsd/Makefile.am +++ b/none/tests/freebsd/Makefile.am @@ -1,7 +1,7 @@ include $(top_srcdir)/Makefile.tool-tests.am -dist_noinst_SCRIPTS = filter_stderr test.sh filter_452275 filter_auxv +dist_noinst_SCRIPTS = filter_stderr test.sh filter_452275 filter_auxv filter_fdleak EXTRA_DIST = \ auxv.vgtest \ diff --git a/none/tests/freebsd/filter_fdleak b/none/tests/freebsd/filter_fdleak deleted file mode 120000 index b20dbae985..0000000000 --- a/none/tests/freebsd/filter_fdleak +++ /dev/null @@ -1 +0,0 @@ -../filter_fdleak \ No newline at end of file diff --git a/none/tests/freebsd/filter_fdleak b/none/tests/freebsd/filter_fdleak new file mode 100755 index 0000000000..498ca03355 --- /dev/null +++ b/none/tests/freebsd/filter_fdleak @@ -0,0 +1,3 @@ +#! /bin/sh + +../filter_fdleak "$@" |
From: Paul F. <pa...@so...> - 2024-09-16 06:08:23
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=508c6f6376193cc2a824f9237c1107d60c9eebc0 commit 508c6f6376193cc2a824f9237c1107d60c9eebc0 Author: Paul Floyd <pj...@wa...> Date: Mon Sep 16 08:07:15 2024 +0200 Comments: update comments added for Bug 492663 Diff: --- VEX/priv/guest_amd64_helpers.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/VEX/priv/guest_amd64_helpers.c b/VEX/priv/guest_amd64_helpers.c index 9997b42669..b4e37fcbd6 100644 --- a/VEX/priv/guest_amd64_helpers.c +++ b/VEX/priv/guest_amd64_helpers.c @@ -1143,7 +1143,7 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, /* 4, */ if (isU64(cc_op, AMD64G_CC_OP_ADDL) && isU64(cond, AMD64CondZ)) { - /* long long add, then Z --> test ((int)(dst+src) == 0) */ + /* long add, then Z --> test ((int)(dst+src) == 0) */ return unop(Iop_1Uto64, binop(Iop_CmpEQ32, unop(Iop_64to32, binop(Iop_Add64, cc_dep1, cc_dep2)), @@ -1181,7 +1181,7 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, /* 4, */ if (isU64(cc_op, AMD64G_CC_OP_ADDW) && isU64(cond, AMD64CondZ)) { - /* long long add, then Z --> test ((short)(dst+src) == 0) */ + /* word add, then Z --> test ((short)(dst+src) == 0) */ return unop(Iop_1Uto64, binop(Iop_CmpEQ16, unop(Iop_64to16, binop(Iop_Add64, cc_dep1, cc_dep2)), @@ -1192,7 +1192,7 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, /* 4, */ if (isU64(cc_op, AMD64G_CC_OP_ADDB) && isU64(cond, AMD64CondZ)) { - /* long long add, then Z --> test ((char)(dst+src) == 0) */ + /* byte add, then Z --> test ((char)(dst+src) == 0) */ return unop(Iop_1Uto64, binop(Iop_CmpEQ8, unop(Iop_64to8, binop(Iop_Add64, cc_dep1, cc_dep2)), @@ -1307,7 +1307,7 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, binop(Iop_CmpLE64S, cc_dep1, cc_dep2)); } if (isU64(cc_op, AMD64G_CC_OP_SUBQ) && isU64(cond, AMD64CondNLE)) { - /* long sub/cmp, then NLE (signed greater than) + /* long long sub/cmp, then NLE (signed greater than) --> test !(dst <=s src) --> test (dst >s src) --> test (src <s dst) */ |
From: Paul F. <pa...@so...> - 2024-09-15 19:43:27
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=7e78a9a990c990631adb3f7c7edfd8cda418547f commit 7e78a9a990c990631adb3f7c7edfd8cda418547f Author: Paul Floyd <pj...@wa...> Date: Sun Sep 15 09:52:56 2024 +0200 Bug 492210 - False positive on x86/amd64 with ZF taken directly from addition Also adds similar checks for short and char equivalents to the original int reproducer. Initial fix provided by Alexander Monakov <amo...@gm...> Two versions of the testcase, one with default options and one with -expensive-definedness-checks=yes because the byte operations subb and addb need the flag turned on explicitly. Diff: --- .gitignore | 1 + NEWS | 1 + VEX/priv/guest_amd64_helpers.c | 37 +++++++++- memcheck/tests/amd64/Makefile.am | 3 + memcheck/tests/amd64/bug492210.c | 106 ++++++++++++++++++++++++++++ memcheck/tests/amd64/bug492210_1.stderr.exp | 12 ++++ memcheck/tests/amd64/bug492210_1.vgtest | 4 ++ memcheck/tests/amd64/bug492210_2.stderr.exp | 0 memcheck/tests/amd64/bug492210_2.vgtest | 4 ++ 9 files changed, 167 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bf477a4fa6..c15cf93e00 100644 --- a/.gitignore +++ b/.gitignore @@ -1070,6 +1070,7 @@ /memcheck/tests/amd64/bt_everything /memcheck/tests/amd64/bug132146 /memcheck/tests/amd64/bug279698 +/memcheck/tests/amd64/bug492210 /memcheck/tests/amd64/defcfaexpr /memcheck/tests/amd64/fxsave-amd64 /memcheck/tests/amd64/int3-amd64 diff --git a/NEWS b/NEWS index 3906beedf9..b9cb1d5dc2 100644 --- a/NEWS +++ b/NEWS @@ -62,6 +62,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. 490651 Stop using -flto-partition=one 491394 (vgModuleLocal_addDiCfSI): Assertion 'di->fsm.have_rx_map && di->fsm.rw_map_count' failed +492210 False positive on x86/amd64 with ZF taken directly from addition 492214 statx(fd, NULL, AT_EMPTY_PATH) is supported since Linux 6.11 but not supported in valgrind 492663 Valgrind ignores debug info for some binaries diff --git a/VEX/priv/guest_amd64_helpers.c b/VEX/priv/guest_amd64_helpers.c index da1cabc3cb..9997b42669 100644 --- a/VEX/priv/guest_amd64_helpers.c +++ b/VEX/priv/guest_amd64_helpers.c @@ -1062,6 +1062,7 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, # define binop(_op,_a1,_a2) IRExpr_Binop((_op),(_a1),(_a2)) # define mkU64(_n) IRExpr_Const(IRConst_U64(_n)) # define mkU32(_n) IRExpr_Const(IRConst_U32(_n)) +# define mkU16(_n) IRExpr_Const(IRConst_U16(_n)) # define mkU8(_n) IRExpr_Const(IRConst_U8(_n)) Int i, arity = 0; @@ -1140,6 +1141,15 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, } + /* 4, */ + if (isU64(cc_op, AMD64G_CC_OP_ADDL) && isU64(cond, AMD64CondZ)) { + /* long long add, then Z --> test ((int)(dst+src) == 0) */ + return unop(Iop_1Uto64, + binop(Iop_CmpEQ32, + unop(Iop_64to32, binop(Iop_Add64, cc_dep1, cc_dep2)), + mkU32(0))); + } + /* 8, 9 */ if (isU64(cc_op, AMD64G_CC_OP_ADDL) && isU64(cond, AMD64CondS)) { /* long add, then S (negative) @@ -1166,6 +1176,29 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, mkU64(1)); } + /*---------------- ADDW ----------------*/ + + /* 4, */ + if (isU64(cc_op, AMD64G_CC_OP_ADDW) && isU64(cond, AMD64CondZ)) { + + /* long long add, then Z --> test ((short)(dst+src) == 0) */ + return unop(Iop_1Uto64, + binop(Iop_CmpEQ16, + unop(Iop_64to16, binop(Iop_Add64, cc_dep1, cc_dep2)), + mkU16(0))); + } + + /*---------------- ADDB ----------------*/ + + /* 4, */ + if (isU64(cc_op, AMD64G_CC_OP_ADDB) && isU64(cond, AMD64CondZ)) { + /* long long add, then Z --> test ((char)(dst+src) == 0) */ + return unop(Iop_1Uto64, + binop(Iop_CmpEQ8, + unop(Iop_64to8, binop(Iop_Add64, cc_dep1, cc_dep2)), + mkU8(0))); + } + /*---------------- SUBQ ----------------*/ /* 0, */ @@ -1307,6 +1340,8 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, mkU8(31)), mkU64(1)); } + + /* 1, */ if (isU64(cc_op, AMD64G_CC_OP_SUBL) && isU64(cond, AMD64CondNO)) { /* No action. Never yet found a test case. */ } @@ -1578,7 +1613,7 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name, if (isU64(cc_op, AMD64G_CC_OP_SUBB) && isU64(cond, AMD64CondZ)) { /* byte sub/cmp, then Z --> test dst==src */ return unop(Iop_1Uto64, - binop(Iop_CmpEQ8, + binop(Iop_CmpEQ8, unop(Iop_64to8,cc_dep1), unop(Iop_64to8,cc_dep2))); } diff --git a/memcheck/tests/amd64/Makefile.am b/memcheck/tests/amd64/Makefile.am index 906b8f393b..c0139bdb20 100644 --- a/memcheck/tests/amd64/Makefile.am +++ b/memcheck/tests/amd64/Makefile.am @@ -13,6 +13,8 @@ EXTRA_DIST = \ bt_everything.vgtest \ bug132146.vgtest bug132146.stderr.exp bug132146.stdout.exp \ bug279698.vgtest bug279698.stderr.exp bug279698.stdout.exp \ + bug492210_1.vgtest bug492210_1.stderr.exp \ + bug492210_2.vgtest bug492210_2.stderr.exp \ fxsave-amd64.vgtest fxsave-amd64.stdout.exp fxsave-amd64.stderr.exp \ insn-bsfl.vgtest insn-bsfl.stdout.exp insn-bsfl.stderr.exp \ insn-pcmpistri.vgtest insn-pcmpistri.stdout.exp insn-pcmpistri.stderr.exp \ @@ -46,6 +48,7 @@ check_PROGRAMS = \ bt_everything \ bug132146 \ bug279698 \ + bug492210 \ fxsave-amd64 \ insn-bsfl \ insn-pmovmskb \ diff --git a/memcheck/tests/amd64/bug492210.c b/memcheck/tests/amd64/bug492210.c new file mode 100644 index 0000000000..27e1b17a7c --- /dev/null +++ b/memcheck/tests/amd64/bug492210.c @@ -0,0 +1,106 @@ +/* + * Bug 492210 False positive on x86/amd64 with ZF taken directly from addition + * + * The problem is that the Z flag wasn't being calculated for addl instructions. + * + * The same problem exists for addw and addb. + */ + + +unsigned char b; +unsigned short w; +unsigned long l; +unsigned long long q; + +extern void test(void); + +asm("\n" +".text\n" +"test:\n" + +"\tmovb b, %al\n" +"\tmovb $1, %ah\n" +"\taddb %al, %ah\n" +"\tje label1\n" +"\tlabel1:\n" + +"\taddb %al, %ah\n" +"\tjne label2\n" +"\tlabel2:\n" + +"\tsubb %al, %ah\n" +"\tje label3\n" +"\tlabel3:\n" + +"\tsubb %al, %ah\n" +"\tjne label4\n" +"\tlabel4:\n" + +"\tmov w, %ax\n" +"\tmovw $1, %bx\n" +"\taddw %ax, %bx\n" +"\tje label5\n" +"\tlabel5:\n" + +"\taddw %ax, %bx\n" +"\tjne label6\n" +"\tlabel6:\n" + +"\tsubw %ax, %bx\n" +"\tje label7\n" +"\tlabel7:\n" + +"\tsubw %ax, %bx\n" +"\tjne label8\n" +"\tlabel8:\n" + +"\tmov l, %eax\n" +"\tmov $1, %ebx\n" +"\tadd %eax, %ebx\n" +"\tje label9\n" +"\tlabel9:\n" + +"\tadd %eax, %ebx\n" +"\tjne label10\n" +"\tlabel10:\n" + +"\tsub %eax, %ebx\n" +"\tje label11\n" +"\tlabel11:\n" + +"\tsub %eax, %ebx\n" +"\tjne label12\n" +"\tlabel12:\n" + +"\tmovq q, %rax\n" +"\tmovq $1, %rbx\n" +"\taddq %rax, %rbx\n" +"\tje label13\n" +"\tlabel13:\n" + +"\taddq %rax, %rbx\n" +"\tjne label14\n" +"\tlabel14:\n" + +"\tsubq %rax, %rbx\n" +"\tje label15\n" +"\tlabel15:\n" + +"\tsubq %rax, %rbx\n" +"\tjne label16\n" +"\tlabel16:\n" + +"\tret\n" +".previous\n" +); + +int main() +{ + unsigned long long uninit; + uninit &= 0xfffffffffffffffe; + b = uninit; + w = uninit; + l = uninit; + q = uninit; + test(); +} diff --git a/memcheck/tests/amd64/bug492210_1.stderr.exp b/memcheck/tests/amd64/bug492210_1.stderr.exp new file mode 100644 index 0000000000..afaaad650e --- /dev/null +++ b/memcheck/tests/amd64/bug492210_1.stderr.exp @@ -0,0 +1,12 @@ +Conditional jump or move depends on uninitialised value(s) + ... + +Conditional jump or move depends on uninitialised value(s) + ... + +Conditional jump or move depends on uninitialised value(s) + ... + +Conditional jump or move depends on uninitialised value(s) + ... + diff --git a/memcheck/tests/amd64/bug492210_1.vgtest b/memcheck/tests/amd64/bug492210_1.vgtest new file mode 100644 index 0000000000..e80be84ec8 --- /dev/null +++ b/memcheck/tests/amd64/bug492210_1.vgtest @@ -0,0 +1,4 @@ +prog: bug492210 +vgopts: -q + + diff --git a/memcheck/tests/amd64/bug492210_2.stderr.exp b/memcheck/tests/amd64/bug492210_2.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/amd64/bug492210_2.vgtest b/memcheck/tests/amd64/bug492210_2.vgtest new file mode 100644 index 0000000000..1c4e3614f8 --- /dev/null +++ b/memcheck/tests/amd64/bug492210_2.vgtest @@ -0,0 +1,4 @@ +prog: bug492210 +vgopts: -q --expensive-definedness-checks=yes + + |
From: Paul F. <pa...@so...> - 2024-09-14 19:01:20
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=b8517dec59aa67a0a6729568d9b65808f4bee93b commit b8517dec59aa67a0a6729568d9b65808f4bee93b Author: Paul Floyd <pj...@wa...> Date: Sat Sep 14 20:56:54 2024 +0200 FreeBSD: add file descriptor tracking for _umtx_op UMTX_OP_SHM with a sub request of UMTX_SHM_CREAT creates an anonymous shared memory object and returns a file descriptor. This fd is now tracked when required. Diff: --- .gitignore | 3 ++- coregrind/m_syswrap/syswrap-freebsd.c | 5 +++++ include/vki/vki-freebsd.h | 3 +++ none/tests/freebsd/Makefile.am | 8 +++++++- none/tests/freebsd/filter_fdleak | 1 + none/tests/freebsd/umtx_shm_creat.cpp | 13 +++++++++++++ none/tests/freebsd/umtx_shm_creat1.stderr.exp | 11 +++++++++++ none/tests/freebsd/umtx_shm_creat1.vgtest | 4 ++++ none/tests/freebsd/umtx_shm_creat2.stderr.exp | 14 ++++++++++++++ none/tests/freebsd/umtx_shm_creat2.vgtest | 4 ++++ 10 files changed, 64 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 32d32212af..bf477a4fa6 100644 --- a/.gitignore +++ b/.gitignore @@ -2251,9 +2251,10 @@ /none/tests/freebsd/fexecve /none/tests/freebsd/hello_world /none/tests/freebsd/452275 +/none/tests/freebsd/proc_pid_file /none/tests/freebsd/sanity_level_thread /none/tests/freebsd/usrstack -/none/tests/freebsd/proc_pid_file +/none/tests/freebsd/umtx_shm_creat # /none/tests/x86/ /none/tests/x86/*.dSYM diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index bc792ae516..071e6ab152 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -4860,6 +4860,11 @@ POST(sys__umtx_op) } break; case VKI_UMTX_OP_SHM: + if (SUCCESS && ARG3 == VKI_UMTX_SHM_CREAT) { + if (VG_(clo_track_fds)) + ML_(record_fd_open_nameless) (tid, RES); + } + break; case VKI_UMTX_OP_ROBUST_LISTS: break; #if (FREEBSD_VERS >= FREEBSD_13_3) diff --git a/include/vki/vki-freebsd.h b/include/vki/vki-freebsd.h index 1b51e939fa..0c93c3e9ad 100644 --- a/include/vki/vki-freebsd.h +++ b/include/vki/vki-freebsd.h @@ -1974,6 +1974,9 @@ struct vki_umtx_robust_lists_params { #define VKI_UMTX_OP_SEM2_WAKE 24 #define VKI_UMTX_OP_SHM 25 #define VKI_UMTX_OP_ROBUST_LISTS 26 + +#define VKI_UMTX_SHM_CREAT 0x0001 + #if (FREEBSD_VERS >= FREEBSD_13_3) #define VKI_UMTX_OP_GET_MIN_TIMEOUT 27 #define VKI_UMTX_OP_SET_MIN_TIMEOUT 28 diff --git a/none/tests/freebsd/Makefile.am b/none/tests/freebsd/Makefile.am index 50c74496f8..0194dc474a 100644 --- a/none/tests/freebsd/Makefile.am +++ b/none/tests/freebsd/Makefile.am @@ -52,13 +52,17 @@ EXTRA_DIST = \ swapcontext.stdout.exp \ umtx_op_timeout.vgtest \ umtx_op_timeout.stderr.exp \ + umtx_shm_creat1.vgtest \ + umtx_shm_creat1.stderr.exp \ + umtx_shm_creat2.vgtest \ + umtx_shm_creat2.stderr.exp \ usrstack.vgtest \ usrstack.stderr.exp \ usrstack.stdout.exp check_PROGRAMS = \ auxv osrel swapcontext hello_world fexecve 452275 usrstack \ - proc_pid_file sanity_level_thread + proc_pid_file sanity_level_thread umtx_shm_creat AM_CFLAGS += $(AM_FLAG_M3264_PRI) AM_CXXFLAGS += $(AM_FLAG_M3264_PRI) @@ -73,3 +77,5 @@ proc_pid_file_SOURCES = proc_pid_file.cpp sanity_level_thread_SOURCES = sanity_level_thread.cpp sanity_level_thread_LDFLAGS = ${AM_LDFLAGS} -pthread + +umtx_shm_creat_SOURCES = umtx_shm_creat.cpp diff --git a/none/tests/freebsd/filter_fdleak b/none/tests/freebsd/filter_fdleak new file mode 120000 index 0000000000..b20dbae985 --- /dev/null +++ b/none/tests/freebsd/filter_fdleak @@ -0,0 +1 @@ +../filter_fdleak \ No newline at end of file diff --git a/none/tests/freebsd/umtx_shm_creat.cpp b/none/tests/freebsd/umtx_shm_creat.cpp new file mode 100644 index 0000000000..5af1dc94da --- /dev/null +++ b/none/tests/freebsd/umtx_shm_creat.cpp @@ -0,0 +1,13 @@ +#include <sys/types.h> +#include <sys/umtx.h> +#include <unistd.h> + +int main(int argc, char** argv) +{ + char key[64]; + int fd = _umtx_op(nullptr, UMTX_OP_SHM, UMTX_SHM_CREAT, key, nullptr); + if (1 == argc) + { + close(fd); + } +} diff --git a/none/tests/freebsd/umtx_shm_creat1.stderr.exp b/none/tests/freebsd/umtx_shm_creat1.stderr.exp new file mode 100644 index 0000000000..4e918760ff --- /dev/null +++ b/none/tests/freebsd/umtx_shm_creat1.stderr.exp @@ -0,0 +1,11 @@ +FILE DESCRIPTORS: 3 open (3 std) at exit. +Open file descriptor ...: ... + <inherited from parent> + +Open file descriptor ...: ... + <inherited from parent> + +Open file descriptor ...: ... + <inherited from parent> + + diff --git a/none/tests/freebsd/umtx_shm_creat1.vgtest b/none/tests/freebsd/umtx_shm_creat1.vgtest new file mode 100644 index 0000000000..d7d4e3b87e --- /dev/null +++ b/none/tests/freebsd/umtx_shm_creat1.vgtest @@ -0,0 +1,4 @@ +prog: umtx_shm_creat +vgopts: -q --track-fds=all +stderr_filter: filter_fdleak + diff --git a/none/tests/freebsd/umtx_shm_creat2.stderr.exp b/none/tests/freebsd/umtx_shm_creat2.stderr.exp new file mode 100644 index 0000000000..4acc5e4122 --- /dev/null +++ b/none/tests/freebsd/umtx_shm_creat2.stderr.exp @@ -0,0 +1,14 @@ +FILE DESCRIPTORS: 4 open (3 std) at exit. +Open file descriptor ...: + ... + +Open file descriptor ...: ... + <inherited from parent> + +Open file descriptor ...: ... + <inherited from parent> + +Open file descriptor ...: ... + <inherited from parent> + + diff --git a/none/tests/freebsd/umtx_shm_creat2.vgtest b/none/tests/freebsd/umtx_shm_creat2.vgtest new file mode 100644 index 0000000000..ed1f2f21c0 --- /dev/null +++ b/none/tests/freebsd/umtx_shm_creat2.vgtest @@ -0,0 +1,4 @@ +prog: umtx_shm_creat +vgopts: -q --track-fds=all +args: 1 +stderr_filter: filter_fdleak |
From: Paul F. <pa...@so...> - 2024-09-13 07:35:18
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=a682c879d059e957c9f7b0419f1eb8bcde6729b0 commit a682c879d059e957c9f7b0419f1eb8bcde6729b0 Author: Paul Floyd <pj...@wa...> Date: Fri Sep 13 09:34:26 2024 +0200 FreeBSD 13.4: change conditional compilation for recent syscalls Diff: --- coregrind/m_syswrap/priv_syswrap-freebsd.h | 7 ++++--- coregrind/m_syswrap/syswrap-freebsd.c | 17 +++++++++-------- include/vki/vki-scnums-freebsd.h | 10 +++++++--- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/coregrind/m_syswrap/priv_syswrap-freebsd.h b/coregrind/m_syswrap/priv_syswrap-freebsd.h index fc29f1c8af..df049d907b 100644 --- a/coregrind/m_syswrap/priv_syswrap-freebsd.h +++ b/coregrind/m_syswrap/priv_syswrap-freebsd.h @@ -573,13 +573,14 @@ DECL_TEMPLATE(freebsd, sys_kqueuex) // 583 DECL_TEMPLATE(freebsd, sys_membarrier) // 584 #endif -#if (FREEBSD_VERS >= FREEBSD_14_0) +#if (FREEBSD_VERS >= FREEBSD_14_0) || (FREEBSD_VERS >= FREEBSD_13_4) DECL_TEMPLATE(freebsd, sys_timerfd_create) // 585 DECL_TEMPLATE(freebsd, sys_timerfd_gettime) // 586 DECL_TEMPLATE(freebsd, sys_timerfd_settime) // 587 -#if (FREEBSD_VERS >= FREEBSD_14_1) -DECL_TEMPLATE(freebsd, sys_kcmp) // 588 #endif + +#if (FREEBSD_VERS >= FREEBSD_14_1) || (FREEBSD_VERS >= FREEBSD_13_4) +DECL_TEMPLATE(freebsd, sys_kcmp) // 588 #endif DECL_TEMPLATE(freebsd, sys_fake_sigreturn) diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index b9532542a1..bc792ae516 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -7119,7 +7119,7 @@ PRE(sys_membarrier) #endif -#if (FREEBSD_VERS >= FREEBSD_14_0) +#if (FREEBSD_VERS >= FREEBSD_14_0) || (FREEBSD_VERS >= FREEBSD_13_4) // SYS_timerfd_create 585 // int timerfd_create(int clockid, int flags); @@ -7194,7 +7194,9 @@ POST(sys_timerfd_settime) } } -#if (FREEBSD_VERS >= FREEBSD_14_1) +#endif // FREEBSD_14_0 or FREEDSD_13_4 + +#if (FREEBSD_VERS >= FREEBSD_14_1) || (FREEBSD_VERS >= FREEBSD_13_4) // SYS_kcmp 588 // int kcmp(pid_t pid1, pid_t pid2, int type, uintptr_t idx1, uintptr_t idx2); @@ -7220,9 +7222,7 @@ PRE(sys_kcmp) } } -#endif // FREEBSD_14_1 - -#endif // FREEBSD_14_0 +#endif // FREEBSD_14_1 or FREEDSD_13_4 #undef PRE #undef POST @@ -7957,16 +7957,17 @@ const SyscallTableEntry ML_(syscall_table)[] = { BSDXY(__NR_kqueuex, sys_kqueuex), // 583 BSDX_(__NR_membarrier, sys_membarrier), // 584 #endif -#if (FREEBSD_VERS >= FREEBSD_14_0) +#if (FREEBSD_VERS >= FREEBSD_14_0) || (FREEBSD_VERS >= FREEBSD_13_4) BSDXY(__NR_timerfd_create, sys_timerfd_create), // 585 BSDXY(__NR_timerfd_settime, sys_timerfd_settime), // 586 BSDXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 587 -#if (FREEBSD_VERS >= FREEBSD_14_1) - BSDX_(__NR_kcmp, sys_kcmp), // 588 #endif +#if (FREEBSD_VERS >= FREEBSD_14_1) || (FREEBSD_VERS >= FREEBSD_13_4) + BSDX_(__NR_kcmp, sys_kcmp), // 588 #endif + BSDX_(__NR_fake_sigreturn, sys_fake_sigreturn), // 1000, fake sigreturn }; diff --git a/include/vki/vki-scnums-freebsd.h b/include/vki/vki-scnums-freebsd.h index 66f1a3717f..17d8b11df1 100644 --- a/include/vki/vki-scnums-freebsd.h +++ b/include/vki/vki-scnums-freebsd.h @@ -683,14 +683,18 @@ #endif -#if (FREEBSD_VERS >= FREEBSD_14_0) +#if (FREEBSD_VERS >= FREEBSD_14_0) || (FREEBSD_VERS >= FREEBSD_13_4) + #define __NR_timerfd_create 585 #define __NR_timerfd_gettime 586 #define __NR_timerfd_settime 587 -#if (FREEBSD_VERS >= FREEBSD_14_1) -#define __NR_kcmp 588 + #endif +#if (FREEBSD_VERS >= FREEBSD_14_1) || (FREEBSD_VERS >= FREEBSD_13_3) + +#define __NR_kcmp 588 + #endif #define __NR_fake_sigreturn 1000 |
From: Paul F. <pa...@so...> - 2024-09-13 06:48:03
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=718dfb359720583649763930656e479d7720f00c commit 718dfb359720583649763930656e479d7720f00c Author: Paul Floyd <pj...@wa...> Date: Fri Sep 13 08:47:23 2024 +0200 FreeBSD: initial support for version 13.4 Diff: --- configure.ac | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/configure.ac b/configure.ac index aa24b6382a..c7f834e051 100755 --- a/configure.ac +++ b/configure.ac @@ -415,6 +415,8 @@ case "${host_os}" in freebsd_13_2=1320 AC_DEFINE([FREEBSD_13_3], 1330, [FREEBSD_VERS value for FreeBSD 13.3]) freebsd_13_3=1330 + AC_DEFINE([FREEBSD_13_4], 1340, [FREEBSD_VERS value for FreeBSD 13.4]) + freebsd_13_4=1340 AC_DEFINE([FREEBSD_14_0], 1400, [FREEBSD_VERS value for FreeBSD 14.0]) freebsd_14_0=1400 AC_DEFINE([FREEBSD_14_1], 1410, [FREEBSD_VERS value for FreeBSD 14.1]) @@ -472,6 +474,11 @@ case "${host_os}" in AC_DEFINE([FREEBSD_VERS], FREEBSD_13_3, [FreeBSD version]) freebsd_vers=$freebsd_13_3 ;; + 13.4-*) + AC_MSG_RESULT([FreeBSD 13.4 (${kernel})]) + AC_DEFINE([FREEBSD_VERS], FREEBSD_13_4, [FreeBSD version]) + freebsd_vers=$freebsd_13_4 + ;; *) AC_MSG_RESULT([unsupported (${kernel})]) AC_MSG_ERROR([Valgrind works on FreeBSD 10.x to 15.x]) |
From: Andreas A. <ar...@so...> - 2024-09-10 16:39:23
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=5d404b97d44001565403c7ca4a6a2eebfde4413d commit 5d404b97d44001565403c7ca4a6a2eebfde4413d Author: Andreas Arnez <ar...@li...> Date: Tue Sep 10 18:38:49 2024 +0200 s390x: Add MSA support Handle instructions that were added to z/Architecture with the message-security assist (MSA) facility or with one of its extensions up to MSA extension 9: km -- ``cipher message'' kmc -- ``cipher message with chaining'' kimd -- ``compute intermediate message digest'' klmd -- ``compute last message digest'' kmac -- ``compute message authentication code'' kmf -- ``cipher message with cipher feedback'' kmctr -- ``cipher message with counter'' kmo -- ``cipher message with output feedback'' pcc -- ``perform cryptographic computation'' kma -- ``cipher message with authentication'' kdsa -- ``compute digital signature authentication'' Each of these instructions has multiple functions. Support all functions described by MSA levels up to extension 9. Handle the instructions as "extensions" and essentially forward them to the instructions themselves, as long as they are available on the host. Note that the MSA-3 instruction pkcmo -- ``perform cryptographic key management operation'' will not be handled by this change, since it is privileged and should not occur in user-space programs. The MSA facilities are typically used by cryptographic libraries like OpenSSL or openCryptoki. So far Valgrind suppresses the facility bits indicating any MSA support, which causes such libraries to revert to a software implementation. This change enables running cryptographic applications under Valgrind without reverting to an alternate code path. Diff: --- NEWS | 3 + VEX/priv/guest_s390_toIR.c | 125 +++- VEX/pub/libvex_s390x_common.h | 11 + coregrind/m_extension/extension-s390x.c | 988 ++++++++++++++++++++++++++++++-- docs/internals/s390-opcodes.csv | 22 +- none/tests/s390x/stfle.c | 8 +- none/tests/s390x/stfle.stdout.exp | 2 +- none/tests/s390x/stfle.stdout.exp-z16 | 2 +- 8 files changed, 1094 insertions(+), 67 deletions(-) diff --git a/NEWS b/NEWS index 1c3b8c5f8d..3906beedf9 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,9 @@ AMD64/macOS 10.13 and nanoMIPS/Linux. * S390X added support for the DFLTCC instruction provided by the deflate-conversion facility (z15/arch13). +* S390X added support for the instructions provided by the MSA facility + and MSA extensions 1-9. + * ==================== TOOL CHANGES =================== * ==================== FIXED BUGS ==================== diff --git a/VEX/priv/guest_s390_toIR.c b/VEX/priv/guest_s390_toIR.c index 1d8fb72cc5..c3816a10ed 100644 --- a/VEX/priv/guest_s390_toIR.c +++ b/VEX/priv/guest_s390_toIR.c @@ -19707,6 +19707,99 @@ s390_irgen_NNPA(void) return "nnpa"; } +static const HChar * +s390_irgen_KM(UChar r1, UChar r2) +{ + s390_insn_assert("km", r1 != 0 && r1 % 2 == 0 && r2 != 0 && r2 % 2 == 0); + extension(S390_EXT_KM, r1 | (r2 << 4)); + return "km"; +} + +static const HChar * +s390_irgen_KMC(UChar r1, UChar r2) +{ + s390_insn_assert("kmc", r1 != 0 && r1 % 2 == 0 && r2 != 0 && r2 % 2 == 0); + extension(S390_EXT_KMC, r1 | (r2 << 4)); + return "kmc"; +} + +static const HChar * +s390_irgen_KIMD(UChar r1, UChar r2) +{ + /* r1 is reserved */ + s390_insn_assert("kimd", r2 != 0 && r2 % 2 == 0); + extension(S390_EXT_KIMD, r1 | (r2 << 4)); + return "kimd"; +} + +static const HChar * +s390_irgen_KLMD(UChar r1, UChar r2) +{ + /* r1 is only used by some functions */ + s390_insn_assert("klmd", r2 != 0 && r2 % 2 == 0); + extension(S390_EXT_KLMD, r1 | (r2 << 4)); + return "klmd"; +} + +static const HChar * +s390_irgen_KMAC(UChar r1, UChar r2) +{ + /* r1 is ignored */ + s390_insn_assert("kmac", r2 != 0 && r2 % 2 == 0); + extension(S390_EXT_KMAC, r1 | (r2 << 4)); + return "kmac"; +} + +static const HChar * +s390_irgen_PCC(void) +{ + extension(S390_EXT_PCC, 0); + return "pcc"; +} + +static const HChar * +s390_irgen_KMCTR(UChar r3, UChar r1, UChar r2) +{ + s390_insn_assert("kmctr", r1 % 2 == 0 && r1 != 0 && r2 % 2 == 0 && r2 != 0 && + r3 % 2 == 0 && r3 != 0); + extension(S390_EXT_KMCTR, r1 | (r2 << 4) | (r3 << 8)); + return "kmctr"; +} + +static const HChar * +s390_irgen_KMO(UChar r1, UChar r2) +{ + s390_insn_assert("kmo", r1 != 0 && r1 % 2 == 0 && r2 != 0 && r2 % 2 == 0); + extension(S390_EXT_KMO, r1 | (r2 << 4)); + return "kmo"; +} + +static const HChar * +s390_irgen_KMF(UChar r1, UChar r2) +{ + s390_insn_assert("kmf", r1 != 0 && r1 % 2 == 0 && r2 != 0 && r2 % 2 == 0); + extension(S390_EXT_KMF, r1 | (r2 << 4)); + return "kmf"; +} + +static const HChar * +s390_irgen_KMA(UChar r3, UChar r1, UChar r2) +{ + s390_insn_assert("kma", r1 % 2 == 0 && r1 != 0 && r2 % 2 == 0 && r2 != 0 && + r3 % 2 == 0 && r3 != 0); + extension(S390_EXT_KMA, r1 | (r2 << 4) | (r3 << 8)); + return "kma"; +} + +static const HChar * +s390_irgen_KDSA(UChar r1, UChar r2) +{ + /* r1 is reserved */ + s390_insn_assert("kdsa", r2 != 0 && r2 % 2 == 0); + extension(S390_EXT_KDSA, r1 | (r2 << 4)); + return "kdsa"; +} + /* New insns are added here. If an insn is contingent on a facility being installed also check whether the list of supported facilities in function @@ -20457,7 +20550,8 @@ s390_decode_4byte_and_irgen(const UChar *bytes) RRE_r2(ovl)); goto ok; case 0xb91d: s390_format_RRE_RR(s390_irgen_DSGFR, RRE_r1(ovl), RRE_r2(ovl)); goto ok; - case 0xb91e: /* KMAC */ goto unimplemented; + case 0xb91e: s390_format_RRE_RR(s390_irgen_KMAC, RRE_r1(ovl), + RRE_r2(ovl)); goto ok; case 0xb91f: s390_format_RRE_RR(s390_irgen_LRVR, RRE_r1(ovl), RRE_r2(ovl)); goto ok; case 0xb920: s390_format_RRE_RR(s390_irgen_CGR, RRE_r1(ovl), @@ -20470,13 +20564,19 @@ s390_decode_4byte_and_irgen(const UChar *bytes) case 0xb927: s390_format_RRE_RR(s390_irgen_LHR, RRE_r1(ovl), RRE_r2(ovl)); goto ok; case 0xb928: /* PCKMO */ goto unimplemented; - case 0xb929: /* KMA */ goto unimplemented; - case 0xb92a: /* KMF */ goto unimplemented; - case 0xb92b: /* KMO */ goto unimplemented; - case 0xb92c: /* PCC */ goto unimplemented; - case 0xb92d: /* KMCTR */ goto unimplemented; - case 0xb92e: /* KM */ goto unimplemented; - case 0xb92f: /* KMC */ goto unimplemented; + case 0xb929: s390_format_RRF_R0RR2(s390_irgen_KMA, RRF4_r3(ovl), + RRF4_r1(ovl), RRF4_r2(ovl)); goto ok; + case 0xb92a: s390_format_RRE_RR(s390_irgen_KMF, RRE_r1(ovl), + RRE_r2(ovl)); goto ok; + case 0xb92b: s390_format_RRE_RR(s390_irgen_KMO, RRE_r1(ovl), + RRE_r2(ovl)); goto ok; + case 0xb92c: s390_format_E(s390_irgen_PCC); goto ok; + case 0xb92d: s390_format_RRF_R0RR2(s390_irgen_KMCTR, RRF4_r3(ovl), + RRF4_r1(ovl), RRF4_r2(ovl)); goto ok; + case 0xb92e: s390_format_RRE_RR(s390_irgen_KM, RRE_r1(ovl), + RRE_r2(ovl)); goto ok; + case 0xb92f: s390_format_RRE_RR(s390_irgen_KMC, RRE_r1(ovl), + RRE_r2(ovl)); goto ok; case 0xb930: s390_format_RRE_RR(s390_irgen_CGFR, RRE_r1(ovl), RRE_r2(ovl)); goto ok; case 0xb931: s390_format_RRE_RR(s390_irgen_CLGFR, RRE_r1(ovl), @@ -20484,12 +20584,15 @@ s390_decode_4byte_and_irgen(const UChar *bytes) case 0xb938: /* SORTL */ goto unimplemented; case 0xb939: s390_format_RRF_R0RR2(s390_irgen_DFLTCC, RRF4_r3(ovl), RRF4_r1(ovl), RRF4_r2(ovl)); goto ok; - case 0xb93a: /* KDSA */ goto unimplemented; + case 0xb93a: s390_format_RRE_RR(s390_irgen_KDSA, RRE_r1(ovl), + RRE_r2(ovl)); goto ok; case 0xb93b: s390_format_E(s390_irgen_NNPA); goto ok; case 0xb93c: s390_format_RRE_RR(s390_irgen_PPNO, RRE_r1(ovl), RRE_r2(ovl)); goto ok; - case 0xb93e: /* KIMD */ goto unimplemented; - case 0xb93f: /* KLMD */ goto unimplemented; + case 0xb93e: s390_format_RRE_RR(s390_irgen_KIMD, RRE_r1(ovl), + RRE_r2(ovl)); goto ok; + case 0xb93f: s390_format_RRE_RR(s390_irgen_KLMD, RRE_r1(ovl), + RRE_r2(ovl)); goto ok; case 0xb941: s390_format_RRF_UURF(s390_irgen_CFDTR, RRF2_m3(ovl), RRF2_m4(ovl), RRF2_r1(ovl), RRF2_r2(ovl)); goto ok; diff --git a/VEX/pub/libvex_s390x_common.h b/VEX/pub/libvex_s390x_common.h index 5b03fb7c4e..944347242d 100644 --- a/VEX/pub/libvex_s390x_common.h +++ b/VEX/pub/libvex_s390x_common.h @@ -120,6 +120,17 @@ #define S390_EXT_NNPA 2 #define S390_EXT_DFLT 3 #define S390_EXT_STFLE 4 +#define S390_EXT_KM 5 +#define S390_EXT_KMC 6 +#define S390_EXT_KIMD 7 +#define S390_EXT_KLMD 8 +#define S390_EXT_KMAC 9 +#define S390_EXT_PCC 10 +#define S390_EXT_KMCTR 11 +#define S390_EXT_KMO 12 +#define S390_EXT_KMF 13 +#define S390_EXT_KMA 14 +#define S390_EXT_KDSA 15 /*--------------------------------------------------------------*/ /*--- Miscellaneous ---*/ diff --git a/coregrind/m_extension/extension-s390x.c b/coregrind/m_extension/extension-s390x.c index 82bd231cf1..34e2e0409d 100644 --- a/coregrind/m_extension/extension-s390x.c +++ b/coregrind/m_extension/extension-s390x.c @@ -79,6 +79,89 @@ union reg_pair { unsigned __int128 pair; }; +/* To avoid code duplication, provide macros for generating inline assembly + functions where applicable. */ + +#define S390_DEFINE_DO_RRR_INSN(fname, opc) \ + static Int fname(ULong func, ULong parms, ULong* addr1, ULong* addr2, \ + ULong* len2, ULong* addr3, ULong* len3) \ + { \ + union reg_pair op1 = {{*addr1, 0}}; \ + union reg_pair op2 = {{*addr2, *len2}}; \ + union reg_pair op3 = {{*addr3, *len3}}; \ + register ULong reg0 asm("0") = func; \ + register void* reg1 asm("1") = (void*)parms; \ + UInt cc; \ + \ + asm volatile(".insn rrf, " #opc "0000, %[op1], %[op2], %[op3], 0\n" \ + "ipm %[cc]\n" \ + : [cc] "=d"(cc), [op1] "+a"(op1.pair), \ + [op2] "+a"(op2.pair), [op3] "+a"(op3.pair) \ + : "d"(reg0), "d"(reg1) \ + : "cc", "memory"); \ + *addr1 = op1.a; \ + *addr2 = op2.a; \ + *len2 = op2.b; \ + *addr3 = op3.a; \ + *len3 = op3.b; \ + return cc >> 28; \ + } + +#define S390_DEFINE_DO_RR_INSN(fname, opc) \ + static Int fname(ULong func, ULong parms, ULong* addr1, ULong* len1, \ + ULong* addr2, ULong* len2) \ + { \ + union reg_pair op1 = {{*addr1, *len1}}; \ + union reg_pair op2 = {{*addr2, *len2}}; \ + register ULong reg0 asm("0") = func; \ + register void* reg1 asm("1") = (void*)parms; \ + UInt cc; \ + \ + asm volatile(".insn rre, " #opc "0000, %[op1], %[op2]\n" \ + "ipm %[cc]\n" \ + : [cc] "=d"(cc), [op1] "+a"(op1.pair), [op2] "+a"(op2.pair) \ + : "d"(reg0), "d"(reg1) \ + : "cc", "memory"); \ + *addr1 = op1.a; \ + *len1 = op1.b; \ + *addr2 = op2.a; \ + *len2 = op2.b; \ + return cc >> 28; \ + } + +#define S390_DEFINE_DO_0R_INSN(fname, opc) \ + static Int fname(ULong func, ULong parms, ULong* addr2, ULong* len2) \ + { \ + union reg_pair op2 = {{*addr2, *len2}}; \ + register ULong reg0 asm("0") = func; \ + register void* reg1 asm("1") = (void*)parms; \ + UInt cc; \ + \ + asm volatile(".insn rre, " #opc "0000, 0, %[op2]\n" \ + "ipm %[cc]\n" \ + : [cc] "=d"(cc), [op2] "+a"(op2.pair) \ + : "d"(reg0), "d"(reg1) \ + : "cc", "memory"); \ + *addr2 = op2.a; \ + *len2 = op2.b; \ + return cc >> 28; \ + } + +#define S390_DEFINE_DO_00_INSN(fname, opc) \ + static Int fname(ULong func, ULong parms) \ + { \ + register ULong reg0 asm("0") = func; \ + register void* reg1 asm("1") = (void*)parms; \ + UInt cc; \ + \ + asm volatile(".insn rre, " #opc "0000, 0, 0\n" \ + "ipm %[cc]\n" \ + : [cc] "=d"(cc) \ + : "d"(reg0), "d"(reg1) \ + : "cc", "memory"); \ + return cc >> 28; \ + } + #define S390_SETBIT(x) (1UL << (63 - (x % 64))) #define S390_SETBITS(lo, hi) (((1UL << (hi + 1 - lo)) - 1) << (63 - (hi % 64))) @@ -104,31 +187,7 @@ static void s390_filter_functions(ULong* fc, /*--- PRNO (perform random number operation) ---*/ /*---------------------------------------------------------------*/ -static Int do_PRNO_insn(UChar func, - ULong parms, - ULong* addr1, - ULong* len1, - ULong* addr2, - ULong* len2) -{ - register UChar reg0 asm("0") = func; - register void* reg1 asm("1") = (void*)parms; - union reg_pair op1 = {{*addr1, *len1}}; - union reg_pair op2 = {{*addr2, *len2}}; - Int cc; - - asm volatile(".insn rre, 0xb93c0000, %[op1], %[op2]\n" - "ipm %[cc]\n" - "srl %[cc], 28\n" - : [cc] "=d"(cc), [op1] "+a"(op1.pair), [op2] "+a"(op2.pair) - : "d"(reg0), "d"(reg1) - : "cc", "memory"); - *addr1 = op1.a; - *len1 = op1.b; - *addr2 = op2.a; - *len2 = op2.b; - return cc; -} +S390_DEFINE_DO_RR_INSN(do_PRNO_insn, 0xb93c) /* PRNO functions that we support if the hardware does. */ static const ULong PRNO_functions[] = { @@ -769,9 +828,7 @@ static enum ExtensionError do_extension_STFLE(ThreadState* tst, ULong variant) PRE_MEM_WRITE(tst, "STFLE(bits)", addr, (last_dw + 1) * sizeof(ULong)); static const ULong accepted_facility[] = { /* === 0 .. 63 === */ - (S390_SETBITS(0, 16) - /* 17: message-security-assist, not supported */ - | S390_SETBITS(18, 19) + (S390_SETBITS(0, 19) /* 20: HFP-multiply-and-add/subtract, not supported */ | S390_SETBITS(21, 22) /* 23: HFP-unnormalized-extension, not supported */ @@ -790,16 +847,12 @@ static enum ExtensionError do_extension_STFLE(ThreadState* tst, ULong variant) /* 50: constrained transactional-execution, not supported */ | S390_SETBITS(51, 55) /* 56: unassigned */ - /* 57: MSA5, not supported */ - | S390_SETBITS(58, 63)), + | S390_SETBITS(57, 63)), /* === 64 .. 127 === */ (S390_SETBITS(64, 72) /* 73: transactional-execution, not supported */ - | S390_SETBITS(74, 75) - /* 76: MSA3, not supported */ - /* 77: MSA4, not supported */ - | S390_SETBITS(78, 78) + | S390_SETBITS(74, 78) /* 80: DFP packed-conversion, not supported */ /* 81: PPA-in-order, not supported */ | S390_SETBITS(82, 82) @@ -815,16 +868,13 @@ static enum ExtensionError do_extension_STFLE(ThreadState* tst, ULong variant) /* 137: unassigned */ | S390_SETBITS(138, 142) /* 143: unassigned */ - | S390_SETBITS(144, 145) - /* 146: MSA8, not supported */ - | S390_SETBITS(147, 149) + | S390_SETBITS(144, 149) /* 150: unassigned */ | S390_SETBITS(151, 151) /* 152: vector packed decimal enhancement, not supported */ /* 153: unassigned */ /* 154: unassigned */ - /* 155: MSA9, not supported */ - | S390_SETBITS(156, 156) + | S390_SETBITS(155, 156) /* 157-164: unassigned */ | S390_SETBITS(165, 165) /* 166-167: unassigned */ @@ -858,6 +908,844 @@ static enum ExtensionError do_extension_STFLE(ThreadState* tst, ULong variant) return ExtErr_OK; } +/*---------------------------------------------------------------*/ +/*--- KM (cypher message) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_RR_INSN(do_KM_insn, 0xb92e) + +/* List all the functions supported. This list provides the parameter block + sizes and will also be used for filtering the supported functions. The + function names are included for documentation purposes only. */ + +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, S390_KM_Query, 16) \ + S390_DO_FUNC(1, S390_KM_DEA, 8) \ + S390_DO_FUNC(2, S390_KM_TDEA_128, 16) \ + S390_DO_FUNC(3, S390_KM_TDEA_192, 24) \ + S390_DO_FUNC(9, S390_KM_Encrypted_DEA, 32) \ + S390_DO_FUNC(10, S390_KM_Encrypted_TDEA_128, 40) \ + S390_DO_FUNC(11, S390_KM_Encrypted_TDEA_192, 48) \ + S390_DO_FUNC(18, S390_KM_AES_128, 16) \ + S390_DO_FUNC(19, S390_KM_AES_192, 24) \ + S390_DO_FUNC(20, S390_KM_AES_256, 32) \ + S390_DO_FUNC(26, S390_KM_Encrypted_AES_128, 48) \ + S390_DO_FUNC(27, S390_KM_Encrypted_AES_192, 56) \ + S390_DO_FUNC(28, S390_KM_Encrypted_AES_256, 64) \ + S390_DO_FUNC(50, S390_KM_XTS_AES_128, 32) \ + S390_DO_FUNC(52, S390_KM_XTS_AES_256, 48) \ + S390_DO_FUNC(58, S390_KM_XTS_Encrypted_AES_128, 64) \ + S390_DO_FUNC(60, S390_KM_XTS_Encrypted_AES_256, 80) + +#define S390_DO_FUNC(fc, name, plen) [fc] = plen, +static const UChar S390_KM_parms_len[] = {S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, name, plen) | S390_SETBIT(fc) +static const ULong S390_KM_supported_fc[] = {0 S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS + +static enum ExtensionError do_extension_KM(ThreadState* tst, ULong variant) +{ + UChar r1 = variant & 0xf; + UChar r2 = (variant >> 4) & 0xf; + UChar func = READ_FUNCTION_CODE(tst, "KM"); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KM(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong orig_addr1, orig_len2 = 0; + ULong addr1 = 0, len1 = 0, addr2 = 0, len2 = 0; + + if (fc < sizeof(S390_KM_parms_len) / sizeof(S390_KM_parms_len[0])) + parms_len = S390_KM_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KM: unknown function code\n"); + + if (fc == 0) { // Query + PRE_MEM_WRITE(tst, "KM(parms)", parms, parms_len); + cc = do_KM_insn(func, parms, &addr1, &len1, &addr2, &len2); + s390_filter_functions((ULong*)parms, parms_len, S390_KM_supported_fc, + sizeof(S390_KM_supported_fc)); + POST_MEM_WRITE(tst, parms, parms_len); + } else { + addr1 = orig_addr1 = READ_GPR(tst, "KM(op1_addr)", r1); + addr2 = READ_GPR(tst, "KM(op2_addr)", r2); + len2 = orig_len2 = READ_GPR(tst, "KM(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KM(parms)", parms, parms_len); + PRE_MEM_WRITE(tst, "KM(op1)", addr1, len2); + PRE_MEM_READ(tst, "KM(op2)", addr2, len2); + cc = do_KM_insn(func, parms, &addr1, &len1, &addr2, &len2); + WRITE_GPR(tst, r1, addr1); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + POST_MEM_WRITE(tst, orig_addr1, orig_len2 - len2); + } + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KMC (cypher message with chaining) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_RR_INSN(do_KMC_insn, 0xb92f) + +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, S390_KMC_Query, 16) \ + S390_DO_FUNC(1, S390_KMC_DEA, 16) \ + S390_DO_FUNC(2, S390_KMC_TDEA_128, 24) \ + S390_DO_FUNC(3, S390_KMC_TDEA_192, 32) \ + S390_DO_FUNC(9, S390_KMC_Encrypted_DEA, 40) \ + S390_DO_FUNC(10, S390_KMC_Encrypted_TDEA_128, 48) \ + S390_DO_FUNC(11, S390_KMC_Encrypted_TDEA_192, 56) \ + S390_DO_FUNC(18, S390_KMC_AES_128, 32) \ + S390_DO_FUNC(19, S390_KMC_AES_192, 40) \ + S390_DO_FUNC(20, S390_KMC_AES_256, 48) \ + S390_DO_FUNC(26, S390_KMC_Encrypted_AES_128, 64) \ + S390_DO_FUNC(27, S390_KMC_Encrypted_AES_192, 72) \ + S390_DO_FUNC(28, S390_KMC_Encrypted_AES_256, 80) + +#define S390_DO_FUNCTIONS1 S390_DO_FUNC(67, S390_KMC_PRNG, 32) + +#define S390_DO_FUNC(fc, name, plen) [fc] = plen, +static const UChar S390_KMC_parms_len[] = { + S390_DO_FUNCTIONS S390_DO_FUNCTIONS1}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, name, plen) | S390_SETBIT(fc) +static const ULong S390_KMC_supported_fc[] = {0 S390_DO_FUNCTIONS, + 0 S390_DO_FUNCTIONS1}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS +#undef S390_DO_FUNCTIONS1 + +static enum ExtensionError do_extension_KMC(ThreadState* tst, ULong variant) +{ + UChar r1 = variant & 0xf; + UChar r2 = (variant >> 4) & 0xf; + UChar func = READ_FUNCTION_CODE(tst, "KMC"); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KMC(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong orig_addr1, orig_len2 = 0; + ULong addr1 = 0, len1 = 0, addr2 = 0, len2 = 0; + + if (fc < sizeof(S390_KMC_parms_len) / sizeof(S390_KMC_parms_len[0])) + parms_len = S390_KMC_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KMC: unknown function code\n"); + + PRE_MEM_WRITE(tst, "KMC(parms)", parms, parms_len); + if (fc == 0) { // Query + cc = do_KMC_insn(func, parms, &addr1, &len1, &addr2, &len2); + s390_filter_functions((ULong*)parms, parms_len, S390_KMC_supported_fc, + sizeof(S390_KMC_supported_fc)); + } else { + addr1 = orig_addr1 = READ_GPR(tst, "KMC(op1_addr)", r1); + addr2 = READ_GPR(tst, "KMC(op2_addr)", r2); + len2 = orig_len2 = READ_GPR(tst, "KMC(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KMC(parms)", parms, parms_len); + PRE_MEM_WRITE(tst, "KMC(op1)", addr1, len2); + PRE_MEM_READ(tst, "KMC(op2)", addr2, len2); + cc = do_KMC_insn(func, parms, &addr1, &len1, &addr2, &len2); + WRITE_GPR(tst, r1, addr1); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + POST_MEM_WRITE(tst, orig_addr1, orig_len2 - len2); + } + POST_MEM_WRITE(tst, parms, parms_len); + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KIMD (compute intermediate message digest) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_0R_INSN(do_KIMD_insn, 0xb93e) + +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, S390_KIMD_Query, 16) \ + S390_DO_FUNC(1, S390_KIMD_SHA_1, 20) \ + S390_DO_FUNC(2, S390_KIMD_SHA_256, 32) \ + S390_DO_FUNC(3, S390_KIMD_SHA_512, 64) \ + S390_DO_FUNC(32, S390_KIMD_SHA3_224, 200) \ + S390_DO_FUNC(33, S390_KIMD_SHA3_256, 200) \ + S390_DO_FUNC(34, S390_KIMD_SHA3_384, 200) \ + S390_DO_FUNC(35, S390_KIMD_SHA3_512, 200) \ + S390_DO_FUNC(36, S390_KIMD_SHAKE_128, 200) \ + S390_DO_FUNC(37, S390_KIMD_SHAKE_256, 200) \ + S390_DO_FUNC(65, S390_KIMD_GHASH, 32) + +#define S390_DO_FUNC(fc, name, plen) [fc] = plen, +static const UChar S390_KIMD_parms_len[] = {S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, name, plen) | S390_SETBIT(fc) +static const ULong S390_KIMD_supported_fc[] = {0 S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS + +static enum ExtensionError do_extension_KIMD(ThreadState* tst, ULong variant) +{ + UChar r2 = (variant >> 4) & 0xf; + UChar func = READ_FUNCTION_CODE(tst, "KIMD"); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KIMD(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong addr2 = 0, len2 = 0; + + if (fc < sizeof(S390_KIMD_parms_len) / sizeof(S390_KIMD_parms_len[0])) + parms_len = S390_KIMD_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KIMD: unknown function code\n"); + + if (fc == 0) { // Query + PRE_MEM_WRITE(tst, "KIMD(parms)", parms, parms_len); + cc = do_KIMD_insn(func, parms, &addr2, &len2); + s390_filter_functions((ULong*)parms, parms_len, S390_KIMD_supported_fc, + sizeof(S390_KIMD_supported_fc)); + POST_MEM_WRITE(tst, parms, parms_len); + } else { + addr2 = READ_GPR(tst, "KIMD(op2_addr)", r2); + len2 = READ_GPR(tst, "KIMD(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KIMD(parms)", parms, parms_len); + PRE_MEM_WRITE(tst, "KIMD(parms)", parms, parms_len); + PRE_MEM_READ(tst, "KIMD(op2)", addr2, len2); + cc = do_KIMD_insn(func, parms, &addr2, &len2); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + POST_MEM_WRITE(tst, parms, parms_len); + } + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KLMD (compute last message digest) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_RR_INSN(do_KLMD_insn, 0xb93f) + +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, S390_KLMD_Query, 16) \ + S390_DO_FUNC(1, S390_KLMD_SHA_1, 28) \ + S390_DO_FUNC(2, S390_KLMD_SHA_256, 40) \ + S390_DO_FUNC(3, S390_KLMD_SHA_512, 80) \ + S390_DO_FUNC(32, S390_KLMD_SHA3_224, 200) \ + S390_DO_FUNC(33, S390_KLMD_SHA3_256, 200) \ + S390_DO_FUNC(34, S390_KLMD_SHA3_384, 200) \ + S390_DO_FUNC(35, S390_KLMD_SHA3_512, 200) \ + S390_DO_FUNC(36, S390_KLMD_SHAKE_128, 200) \ + S390_DO_FUNC(37, S390_KLMD_SHAKE_256, 200) + +#define S390_DO_FUNC(fc, name, plen) [fc] = plen, +static const UChar S390_KLMD_parms_len[] = {S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, name, plen) | S390_SETBIT(fc) +static const ULong S390_KLMD_supported_fc[] = {0 S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS + +static enum ExtensionError do_extension_KLMD(ThreadState* tst, ULong variant) +{ + UChar r1 = variant & 0xf; + UChar r2 = (variant >> 4) & 0xf; + ULong func = READ_GPR(tst, "KLMD(r0)", 0); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KLMD(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong orig_addr1 = 0, orig_len1 = 0; + ULong addr1 = 0, len1 = 0, addr2 = 0, len2 = 0; + + if (fc < sizeof(S390_KLMD_parms_len) / sizeof(S390_KLMD_parms_len[0])) + parms_len = S390_KLMD_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KLMD: unknown function code\n"); + PRE_MEM_WRITE(tst, "KLMD(parms)", parms, parms_len); + + if (fc == 0) { // Query + cc = do_KLMD_insn(func, parms, &addr1, &len1, &addr2, &len2); + s390_filter_functions((ULong*)parms, parms_len, S390_KLMD_supported_fc, + sizeof(S390_KLMD_supported_fc)); + } else { + /* The "shake" functions use the first operand */ + Bool have_op1 = fc >= 36 && fc <= 37; + + PRE_MEM_READ(tst, "KLMD(parms)", parms, parms_len); + if (have_op1) { + if (r1 == 0 || r1 % 2 != 0) + return INSN_ERR("KLMD: bad r1 field"); + addr1 = orig_addr1 = READ_GPR(tst, "KLMD(op1_addr)", r1); + len1 = orig_len1 = READ_GPR(tst, "KLMD(op1_len)", r1 + 1); + PRE_MEM_WRITE(tst, "KLMD(op1)", addr1, len1); + } + addr2 = READ_GPR(tst, "KLMD(op2_addr)", r2); + len2 = READ_GPR(tst, "KLMD(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KLMD(op2)", addr2, len2); + cc = do_KLMD_insn(func, parms, &addr1, &len1, &addr2, &len2); + if (have_op1) { + WRITE_GPR(tst, r1, addr1); + WRITE_GPR(tst, r1 + 1, len1); + POST_MEM_WRITE(tst, orig_addr1, orig_len1 - len1); + } + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + } + POST_MEM_WRITE(tst, parms, parms_len); + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KMAC (compute message authentication code) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_0R_INSN(do_KMAC_insn, 0xb91e) + +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, S390_KMAC_Query, 16) \ + S390_DO_FUNC(1, S390_KMAC_DEA, 16) \ + S390_DO_FUNC(2, S390_KMAC_TDEA_128, 24) \ + S390_DO_FUNC(3, S390_KMAC_TDEA_192, 32) \ + S390_DO_FUNC(9, S390_KMAC_Encrypted_DEA, 40) \ + S390_DO_FUNC(10, S390_KMAC_Encrypted_TDEA_128, 48) \ + S390_DO_FUNC(11, S390_KMAC_Encrypted_TDEA_192, 56) \ + S390_DO_FUNC(18, S390_KMAC_AES_128, 32) \ + S390_DO_FUNC(19, S390_KMAC_AES_192, 40) \ + S390_DO_FUNC(20, S390_KMAC_AES_256, 48) \ + S390_DO_FUNC(26, S390_KMAC_Encrypted_AES_128, 64) \ + S390_DO_FUNC(27, S390_KMAC_Encrypted_AES_192, 72) \ + S390_DO_FUNC(28, S390_KMAC_Encrypted_AES_256, 80) + +#define S390_DO_FUNC(fc, name, plen) [fc] = plen, +static const UChar S390_KMAC_parms_len[] = {S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, name, plen) | S390_SETBIT(fc) +static const ULong S390_KMAC_supported_fc[] = {0 S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS + +static enum ExtensionError do_extension_KMAC(ThreadState* tst, ULong variant) +{ + UChar r2 = (variant >> 4) & 0xf; + UChar func = READ_FUNCTION_CODE(tst, "KMAC"); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KMAC(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong addr2 = 0, len2 = 0; + + if (fc < sizeof(S390_KMAC_parms_len) / sizeof(S390_KMAC_parms_len[0])) + parms_len = S390_KMAC_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KMAC: unknown function code\n"); + + if (fc == 0) { // Query + PRE_MEM_WRITE(tst, "KMAC(parms)", parms, parms_len); + cc = do_KMAC_insn(func, parms, &addr2, &len2); + s390_filter_functions((ULong*)parms, parms_len, S390_KMAC_supported_fc, + sizeof(S390_KMAC_supported_fc)); + POST_MEM_WRITE(tst, parms, parms_len); + } else { + addr2 = READ_GPR(tst, "KMAC(op2_addr)", r2); + len2 = READ_GPR(tst, "KMAC(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KMAC(parms)", parms, parms_len); + PRE_MEM_WRITE(tst, "KMAC(parms)", parms, parms_len); + PRE_MEM_READ(tst, "KMAC(op2)", addr2, len2); + cc = do_KMAC_insn(func, parms, &addr2, &len2); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + if (cc != 1) + POST_MEM_WRITE(tst, parms, parms_len); + } + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- PCC (perform cryptographic computation) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_00_INSN(do_PCC_insn, 0xb92c) + +enum PCC_function_class { + PCC_Unassigned = 0, + PCC_Query, + PCC_Compute_Last_Block_CMAC, + PCC_Compute_XTS_Parameter, + PCC_Scalar_Multiply, +}; + +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, PCC_Query, Query, 16, 16) \ + S390_DO_FUNC(1, PCC_Compute_Last_Block_CMAC, Using_DEA, 8, 32) \ + S390_DO_FUNC(2, PCC_Compute_Last_Block_CMAC, Using_TDEA_128, 8, 40) \ + S390_DO_FUNC(3, PCC_Compute_Last_Block_CMAC, Using_TDEA_192, 8, 48) \ + S390_DO_FUNC(9, PCC_Compute_Last_Block_CMAC, Using_Encrypted_DEA, 8, 56) \ + S390_DO_FUNC(10, PCC_Compute_Last_Block_CMAC, Using_Encrypted_TDEA_128, 8, \ + 64) \ + S390_DO_FUNC(11, PCC_Compute_Last_Block_CMAC, Using_Encrypted_TDEA_192, 8, \ + 72) \ + S390_DO_FUNC(18, PCC_Compute_Last_Block_CMAC, Using_AES_128, 16, 56) \ + S390_DO_FUNC(19, PCC_Compute_Last_Block_CMAC, Using_AES_192, 16, 64) \ + S390_DO_FUNC(20, PCC_Compute_Last_Block_CMAC, Using_AES_256, 16, 72) \ + S390_DO_FUNC(26, PCC_Compute_Last_Block_CMAC, Using_Encrypted_AES_128, 16, \ + 88) \ + S390_DO_FUNC(27, PCC_Compute_Last_Block_CMAC, Using_Encrypted_AES_192, 16, \ + 96) \ + S390_DO_FUNC(28, PCC_Compute_Last_Block_CMAC, Using_Encrypted_AES_256, 16, \ + 104) \ + S390_DO_FUNC(50, PCC_Compute_XTS_Parameter, Using_AES_128, 16, 80) \ + S390_DO_FUNC(52, PCC_Compute_XTS_Parameter, Using_AES_256, 16, 96) \ + S390_DO_FUNC(58, PCC_Compute_XTS_Parameter, Using_Encrypted_AES_128, 16, \ + 112) \ + S390_DO_FUNC(60, PCC_Compute_XTS_Parameter, Using_Encrypted_AES_256, 16, 128) + +#define S390_DO_FUNCTIONS1 \ + S390_DO_FUNC(64, PCC_Scalar_Multiply, P256, 64, 168) \ + S390_DO_FUNC(65, PCC_Scalar_Multiply, P384, 96, 248) \ + S390_DO_FUNC(66, PCC_Scalar_Multiply, P521, 160, 408) \ + S390_DO_FUNC(72, PCC_Scalar_Multiply, Ed25519, 64, 168) \ + S390_DO_FUNC(73, PCC_Scalar_Multiply, Ed448, 128, 328) \ + S390_DO_FUNC(80, PCC_Scalar_Multiply, X25519, 32, 104) \ + S390_DO_FUNC(81, PCC_Scalar_Multiply, X448, 64, 200) + +#define S390_DO_FUNC(fc, class, name, rlen, plen) \ + [fc] = {class, rlen / 8, plen / 8}, +static const struct { + UChar fc_class : 3; + UChar result_len : 5; + UChar parms_len; +} S390_PCC_fc_info[] = {S390_DO_FUNCTIONS S390_DO_FUNCTIONS1}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, class, name, rlen, plen) | S390_SETBIT(fc) +static const ULong S390_PCC_supported_fc[] = {0 S390_DO_FUNCTIONS, + 0 S390_DO_FUNCTIONS1}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS +#undef S390_DO_FUNCTIONS1 + +static enum ExtensionError do_extension_PCC(ThreadState* tst, ULong variant) +{ + UChar func = READ_FUNCTION_CODE(tst, "PCC"); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "PCC(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + UChar fc_class = PCC_Unassigned; + ULong result_offs, result_len, msg_len; + + if (fc < sizeof(S390_PCC_fc_info) / sizeof(S390_PCC_fc_info[0])) { + fc_class = S390_PCC_fc_info[fc].fc_class; + result_len = S390_PCC_fc_info[fc].result_len * 8; + parms_len = S390_PCC_fc_info[fc].parms_len * 8; + } + + switch (fc_class) { + case PCC_Query: + PRE_MEM_WRITE(tst, "PCC(parms)", parms, parms_len); + cc = do_PCC_insn(func, parms); + s390_filter_functions((ULong*)parms, parms_len, S390_PCC_supported_fc, + sizeof(S390_PCC_supported_fc)); + result_offs = 0; + break; + case PCC_Compute_Last_Block_CMAC: + /* result_len == sizeof(ICV) == sizeof(message) */ + PRE_MEM_READ(tst, "PCC(parms)", parms, 8); + msg_len = (*(UChar*)parms + 7) / 8; + if (msg_len > result_len) + msg_len = result_len; + if (msg_len != 0) { + PRE_MEM_READ(tst, "PCC(parms)", parms + 8, msg_len); + } + result_offs = 8 + result_len; + PRE_MEM_READ(tst, "PCC(parms)", parms + result_offs, + parms_len - result_offs); + PRE_MEM_WRITE(tst, "PCC(parms.CMAC)", parms + result_offs, result_len); + cc = do_PCC_insn(func, parms); + break; + case PCC_Compute_XTS_Parameter: + /* result_len == sizeof(XTS parameter) */ + result_offs = parms_len - result_len; + PRE_MEM_READ(tst, "PCC(parms)", parms, result_offs - 16); + if (*(ULong*)(parms + result_offs - 32) != 0) { + /* block sequential number non-zero -> read intermediate bit index t */ + result_offs -= 16; + result_len += 16; + PRE_MEM_READ(tst, "PCC(parms.t)", parms + result_offs, 16); + if (*(ULong*)(parms + result_offs) != 0) { + /* t != 0: read partial XTS parameter */ + PRE_MEM_READ(tst, "PCC(parms.XTS)", parms + result_offs + 16, + result_len); + } + } + PRE_MEM_WRITE(tst, "PCC(parms)", parms + result_offs, result_len); + cc = do_PCC_insn(func, parms); + break; + case PCC_Scalar_Multiply: + /* result_len == sizeof(result) == sizeof(source) */ + result_offs = 0; + PRE_MEM_READ(tst, "PCC(parms)", parms + result_len, + parms_len - result_len); + PRE_MEM_WRITE(tst, "PCC(parms)", parms, 4096); + if (*(ULong*)(parms + parms_len - 8) != 0) { + /* continuation -> read the continuation state buffer as well */ + PRE_MEM_READ(tst, "PCC(parms.CSB)", parms + parms_len, + 4096 - parms_len); + } + cc = do_PCC_insn(func, parms); + break; + default: + return INSN_ERR("PCC: unknown function code\n"); + } + + if (cc == 0 || cc == 3) // normal or partial completion + POST_MEM_WRITE(tst, parms + result_offs, result_len); + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KMCTR (cypher message with counter) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_RRR_INSN(do_KMCTR_insn, 0xb92d) + +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, S390_KMCTR_Query, 16) \ + S390_DO_FUNC(1, S390_KMCTR_DEA, 8) \ + S390_DO_FUNC(2, S390_KMCTR_TDEA_128, 16) \ + S390_DO_FUNC(3, S390_KMCTR_TDEA_192, 24) \ + S390_DO_FUNC(9, S390_KMCTR_Encrypted_DEA, 32) \ + S390_DO_FUNC(10, S390_KMCTR_Encrypted_TDEA_128, 40) \ + S390_DO_FUNC(11, S390_KMCTR_Encrypted_TDEA_192, 48) \ + S390_DO_FUNC(18, S390_KMCTR_AES_128, 16) \ + S390_DO_FUNC(19, S390_KMCTR_AES_192, 24) \ + S390_DO_FUNC(20, S390_KMCTR_AES_256, 32) \ + S390_DO_FUNC(26, S390_KMCTR_Encrypted_AES_128, 48) \ + S390_DO_FUNC(27, S390_KMCTR_Encrypted_AES_192, 56) \ + S390_DO_FUNC(28, S390_KMCTR_Encrypted_AES_256, 64) + +#define S390_DO_FUNC(fc, name, plen) [fc] = plen, +static const UChar S390_KMCTR_parms_len[] = {S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, name, plen) | S390_SETBIT(fc) +static const ULong S390_KMCTR_supported_fc[] = {0 S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS + +enum { + S390_KMCTR_parms_len_n = + sizeof(S390_KMCTR_parms_len) / sizeof(S390_KMCTR_parms_len[0]) +}; + +static enum ExtensionError do_extension_KMCTR(ThreadState* tst, ULong variant) +{ + UChar r1 = variant & 0xf; + UChar r2 = (variant >> 4) & 0xf; + UChar r3 = (variant >> 8) & 0xf; + UChar func = READ_FUNCTION_CODE(tst, "KMCTR"); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KMCTR(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong orig_addr1, orig_len2 = 0; + ULong addr1 = 0, addr2 = 0, addr3 = 0, len2 = 0, len3 = 0; + + if (fc < S390_KMCTR_parms_len_n) + parms_len = S390_KMCTR_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KMCTR: unknown function code\n"); + + if (fc == 0) { // Query + PRE_MEM_WRITE(tst, "KMCTR(parms)", parms, parms_len); + cc = do_KMCTR_insn(func, parms, &addr1, &addr2, &len2, &addr3, &len3); + s390_filter_functions((ULong*)parms, parms_len, S390_KMCTR_supported_fc, + sizeof(S390_KMCTR_supported_fc)); + POST_MEM_WRITE(tst, parms, parms_len); + } else { + addr1 = orig_addr1 = READ_GPR(tst, "KMCTR(op1_addr)", r1); + addr2 = READ_GPR(tst, "KMCTR(op2_addr)", r2); + addr3 = READ_GPR(tst, "KMCTR(op3_addr)", r3); + len2 = orig_len2 = READ_GPR(tst, "KMCTR(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KMCTR(parms)", parms, parms_len); + PRE_MEM_WRITE(tst, "KMCTR(op1)", addr1, len2); + PRE_MEM_READ(tst, "KMCTR(op2)", addr2, len2); + PRE_MEM_READ(tst, "KMCTR(op3)", addr3, len2); + cc = do_KMCTR_insn(func, parms, &addr1, &addr2, &len2, &addr3, &len3); + WRITE_GPR(tst, r1, addr1); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + WRITE_GPR(tst, r3, addr3); + POST_MEM_WRITE(tst, orig_addr1, orig_len2 - len2); + } + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KMO (cypher message with output feedback) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_RR_INSN(do_KMO_insn, 0xb92b) + +/* Same functions and parameter block sizes as for KMCTR */ +static const UChar* const S390_KMO_parms_len = S390_KMCTR_parms_len; +static const ULong* const S390_KMO_supported_fc = S390_KMCTR_supported_fc; +enum { S390_KMO_parms_len_n = S390_KMCTR_parms_len_n }; + +static enum ExtensionError do_extension_KMO(ThreadState* tst, ULong variant) +{ + UChar r1 = variant & 0xf; + UChar r2 = (variant >> 4) & 0xf; + UChar func = READ_FUNCTION_CODE(tst, "KMO"); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KMO(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong orig_addr1, orig_len2 = 0; + ULong addr1 = 0, len1 = 0, addr2 = 0, len2 = 0; + + if (fc < S390_KMO_parms_len_n) + parms_len = S390_KMO_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KMO: unknown function code\n"); + + PRE_MEM_WRITE(tst, "KMO(parms)", parms, parms_len); + if (fc == 0) { // Query + cc = do_KMO_insn(func, parms, &addr1, &len1, &addr2, &len2); + s390_filter_functions((ULong*)parms, parms_len, S390_KMO_supported_fc, + sizeof(S390_KMO_supported_fc)); + } else { + addr1 = orig_addr1 = READ_GPR(tst, "KMO(op1_addr)", r1); + addr2 = READ_GPR(tst, "KMO(op2_addr)", r2); + len2 = orig_len2 = READ_GPR(tst, "KMO(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KMO(parms)", parms, parms_len); + PRE_MEM_WRITE(tst, "KMO(op1)", addr1, len2); + PRE_MEM_READ(tst, "KMO(op2)", addr2, len2); + cc = do_KMO_insn(func, parms, &addr1, &len1, &addr2, &len2); + WRITE_GPR(tst, r1, addr1); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + POST_MEM_WRITE(tst, orig_addr1, orig_len2 - len2); + } + POST_MEM_WRITE(tst, parms, parms_len); + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KMF (cypher message with output feedback) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_RR_INSN(do_KMF_insn, 0xb92a) + +/* Same functions and parameter block sizes as for KMCTR */ +static const UChar* const S390_KMF_parms_len = S390_KMCTR_parms_len; +static const ULong* const S390_KMF_supported_fc = S390_KMCTR_supported_fc; +enum { S390_KMF_parms_len_n = S390_KMCTR_parms_len_n }; + +static enum ExtensionError do_extension_KMF(ThreadState* tst, ULong variant) +{ + UChar r1 = variant & 0xf; + UChar r2 = (variant >> 4) & 0xf; + ULong func = READ_GPR(tst, "KLMD(r0)", 0); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KMF(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong orig_addr1, orig_len2 = 0; + ULong addr1 = 0, len1 = 0, addr2 = 0, len2 = 0; + + if (fc < S390_KMF_parms_len_n) + parms_len = S390_KMF_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KMF: unknown function code\n"); + + PRE_MEM_WRITE(tst, "KMF(parms)", parms, parms_len); + if (fc == 0) { // Query + cc = do_KMF_insn(func, parms, &addr1, &len1, &addr2, &len2); + s390_filter_functions((ULong*)parms, parms_len, S390_KMF_supported_fc, + sizeof(S390_KMF_supported_fc)); + } else { + addr1 = orig_addr1 = READ_GPR(tst, "KMF(op1_addr)", r1); + addr2 = READ_GPR(tst, "KMF(op2_addr)", r2); + len2 = orig_len2 = READ_GPR(tst, "KMF(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KMF(parms)", parms, parms_len); + PRE_MEM_WRITE(tst, "KMF(op1)", addr1, len2); + PRE_MEM_READ(tst, "KMF(op2)", addr2, len2); + cc = do_KMF_insn(func, parms, &addr1, &len1, &addr2, &len2); + WRITE_GPR(tst, r1, addr1); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + POST_MEM_WRITE(tst, orig_addr1, orig_len2 - len2); + } + POST_MEM_WRITE(tst, parms, parms_len); + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KMA (cypher message with authentication) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_RRR_INSN(do_KMA_insn, 0xb929) + +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, S390_KMA_Query, 16) \ + S390_DO_FUNC(18, S390_KMA_GCM_AES_128, 96) \ + S390_DO_FUNC(19, S390_KMA_GCM_AES_192, 104) \ + S390_DO_FUNC(20, S390_KMA_GCM_AES_256, 112) \ + S390_DO_FUNC(26, S390_KMA_GCM_Encrypted_AES_128, 128) \ + S390_DO_FUNC(27, S390_KMA_GCM_Encrypted_AES_192, 136) \ + S390_DO_FUNC(28, S390_KMA_GCM_Encrypted_AES_256, 144) + +#define S390_DO_FUNC(fc, name, plen) [fc] = plen, +static const UChar S390_KMA_parms_len[] = {S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, name, plen) | S390_SETBIT(fc) +static const ULong S390_KMA_supported_fc[] = {0 S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS + +static enum ExtensionError do_extension_KMA(ThreadState* tst, ULong variant) +{ + UChar r1 = variant & 0xf; + UChar r2 = (variant >> 4) & 0xf; + UChar r3 = (variant >> 8) & 0xf; + ULong func = READ_GPR(tst, "KMA(gpr0)", 0); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KMA(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong orig_addr1, orig_len2; + ULong addr1 = 0, addr2 = 0, addr3 = 0, len2 = 0, len3 = 0; + + if (fc < sizeof(S390_KMA_parms_len) / sizeof(S390_KMA_parms_len[0])) + parms_len = S390_KMA_parms_len[fc]; + if (parms_len == 0) + return INSN_ERR("KMA: unknown function code\n"); + + if (fc == 0) { // Query + PRE_MEM_WRITE(tst, "KMA(parms)", parms, parms_len); + cc = do_KMA_insn(func, parms, &addr1, &addr2, &len2, &addr3, &len3); + s390_filter_functions((ULong*)parms, parms_len, S390_KMA_supported_fc, + sizeof(S390_KMA_supported_fc)); + POST_MEM_WRITE(tst, parms, parms_len); + } else { + addr1 = orig_addr1 = READ_GPR(tst, "KMA(op1_addr)", r1); + addr2 = READ_GPR(tst, "KMA(op2_addr)", r2); + addr3 = READ_GPR(tst, "KMA(op3_addr)", r3); + len2 = orig_len2 = READ_GPR(tst, "KMA(op2_len)", r2 + 1); + len3 = READ_GPR(tst, "KMA(op3_len)", r3 + 1); + PRE_MEM_READ(tst, "KMA(parms)", parms, parms_len); + PRE_MEM_WRITE(tst, "KMA(op1)", addr1, len2); + PRE_MEM_READ(tst, "KMA(op2)", addr2, len2); + PRE_MEM_READ(tst, "KMA(op3)", addr3, len3); + cc = do_KMA_insn(func, parms, &addr1, &addr2, &len2, &addr3, &len3); + WRITE_GPR(tst, r1, addr1); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + WRITE_GPR(tst, r3, addr3); + WRITE_GPR(tst, r3 + 1, len3); + POST_MEM_WRITE(tst, orig_addr1, orig_len2 - len2); + } + WRITE_CC(tst, cc); + return ExtErr_OK; +} + +/*---------------------------------------------------------------*/ +/*--- KDSA (compute intermediate message digest) ---*/ +/*---------------------------------------------------------------*/ + +S390_DEFINE_DO_0R_INSN(do_KDSA_insn, 0xb93a) + +/* We specify the parameter block size without the CSB here. Also note that + this approach only supports sizes that are a multiple of 8. */ +#define S390_DO_FUNCTIONS \ + S390_DO_FUNC(0, S390_KDSA_Query, 16) \ + S390_DO_FUNC(1, S390_KDSA_ECDSA_Verify_P256, 168) \ + S390_DO_FUNC(2, S390_KDSA_ECDSA_Verify_P384, 248) \ + S390_DO_FUNC(3, S390_KDSA_ECDSA_Verify_P521, 408) \ + S390_DO_FUNC(9, S390_KDSA_ECDSA_Sign_P256, 168) \ + S390_DO_FUNC(10, S390_KDSA_ECDSA_Sign_P384, 248) \ + S390_DO_FUNC(11, S390_KDSA_ECDSA_Sign_P521, 408) \ + S390_DO_FUNC(17, S390_KDSA_Encrypted_ECDSA_Sign_P256, 200) \ + S390_DO_FUNC(18, S390_KDSA_Encrypted_ECDSA_Sign_P384, 280) \ + S390_DO_FUNC(19, S390_KDSA_Encrypted_ECDSA_Sign_P521, 440) \ + S390_DO_FUNC(32, S390_KDSA_EdDSA_Verify_Ed25519, 104) \ + S390_DO_FUNC(36, S390_KDSA_EdDSA_Verify_Ed448, 200) \ + S390_DO_FUNC(40, S390_KDSA_EdDSA_Sign_Ed25519, 120) \ + S390_DO_FUNC(44, S390_KDSA_EdDSA_Sign_Ed448, 216) \ + S390_DO_FUNC(48, S390_KDSA_Encrypted_EdDSA_Sign_Ed25519, 152) \ + S390_DO_FUNC(52, S390_KDSA_Encrypted_EdDSA_Sign_Ed448, 248) + +#define S390_DO_FUNC(fc, name, plen) [fc] = plen / 8, +static const UChar S390_KDSA_parms_len[] = {S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#define S390_DO_FUNC(fc, name, plen) | S390_SETBIT(fc) +static const ULong S390_KDSA_supported_fc[] = {0 S390_DO_FUNCTIONS}; +#undef S390_DO_FUNC + +#undef S390_DO_FUNCTIONS + +static enum ExtensionError do_extension_KDSA(ThreadState* tst, ULong variant) +{ + UChar r2 = (variant >> 4) & 0xf; + UChar func = READ_FUNCTION_CODE(tst, "KDSA"); + UChar fc = func & 0x7f; + ULong parms = READ_GPR(tst, "KDSA(r1)", 1); + ULong parms_len = 0; + Int cc = 0; + ULong addr2 = 0, len2 = 0; + + if (fc < sizeof(S390_KDSA_parms_len) / sizeof(S390_KDSA_parms_len[0])) + parms_len = S390_KDSA_parms_len[fc] * 8; + if (parms_len == 0) + return INSN_ERR("KDSA: unknown function code\n"); + + if (fc == 0) { // Query + PRE_MEM_WRITE(tst, "KDSA(parms)", parms, parms_len); + cc = do_KDSA_insn(func, parms, &addr2, &len2); + s390_filter_functions((ULong*)parms, parms_len, S390_KDSA_supported_fc, + sizeof(S390_KDSA_supported_fc)); + POST_MEM_WRITE(tst, parms, parms_len); + } else { + addr2 = READ_GPR(tst, "KDSA(op2_addr)", r2); + len2 = READ_GPR(tst, "KDSA(op2_len)", r2 + 1); + PRE_MEM_READ(tst, "KDSA(parms)", parms, parms_len); + /* the CSB must also be writable */ + PRE_MEM_WRITE(tst, "KDSA(parms)", parms, 4096); + PRE_MEM_READ(tst, "KDSA(op2)", addr2, len2); + cc = do_KDSA_insn(func, parms, &addr2, &len2); + WRITE_GPR(tst, r2, addr2); + WRITE_GPR(tst, r2 + 1, len2); + POST_MEM_WRITE(tst, parms, parms_len); + } + WRITE_CC(tst, cc); + return ExtErr_OK; +} + /*---------------------------------------------------------------*/ /*--- Main function: select and call appropriate extension ---*/ /*---------------------------------------------------------------*/ @@ -877,6 +1765,28 @@ enum ExtensionError ML_(do_client_extension)(ThreadState* tst) return do_extension_DFLTCC(tst, variant); case S390_EXT_STFLE: return do_extension_STFLE(tst, variant); + case S390_EXT_KM: + return do_extension_KM(tst, variant); + case S390_EXT_KMC: + return do_extension_KMC(tst, variant); + case S390_EXT_KIMD: + return do_extension_KIMD(tst, variant); + case S390_EXT_KLMD: + return do_extension_KLMD(tst, variant); + case S390_EXT_KMAC: + return do_extension_KMAC(tst, variant); + case S390_EXT_PCC: + return do_extension_PCC(tst, variant); + case S390_EXT_KMCTR: + return do_extension_KMCTR(tst, variant); + case S390_EXT_KMO: + return do_extension_KMO(tst, variant); + case S390_EXT_KMF: + return do_extension_KMF(tst, variant); + case S390_EXT_KMA: + return do_extension_KMA(tst, variant); + case S390_EXT_KDSA: + return do_extension_KDSA(tst, variant); default: VG_(core_panic)("unknown extension ID"); } diff --git a/docs/internals/s390-opcodes.csv b/docs/internals/s390-opcodes.csv index 97eb66beea..2b6fae36db 100644 --- a/docs/internals/s390-opcodes.csv +++ b/docs/internals/s390-opcodes.csv @@ -619,15 +619,15 @@ msdr,"multiply and subtract long hfp","won't do","hfp instruction" msd,"multiply and subtract long hfp","won't do","hfp instruction" mser,"mutliply and subtract short hfp","won't do","hfp instruction" mse,"multiply and subttract short hfp","won't do","hfp instruction" -km,"cipher message","not implemented", -kmc,"cipher message with chaining","not implemented", -kmf,"cipher message with CFB","not implemented", -kmo,"cipher message with OFB","not implemented", -kmctr,"cipher message with counter","not implemented", -pcc,"perform cryptographic computation","not implemented", -kimd,"compute intermediate message digest","not implemented", -klmd,"compute last message digest","not implemented", -kmac,"compute message authentication code","not implemented", +km,"cipher message",implemented, +kmc,"cipher message with chaining",implemented, +kmf,"cipher message with CFB",implemented, +kmo,"cipher message with OFB",implemented, +kmctr,"cipher message with counter",implemented, +pcc,"perform cryptographic computation",implemented, +kimd,"compute intermediate message digest",implemented, +klmd,"compute last message digest",implemented, +kmac,"compute message authentication code",implemented, afi,"add immediate 32",implemented, agfi,"add immediate 64<32",implemented, alfi,"add logical immediate 32",implemented, @@ -1670,7 +1670,7 @@ lgg,"load guarded 64 bit","not implemented","arch12" llgfs... [truncated message content] |
From: Paul F. <pa...@so...> - 2024-09-09 05:52:35
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=1a1343b132c8795c437b218bff8a5f8bbcfbac2f commit 1a1343b132c8795c437b218bff8a5f8bbcfbac2f Author: Paul Floyd <pj...@wa...> Date: Mon Sep 9 07:51:51 2024 +0200 FreeBSD nightly: increase parallel build to 4 jobs Diff: --- nightly/conf/freebsd.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nightly/conf/freebsd.conf b/nightly/conf/freebsd.conf index c76383ed5c..0ca2d8c8a6 100644 --- a/nightly/conf/freebsd.conf +++ b/nightly/conf/freebsd.conf @@ -1,4 +1,4 @@ export ABT_DETAILS=`uname -mrs` -export ABT_JOBS=2 +export ABT_JOBS=4 #export ABT_PERF="--tools=none,memcheck,callgrind,helgrind,cachegrind,drd,massif --reps=3 --vg=../valgrind-old --vg=../valgrind-new" export ABT_CONFIGURE_OPTIONS="CC=clang CXX=clang++" |
From: Paul F. <pa...@so...> - 2024-09-09 05:35:25
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=617efba8947b529e79ed25b59403852d78e75ea0 commit 617efba8947b529e79ed25b59403852d78e75ea0 Author: Paul Floyd <pj...@wa...> Date: Sat Mar 16 04:51:37 2024 +0100 Add 492663 to NEWS Diff: --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 0e44e2ce1a..1c3b8c5f8d 100644 --- a/NEWS +++ b/NEWS @@ -61,6 +61,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. di->fsm.rw_map_count' failed 492214 statx(fd, NULL, AT_EMPTY_PATH) is supported since Linux 6.11 but not supported in valgrind +492663 Valgrind ignores debug info for some binaries To see details of a given bug, visit https://bugs.kde.org/show_bug.cgi?id=XXXXXX |
From: Mark W. <ma...@kl...> - 2024-09-08 20:25:27
|
Remove the opensuse x86_64 builders. They don't add much extra. Add an ibm-power10 and a fedora-arm64 try builder. Don't run the auxchecks. They are unreliable. Add || true to make regtest becuase the regtests aren't zero fail. Add valgrind_regtest_step and bunsen upload for dist_factory. Add collapseRequests=True to all builders. --- builder/master.cfg | 129 +++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 70 deletions(-) diff --git a/builder/master.cfg b/builder/master.cfg index bd25aeeaf8ca..399a8579ae5f 100644 --- a/builder/master.cfg +++ b/builder/master.cfg @@ -845,9 +845,8 @@ valgrind_scheduler = schedulers.SingleBranchScheduler( "valgrind-fedora-s390x", "valgrind-debian-ppc64", # "valgrind-debian-arm64", - "valgrind-fedora-arm64", - "valgrind-opensusetw-x86_64", - "valgrind-opensuseleap-x86_64"]) + "valgrind-fedora-arm64"]) + c['schedulers'].append(valgrind_scheduler) valgrind_try_scheduler = schedulers.AnyBranchScheduler( @@ -858,12 +857,13 @@ valgrind_try_scheduler = schedulers.AnyBranchScheduler( builderNames=["valgrind-try-debian-armhf", "valgrind-try-debian-i386", "valgrind-try-ibm-power9", + "valgrind-try-ibm-power10", "valgrind-try-fedora-x86_64", "valgrind-try-fedora-ppc64le", "valgrind-try-fedora-s390x", "valgrind-try-debian-ppc64", # "valgrind-try-debian-arm64", - "valgrind-try-opensuseleap-x86_64"]) + "valgrind-try-fedora-arm64"]) c['schedulers'].append(valgrind_try_scheduler) valgrind_snapshot_scheduler = schedulers.Periodic( @@ -4684,16 +4684,10 @@ valgrind_git_step = steps.Git( valgrind_autogen_step = steps.ShellCommand( command=["./autogen.sh"], name="autogen", haltOnFailure=True) -# Note we use command as string so it gets passed to /bin/sh -c -valgrind_auxchecks_step = steps.Test( - command=util.Interpolate( - 'make --output-sync=line -j%(prop:ncpus)s auxchecks AUX_CHECK_DIR=$HOME/valgrind-auxtests'), - name="make auxchecks", - flunkOnFailure=True, - haltOnFailure=False) +# Since the regtests aren't zero fail on most arches we || true valgrind_regtest_step = steps.Test( - command='make regtest', + command='make regtest || true', name="make regtest", flunkOnFailure=True, haltOnFailure=False) @@ -4726,29 +4720,30 @@ valgrind_dist_factory.addStep(valgrind_git_step) valgrind_dist_factory.addStep(valgrind_autogen_step) valgrind_dist_factory.addStep(configure_step) valgrind_dist_factory.addStep(make_step) +valgrind_dist_factory.addStep(make_check_step) +valgrind_dist_factory.addStep(valgrind_regtest_step) +valgrind_dist_factory.addSteps(bunsen_logfile_upload_cpio_steps(["*.sum", "*.log", "*.trs"])) valgrind_dist_factory.addStep(make_distcheck_step) valgrind_dist_factory.addStep(make_distclean_step) -valgrind_make_check_aux_factory = util.BuildFactory() -valgrind_make_check_aux_factory.addStep(valgrind_git_step) -valgrind_make_check_aux_factory.addStep(valgrind_autogen_step) -valgrind_make_check_aux_factory.addStep(configure_step) -valgrind_make_check_aux_factory.addStep(make_step) -valgrind_make_check_aux_factory.addStep(make_check_step) -valgrind_make_check_aux_factory.addStep(valgrind_auxchecks_step) -valgrind_make_check_aux_factory.addStep(valgrind_regtest_step) -valgrind_make_check_aux_factory.addSteps(bunsen_logfile_upload_cpio_steps(["*.sum", "*.log", "*.trs"])) -valgrind_make_check_aux_factory.addStep(make_distclean_step) +valgrind_make_check_factory = util.BuildFactory() +valgrind_make_check_factory.addStep(valgrind_git_step) +valgrind_make_check_factory.addStep(valgrind_autogen_step) +valgrind_make_check_factory.addStep(configure_step) +valgrind_make_check_factory.addStep(make_step) +valgrind_make_check_factory.addStep(make_check_step) +valgrind_make_check_factory.addStep(valgrind_regtest_step) +valgrind_make_check_factory.addSteps(bunsen_logfile_upload_cpio_steps(["*.sum", "*.log", "*.trs"])) +valgrind_make_check_factory.addStep(make_distclean_step) # For arm32 because it is slow and make check doesn't build... -valgrind_make_aux_factory = util.BuildFactory() -valgrind_make_aux_factory.addStep(valgrind_git_step) -valgrind_make_aux_factory.addStep(valgrind_autogen_step) -valgrind_make_aux_factory.addStep(configure_step) -valgrind_make_aux_factory.addStep(make_step) -valgrind_make_aux_factory.addStep(valgrind_auxchecks_step) -valgrind_make_aux_factory.addSteps(bunsen_logfile_upload_cpio_steps(["*.sum", "*.log", "*.trs"])) -valgrind_make_aux_factory.addStep(make_distclean_step) +valgrind_make_factory = util.BuildFactory() +valgrind_make_factory.addStep(valgrind_git_step) +valgrind_make_factory.addStep(valgrind_autogen_step) +valgrind_make_factory.addStep(configure_step) +valgrind_make_factory.addStep(make_step) +# No bunsen because no checks are ran. +valgrind_make_factory.addStep(make_distclean_step) # trunk snapshots valgrind_snapshots_trunk_factory = util.BuildFactory() @@ -4768,6 +4763,7 @@ valgrind_fedora_x86_64_builder = util.BuilderConfig( readContainerFile('fedora-latest')}, workernames=vm_workers, tags=["valgrind", "fedora", "x86_64"], + collapseRequests=True, factory=valgrind_dist_factory) c['builders'].append(valgrind_fedora_x86_64_builder) @@ -4801,14 +4797,24 @@ valgrind_fedora_arm64_builder = util.BuilderConfig( name="valgrind-fedora-arm64", workernames=["fedora-arm64"], tags=["valgrind", "fedora", "arm64"], - factory=valgrind_make_check_aux_factory) + collapseRequests=True, + factory=valgrind_make_check_factory) c['builders'].append(valgrind_fedora_arm64_builder) +valgrind_try_fedora_arm64_builder = util.BuilderConfig( + name="valgrind-try-fedora-arm64", + workernames=["fedora-arm64"], + tags=["valgrind-try", "fedora", "arm64"], + collapseRequests=True, + factory=valgrind_make_check_factory) +c['builders'].append(valgrind_try_fedora_arm64_builder) + valgrind_debian_i386_builder = util.BuilderConfig( name="valgrind-debian-i386", workernames=debian_i386_workers, tags=["valgrind", "debian", "i386"], - factory=valgrind_make_check_aux_factory) + collapseRequests=True, + factory=valgrind_make_check_factory) c['builders'].append(valgrind_debian_i386_builder) valgrind_try_debian_i386_builder = util.BuilderConfig( @@ -4816,7 +4822,7 @@ valgrind_try_debian_i386_builder = util.BuilderConfig( workernames=debian_i386_workers, tags=["valgrind-try", "debian", "i386"], collapseRequests=True, - factory=valgrind_make_check_aux_factory) + factory=valgrind_make_check_factory) c['builders'].append(valgrind_try_debian_i386_builder) valgrind_debian_armhf_builder = util.BuilderConfig( @@ -4824,7 +4830,7 @@ valgrind_debian_armhf_builder = util.BuilderConfig( workernames=["debian-armhf"], tags=["valgrind", "debian", "armhf"], collapseRequests=True, - factory=valgrind_make_aux_factory) + factory=valgrind_make_factory) c['builders'].append(valgrind_debian_armhf_builder) valgrind_try_debian_armhf_builder = util.BuilderConfig( @@ -4832,7 +4838,7 @@ valgrind_try_debian_armhf_builder = util.BuilderConfig( workernames=["debian-armhf"], tags=["valgrind-try", "debian", "armhf"], collapseRequests=True, - factory=valgrind_make_aux_factory) + factory=valgrind_make_factory) c['builders'].append(valgrind_try_debian_armhf_builder) valgrind_fedora_s390x_builder = util.BuilderConfig( @@ -4840,7 +4846,7 @@ valgrind_fedora_s390x_builder = util.BuilderConfig( workernames=["fedora-s390x"], tags=["valgrind", "fedora", "s390x"], collapseRequests=True, - factory=valgrind_make_check_aux_factory) + factory=valgrind_make_check_factory) c['builders'].append(valgrind_fedora_s390x_builder) valgrind_try_fedora_s390x_builder = util.BuilderConfig( @@ -4848,14 +4854,15 @@ valgrind_try_fedora_s390x_builder = util.BuilderConfig( workernames=["fedora-s390x"], tags=["valgrind-try", "fedora", "s390x"], collapseRequests=True, - factory=valgrind_make_check_aux_factory) + factory=valgrind_make_check_factory) c['builders'].append(valgrind_try_fedora_s390x_builder) valgrind_debian_ppc64_builder = util.BuilderConfig( name="valgrind-debian-ppc64", workernames=["debian-ppc64"], tags=["valgrind", "debian", "ppc64"], - factory=valgrind_make_check_aux_factory) + collapseRequests=True, + factory=valgrind_make_check_factory) c['builders'].append(valgrind_debian_ppc64_builder) valgrind_try_debian_ppc64_builder = util.BuilderConfig( @@ -4863,7 +4870,7 @@ valgrind_try_debian_ppc64_builder = util.BuilderConfig( workernames=["debian-ppc64"], tags=["valgrind-try", "debian", "ppc64"], collapseRequests=True, - factory=valgrind_make_check_aux_factory) + factory=valgrind_make_check_factory) c['builders'].append(valgrind_try_debian_ppc64_builder) valgrind_fedora_ppc64le_builder = util.BuilderConfig( @@ -4871,7 +4878,7 @@ valgrind_fedora_ppc64le_builder = util.BuilderConfig( workernames=["fedora-ppc64le"], tags=["valgrind", "fedora", "ppc64le"], collapseRequests=True, - factory=valgrind_make_check_aux_factory) + factory=valgrind_make_check_factory) c['builders'].append(valgrind_fedora_ppc64le_builder) valgrind_try_fedora_ppc64le_builder = util.BuilderConfig( @@ -4879,14 +4886,15 @@ valgrind_try_fedora_ppc64le_builder = util.BuilderConfig( workernames=["fedora-ppc64le"], tags=["valgrind-try", "fedora", "ppc64le"], collapseRequests=True, - factory=valgrind_make_check_aux_factory) + factory=valgrind_make_check_factory) c['builders'].append(valgrind_try_fedora_ppc64le_builder) valgrind_ibm_power9_builder = util.BuilderConfig( name="valgrind-ibm-power9", workernames=["ibm_power9"], tags=["valgrind", "ibm", "power9"], - factory=valgrind_make_check_aux_factory) + collapseRequests=True, + factory=valgrind_make_check_factory) c['builders'].append(valgrind_ibm_power9_builder) valgrind_try_ibm_power9_builder = util.BuilderConfig( @@ -4894,43 +4902,24 @@ valgrind_try_ibm_power9_builder = util.BuilderConfig( workernames=["ibm_power9"], tags=["valgrind-try", "ibm", "power9"], collapseRequests=True, - factory=valgrind_make_check_aux_factory) + factory=valgrind_make_check_factory) c['builders'].append(valgrind_try_ibm_power9_builder) valgrind_ibm_power10_builder = util.BuilderConfig( name="valgrind-ibm-power10", workernames=["ibm_power10"], tags=["valgrind", "ibm", "power10"], - factory=valgrind_make_check_aux_factory) + collapseRequests=True, + factory=valgrind_make_check_factory) c['builders'].append(valgrind_ibm_power10_builder) -valgrind_opensusetw_x86_64_builder = util.BuilderConfig( - name="valgrind-opensusetw-x86_64", - properties={'container-file': - readContainerFile('opensuse-tumbleweed')}, - workernames=vm_workers, - tags=["valgrind", "opensusetw", "x86_64"], - factory=valgrind_make_check_aux_factory) -c['builders'].append(valgrind_opensusetw_x86_64_builder) - -valgrind_opensuseleap_x86_64_builder = util.BuilderConfig( - name="valgrind-opensuseleap-x86_64", - properties={'container-file': - readContainerFile('opensuse-leap')}, - workernames=vm_workers, - tags=["valgrind", "opensuseleap", "x86_64"], - factory=valgrind_make_check_aux_factory) -c['builders'].append(valgrind_opensuseleap_x86_64_builder) - -valgrind_try_opensuseleap_x86_64_builder = util.BuilderConfig( - name="valgrind-try-opensuseleap-x86_64", - properties={'container-file': - readContainerFile('opensuse-leap')}, - workernames=vm_workers, - tags=["valgrind-try", "opensuseleap", "x86_64"], +valgrind_try_ibm_power10_builder = util.BuilderConfig( + name="valgrind-try-ibm-power10", + workernames=["ibm_power10"], + tags=["valgrind-try", "ibm", "power10"], collapseRequests=True, - factory=valgrind_make_check_aux_factory) -c['builders'].append(valgrind_try_opensuseleap_x86_64_builder) + factory=valgrind_make_check_factory) +c['builders'].append(valgrind_try_ibm_power10_builder) # valgrind_rawhide_x86_64_builder = util.BuilderConfig( # name="valgrind-rawhide-x86_64", -- 2.46.0 |
From: Paul F. <pa...@so...> - 2024-09-07 10:03:44
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=28d8b35fb967ac95d095a7225c91070a7c463f98 commit 28d8b35fb967ac95d095a7225c91070a7c463f98 Author: Paul Floyd <pj...@wa...> Date: Sat Sep 7 12:02:50 2024 +0200 FreeBSD suppression: reachables from libc scanf and srand Still no libc freeres on FreeBSD. Diff: --- freebsd.supp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/freebsd.supp b/freebsd.supp index b387c19125..74e2bf2b28 100644 --- a/freebsd.supp +++ b/freebsd.supp @@ -161,3 +161,22 @@ obj:*/lib*/libc.so.7 fun:puts } +{ + MEMCHECK-LIBC-SRAND + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + obj:*/lib*/libc.so.7 + obj:*/lib*/libc.so.7 + fun:srand +} +{ + MEMCHECK-LIBC-SCANF + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + obj:*/lib*/libc.so.7 + obj:*/lib*/libc.so.7 + obj:*/lib*/libc.so.7 + fun:scanf +} |
From: Paul F. <pa...@so...> - 2024-09-07 07:32:24
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=1076dc0912e68b085de2bbf52e9e31cb32866f85 commit 1076dc0912e68b085de2bbf52e9e31cb32866f85 Author: Paul Floyd <pj...@wa...> Date: Sat Sep 7 09:06:03 2024 +0200 Bug 492663 - Valgrind ignores debug info for some binaries ML_(check_elf_and_get_rw_loads) now always checks for merged PT_LOADs when called from valgrind_main when iterating over nsegments. Updated comments and changed variable names and the debug message when the number of expected RW PT_LOADs hasn't been reached. Diff: --- coregrind/m_debuginfo/debuginfo.c | 14 ++++++++------ coregrind/m_debuginfo/priv_readelf.h | 3 ++- coregrind/m_debuginfo/readelf.c | 20 +++++++++++--------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c index cc79429bd6..a6a0f79b3b 100644 --- a/coregrind/m_debuginfo/debuginfo.c +++ b/coregrind/m_debuginfo/debuginfo.c @@ -1072,7 +1072,8 @@ static ULong di_notify_ACHIEVE_ACCEPT_STATE ( struct _DebugInfo* di ) exe_handlers->load_fn ( == VG_(load_ELF) ) [or load_MACHO]. - This does the mmap'ing and creates the associated NSegments. + This does the mmap'ing with VG_(am_do_mmap_NO_NOTIFY) + and creates the associated NSegments. The NSegments may get merged, (see maybe_merge_nsegments) so there could be more PT_LOADs than there are NSegments. @@ -1125,7 +1126,7 @@ static ULong di_notify_ACHIEVE_ACCEPT_STATE ( struct _DebugInfo* di ) ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd ) { NSegment const * seg; - Int rw_load_count; + Int expected_rw_load_count; const HChar* filename; Bool is_rx_map, is_rw_map, is_ro_map; @@ -1372,9 +1373,9 @@ ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd ) /* We're only interested in mappings of object files. */ # if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd) - rw_load_count = 0; + expected_rw_load_count = 0; - elf_ok = ML_(check_elf_and_get_rw_loads) ( actual_fd, filename, &rw_load_count ); + elf_ok = ML_(check_elf_and_get_rw_loads) ( actual_fd, filename, &expected_rw_load_count, use_fd == -1 ); if (use_fd == -1) { VG_(close)( actual_fd ); @@ -1444,7 +1445,7 @@ ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd ) /* So, finally, are we in an accept state? */ vg_assert(!di->have_dinfo); if (di->fsm.have_rx_map && - di->fsm.rw_map_count == rw_load_count) { + di->fsm.rw_map_count == expected_rw_load_count) { /* Ok, so, finally, we found what we need, and we haven't already read debuginfo for this object. So let's do so now. Yee-ha! */ @@ -1457,7 +1458,8 @@ ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd ) /* If we don't have an rx and rw mapping, go no further. */ if (debug) VG_(dmsg)("di_notify_mmap-6: " - "no dinfo loaded %s (no rx or no rw mapping)\n", filename); + "no dinfo loaded %s (no rx or rw mappings (%d) not reached expected count (%d))\n", + filename, di->fsm.rw_map_count, expected_rw_load_count); return 0; } } diff --git a/coregrind/m_debuginfo/priv_readelf.h b/coregrind/m_debuginfo/priv_readelf.h index 7e0fa17c9d..75e02c9800 100644 --- a/coregrind/m_debuginfo/priv_readelf.h +++ b/coregrind/m_debuginfo/priv_readelf.h @@ -62,7 +62,8 @@ extern Bool ML_(read_elf_object) ( DebugInfo* di ); function. */ extern Bool ML_(read_elf_debug) ( DebugInfo* di ); -extern Bool ML_(check_elf_and_get_rw_loads) ( Int fd, const HChar* filename, Int * rw_load_count ); +extern Bool ML_(check_elf_and_get_rw_loads) ( Int fd, const HChar* filename, + Int * rw_load_count, Bool from_nsegments ); #endif /* ndef __PRIV_READELF_H */ diff --git a/coregrind/m_debuginfo/readelf.c b/coregrind/m_debuginfo/readelf.c index 735f830441..b037b9201a 100644 --- a/coregrind/m_debuginfo/readelf.c +++ b/coregrind/m_debuginfo/readelf.c @@ -3852,7 +3852,8 @@ Bool ML_(read_elf_debug) ( struct _DebugInfo* di ) /* NOTREACHED */ } -Bool ML_(check_elf_and_get_rw_loads) ( Int fd, const HChar* filename, Int * rw_load_count ) +Bool ML_(check_elf_and_get_rw_loads) ( Int fd, const HChar* filename, + Int * rw_load_count, Bool from_nsegments ) { Bool res, ok; UWord i; @@ -3924,9 +3925,10 @@ Bool ML_(check_elf_and_get_rw_loads) ( Int fd, const HChar* filename, Int * rw_l * Hold your horses * Just because The ELF file contains 2 RW PT_LOAD segments * doesn't mean that Valgrind will also make 2 calls to - * VG_(di_notify_mmap): in some cases, the 2 NSegments will get - * merged and VG_(di_notify_mmap) only gets called once. - * How to detect that the segments will be merged ? + * VG_(di_notify_mmap): in some cases, the 2 NSegments will + * have been merged and VG_(di_notify_mmap) only gets called + * once. + * How to detect that the segments were be merged ? * Logically, they will be merged if the first segment ends * at the beginning of the second segment: * Seg1 virtual address + Seg1 segment_size @@ -3949,12 +3951,12 @@ Bool ML_(check_elf_and_get_rw_loads) ( Int fd, const HChar* filename, Int * rw_l * the 2 different segments loaded separately are both counted * here, we use the non rounded up p_filesz. * This is all a nightmare/hack. Something cleaner should be - * done than trying to guess here if segments will or will not - * be merged later depending on how the loader will load - * with or without rounding up. - * */ + * done than other than reverse engineering whether this call + * results from merged nsegments or not. Particularly as + * the mmap'ing and nsegment merging is all under our control. + */ if (previous_rw_a_phdr.p_memsz > 0 && - ehdr_m.e_type == ET_EXEC && + from_nsegments && previous_rw_a_phdr.p_vaddr + previous_rw_a_phdr.p_filesz == a_phdr.p_vaddr) { |