diff --git a/arch/lkl/include/uapi/asm/lkl_long.h b/arch/lkl/include/uapi/asm/lkl_long.h new file mode 100644 index 00000000000000..2d8b33a5380270 --- /dev/null +++ b/arch/lkl/include/uapi/asm/lkl_long.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _ASM_UAPI_LKL_LONG_H +#define _ASM_UAPI_LKL_LONG_H + +/* + * lkl_long_t / lkl_ulong_t: pointer-width integer types for the + * LKL cross-world interface (host_ops, syscall dispatch, UAPI structs). + * + * These must be the same size on both sides of the kernel<->host boundary: + * - Kernel side (LP64 native GCC with -mabi=ms): long = 8 bytes + * - Host side (LLP64 MinGW-w64): long = 4 bytes, need long long + * - Host side (LP64 Linux/Cygwin/macOS): long = 8 bytes + * + * The headers_install.py script replaces all 'long' in generated user + * headers with these types to ensure ABI compatibility across data models. + */ +#if defined(_WIN64) && !defined(__LP64__) +/* LLP64: MinGW-w64 x64 user-space */ +typedef long long lkl_long_t; +typedef unsigned long long lkl_ulong_t; +#else +/* LP64: kernel side, Linux, Cygwin, macOS, or any ILP32 system */ +typedef long lkl_long_t; +typedef unsigned long lkl_ulong_t; +#endif + +#endif /* _ASM_UAPI_LKL_LONG_H */ diff --git a/arch/lkl/scripts/headers_install.py b/arch/lkl/scripts/headers_install.py index 43fe5ac5829d78..0ec14bd280f6e3 100755 --- a/arch/lkl/scripts/headers_install.py +++ b/arch/lkl/scripts/headers_install.py @@ -107,6 +107,7 @@ def lkl_prefix(self, w): def install_headers(self): self.find_headers("arch/lkl/include/uapi/asm/syscalls.h") self.headers.add("arch/lkl/include/uapi/asm/host_ops.h") + self.headers.add("arch/lkl/include/uapi/asm/lkl_long.h") self.find_headers("include/uapi/linux/android/binder.h") self.find_headers("include/uapi/linux/uhid.h") self.find_headers("include/uapi/linux/mman.h") @@ -160,6 +161,37 @@ def find_all_symbols(self): # needed for i386 self.defines.add("__NR_stime") + + def replace_long_types(self, content, h): + """Replace 'long' and 'unsigned long' with lkl_long_t/lkl_ulong_t + for LLP64 compatibility, preserving 'long long' and 'long double'.""" + # Skip lkl_long.h itself + if 'lkl_long.h' in h: + return content + # Step 1: protect 'long long' and 'long double' with placeholders + content = re.sub(r'\blong\s+long\b', '__LKLPH_LONGLONG__', content) + content = re.sub(r'\blong\s+double\b', '__LKLPH_LONGDOUBLE__', content) + # Step 2: replace 'unsigned long [int]' (now safe, no 'long long' present) + content = re.sub(r'\bunsigned\s+long(?:\s+int)?\b', 'lkl_ulong_t', content) + # Step 3: replace remaining 'long [int]' + content = re.sub(r'\blong(?:\s+int)?\b', 'lkl_long_t', content) + # Step 4: restore placeholders + content = content.replace('__LKLPH_LONGLONG__', 'long long') + content = content.replace('__LKLPH_LONGDOUBLE__', 'long double') + # Step 5: add include for lkl_long_t definition if replacements were made + if 'lkl_long_t' in content or 'lkl_ulong_t' in content: + # Insert after the first #ifndef/#define guard or at the top + include_line = '#include \n' + if include_line not in content: + # Insert after the header guard #define + m = re.search(r'(#ifndef\s+\w+\s*\n#define\s+\w+\s*\n)', content) + if m: + pos = m.end() + content = content[:pos] + '\n' + include_line + '\n' + content[pos:] + else: + content = include_line + content + return content + def update_header(self, h): print(" REPLACE\t%s" % h) content = open(h).read() @@ -184,6 +216,8 @@ def update_header(self, h): search_str = r"(\W?union\s+)" + s + r"(\W)" replace_str = "\\1" + self.lkl_prefix(s) + "\\2" content = re.sub(search_str, replace_str, content, flags = re.MULTILINE) + # Replace long/unsigned long with lkl_long_t/lkl_ulong_t + content = self.replace_long_types(content, h) open(h, 'w').write(content) def update_headers(self): diff --git a/tools/lkl/Makefile.autoconf b/tools/lkl/Makefile.autoconf index bb523f49cd2e90..86e5db5065f5cb 100644 --- a/tools/lkl/Makefile.autoconf +++ b/tools/lkl/Makefile.autoconf @@ -106,10 +106,12 @@ endef define nt_host $(call set_autoconf_var,NT,y) + $(call set_kernel_config,INIT_STACK_ALL_ZERO,n) KOPT = "KALLSYMS_EXTRA_PASS=1" KOPT += "HOSTCFLAGS=-Wno-char-subscripts" KOPT += "HOSTLDFLAGS=-s" LDLIBS += -lws2_32 + LDFLAGS += -Wl,--image-base,0x10000 EXESUF := .exe SOSUF := .dll CFLAGS += -Iinclude/mingw32 diff --git a/tools/lkl/bin/as.exe b/tools/lkl/bin/as.exe index 0acc3b2307d3c9..dbfff40a09b2c5 100644 Binary files a/tools/lkl/bin/as.exe and b/tools/lkl/bin/as.exe differ diff --git a/tools/lkl/bin/i686-w64-mingw32-as b/tools/lkl/bin/i686-w64-mingw32-as index 50e3c1fc4e7439..c95499e58202eb 100755 Binary files a/tools/lkl/bin/i686-w64-mingw32-as and b/tools/lkl/bin/i686-w64-mingw32-as differ diff --git a/tools/lkl/bin/i686-w64-mingw32-ld b/tools/lkl/bin/i686-w64-mingw32-ld index e31ebad3aec5b1..5a6335846d6658 100755 Binary files a/tools/lkl/bin/i686-w64-mingw32-ld and b/tools/lkl/bin/i686-w64-mingw32-ld differ diff --git a/tools/lkl/bin/i686-w64-mingw32-objcopy b/tools/lkl/bin/i686-w64-mingw32-objcopy index 6b47d674e61789..88a3da61b3e070 100755 Binary files a/tools/lkl/bin/i686-w64-mingw32-objcopy and b/tools/lkl/bin/i686-w64-mingw32-objcopy differ diff --git a/tools/lkl/bin/ld.exe b/tools/lkl/bin/ld.exe index 46456a284c41f6..c5415180a40a8e 100644 Binary files a/tools/lkl/bin/ld.exe and b/tools/lkl/bin/ld.exe differ diff --git a/tools/lkl/bin/objcopy.exe b/tools/lkl/bin/objcopy.exe index 5f3795ce90e882..9864927f7f4808 100644 Binary files a/tools/lkl/bin/objcopy.exe and b/tools/lkl/bin/objcopy.exe differ diff --git a/tools/lkl/bin/x86_64-w64-mingw32-as b/tools/lkl/bin/x86_64-w64-mingw32-as new file mode 120000 index 00000000000000..40bab45b7997c2 --- /dev/null +++ b/tools/lkl/bin/x86_64-w64-mingw32-as @@ -0,0 +1 @@ +i686-w64-mingw32-as \ No newline at end of file diff --git a/tools/lkl/bin/x86_64-w64-mingw32-cc b/tools/lkl/bin/x86_64-w64-mingw32-cc new file mode 120000 index 00000000000000..b271421649ee2d --- /dev/null +++ b/tools/lkl/bin/x86_64-w64-mingw32-cc @@ -0,0 +1 @@ +x86_64-w64-mingw32-gcc \ No newline at end of file diff --git a/tools/lkl/bin/x86_64-w64-mingw32-gcc b/tools/lkl/bin/x86_64-w64-mingw32-gcc new file mode 100755 index 00000000000000..f0272cc2b9a943 --- /dev/null +++ b/tools/lkl/bin/x86_64-w64-mingw32-gcc @@ -0,0 +1,23 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Shim: routes kernel code to cygwin cross-gcc, user-space to mingw-gcc. +# Cygwin-gcc: LP64 (long=64-bit), direct PE/COFF output, no Wine needed. +# Mingw-gcc: LLP64 (long=32-bit), standard Win64 libraries. +# The LKL API header uses __lkl_long_t (always 64-bit) to bridge the difference. +REAL_MINGW_GCC="/usr/bin/x86_64-w64-mingw32-gcc" +CYGWIN_GCC="/usr/bin/x86_64-pc-cygwin-gcc" +LKL_BIN_DIR="$(cd "$(dirname "$0")" && pwd)" + +# Kernel code → cygwin-gcc (LP64) +for arg in "$@"; do + if [[ "$arg" == "-D__KERNEL__" ]]; then + exec "$CYGWIN_GCC" "$@" + fi +done + +# User-space: use mingw-gcc with patched ld via specs +SPECS="$LKL_BIN_DIR/.lkl-linker.specs" +if [[ ! -f "$SPECS" ]]; then + printf '*linker:\n%s/x86_64-w64-mingw32-ld\n' "$LKL_BIN_DIR" > "$SPECS" +fi +exec "$REAL_MINGW_GCC" -specs="$SPECS" "$@" diff --git a/tools/lkl/bin/x86_64-w64-mingw32-ld b/tools/lkl/bin/x86_64-w64-mingw32-ld new file mode 100755 index 00000000000000..a31ee9b9033ce7 --- /dev/null +++ b/tools/lkl/bin/x86_64-w64-mingw32-ld @@ -0,0 +1,2 @@ +#!/bin/bash +exec "$(dirname "$0")/i686-w64-mingw32-ld" -m i386pep "$@" diff --git a/tools/lkl/bin/x86_64-w64-mingw32-objcopy b/tools/lkl/bin/x86_64-w64-mingw32-objcopy new file mode 120000 index 00000000000000..b9a4ac51d0bfea --- /dev/null +++ b/tools/lkl/bin/x86_64-w64-mingw32-objcopy @@ -0,0 +1 @@ +i686-w64-mingw32-objcopy \ No newline at end of file diff --git a/tools/lkl/include/lkl.h b/tools/lkl/include/lkl.h index eaf6c4ceebc929..3929847f7d613e 100644 --- a/tools/lkl/include/lkl.h +++ b/tools/lkl/include/lkl.h @@ -21,6 +21,7 @@ extern "C" { #undef __unused #include +#include #pragma pop_macro("__unused") @@ -67,7 +68,7 @@ static inline int lkl_sys_fstatfs(unsigned int fd, struct lkl_statfs *buf) static inline int lkl_sys_nanosleep(struct __lkl__kernel_timespec *rqtp, struct __lkl__kernel_timespec *rmtp) { - long p[6] = {LKL_CLOCK_MONOTONIC, 0, (long)rqtp, (long)rmtp, 0}; + lkl_long_t p[6] = {LKL_CLOCK_MONOTONIC, 0, (lkl_long_t)rqtp, (lkl_long_t)rmtp, 0}; return lkl_syscall(__lkl__NR_clock_nanosleep_time64, p); } @@ -93,7 +94,7 @@ static inline long long lkl_sys_lseek(unsigned int fd, __lkl__kernel_loff_t off, unsigned int whence) { long long res; - long ret = lkl_sys_llseek(fd, off >> 32, off & 0xffffffff, &res, whence); + lkl_long_t ret = lkl_sys_llseek(fd, off >> 32, off & 0xffffffff, &res, whence); return ret < 0 ? ret : res; } @@ -102,7 +103,7 @@ static inline long long lkl_sys_lseek(unsigned int fd, __lkl__kernel_loff_t off, static inline void *lkl_sys_mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) { - return (void *)lkl_sys_mmap_pgoff((long)addr, length, prot, flags, fd, + return (void *)lkl_sys_mmap_pgoff((lkl_long_t)addr, length, prot, flags, fd, offset >> 12); } @@ -112,7 +113,7 @@ static inline void *lkl_sys_mmap(void *addr, size_t length, int prot, int flags, /** * lkl_sys_open - wrapper for lkl_sys_openat */ -static inline long lkl_sys_open(const char *file, int flags, int mode) +static inline lkl_long_t lkl_sys_open(const char *file, int flags, int mode) { return lkl_sys_openat(LKL_AT_FDCWD, file, flags, mode); } @@ -120,7 +121,7 @@ static inline long lkl_sys_open(const char *file, int flags, int mode) /** * lkl_sys_creat - wrapper for lkl_sys_openat */ -static inline long lkl_sys_creat(const char *file, int mode) +static inline lkl_long_t lkl_sys_creat(const char *file, int mode) { return lkl_sys_openat(LKL_AT_FDCWD, file, LKL_O_CREAT|LKL_O_WRONLY|LKL_O_TRUNC, mode); @@ -132,7 +133,7 @@ static inline long lkl_sys_creat(const char *file, int mode) /** * lkl_sys_access - wrapper for lkl_sys_faccessat */ -static inline long lkl_sys_access(const char *file, int mode) +static inline lkl_long_t lkl_sys_access(const char *file, int mode) { return lkl_sys_faccessat(LKL_AT_FDCWD, file, mode); } @@ -142,7 +143,7 @@ static inline long lkl_sys_access(const char *file, int mode) /** * lkl_sys_chown - wrapper for lkl_sys_fchownat */ -static inline long lkl_sys_chown(const char *path, lkl_uid_t uid, lkl_gid_t gid) +static inline lkl_long_t lkl_sys_chown(const char *path, lkl_uid_t uid, lkl_gid_t gid) { return lkl_sys_fchownat(LKL_AT_FDCWD, path, uid, gid, 0); } @@ -152,7 +153,7 @@ static inline long lkl_sys_chown(const char *path, lkl_uid_t uid, lkl_gid_t gid) /** * lkl_sys_chmod - wrapper for lkl_sys_fchmodat */ -static inline long lkl_sys_chmod(const char *path, mode_t mode) +static inline lkl_long_t lkl_sys_chmod(const char *path, mode_t mode) { return lkl_sys_fchmodat(LKL_AT_FDCWD, path, mode); } @@ -162,7 +163,7 @@ static inline long lkl_sys_chmod(const char *path, mode_t mode) /** * lkl_sys_link - wrapper for lkl_sys_linkat */ -static inline long lkl_sys_link(const char *existing, const char *new) +static inline lkl_long_t lkl_sys_link(const char *existing, const char *new) { return lkl_sys_linkat(LKL_AT_FDCWD, existing, LKL_AT_FDCWD, new, 0); } @@ -172,7 +173,7 @@ static inline long lkl_sys_link(const char *existing, const char *new) /** * lkl_sys_unlink - wrapper for lkl_sys_unlinkat */ -static inline long lkl_sys_unlink(const char *path) +static inline lkl_long_t lkl_sys_unlink(const char *path) { return lkl_sys_unlinkat(LKL_AT_FDCWD, path, 0); } @@ -182,7 +183,7 @@ static inline long lkl_sys_unlink(const char *path) /** * lkl_sys_symlink - wrapper for lkl_sys_symlinkat */ -static inline long lkl_sys_symlink(const char *existing, const char *new) +static inline lkl_long_t lkl_sys_symlink(const char *existing, const char *new) { return lkl_sys_symlinkat(existing, LKL_AT_FDCWD, new); } @@ -192,7 +193,7 @@ static inline long lkl_sys_symlink(const char *existing, const char *new) /** * lkl_sys_readlink - wrapper for lkl_sys_readlinkat */ -static inline long lkl_sys_readlink(const char *path, char *buf, size_t bufsize) +static inline lkl_long_t lkl_sys_readlink(const char *path, char *buf, size_t bufsize) { return lkl_sys_readlinkat(LKL_AT_FDCWD, path, buf, bufsize); } @@ -202,7 +203,7 @@ static inline long lkl_sys_readlink(const char *path, char *buf, size_t bufsize) /** * lkl_sys_rename - wrapper for lkl_sys_renameat */ -static inline long lkl_sys_rename(const char *old, const char *new) +static inline lkl_long_t lkl_sys_rename(const char *old, const char *new) { return lkl_sys_renameat(LKL_AT_FDCWD, old, LKL_AT_FDCWD, new); } @@ -212,7 +213,7 @@ static inline long lkl_sys_rename(const char *old, const char *new) /** * lkl_sys_mkdir - wrapper for lkl_sys_mkdirat */ -static inline long lkl_sys_mkdir(const char *path, mode_t mode) +static inline lkl_long_t lkl_sys_mkdir(const char *path, mode_t mode) { return lkl_sys_mkdirat(LKL_AT_FDCWD, path, mode); } @@ -222,7 +223,7 @@ static inline long lkl_sys_mkdir(const char *path, mode_t mode) /** * lkl_sys_rmdir - wrapper for lkl_sys_unlinkrat */ -static inline long lkl_sys_rmdir(const char *path) +static inline lkl_long_t lkl_sys_rmdir(const char *path) { return lkl_sys_unlinkat(LKL_AT_FDCWD, path, LKL_AT_REMOVEDIR); } @@ -232,7 +233,7 @@ static inline long lkl_sys_rmdir(const char *path) /** * lkl_sys_mknod - wrapper for lkl_sys_mknodat */ -static inline long lkl_sys_mknod(const char *path, mode_t mode, dev_t dev) +static inline lkl_long_t lkl_sys_mknod(const char *path, mode_t mode, dev_t dev) { return lkl_sys_mknodat(LKL_AT_FDCWD, path, mode, dev); } @@ -242,7 +243,7 @@ static inline long lkl_sys_mknod(const char *path, mode_t mode, dev_t dev) /** * lkl_sys_pipe - wrapper for lkl_sys_pipe2 */ -static inline long lkl_sys_pipe(int fd[2]) +static inline lkl_long_t lkl_sys_pipe(int fd[2]) { return lkl_sys_pipe2(fd, 0); } @@ -252,7 +253,7 @@ static inline long lkl_sys_pipe(int fd[2]) /** * lkl_sys_send - wrapper for lkl_sys_sendto */ -static inline long lkl_sys_send(int fd, void *buf, size_t len, int flags) +static inline lkl_long_t lkl_sys_send(int fd, void *buf, size_t len, int flags) { return lkl_sys_sendto(fd, buf, len, flags, 0, 0); } @@ -262,7 +263,7 @@ static inline long lkl_sys_send(int fd, void *buf, size_t len, int flags) /** * lkl_sys_recv - wrapper for lkl_sys_recvfrom */ -static inline long lkl_sys_recv(int fd, void *buf, size_t len, int flags) +static inline lkl_long_t lkl_sys_recv(int fd, void *buf, size_t len, int flags) { return lkl_sys_recvfrom(fd, buf, len, flags, 0, 0); } @@ -272,10 +273,10 @@ static inline long lkl_sys_recv(int fd, void *buf, size_t len, int flags) /** * lkl_sys_select - wrapper for lkl_sys_pselect */ -static inline long lkl_sys_select(int n, lkl_fd_set *rfds, lkl_fd_set *wfds, +static inline lkl_long_t lkl_sys_select(int n, lkl_fd_set *rfds, lkl_fd_set *wfds, lkl_fd_set *efds, struct lkl_timeval *tv) { - long data[2] = { 0, _LKL_NSIG/8 }; + lkl_long_t data[2] = { 0, _LKL_NSIG/8 }; struct __lkl__kernel_timespec ts; if (tv) { @@ -293,7 +294,7 @@ static inline long lkl_sys_select(int n, lkl_fd_set *rfds, lkl_fd_set *wfds, /** * lkl_sys_poll - wrapper for lkl_sys_ppoll */ -static inline long lkl_sys_poll(struct lkl_pollfd *fds, int n, int timeout) +static inline lkl_long_t lkl_sys_poll(struct lkl_pollfd *fds, int n, int timeout) { struct __lkl__kernel_timespec ts; @@ -311,7 +312,7 @@ static inline long lkl_sys_poll(struct lkl_pollfd *fds, int n, int timeout) /** * lkl_sys_epoll_create - wrapper for lkl_sys_epoll_create1 */ -static inline long lkl_sys_epoll_create(int size) +static inline lkl_long_t lkl_sys_epoll_create(int size) { return lkl_sys_epoll_create1(0); } @@ -321,7 +322,7 @@ static inline long lkl_sys_epoll_create(int size) /** * lkl_sys_epoll_wait - wrapper for lkl_sys_epoll_pwait */ -static inline long lkl_sys_epoll_wait(int fd, struct lkl_epoll_event *ev, +static inline lkl_long_t lkl_sys_epoll_wait(int fd, struct lkl_epoll_event *ev, int cnt, int to) { return lkl_sys_epoll_pwait(fd, ev, cnt, to, 0, _LKL_NSIG/8); @@ -428,7 +429,7 @@ int lkl_get_virtio_blkdev(int disk_id, unsigned int part, uint32_t *pdevid); * @mnt_str_len - size of mnt_str * @returns - 0 on success, a negative value on error */ -long lkl_mount_dev(unsigned int disk_id, unsigned int part, const char *fs_type, +lkl_long_t lkl_mount_dev(unsigned int disk_id, unsigned int part, const char *fs_type, int flags, const char *opts, char *mnt_str, unsigned int mnt_str_len); @@ -447,7 +448,7 @@ long lkl_mount_dev(unsigned int disk_id, unsigned int part, const char *fs_type, * @mnt_str_len - size of mnt_str * @returns - 0 on success, a negative value on error */ -long lkl_mount_blkdev(unsigned int dev, const char *fs_type, int flags, +lkl_long_t lkl_mount_blkdev(unsigned int dev, const char *fs_type, int flags, const char *opts, char *mnt_str, unsigned int mnt_str_len); @@ -464,8 +465,8 @@ long lkl_mount_blkdev(unsigned int dev, const char *fs_type, int flags, * umount can succeed * @returns - 0 on success, a negative value on error */ -long lkl_umount_dev(unsigned int disk_id, unsigned int part, int flags, - long timeout_ms); +lkl_long_t lkl_umount_dev(unsigned int disk_id, unsigned int part, int flags, + lkl_long_t timeout_ms); /** * lkl_umount_blkdev - umount a block device @@ -478,7 +479,7 @@ long lkl_umount_dev(unsigned int disk_id, unsigned int part, int flags, * umount can succeed * @returns - 0 on success, a negative value on error */ -long lkl_umount_blkdev(unsigned int dev, int flags, long timeout_ms); +lkl_long_t lkl_umount_blkdev(unsigned int dev, int flags, lkl_long_t timeout_ms); /** * lkl_umount_timeout - umount filesystem with timeout @@ -489,7 +490,7 @@ long lkl_umount_blkdev(unsigned int dev, int flags, long timeout_ms); * umount can succeed * @returns - 0 on success, a negative value on error */ -long lkl_umount_timeout(char *path, int flags, long timeout_ms); +lkl_long_t lkl_umount_timeout(char *path, int flags, lkl_long_t timeout_ms); /** * lkl_opendir - open a directory diff --git a/tools/lkl/lib/fs.c b/tools/lkl/lib/fs.c index 8bd8092fd355a7..39ed7f83042575 100644 --- a/tools/lkl/lib/fs.c +++ b/tools/lkl/lib/fs.c @@ -77,7 +77,7 @@ static int get_node_with_prefix(const char *path, const char *prefix, int lkl_encode_dev_from_sysfs(const char *sysfs_path, uint32_t *pdevid) { int ret; - long fd; + lkl_long_t fd; int major, minor; char buf[16] = { 0, }; char *bufptr; @@ -200,7 +200,7 @@ int lkl_get_virtio_blkdev(int disk_id, unsigned int part, uint32_t *pdevid) return lkl_encode_dev_from_sysfs(sysfs_path, pdevid); } -long lkl_mount_blkdev(unsigned int dev, const char *fs_type, int flags, +lkl_long_t lkl_mount_blkdev(unsigned int dev, const char *fs_type, int flags, const char *data, char *mnt_str, unsigned int mnt_str_len) { char dev_str[] = { "/dev/xxxxxxxx" }; @@ -257,7 +257,7 @@ long lkl_mount_blkdev(unsigned int dev, const char *fs_type, int flags, return 0; } -long lkl_mount_dev(unsigned int disk_id, unsigned int part, +lkl_long_t lkl_mount_dev(unsigned int disk_id, unsigned int part, const char *fs_type, int flags, const char *data, char *mnt_str, unsigned int mnt_str_len) { @@ -272,14 +272,14 @@ long lkl_mount_dev(unsigned int disk_id, unsigned int part, mnt_str_len); } -long lkl_umount_timeout(char *path, int flags, long timeout_ms) +lkl_long_t lkl_umount_timeout(char *path, int flags, lkl_long_t timeout_ms) { - long incr = 10000000; /* 10 ms */ + lkl_long_t incr = 10000000; /* 10 ms */ struct __lkl__kernel_timespec ts = { .tv_sec = 0, .tv_nsec = incr, }; - long err; + lkl_long_t err; do { err = lkl_sys_umount(path, flags); @@ -292,7 +292,7 @@ long lkl_umount_timeout(char *path, int flags, long timeout_ms) return err; } -long lkl_umount_blkdev(unsigned int dev, int flags, long timeout_ms) +lkl_long_t lkl_umount_blkdev(unsigned int dev, int flags, lkl_long_t timeout_ms) { char dev_str[] = { "/dev/xxxxxxxx" }; char mnt_str[] = { "/mnt/xxxxxxxx" }; @@ -312,8 +312,8 @@ long lkl_umount_blkdev(unsigned int dev, int flags, long timeout_ms) return lkl_sys_rmdir(mnt_str); } -long lkl_umount_dev(unsigned int disk_id, unsigned int part, int flags, - long timeout_ms) +lkl_long_t lkl_umount_dev(unsigned int disk_id, unsigned int part, int flags, + lkl_long_t timeout_ms) { unsigned int dev; int err; diff --git a/tools/lkl/lib/iomem.c b/tools/lkl/lib/iomem.c index 90545b901165df..7bc3296ded54f2 100644 --- a/tools/lkl/lib/iomem.c +++ b/tools/lkl/lib/iomem.c @@ -53,7 +53,7 @@ void unregister_iomem(void *base) iomem_regions[index].ops = NULL; } -void *lkl_ioremap(long addr, int size) +void *lkl_ioremap(lkl_long_t addr, int size) { int index = IOMEM_ADDR_TO_INDEX(addr); struct iomem_region *iomem = &iomem_regions[index]; diff --git a/tools/lkl/lib/iomem.h b/tools/lkl/lib/iomem.h index 42b1d6a0f10d34..5282c35dbb660a 100644 --- a/tools/lkl/lib/iomem.h +++ b/tools/lkl/lib/iomem.h @@ -8,7 +8,7 @@ struct lkl_iomem_ops { void* register_iomem(void *data, int size, const struct lkl_iomem_ops *ops); void unregister_iomem(void *iomem_base); -void *lkl_ioremap(long addr, int size); +void *lkl_ioremap(lkl_long_t addr, int size); int lkl_iomem_access(const volatile void *addr, void *res, int size, int write); #endif /* _LKL_LIB_IOMEM_H */ diff --git a/tools/lkl/lib/jmp_buf.c b/tools/lkl/lib/jmp_buf.c index 4cce84b751302d..07701b0cddb2fd 100644 --- a/tools/lkl/lib/jmp_buf.c +++ b/tools/lkl/lib/jmp_buf.c @@ -1,6 +1,93 @@ -#include #include +#if defined(__x86_64__) && defined(_WIN64) +/* + * Custom non-SEH setjmp/longjmp for x86_64 Windows. + * + * Windows x64 longjmp uses RtlUnwindEx which walks the stack frame-by-frame. + * LKL uses longjmp for cooperative context switching between different stacks + * (each kernel thread has its own malloc'd stack). RtlUnwindEx cannot handle + * cross-stack jumps, causing stack overflow during unwinding. + * We bypass SEH entirely by doing a raw register save/restore. + * + * jmp_buf layout (16 bytes aligned): + * [0] rbx + * [1] rbp + * [2] r12 + * [3] r13 + * [4] r14 + * [5] r15 + * [6] rsp (after return from setjmp) + * [7] rip (return address) + * [8] rdi + * [9] rsi + */ + +static inline int lkl_setjmp(void *buf) +{ + int ret; + + __asm__ __volatile__ ( + "movq %%rbx, 0(%[b])\n\t" + "movq %%rbp, 8(%[b])\n\t" + "movq %%r12, 16(%[b])\n\t" + "movq %%r13, 24(%[b])\n\t" + "movq %%r14, 32(%[b])\n\t" + "movq %%r15, 40(%[b])\n\t" + "leaq 8(%%rsp), %%rax\n\t" + "movq %%rax, 48(%[b])\n\t" + "movq (%%rsp), %%rax\n\t" + "movq %%rax, 56(%[b])\n\t" + "movq %%rdi, 64(%[b])\n\t" + "movq %%rsi, 72(%[b])\n\t" + "xorl %[ret], %[ret]\n\t" + : [ret] "=a" (ret) + : [b] "r" (buf) + : "memory" + ); + return ret; +} + +__attribute__((noreturn)) +static void lkl_longjmp(void *buf, int val) +{ + __asm__ __volatile__ ( + "movq 0(%[b]), %%rbx\n\t" + "movq 8(%[b]), %%rbp\n\t" + "movq 16(%[b]), %%r12\n\t" + "movq 24(%[b]), %%r13\n\t" + "movq 32(%[b]), %%r14\n\t" + "movq 40(%[b]), %%r15\n\t" + "movq 48(%[b]), %%rsp\n\t" + "movq 64(%[b]), %%rdi\n\t" + "movq 72(%[b]), %%rsi\n\t" + "movl %[v], %%eax\n\t" + "testl %%eax, %%eax\n\t" + "jnz 1f\n\t" + "incl %%eax\n\t" + "1:\n\t" + "jmpq *56(%[b])\n\t" + : + : [b] "r" (buf), [v] "r" (val) + : "memory" + ); + __builtin_unreachable(); +} + +void jmp_buf_set(struct lkl_jmp_buf *jmpb, void (*f)(void)) +{ + if (!lkl_setjmp(jmpb->buf)) + f(); +} + +void jmp_buf_longjmp(struct lkl_jmp_buf *jmpb, int val) +{ + lkl_longjmp(jmpb->buf, val); +} + +#else +#include + void jmp_buf_set(struct lkl_jmp_buf *jmpb, void (*f)(void)) { if (!setjmp(*((jmp_buf *)jmpb->buf))) @@ -11,3 +98,4 @@ void jmp_buf_longjmp(struct lkl_jmp_buf *jmpb, int val) { longjmp(*((jmp_buf *)jmpb->buf), val); } +#endif diff --git a/tools/lkl/lib/net.c b/tools/lkl/lib/net.c index 967e1dac5cb371..fb3d4aabb54191 100644 --- a/tools/lkl/lib/net.c +++ b/tools/lkl/lib/net.c @@ -52,7 +52,7 @@ static inline void set_sockaddr(struct lkl_sockaddr_in *sin, unsigned int addr, static inline int ifindex_to_name(int sock, struct lkl_ifreq *ifr, int ifindex) { ifr->lkl_ifr_ifindex = ifindex; - return lkl_sys_ioctl(sock, LKL_SIOCGIFNAME, (long)ifr); + return lkl_sys_ioctl(sock, LKL_SIOCGIFNAME, (lkl_long_t)ifr); } int lkl_ifname_to_ifindex(const char *name) @@ -66,7 +66,7 @@ int lkl_ifname_to_ifindex(const char *name) strcpy(ifr.lkl_ifr_name, name); - ret = lkl_sys_ioctl(fd, LKL_SIOCGIFINDEX, (long)&ifr); + ret = lkl_sys_ioctl(fd, LKL_SIOCGIFINDEX, (lkl_long_t)&ifr); if (ret < 0) return ret; @@ -84,10 +84,10 @@ int lkl_if_up(int ifindex) if (err < 0) return err; - err = lkl_sys_ioctl(sock, LKL_SIOCGIFFLAGS, (long)&ifr); + err = lkl_sys_ioctl(sock, LKL_SIOCGIFFLAGS, (lkl_long_t)&ifr); if (!err) { ifr.lkl_ifr_flags |= LKL_IFF_UP; - err = lkl_sys_ioctl(sock, LKL_SIOCSIFFLAGS, (long)&ifr); + err = lkl_sys_ioctl(sock, LKL_SIOCSIFFLAGS, (lkl_long_t)&ifr); } lkl_sys_close(sock); @@ -108,10 +108,10 @@ int lkl_if_down(int ifindex) if (err < 0) return err; - err = lkl_sys_ioctl(sock, LKL_SIOCGIFFLAGS, (long)&ifr); + err = lkl_sys_ioctl(sock, LKL_SIOCGIFFLAGS, (lkl_long_t)&ifr); if (!err) { ifr.lkl_ifr_flags &= ~LKL_IFF_UP; - err = lkl_sys_ioctl(sock, LKL_SIOCSIFFLAGS, (long)&ifr); + err = lkl_sys_ioctl(sock, LKL_SIOCSIFFLAGS, (lkl_long_t)&ifr); } lkl_sys_close(sock); @@ -134,7 +134,7 @@ int lkl_if_set_mtu(int ifindex, int mtu) ifr.lkl_ifr_mtu = mtu; - err = lkl_sys_ioctl(sock, LKL_SIOCSIFMTU, (long)&ifr); + err = lkl_sys_ioctl(sock, LKL_SIOCSIFMTU, (lkl_long_t)&ifr); lkl_sys_close(sock); @@ -154,10 +154,10 @@ int lkl_if_set_mac(int ifindex, void *addr) if (err < 0) goto out; - err = lkl_sys_ioctl(sock, LKL_SIOCGIFHWADDR, (long)&ifr); + err = lkl_sys_ioctl(sock, LKL_SIOCGIFHWADDR, (lkl_long_t)&ifr); if (!err) { memcpy(ifr.lkl_ifr_hwaddr.sa_data, addr, LKL_ETH_ALEN); - err = lkl_sys_ioctl(sock, LKL_SIOCSIFHWADDR, (long)&ifr); + err = lkl_sys_ioctl(sock, LKL_SIOCSIFHWADDR, (lkl_long_t)&ifr); } out: @@ -201,7 +201,7 @@ int lkl_netdev_get_ifindex(int id) return sock; snprintf(ifr.lkl_ifr_name, sizeof(ifr.lkl_ifr_name), "eth%d", id); - ret = lkl_sys_ioctl(sock, LKL_SIOCGIFINDEX, (long)&ifr); + ret = lkl_sys_ioctl(sock, LKL_SIOCGIFINDEX, (lkl_long_t)&ifr); lkl_sys_close(sock); return ret < 0 ? ret : ifr.lkl_ifr_ifindex; diff --git a/tools/lkl/lib/nt-host.c b/tools/lkl/lib/nt-host.c index 1d643da4168f9d..4004c231c93dce 100644 --- a/tools/lkl/lib/nt-host.c +++ b/tools/lkl/lib/nt-host.c @@ -208,7 +208,7 @@ static void CALLBACK timer_callback(void *arg, BOOLEAN TimerOrWaitFired) t->callback(); } -static int timer_set_oneshot(void *timer, unsigned long ns) +static int timer_set_oneshot(void *timer, lkl_ulong_t ns) { struct timer *t = (struct timer *)timer; HANDLE tmp; @@ -241,7 +241,7 @@ static void print(const char *str, int len) write(1, str, len); } -static void *mem_alloc(unsigned long size) +static void *mem_alloc(lkl_ulong_t size) { return malloc(size); } diff --git a/tools/lkl/lib/posix-host.c b/tools/lkl/lib/posix-host.c index 89fea03891bd8e..22ce69fca6d6d6 100644 --- a/tools/lkl/lib/posix-host.c +++ b/tools/lkl/lib/posix-host.c @@ -257,7 +257,7 @@ static int thread_equal(lkl_thread_t a, lkl_thread_t b) #define pthread_getattr_np pthread_attr_get_np #endif -void *thread_stack(unsigned long *size) +void *thread_stack(lkl_ulong_t *size) { pthread_attr_t thread_attr; size_t stack_size; @@ -423,7 +423,7 @@ static void *timer_alloc(void (*fn)(void)) return (void *)(long)timer; } -static int timer_set_oneshot(void *_timer, unsigned long ns) +static int timer_set_oneshot(void *_timer, lkl_ulong_t ns) { timer_t timer = (timer_t)(long)_timer; struct itimerspec ts = { @@ -448,7 +448,7 @@ static void panic(void) assert(0); } -static void *page_alloc(unsigned long size) +static void *page_alloc(lkl_ulong_t size) { void *addr; @@ -461,7 +461,7 @@ static void *page_alloc(unsigned long size) return addr; } -static void page_free(void *addr, unsigned long size) +static void page_free(void *addr, lkl_ulong_t size) { munmap((void *)addr, size); } @@ -492,7 +492,7 @@ static inline int get_prot(enum lkl_prot lkl_prot) #endif #endif -static void *lkl_mmap(void *addr, unsigned long size, enum lkl_prot prot) +static void *lkl_mmap(void *addr, lkl_ulong_t size, enum lkl_prot prot) { void *ret; int fl = MAP_ANON | MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_NORESERVE; @@ -507,7 +507,7 @@ static void *lkl_mmap(void *addr, unsigned long size, enum lkl_prot prot) return ret; } -static int lkl_munmap(void *addr, unsigned long size) +static int lkl_munmap(void *addr, lkl_ulong_t size) { return munmap(addr, size); } @@ -518,9 +518,9 @@ extern struct lkl_dev_pci_ops vfio_pci_ops; #ifdef LKL_HOST_CONFIG_MMU static int shared_mem_fd = -1; -static unsigned long shared_mem_size; +static lkl_ulong_t shared_mem_size; -static void shmem_init(unsigned long size) +static void shmem_init(lkl_ulong_t size) { int rwx = 00700; char lkl_shmem_id[NAME_MAX]; @@ -532,8 +532,8 @@ static void shmem_init(unsigned long size) assert(ftruncate(shared_mem_fd, shared_mem_size) == 0); } -static void *lkl_shmem_mmap(void *addr, unsigned long pg_off, - unsigned long size, enum lkl_prot mem_prot_flags) +static void *lkl_shmem_mmap(void *addr, lkl_ulong_t pg_off, + lkl_ulong_t size, enum lkl_prot mem_prot_flags) { int prot = get_prot(mem_prot_flags); int flags = MAP_SHARED | MAP_FIXED_NOREPLACE; @@ -545,22 +545,22 @@ static void *lkl_shmem_mmap(void *addr, unsigned long pg_off, } #endif // LKL_HOST_CONFIG_MMU -static void *posix_malloc(unsigned long size) +static void *posix_malloc(lkl_ulong_t size) { return malloc((size_t)size); } -static void *posix_memcpy(void *dest, const void *src, unsigned long n) +static void *posix_memcpy(void *dest, const void *src, lkl_ulong_t n) { return memcpy(dest, src, (size_t)n); } -static void *posix_memset(void *s, int c, unsigned long n) +static void *posix_memset(void *s, int c, lkl_ulong_t n) { return memset(s, c, (size_t)n); } -static void *posix_memmove(void *dest, const void *src, unsigned long n) +static void *posix_memmove(void *dest, const void *src, lkl_ulong_t n) { return memmove(dest, src, (size_t)n); } diff --git a/tools/lkl/lib/vfio_pci.c b/tools/lkl/lib/vfio_pci.c index 1d76793420ae18..7b242d5a90f647 100644 --- a/tools/lkl/lib/vfio_pci.c +++ b/tools/lkl/lib/vfio_pci.c @@ -40,7 +40,7 @@ struct lkl_pci_dev { */ static struct lkl_pci_dev *vfio_pci_add(const char *name, void *kernel_ram, - unsigned long ram_size) + lkl_ulong_t ram_size) { struct lkl_pci_dev *dev; char path[128], link[128], *l; @@ -281,13 +281,13 @@ static int vfio_pci_irq_init(struct lkl_pci_dev *dev, int irq) } static unsigned long long vfio_map_page(struct lkl_pci_dev *dev, void *vaddr, - unsigned long size) + lkl_ulong_t size) { return (unsigned long long)vaddr - dev->dma_map.vaddr; } static void vfio_unmap_page(struct lkl_pci_dev *dev, - unsigned long long dma_handle, unsigned long size) + unsigned long long dma_handle, lkl_ulong_t size) { } @@ -357,7 +357,7 @@ static const struct lkl_iomem_ops pci_resource_ops = { #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) static void *vfio_resource_alloc(struct lkl_pci_dev *dev, - unsigned long resource_size, + lkl_ulong_t resource_size, int resource_index) { unsigned int region_index_list[] = { diff --git a/tools/lkl/lib/virtio.c b/tools/lkl/lib/virtio.c index a83dde5258897f..bf296aece14c35 100644 --- a/tools/lkl/lib/virtio.c +++ b/tools/lkl/lib/virtio.c @@ -405,7 +405,7 @@ static inline void set_ptr_low(void **ptr, uint32_t val) uint64_t tmp = (uintptr_t)*ptr; tmp = (tmp & 0xFFFFFFFF00000000) | val; - *ptr = (void *)(long)tmp; + *ptr = (void *)(lkl_long_t)tmp; } static inline void set_ptr_high(void **ptr, uint32_t val) @@ -413,7 +413,7 @@ static inline void set_ptr_high(void **ptr, uint32_t val) uint64_t tmp = (uintptr_t)*ptr; tmp = (tmp & 0x00000000FFFFFFFF) | ((uint64_t)val << 32); - *ptr = (void *)(long)tmp; + *ptr = (void *)(lkl_long_t)tmp; } static inline void set_status(struct virtio_dev *dev, uint32_t val) @@ -562,7 +562,7 @@ int virtio_dev_setup(struct virtio_dev *dev, int queues, int num_max) dev->virtio_mmio_id = lkl_num_virtio_boot_devs++; } else { ret = - lkl_sys_virtio_mmio_device_add((long)dev->base, mmio_size, + lkl_sys_virtio_mmio_device_add((lkl_long_t)dev->base, mmio_size, dev->irq); if (ret < 0) { lkl_printf("can't register mmio device\n"); @@ -577,8 +577,8 @@ int virtio_dev_setup(struct virtio_dev *dev, int queues, int num_max) int virtio_dev_cleanup(struct virtio_dev *dev) { char devname[100]; - long fd, ret; - long mount_ret; + lkl_long_t fd, ret; + lkl_long_t mount_ret; if (!lkl_is_running()) goto skip_unbind; diff --git a/tools/lkl/lib/virtio_net_wintap.c b/tools/lkl/lib/virtio_net_wintap.c index 5f29737094ecf2..e49764553e9043 100644 --- a/tools/lkl/lib/virtio_net_wintap.c +++ b/tools/lkl/lib/virtio_net_wintap.c @@ -6,8 +6,8 @@ * Author: Hajime Tazaki * */ -#include -#include +#include +#include #include #include #include diff --git a/tools/lkl/tests/boot.c b/tools/lkl/tests/boot.c index 4cecf482298bdb..8b0da08000b3ea 100644 --- a/tools/lkl/tests/boot.c +++ b/tools/lkl/tests/boot.c @@ -32,8 +32,8 @@ int lkl_test_nanosleep(void) .tv_nsec = sleep_ns, }; struct timespec start, stop; - long delta; - long ret; + lkl_long_t delta; + lkl_long_t ret; clock_gettime(CLOCK_MONOTONIC, &start); ret = lkl_sys_nanosleep(&ts, NULL); @@ -54,12 +54,12 @@ int lkl_test_nanosleep(void) LKL_TEST_CALL(getpid, lkl_sys_getpid, 1) -void check_latency(long (*f)(void), long *min, long *max, long *avg) +void check_latency(lkl_long_t (*f)(void), lkl_long_t *min, lkl_long_t *max, lkl_long_t *avg) { int i; unsigned long long start, stop, sum = 0; static const int count = 1000; - long delta; + lkl_long_t delta; *min = 1000000000; *max = -1; @@ -78,7 +78,7 @@ void check_latency(long (*f)(void), long *min, long *max, long *avg) *avg = sum / count; } -static long native_getpid(void) +static lkl_long_t native_getpid(void) { #ifdef __MINGW32__ GetCurrentProcessId(); @@ -90,7 +90,7 @@ static long native_getpid(void) int lkl_test_syscall_latency(void) { - long min, max, avg; + lkl_long_t min, max, avg; lkl_test_logf("avg/min/max: "); @@ -122,7 +122,7 @@ LKL_TEST_CALL(lseek_set, lkl_sys_lseek, 0, 0, 0, LKL_SEEK_SET); int lkl_test_read(void) { char buf[10] = { 0, }; - long ret; + lkl_long_t ret; ret = lkl_sys_read(0, buf, sizeof(buf)); @@ -137,7 +137,7 @@ int lkl_test_read(void) int lkl_test_fstat(void) { struct lkl_stat stat; - long ret; + lkl_long_t ret; ret = lkl_sys_fstat(0, &stat); @@ -156,7 +156,7 @@ LKL_TEST_CALL(mkdir, lkl_sys_mkdir, 0, "/mnt", access_rights) int lkl_test_stat(void) { struct lkl_stat stat; - long ret; + lkl_long_t ret; ret = lkl_sys_stat("/mnt", &stat); @@ -177,7 +177,7 @@ static int lkl_test_pipe2(void) char str[20]; int msg_len_bytes = strlen(msg) + 1; int cmp_res; - long ret; + lkl_long_t ret; ret = lkl_sys_pipe2(pipe_fds, LKL_O_NONBLOCK); if (ret) { @@ -230,7 +230,7 @@ static int lkl_test_epoll(void) int READ_IDX = 0, WRITE_IDX = 1; struct lkl_epoll_event wait_on, read_result; const char msg[] = "Hello world!"; - long ret; + lkl_long_t ret; memset(&wait_on, 0, sizeof(wait_on)); memset(&read_result, 0, sizeof(read_result)); @@ -312,7 +312,7 @@ static int lkl_test_open_cwd(void) static int lkl_test_getdents64(void) { - long ret; + lkl_long_t ret; char buf[1024], *pos; struct lkl_linux_dirent64 *de; int wr; @@ -346,7 +346,7 @@ LKL_TEST_CALL(lo_ifup, lkl_if_up, 0, 1); static int lkl_test_mutex(void) { - long ret = TEST_SUCCESS; + lkl_long_t ret = TEST_SUCCESS; /* * Can't do much to verify that this works, so we'll just let Valgrind * warn us on CI if we've made bad memory accesses. @@ -371,7 +371,7 @@ static int lkl_test_mutex(void) static int lkl_test_semaphore(void) { - long ret = TEST_SUCCESS; + lkl_long_t ret = TEST_SUCCESS; /* * Can't do much to verify that this works, so we'll just let Valgrind * warn us on CI if we've made bad memory accesses. @@ -400,7 +400,7 @@ static int lkl_test_syscall_thread(void) { int pipe_fds[2]; char tmp[LKL_PIPE_BUF+1]; - long ret; + lkl_long_t ret; lkl_thread_t tid; ret = lkl_sys_pipe2(pipe_fds, 0); @@ -468,8 +468,8 @@ static int lkl_test_many_syscall_threads(void) } struct lkl_test_tgid { - long tgid; - long parent_pid; + lkl_long_t tgid; + lkl_long_t parent_pid; int new_thread_group_leader_result; }; @@ -489,7 +489,7 @@ static void thread_get_tgid(void *arg) static int lkl_test_new_tgid_threads(void) { lkl_thread_t tid; - long current_pid; + lkl_long_t current_pid; int count = 65, ret; struct lkl_test_tgid test_tgid; @@ -603,7 +603,7 @@ static int lkl_test_shared_mmap(void) if (fd < 0) return TEST_FAILURE; - unsigned long mem_size = 15 * 4096; + lkl_ulong_t mem_size = 15 * 4096; if (lkl_sys_ftruncate(fd, mem_size) < 0) return TEST_FAILURE; @@ -631,10 +631,10 @@ static int lkl_test_shared_mmap(void) if (memcmp(mem1, mem2, mem_size) != 0) return TEST_FAILURE; - if (lkl_sys_munmap((unsigned long)mem1, mem_size) != 0) + if (lkl_sys_munmap((lkl_ulong_t)mem1, mem_size) != 0) return TEST_FAILURE; - if (lkl_sys_munmap((unsigned long)mem2, mem_size) != 0) + if (lkl_sys_munmap((lkl_ulong_t)mem2, mem_size) != 0) return TEST_FAILURE; return TEST_SUCCESS; @@ -642,7 +642,7 @@ static int lkl_test_shared_mmap(void) static int lkl_test_private_mmap(void) { - unsigned long mem_size = 3 * 4096; + lkl_ulong_t mem_size = 3 * 4096; int mem_prot = LKL_PROT_WRITE | LKL_PROT_READ; // Super important to use LKL_MAP_POPULATE to force populating pages in the // mapping as in the LKL context we don't have a way to fault in the pages. @@ -654,7 +654,7 @@ static int lkl_test_private_mmap(void) *(unsigned int *)mem = 13; - if (lkl_sys_munmap((unsigned long)mem, mem_size) < 0) + if (lkl_sys_munmap((lkl_ulong_t)mem, mem_size) < 0) return TEST_FAILURE; return TEST_SUCCESS; diff --git a/tools/lkl/tests/disk-vfio-pci.c b/tools/lkl/tests/disk-vfio-pci.c index b8659d5f0e68fc..be3f447e9d0ff7 100644 --- a/tools/lkl/tests/disk-vfio-pci.c +++ b/tools/lkl/tests/disk-vfio-pci.c @@ -31,7 +31,7 @@ static char bootparams[128]; static int lkl_test_umount_dev(void) { - long ret, ret2; + lkl_long_t ret, ret2; ret = lkl_sys_chdir("/"); diff --git a/tools/lkl/tests/disk.c b/tools/lkl/tests/disk.c index 5e1a6113bfa72f..dab81f35bcd0b6 100644 --- a/tools/lkl/tests/disk.c +++ b/tools/lkl/tests/disk.c @@ -104,7 +104,7 @@ LKL_TEST_CALL(mount_dev, lkl_mount_dev, 0, disk_id, cla.partition, cla.fstype, static int lkl_test_umount_dev(void) { - long ret, ret2; + lkl_long_t ret, ret2; ret = lkl_sys_chdir("/"); diff --git a/tools/lkl/tests/test-dlmopen.c b/tools/lkl/tests/test-dlmopen.c index 292eec7094a832..2257dfd2420bb0 100644 --- a/tools/lkl/tests/test-dlmopen.c +++ b/tools/lkl/tests/test-dlmopen.c @@ -24,13 +24,13 @@ static int lkl_test_dlmopen(void) { void *handle; - long ret; + lkl_long_t ret; char *filename = "liblkl.so"; - long params[6] = {0}; + lkl_long_t params[6] = {0}; int (*fn_init)(struct lkl_host_operations *ops); int (*fn_start)(char *fmt, ...); - long (*fn_syscall)(long no, long *params); - long (*fn_sys_halt)(void); + lkl_long_t (*fn_syscall)(lkl_long_t no, lkl_long_t *params); + lkl_long_t (*fn_sys_halt)(void); void (*fn_tls_mode)(void); struct lkl_host_operations *lkl_host_ops;