This series updates the brk LTP tests to use direct syscalls which makes the compat tests pass on our musl-based distribution. Add a simple sanity check for purecap that checks for ENOSYS and fails otherwise. Deactivate brk02 in purecap as it cannot be completed.
checkpatch complains about using ENOSYS but brk should not be implemented in purecap, so this is expected.
Depends on merging the corresponding Linux patch disabling brk : https://op-lists.linaro.org/archives/list/linux-morello@op-lists.linaro.org/...
Branch for review : review/teo/brk-fixes-v2 https://git.morello-project.org/Teo-CD/morello-linux-ltp/-/commits/review/te... --- v2: Better descriptions, switched to direct syscall and not checking for EINTR.
Teo Couprie Diaz (2): syscalls/brk: use direct syscall syscalls/brk: add a sanity check for purecap
runtest/morello_transitional_extended | 3 +++ testcases/kernel/syscalls/brk/brk01.c | 33 +++++++++++++++++++++++---- testcases/kernel/syscalls/brk/brk02.c | 17 ++++++++------ 3 files changed, 42 insertions(+), 11 deletions(-)
base-commit: 04d5526fb44bffdb785e28a334f906c9221bef94
Direct usage of brk is discouraged in favor of using malloc. Also, brk was removed from POSIX in POSIX.1-2001. In particular, the musl libc's brk always returns -ENOMEM which causes the LTP tests to fail. Invoking the syscall directly allows them to pass.
Use syscall() directly, as tst_syscall() casts the syscall return to an int and brk returns a long.
The patch also removes the dependency on sbrk to get the current break as it has the same issues. Instead, call syscall(__NR_brk, 0) which should always fail, returning the current break.
Signed-off-by: Teo Couprie Diaz teo.coupriediaz@arm.com --- testcases/kernel/syscalls/brk/brk01.c | 9 +++------ testcases/kernel/syscalls/brk/brk02.c | 14 ++++++-------- 2 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/testcases/kernel/syscalls/brk/brk01.c b/testcases/kernel/syscalls/brk/brk01.c index 5f482b943..f1e54bdaa 100644 --- a/testcases/kernel/syscalls/brk/brk01.c +++ b/testcases/kernel/syscalls/brk/brk01.c @@ -9,6 +9,7 @@ #include <errno.h>
#include "tst_test.h" +#include "lapi/syscalls.h"
void verify_brk(void) { @@ -16,7 +17,7 @@ void verify_brk(void) size_t inc = getpagesize() * 2 - 1; unsigned int i;
- cur_brk = (uintptr_t)sbrk(0); + cur_brk = (uintptr_t)syscall(__NR_brk, 0);
for (i = 0; i < 33; i++) { switch (i % 3) { @@ -31,11 +32,7 @@ void verify_brk(void) break; }
- TST_EXP_PASS_SILENT(brk((void *)new_brk), "brk()"); - if (!TST_PASS) - return; - - cur_brk = (uintptr_t)sbrk(0); + cur_brk = syscall(__NR_brk, new_brk);
if (cur_brk != new_brk) { tst_res(TFAIL, diff --git a/testcases/kernel/syscalls/brk/brk02.c b/testcases/kernel/syscalls/brk/brk02.c index 11e803cb4..961e5b2f4 100644 --- a/testcases/kernel/syscalls/brk/brk02.c +++ b/testcases/kernel/syscalls/brk/brk02.c @@ -14,24 +14,22 @@ #include <unistd.h> #include <sys/mman.h> #include "tst_test.h" +#include "lapi/syscalls.h"
void brk_down_vmas(void) { - void *brk_addr = sbrk(0); - - if (brk_addr == (void *) -1) - tst_brk(TBROK, "sbrk() failed"); + void *brk_addr = (void *)syscall(__NR_brk, 0);
unsigned long page_size = getpagesize(); void *addr = brk_addr + page_size;
- if (brk(addr)) { + if ((void *)syscall(__NR_brk, addr) < addr) { tst_res(TFAIL | TERRNO, "Cannot expand brk() by page size"); return; }
addr += page_size; - if (brk(addr)) { + if ((void *)syscall(__NR_brk, addr) < addr) { tst_res(TFAIL | TERRNO, "Cannot expand brk() by 2x page size"); return; } @@ -42,12 +40,12 @@ void brk_down_vmas(void) }
addr += page_size; - if (brk(addr)) { + if ((void *)syscall(__NR_brk, addr) < addr) { tst_res(TFAIL | TERRNO, "Cannot expand brk() after mprotect"); return; }
- if (brk(brk_addr)) { + if ((void *)syscall(__NR_brk, brk_addr) != brk_addr) { tst_res(TFAIL | TERRNO, "Cannot restore brk() to start address"); return; }
base-commit: 04d5526fb44bffdb785e28a334f906c9221bef94
brk is disabled in purecap, so only check that calling it returns -ENOSYS.
brk02 cannot be completed in purecap as brk is not implemented, so disable this test in purecap.
Add brk01 and brk02 to the morello_transitional_extended list.
Signed-off-by: Teo Couprie Diaz teo.coupriediaz@arm.com --- runtest/morello_transitional_extended | 3 +++ testcases/kernel/syscalls/brk/brk01.c | 5 +++++ testcases/kernel/syscalls/brk/brk02.c | 3 +++ 3 files changed, 11 insertions(+)
diff --git a/runtest/morello_transitional_extended b/runtest/morello_transitional_extended index 067fe82da..9549f9aa5 100644 --- a/runtest/morello_transitional_extended +++ b/runtest/morello_transitional_extended @@ -1,5 +1,8 @@ #DESCRIPTION: Morello transitional extended ABI system calls
+brk01 brk01 +brk02 brk02 + epoll_create01 epoll_create01 epoll_create02 epoll_create02 epoll_create1_01 epoll_create1_01 diff --git a/testcases/kernel/syscalls/brk/brk01.c b/testcases/kernel/syscalls/brk/brk01.c index f1e54bdaa..64977ac84 100644 --- a/testcases/kernel/syscalls/brk/brk01.c +++ b/testcases/kernel/syscalls/brk/brk01.c @@ -17,6 +17,11 @@ void verify_brk(void) size_t inc = getpagesize() * 2 - 1; unsigned int i;
+#ifdef __CHERI_PURE_CAPABILITY__ + TST_EXP_FAIL(syscall(__NR_brk, 0), ENOSYS, "brk is not implemented in purecap"); + return; +#endif + cur_brk = (uintptr_t)syscall(__NR_brk, 0);
for (i = 0; i < 33; i++) { diff --git a/testcases/kernel/syscalls/brk/brk02.c b/testcases/kernel/syscalls/brk/brk02.c index 961e5b2f4..e5522742f 100644 --- a/testcases/kernel/syscalls/brk/brk02.c +++ b/testcases/kernel/syscalls/brk/brk02.c @@ -18,6 +18,9 @@
void brk_down_vmas(void) { +#ifdef __CHERI_PURE_CAPABILITY__ + tst_brk(TCONF, "Cannot test brk in purecap: it should not be implemented"); +#endif void *brk_addr = (void *)syscall(__NR_brk, 0);
unsigned long page_size = getpagesize();
On 24/10/2022 16:07, Teo Couprie Diaz wrote:
This series updates the brk LTP tests to use direct syscalls which makes the compat tests pass on our musl-based distribution. Add a simple sanity check for purecap that checks for ENOSYS and fails otherwise. Deactivate brk02 in purecap as it cannot be completed.
This series should be disregarded as we decided to push a fix upstream and use the LTP infrastructure for direct system calls.
checkpatch complains about using ENOSYS but brk should not be implemented in purecap, so this is expected.
Depends on merging the corresponding Linux patch disabling brk : https://op-lists.linaro.org/archives/list/linux-morello@op-lists.linaro.org/...
Branch for review : review/teo/brk-fixes-v2 https://git.morello-project.org/Teo-CD/morello-linux-ltp/-/commits/review/te...
v2: Better descriptions, switched to direct syscall and not checking for EINTR.
Teo Couprie Diaz (2): syscalls/brk: use direct syscall syscalls/brk: add a sanity check for purecap
runtest/morello_transitional_extended | 3 +++ testcases/kernel/syscalls/brk/brk01.c | 33 +++++++++++++++++++++++---- testcases/kernel/syscalls/brk/brk02.c | 17 ++++++++------ 3 files changed, 42 insertions(+), 11 deletions(-)
base-commit: 04d5526fb44bffdb785e28a334f906c9221bef94
linux-morello-ltp@op-lists.linaro.org