From 32d14ad8eba97e0e319468e97fea27e989e6457c Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Tue, 13 Apr 2021 17:16:59 +0100 Subject: [PATCH] Add armv7hl fix Several tests do not compile on armv7hl. Backport a fix that addresses this from upstream (they were made after the 2.0 release). Signed-off-by: Stefan Hajnoczi --- ...-rid-of-x86_64-isms-in-the-test-code.patch | 473 ++++++++++++++++++ ...ext-cp.c-cope-with-variable-SIGSTKSZ.patch | 0 liburing.spec | 3 +- 3 files changed, 475 insertions(+), 1 deletion(-) create mode 100644 0003-test-get-rid-of-x86_64-isms-in-the-test-code.patch rename 0003-examples-ucontext-cp.c-cope-with-variable-SIGSTKSZ.patch => 0004-examples-ucontext-cp.c-cope-with-variable-SIGSTKSZ.patch (100%) diff --git a/0003-test-get-rid-of-x86_64-isms-in-the-test-code.patch b/0003-test-get-rid-of-x86_64-isms-in-the-test-code.patch new file mode 100644 index 0000000..8871467 --- /dev/null +++ b/0003-test-get-rid-of-x86_64-isms-in-the-test-code.patch @@ -0,0 +1,473 @@ +From 808b6c72ab753bda0c300b5683cfd31750d1d49b Mon Sep 17 00:00:00 2001 +From: Jens Axboe +Date: Wed, 31 Mar 2021 13:23:56 -0600 +Subject: [PATCH] test: get rid of x86_64'isms in the test code + +Most/all of these are from syzbot. Turn them into regular system calls, +and just let liburing sort out the non-x86 ones. + +Fixes: https://github.com/axboe/liburing/issues/322 +Signed-off-by: Jens Axboe +--- + test/35fa71a030ca-test.c | 16 +++++------ + test/917257daa0fe-test.c | 8 +++--- + test/a0908ae19763-test.c | 13 +++------ + test/a4c0b3decb33-test.c | 10 +++---- + test/accept-reuse.c | 1 - + test/b19062a56726-test.c | 8 +++--- + test/double-poll-crash.c | 55 +++++++------------------------------- + test/fc2a85cb02ef-test.c | 10 ++++--- + test/sendmsg_fs_cve.c | 1 - + test/sqpoll-disable-exit.c | 50 +++++----------------------------- + test/teardowns.c | 1 - + 11 files changed, 43 insertions(+), 130 deletions(-) + +diff --git a/test/35fa71a030ca-test.c b/test/35fa71a030ca-test.c +index 7f2124b..f5fcc4d 100644 +--- a/test/35fa71a030ca-test.c ++++ b/test/35fa71a030ca-test.c +@@ -24,6 +24,9 @@ + + #include + ++#include "liburing.h" ++#include "../src/syscall.h" ++ + #if !defined(SYS_futex) && defined(SYS_futex_time64) + # define SYS_futex SYS_futex_time64 + #endif +@@ -259,13 +262,6 @@ static void loop(void) + } + } + +-#ifndef __NR_io_uring_register +-#define __NR_io_uring_register 427 +-#endif +-#ifndef __NR_io_uring_setup +-#define __NR_io_uring_setup 425 +-#endif +- + uint64_t r[1] = {0xffffffffffffffff}; + + void execute_call(int call) +@@ -301,15 +297,15 @@ void execute_call(int call) + *(uint32_t*)0x200000a8 = 0; + *(uint32_t*)0x200000ac = 0; + *(uint64_t*)0x200000b0 = 0; +- res = syscall(__NR_io_uring_setup, 0x64, 0x20000040); ++ res = __sys_io_uring_setup(0x64, (struct io_uring_params *) 0x20000040UL); + if (res != -1) + r[0] = res; + break; + case 1: +- syscall(__NR_io_uring_register, (long)r[0], 0, 0, 0); ++ __sys_io_uring_register((long)r[0], 0, 0, 0); + break; + case 2: +- syscall(__NR_io_uring_register, (long)r[0], 0, 0, 0); ++ __sys_io_uring_register((long)r[0], 0, 0, 0); + break; + } + } +diff --git a/test/917257daa0fe-test.c b/test/917257daa0fe-test.c +index 2a3cb93..1d00ef1 100644 +--- a/test/917257daa0fe-test.c ++++ b/test/917257daa0fe-test.c +@@ -6,14 +6,12 @@ + #include + #include + #include +-#include + #include + #include + #include + +-#ifndef __NR_io_uring_setup +-#define __NR_io_uring_setup 425 +-#endif ++#include "liburing.h" ++#include "../src/syscall.h" + + int main(int argc, char *argv[]) + { +@@ -50,6 +48,6 @@ int main(int argc, char *argv[]) + *(uint32_t*)0x20000068 = 0; + *(uint32_t*)0x2000006c = 0; + *(uint64_t*)0x20000070 = 0; +- syscall(__NR_io_uring_setup, 0x7a6, 0x20000000); ++ __sys_io_uring_setup(0x7a6, (struct io_uring_params *) 0x20000000UL); + return 0; + } +diff --git a/test/a0908ae19763-test.c b/test/a0908ae19763-test.c +index 1d5741d..00cb559 100644 +--- a/test/a0908ae19763-test.c ++++ b/test/a0908ae19763-test.c +@@ -6,17 +6,12 @@ + #include + #include + #include +-#include + #include + #include + #include + +-#ifndef __NR_io_uring_register +-#define __NR_io_uring_register 427 +-#endif +-#ifndef __NR_io_uring_setup +-#define __NR_io_uring_setup 425 +-#endif ++#include "liburing.h" ++#include "../src/syscall.h" + + uint64_t r[1] = {0xffffffffffffffff}; + +@@ -54,10 +49,10 @@ int main(int argc, char *argv[]) + *(uint32_t*)0x200000e8 = 0; + *(uint32_t*)0x200000ec = 0; + *(uint64_t*)0x200000f0 = 0; +- res = syscall(__NR_io_uring_setup, 0xa4, 0x20000080); ++ res = __sys_io_uring_setup(0xa4, (struct io_uring_params *) 0x20000080); + if (res != -1) + r[0] = res; + *(uint32_t*)0x20000280 = -1; +- syscall(__NR_io_uring_register, r[0], 2, 0x20000280, 1); ++ __sys_io_uring_register(r[0], 2, (const void *) 0x20000280, 1); + return 0; + } +diff --git a/test/a4c0b3decb33-test.c b/test/a4c0b3decb33-test.c +index 23c20f6..34b0af2 100644 +--- a/test/a4c0b3decb33-test.c ++++ b/test/a4c0b3decb33-test.c +@@ -14,13 +14,15 @@ + #include + #include + #include +-#include + #include + #include + #include + #include + #include + ++#include "liburing.h" ++#include "../src/syscall.h" ++ + static void sleep_ms(uint64_t ms) + { + usleep(ms * 1000); +@@ -129,10 +131,6 @@ static void loop(void) + } + } + +-#ifndef __NR_io_uring_setup +-#define __NR_io_uring_setup 425 +-#endif +- + void execute_one(void) + { + *(uint32_t*)0x20000080 = 0; +@@ -163,7 +161,7 @@ void execute_one(void) + *(uint32_t*)0x200000e8 = 0; + *(uint32_t*)0x200000ec = 0; + *(uint64_t*)0x200000f0 = 0; +- syscall(__NR_io_uring_setup, 0x983, 0x20000080); ++ __sys_io_uring_setup(0x983, (struct io_uring_params *) 0x20000080); + } + + static void sig_int(int sig) +diff --git a/test/accept-reuse.c b/test/accept-reuse.c +index 0062729..c95ac70 100644 +--- a/test/accept-reuse.c ++++ b/test/accept-reuse.c +@@ -4,7 +4,6 @@ + #include + #include + #include +-#include + #include + #include + #include +diff --git a/test/b19062a56726-test.c b/test/b19062a56726-test.c +index 697a416..6a0f686 100644 +--- a/test/b19062a56726-test.c ++++ b/test/b19062a56726-test.c +@@ -6,14 +6,12 @@ + #include + #include + #include +-#include + #include + #include + #include + +-#ifndef __NR_io_uring_setup +-#define __NR_io_uring_setup 425 +-#endif ++#include "liburing.h" ++#include "../src/syscall.h" + + int main(int argc, char *argv[]) + { +@@ -50,6 +48,6 @@ int main(int argc, char *argv[]) + *(uint32_t*)0x20000268 = 0; + *(uint32_t*)0x2000026c = 0; + *(uint64_t*)0x20000270 = 0; +- syscall(__NR_io_uring_setup, 0xc9f, 0x20000200); ++ __sys_io_uring_setup(0xc9f, (struct io_uring_params *) 0x20000200); + return 0; + } +diff --git a/test/double-poll-crash.c b/test/double-poll-crash.c +index 1a219c7..2a012e5 100644 +--- a/test/double-poll-crash.c ++++ b/test/double-poll-crash.c +@@ -9,10 +9,13 @@ + #include + #include + #include +-#include + #include ++#include + #include + ++#include "liburing.h" ++#include "../src/syscall.h" ++ + #define SIZEOF_IO_URING_SQE 64 + #define SIZEOF_IO_URING_CQE 16 + #define SQ_HEAD_OFFSET 0 +@@ -29,44 +32,6 @@ + #define CQ_FLAGS_OFFSET 280 + #define CQ_CQES_OFFSET 320 + +-struct io_sqring_offsets { +- uint32_t head; +- uint32_t tail; +- uint32_t ring_mask; +- uint32_t ring_entries; +- uint32_t flags; +- uint32_t dropped; +- uint32_t array; +- uint32_t resv1; +- uint64_t resv2; +-}; +- +-struct io_cqring_offsets { +- uint32_t head; +- uint32_t tail; +- uint32_t ring_mask; +- uint32_t ring_entries; +- uint32_t overflow; +- uint32_t cqes; +- uint64_t resv[2]; +-}; +- +-struct io_uring_params { +- uint32_t sq_entries; +- uint32_t cq_entries; +- uint32_t flags; +- uint32_t sq_thread_cpu; +- uint32_t sq_thread_idle; +- uint32_t features; +- uint32_t resv[4]; +- struct io_sqring_offsets sq_off; +- struct io_cqring_offsets cq_off; +-}; +- +-#define IORING_OFF_SQ_RING 0 +-#define IORING_OFF_SQES 0x10000000ULL +- +-#define __NR_io_uring_setup 425 + static long syz_io_uring_setup(volatile long a0, volatile long a1, + volatile long a2, volatile long a3, + volatile long a4, volatile long a5) +@@ -77,7 +42,7 @@ static long syz_io_uring_setup(volatile long a0, volatile long a1, + void* vma2 = (void*)a3; + void** ring_ptr_out = (void**)a4; + void** sqes_ptr_out = (void**)a5; +- uint32_t fd_io_uring = syscall(__NR_io_uring_setup, entries, setup_params); ++ uint32_t fd_io_uring = __sys_io_uring_setup(entries, setup_params); + uint32_t sq_ring_sz = + setup_params->sq_off.array + setup_params->sq_entries * sizeof(uint32_t); + uint32_t cq_ring_sz = setup_params->cq_off.cqes + +@@ -150,9 +115,9 @@ int main(int argc, char *argv[]) + if (argc > 1) + return 0; + +- syscall(__NR_mmap, 0x1ffff000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); +- syscall(__NR_mmap, 0x20000000ul, 0x1000000ul, 7ul, 0x32ul, -1, 0ul); +- syscall(__NR_mmap, 0x21000000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); ++ mmap((void *)0x1ffff000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); ++ mmap((void *)0x20000000ul, 0x1000000ul, 7ul, 0x32ul, -1, 0ul); ++ mmap((void *)0x21000000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); + intptr_t res = 0; + *(uint32_t*)0x20000484 = 0; + *(uint32_t*)0x20000488 = 0; +@@ -207,7 +172,7 @@ int main(int argc, char *argv[]) + *(uint8_t*)0x2000003e = 0; + *(uint8_t*)0x2000003f = 0; + syz_io_uring_submit(r[1], r[2], 0x20000000, 0); +- syscall(__NR_io_uring_enter, r[0], 0x20450c, 0, 0ul, 0ul, 0ul); ++ __sys_io_uring_enter(r[0], 0x20450c, 0, 0ul, 0ul); + *(uint32_t*)0x20000080 = 0x7ff; + *(uint32_t*)0x20000084 = 0x8b7; + *(uint32_t*)0x20000088 = 3; +@@ -216,6 +181,6 @@ int main(int argc, char *argv[]) + memcpy((void*)0x20000091, "\xaf\x09\x01\xbc\xf9\xc6\xe4\x92\x86\x51\x7d\x7f" + "\xbd\x43\x7d\x16\x69\x3e\x05", + 19); +- syscall(__NR_ioctl, r[3], 0x5404, 0x20000080ul); ++ ioctl(r[3], 0x5404, 0x20000080ul); + return 0; + } +diff --git a/test/fc2a85cb02ef-test.c b/test/fc2a85cb02ef-test.c +index e922d17..35addf5 100644 +--- a/test/fc2a85cb02ef-test.c ++++ b/test/fc2a85cb02ef-test.c +@@ -11,11 +11,13 @@ + #include + #include + #include +-#include + #include + #include + #include + ++#include "liburing.h" ++#include "../src/syscall.h" ++ + static bool write_file(const char* file, const char* what, ...) + { + char buf[1024]; +@@ -123,14 +125,14 @@ int main(int argc, char *argv[]) + *(uint32_t*)0x20000068 = 0; + *(uint32_t*)0x2000006c = 0; + *(uint64_t*)0x20000070 = 0; +- res = syscall(__NR_io_uring_setup, 0x6a6, 0x20000000ul); ++ res = __sys_io_uring_setup(0x6a6, (struct io_uring_params *) 0x20000000ul); + if (res != -1) + r[0] = res; +- res = syscall(__NR_socket, 0x11ul, 2ul, 0x300ul); ++ res = socket(0x11ul, 2ul, 0x300ul); + if (res != -1) + r[1] = res; + *(uint32_t*)0x20000080 = r[1]; + inject_fault(1); +- syscall(__NR_io_uring_register, r[0], 2ul, 0x20000080ul, 1ul); ++ __sys_io_uring_register(r[0], 2ul, (const void *) 0x20000080ul, 1ul); + return 0; + } +diff --git a/test/sendmsg_fs_cve.c b/test/sendmsg_fs_cve.c +index 85f271b..8de220a 100644 +--- a/test/sendmsg_fs_cve.c ++++ b/test/sendmsg_fs_cve.c +@@ -19,7 +19,6 @@ + */ + + #include +-#include + #include + #include + #include +diff --git a/test/sqpoll-disable-exit.c b/test/sqpoll-disable-exit.c +index d4e17f8..93bcf42 100644 +--- a/test/sqpoll-disable-exit.c ++++ b/test/sqpoll-disable-exit.c +@@ -15,12 +15,14 @@ + #include + #include + #include +-#include + #include + #include + #include + #include + ++#include "liburing.h" ++#include "../src/syscall.h" ++ + static void sleep_ms(uint64_t ms) + { + usleep(ms * 1000); +@@ -72,44 +74,6 @@ static bool write_file(const char* file, const char* what, ...) + #define CQ_FLAGS_OFFSET 280 + #define CQ_CQES_OFFSET 320 + +-struct io_sqring_offsets { +- uint32_t head; +- uint32_t tail; +- uint32_t ring_mask; +- uint32_t ring_entries; +- uint32_t flags; +- uint32_t dropped; +- uint32_t array; +- uint32_t resv1; +- uint64_t resv2; +-}; +- +-struct io_cqring_offsets { +- uint32_t head; +- uint32_t tail; +- uint32_t ring_mask; +- uint32_t ring_entries; +- uint32_t overflow; +- uint32_t cqes; +- uint64_t resv[2]; +-}; +- +-struct io_uring_params { +- uint32_t sq_entries; +- uint32_t cq_entries; +- uint32_t flags; +- uint32_t sq_thread_cpu; +- uint32_t sq_thread_idle; +- uint32_t features; +- uint32_t resv[4]; +- struct io_sqring_offsets sq_off; +- struct io_cqring_offsets cq_off; +-}; +- +-#define IORING_OFF_SQ_RING 0 +-#define IORING_OFF_SQES 0x10000000ULL +- +-#define sys_io_uring_setup 425 + static long syz_io_uring_setup(volatile long a0, volatile long a1, + volatile long a2, volatile long a3, + volatile long a4, volatile long a5) +@@ -120,7 +84,7 @@ static long syz_io_uring_setup(volatile long a0, volatile long a1, + void* vma2 = (void*)a3; + void** ring_ptr_out = (void**)a4; + void** sqes_ptr_out = (void**)a5; +- uint32_t fd_io_uring = syscall(sys_io_uring_setup, entries, setup_params); ++ uint32_t fd_io_uring = __sys_io_uring_setup(entries, setup_params); + uint32_t sq_ring_sz = + setup_params->sq_off.array + setup_params->sq_entries * sizeof(uint32_t); + uint32_t cq_ring_sz = setup_params->cq_off.cqes + +@@ -223,9 +187,9 @@ void execute_one(void) + } + int main(void) + { +- syscall(__NR_mmap, 0x1ffff000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); +- syscall(__NR_mmap, 0x20000000ul, 0x1000000ul, 7ul, 0x32ul, -1, 0ul); +- syscall(__NR_mmap, 0x21000000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); ++ mmap((void *)0x1ffff000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); ++ mmap((void *)0x20000000ul, 0x1000000ul, 7ul, 0x32ul, -1, 0ul); ++ mmap((void *)0x21000000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); + loop(); + return 0; + } +diff --git a/test/teardowns.c b/test/teardowns.c +index f78fe22..8bd3022 100644 +--- a/test/teardowns.c ++++ b/test/teardowns.c +@@ -3,7 +3,6 @@ + #include + #include + #include +-#include + #include + #include + #include +-- +2.30.2 + diff --git a/0003-examples-ucontext-cp.c-cope-with-variable-SIGSTKSZ.patch b/0004-examples-ucontext-cp.c-cope-with-variable-SIGSTKSZ.patch similarity index 100% rename from 0003-examples-ucontext-cp.c-cope-with-variable-SIGSTKSZ.patch rename to 0004-examples-ucontext-cp.c-cope-with-variable-SIGSTKSZ.patch diff --git a/liburing.spec b/liburing.spec index 07bb00e..14bdff7 100644 --- a/liburing.spec +++ b/liburing.spec @@ -10,7 +10,8 @@ BuildRequires: gcc BuildRequires: make Patch1: 0001-spec-bump-version-to-2.0.patch Patch2: 0002-spec-add-explicit-build-dependency-on-make.patch -Patch3: 0003-examples-ucontext-cp.c-cope-with-variable-SIGSTKSZ.patch +Patch3: 0003-test-get-rid-of-x86_64-isms-in-the-test-code.patch +Patch4: 0004-examples-ucontext-cp.c-cope-with-variable-SIGSTKSZ.patch %description Provides native async IO for the Linux kernel, in a fast and efficient