summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-02-05 12:16:30 +0100
committerAndreas Kling <kling@serenityos.org>2021-02-05 12:23:39 +0100
commite87eac92730f1cc55d7a44f8bb6331b4a8e33535 (patch)
treec8a17aba1bf677a5fc6059b018baa8f861fd1670
parent4df3a34bc29a4fde57bd0d1ae408a3d094c10b62 (diff)
downloadserenity-e87eac92730f1cc55d7a44f8bb6331b4a8e33535.zip
Userland: Add LibSystem and funnel all syscalls through it
This achieves two things: - Programs can now intentionally perform arbitrary syscalls by calling syscall(). This allows us to work on things like syscall fuzzing. - It restricts the ability of userspace to make syscalls to a single 4KB page of code. In order to call the kernel directly, an attacker must now locate this page and call through it.
-rw-r--r--CMakeLists.txt1
-rw-r--r--Kernel/API/Syscall.h1
-rw-r--r--Userland/DevTools/UserspaceEmulator/Emulator.cpp2
-rw-r--r--Userland/DynamicLoader/CMakeLists.txt3
-rw-r--r--Userland/Libraries/CMakeLists.txt1
-rw-r--r--Userland/Libraries/LibC/CMakeLists.txt8
-rw-r--r--Userland/Libraries/LibC/assert.cpp2
-rw-r--r--Userland/Libraries/LibC/dirent.cpp2
-rw-r--r--Userland/Libraries/LibC/fcntl.cpp2
-rw-r--r--Userland/Libraries/LibC/ioctl.cpp2
-rw-r--r--Userland/Libraries/LibC/mman.cpp2
-rw-r--r--Userland/Libraries/LibC/poll.cpp2
-rw-r--r--Userland/Libraries/LibC/sched.cpp2
-rw-r--r--Userland/Libraries/LibC/serenity.cpp2
-rw-r--r--Userland/Libraries/LibC/serenity.h4
-rw-r--r--Userland/Libraries/LibC/signal.cpp2
-rw-r--r--Userland/Libraries/LibC/stat.cpp2
-rw-r--r--Userland/Libraries/LibC/stdio.cpp2
-rw-r--r--Userland/Libraries/LibC/stdlib.cpp2
-rw-r--r--Userland/Libraries/LibC/sys/prctl.cpp2
-rw-r--r--Userland/Libraries/LibC/sys/ptrace.cpp2
-rw-r--r--Userland/Libraries/LibC/sys/select.cpp2
-rw-r--r--Userland/Libraries/LibC/sys/socket.cpp2
-rw-r--r--Userland/Libraries/LibC/sys/uio.cpp2
-rw-r--r--Userland/Libraries/LibC/sys/wait.cpp2
-rw-r--r--Userland/Libraries/LibC/termios.cpp1
-rw-r--r--Userland/Libraries/LibC/time.cpp2
-rw-r--r--Userland/Libraries/LibC/times.cpp2
-rw-r--r--Userland/Libraries/LibC/unistd.cpp2
-rw-r--r--Userland/Libraries/LibC/utime.cpp2
-rw-r--r--Userland/Libraries/LibC/utsname.cpp2
-rw-r--r--Userland/Libraries/LibCore/AnonymousBuffer.cpp1
-rw-r--r--Userland/Libraries/LibCore/File.cpp1
-rw-r--r--Userland/Libraries/LibELF/DynamicLinker.cpp4
-rw-r--r--Userland/Libraries/LibKeyboard/CharacterMap.cpp1
-rw-r--r--Userland/Libraries/LibPthread/CMakeLists.txt2
-rw-r--r--Userland/Libraries/LibPthread/pthread.cpp2
-rw-r--r--Userland/Libraries/LibSystem/CMakeLists.txt7
-rw-r--r--Userland/Libraries/LibSystem/syscall.cpp51
-rw-r--r--Userland/Libraries/LibSystem/syscall.h62
-rw-r--r--Userland/Tests/Kernel/invalid-any-pointer-assert.cpp2
-rw-r--r--Userland/Tests/Kernel/invalid-path-pointer-assert.cpp2
-rw-r--r--Userland/Utilities/crash.cpp2
-rw-r--r--Userland/Utilities/functrace.cpp2
-rw-r--r--Userland/Utilities/purge.cpp1
-rw-r--r--Userland/Utilities/strace.cpp2
-rw-r--r--Userland/Utilities/syscall.cpp2
47 files changed, 164 insertions, 47 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 56501c6fe4..d8a033513f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -140,6 +140,7 @@ add_link_options(--sysroot ${CMAKE_BINARY_DIR}/Root)
include_directories(Userland/Libraries/LibC)
include_directories(Userland/Libraries/LibM)
+include_directories(Userland/Libraries/LibSystem)
include_directories(Userland/Services)
include_directories(Userland)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h
index 5de5ecb669..984405b84b 100644
--- a/Kernel/API/Syscall.h
+++ b/Kernel/API/Syscall.h
@@ -504,7 +504,6 @@ inline uintptr_t invoke(Function function, T1 arg1, T2 arg2, T3 arg3)
#define __ENUMERATE_SYSCALL(x) using Syscall::SC_##x;
ENUMERATE_SYSCALLS(__ENUMERATE_SYSCALL)
#undef __ENUMERATE_SYSCALL
-#define syscall Syscall::invoke
}
diff --git a/Userland/DevTools/UserspaceEmulator/Emulator.cpp b/Userland/DevTools/UserspaceEmulator/Emulator.cpp
index ef72f6d04a..bc5544805c 100644
--- a/Userland/DevTools/UserspaceEmulator/Emulator.cpp
+++ b/Userland/DevTools/UserspaceEmulator/Emulator.cpp
@@ -32,7 +32,6 @@
#include <AK/Format.h>
#include <AK/LexicalPath.h>
#include <AK/MappedFile.h>
-#include <Kernel/API/Syscall.h>
#include <LibELF/AuxiliaryVector.h>
#include <LibELF/Image.h>
#include <LibELF/Validation.h>
@@ -53,6 +52,7 @@
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/uio.h>
+#include <syscall.h>
#include <termios.h>
#include <unistd.h>
diff --git a/Userland/DynamicLoader/CMakeLists.txt b/Userland/DynamicLoader/CMakeLists.txt
index e96b2b4ef4..019b7eaf89 100644
--- a/Userland/DynamicLoader/CMakeLists.txt
+++ b/Userland/DynamicLoader/CMakeLists.txt
@@ -10,11 +10,12 @@ set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/i386/plt_trampoline.S)
file(GLOB LIBC_SOURCES1 "../Libraries/LibC/*.cpp")
file(GLOB LIBC_SOURCES2 "../Libraries/LibC/*/*.cpp")
file(GLOB LIBC_SOURCES3 "../Libraries/LibC/*.S")
+file(GLOB LIBSYSTEM_SOURCES "../Libraries/LibSystem/*.cpp")
list(FILTER LIBC_SOURCES1 EXCLUDE REGEX ".+crt0.cpp")
list(FILTER LIBC_SOURCES1 EXCLUDE REGEX ".+crt0.+.cpp")
-set(SOURCES ${LOADER_SOURCES} ${AK_SOURCES} ${ELF_SOURCES} ${LIBC_SOURCES1} ${LIBC_SOURCES2} ${LIBC_SOURCES3})
+set(SOURCES ${LOADER_SOURCES} ${AK_SOURCES} ${ELF_SOURCES} ${LIBC_SOURCES1} ${LIBC_SOURCES2} ${LIBC_SOURCES3} ${LIBSYSTEM_SOURCES})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -nostdlib -pie -fpic -DNO_TLS")
diff --git a/Userland/Libraries/CMakeLists.txt b/Userland/Libraries/CMakeLists.txt
index 9e54e78156..ed30460a48 100644
--- a/Userland/Libraries/CMakeLists.txt
+++ b/Userland/Libraries/CMakeLists.txt
@@ -27,6 +27,7 @@ add_subdirectory(LibProtocol)
add_subdirectory(LibPthread)
add_subdirectory(LibRegex)
add_subdirectory(LibSymbolClient)
+add_subdirectory(LibSystem)
add_subdirectory(LibTar)
add_subdirectory(LibTextCodec)
add_subdirectory(LibThread)
diff --git a/Userland/Libraries/LibC/CMakeLists.txt b/Userland/Libraries/LibC/CMakeLists.txt
index 393addb934..cab661dcb6 100644
--- a/Userland/Libraries/LibC/CMakeLists.txt
+++ b/Userland/Libraries/LibC/CMakeLists.txt
@@ -81,10 +81,10 @@ add_custom_command(
set(SOURCES ${LIBC_SOURCES} ${AK_SOURCES} ${ELF_SOURCES})
serenity_libc_static(LibCStatic c)
-target_link_libraries(LibCStatic crt0 ssp)
-add_dependencies(LibCStatic LibM)
+target_link_libraries(LibCStatic crt0 ssp system)
+add_dependencies(LibCStatic LibM LibSystem)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++")
serenity_libc(LibC c)
-target_link_libraries(LibC crt0 ssp)
-add_dependencies(LibC LibM)
+target_link_libraries(LibC crt0 ssp system)
+add_dependencies(LibC LibM LibSystem)
diff --git a/Userland/Libraries/LibC/assert.cpp b/Userland/Libraries/LibC/assert.cpp
index 7dcd7a5258..ad9c6837d2 100644
--- a/Userland/Libraries/LibC/assert.cpp
+++ b/Userland/Libraries/LibC/assert.cpp
@@ -24,12 +24,12 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/internals.h>
+#include <syscall.h>
#include <unistd.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/dirent.cpp b/Userland/Libraries/LibC/dirent.cpp
index 8e9701177d..504fa70367 100644
--- a/Userland/Libraries/LibC/dirent.cpp
+++ b/Userland/Libraries/LibC/dirent.cpp
@@ -26,7 +26,6 @@
#include <AK/Assertions.h>
#include <AK/StdLibExtras.h>
-#include <Kernel/API/Syscall.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
@@ -34,6 +33,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
+#include <syscall.h>
#include <unistd.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/fcntl.cpp b/Userland/Libraries/LibC/fcntl.cpp
index 7790bec113..3bd873dff7 100644
--- a/Userland/Libraries/LibC/fcntl.cpp
+++ b/Userland/Libraries/LibC/fcntl.cpp
@@ -24,11 +24,11 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <string.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/ioctl.cpp b/Userland/Libraries/LibC/ioctl.cpp
index c5fee3951e..280c4d5378 100644
--- a/Userland/Libraries/LibC/ioctl.cpp
+++ b/Userland/Libraries/LibC/ioctl.cpp
@@ -24,11 +24,11 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <sys/ioctl.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/mman.cpp b/Userland/Libraries/LibC/mman.cpp
index b3346d2e1f..0f01395ab5 100644
--- a/Userland/Libraries/LibC/mman.cpp
+++ b/Userland/Libraries/LibC/mman.cpp
@@ -24,11 +24,11 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <mman.h>
#include <stdio.h>
#include <string.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/poll.cpp b/Userland/Libraries/LibC/poll.cpp
index 437ea8243a..5695ff1318 100644
--- a/Userland/Libraries/LibC/poll.cpp
+++ b/Userland/Libraries/LibC/poll.cpp
@@ -24,10 +24,10 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <poll.h>
#include <sys/time.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/sched.cpp b/Userland/Libraries/LibC/sched.cpp
index 4e3643bd01..d5139cb1c5 100644
--- a/Userland/Libraries/LibC/sched.cpp
+++ b/Userland/Libraries/LibC/sched.cpp
@@ -24,9 +24,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <sched.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/serenity.cpp b/Userland/Libraries/LibC/serenity.cpp
index 319975c653..8899a2b7df 100644
--- a/Userland/Libraries/LibC/serenity.cpp
+++ b/Userland/Libraries/LibC/serenity.cpp
@@ -24,10 +24,10 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <serenity.h>
#include <string.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/serenity.h b/Userland/Libraries/LibC/serenity.h
index 70ddf295af..8860e89d14 100644
--- a/Userland/Libraries/LibC/serenity.h
+++ b/Userland/Libraries/LibC/serenity.h
@@ -106,8 +106,8 @@ int anon_create(size_t size, int options);
int serenity_readlink(const char* path, size_t path_length, char* buffer, size_t buffer_size);
-int getkeymap(char* name_buffer, size_t name_buffer_size, u32* map, u32* shift_map, u32* alt_map, u32* altgr_map, u32* shift_altgr_map);
-int setkeymap(const char* name, const u32* map, u32* const shift_map, const u32* alt_map, const u32* altgr_map, const u32* shift_altgr_map);
+int getkeymap(char* name_buffer, size_t name_buffer_size, uint32_t* map, uint32_t* shift_map, uint32_t* alt_map, uint32_t* altgr_map, uint32_t* shift_altgr_map);
+int setkeymap(const char* name, const uint32_t* map, uint32_t* const shift_map, const uint32_t* alt_map, const uint32_t* altgr_map, const uint32_t* shift_altgr_map);
#ifdef __i386__
ALWAYS_INLINE void send_secret_data_to_userspace_emulator(uintptr_t data1, uintptr_t data2, uintptr_t data3)
diff --git a/Userland/Libraries/LibC/signal.cpp b/Userland/Libraries/LibC/signal.cpp
index 55da42a04d..cea5e149f4 100644
--- a/Userland/Libraries/LibC/signal.cpp
+++ b/Userland/Libraries/LibC/signal.cpp
@@ -25,12 +25,12 @@
*/
#include <AK/Format.h>
-#include <Kernel/API/Syscall.h>
#include <assert.h>
#include <errno.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
+#include <syscall.h>
#include <unistd.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/stat.cpp b/Userland/Libraries/LibC/stat.cpp
index 5de2472dfa..16bee73b9a 100644
--- a/Userland/Libraries/LibC/stat.cpp
+++ b/Userland/Libraries/LibC/stat.cpp
@@ -24,12 +24,12 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
+#include <syscall.h>
#include <unistd.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/stdio.cpp b/Userland/Libraries/LibC/stdio.cpp
index f96f4732ad..c1a8bca79f 100644
--- a/Userland/Libraries/LibC/stdio.cpp
+++ b/Userland/Libraries/LibC/stdio.cpp
@@ -30,7 +30,6 @@
#include <AK/ScopedValueRollback.h>
#include <AK/StdLibExtras.h>
#include <AK/kmalloc.h>
-#include <Kernel/API/Syscall.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
@@ -41,6 +40,7 @@
#include <sys/internals.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <syscall.h>
#include <unistd.h>
struct FILE {
diff --git a/Userland/Libraries/LibC/stdlib.cpp b/Userland/Libraries/LibC/stdlib.cpp
index 8a0dc247d0..56f1070e76 100644
--- a/Userland/Libraries/LibC/stdlib.cpp
+++ b/Userland/Libraries/LibC/stdlib.cpp
@@ -30,7 +30,6 @@
#include <AK/StdLibExtras.h>
#include <AK/Types.h>
#include <AK/Utf8View.h>
-#include <Kernel/API/Syscall.h>
#include <LibELF/AuxiliaryVector.h>
#include <alloca.h>
#include <assert.h>
@@ -45,6 +44,7 @@
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/wait.h>
+#include <syscall.h>
#include <unistd.h>
static void strtons(const char* str, char** endptr)
diff --git a/Userland/Libraries/LibC/sys/prctl.cpp b/Userland/Libraries/LibC/sys/prctl.cpp
index d7aa35486b..dbc4b53063 100644
--- a/Userland/Libraries/LibC/sys/prctl.cpp
+++ b/Userland/Libraries/LibC/sys/prctl.cpp
@@ -24,11 +24,11 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <sys/prctl.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/sys/ptrace.cpp b/Userland/Libraries/LibC/sys/ptrace.cpp
index 9e7eb60c2a..f285ef5bb5 100644
--- a/Userland/Libraries/LibC/sys/ptrace.cpp
+++ b/Userland/Libraries/LibC/sys/ptrace.cpp
@@ -25,9 +25,9 @@
*/
#include <AK/LogStream.h>
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <sys/ptrace.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/sys/select.cpp b/Userland/Libraries/LibC/sys/select.cpp
index 85c5b03d43..dfc039d12a 100644
--- a/Userland/Libraries/LibC/sys/select.cpp
+++ b/Userland/Libraries/LibC/sys/select.cpp
@@ -24,11 +24,11 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/sys/socket.cpp b/Userland/Libraries/LibC/sys/socket.cpp
index 95d2a015a7..a545e00021 100644
--- a/Userland/Libraries/LibC/sys/socket.cpp
+++ b/Userland/Libraries/LibC/sys/socket.cpp
@@ -25,12 +25,12 @@
*/
#include <AK/Assertions.h>
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/uio.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/sys/uio.cpp b/Userland/Libraries/LibC/sys/uio.cpp
index 4aad828c65..2fd6c94fe9 100644
--- a/Userland/Libraries/LibC/sys/uio.cpp
+++ b/Userland/Libraries/LibC/sys/uio.cpp
@@ -24,9 +24,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <sys/uio.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/sys/wait.cpp b/Userland/Libraries/LibC/sys/wait.cpp
index 9969a8eec2..2cde5e2821 100644
--- a/Userland/Libraries/LibC/sys/wait.cpp
+++ b/Userland/Libraries/LibC/sys/wait.cpp
@@ -24,9 +24,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <assert.h>
#include <sys/wait.h>
+#include <syscall.h>
#include <unistd.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/termios.cpp b/Userland/Libraries/LibC/termios.cpp
index 1037b0ab61..c1c4238b5c 100644
--- a/Userland/Libraries/LibC/termios.cpp
+++ b/Userland/Libraries/LibC/termios.cpp
@@ -24,7 +24,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <assert.h>
#include <errno.h>
#include <sys/ioctl.h>
diff --git a/Userland/Libraries/LibC/time.cpp b/Userland/Libraries/LibC/time.cpp
index e6e9f06c66..df7010c646 100644
--- a/Userland/Libraries/LibC/time.cpp
+++ b/Userland/Libraries/LibC/time.cpp
@@ -27,13 +27,13 @@
#include <AK/String.h>
#include <AK/StringBuilder.h>
#include <AK/Time.h>
-#include <Kernel/API/Syscall.h>
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/times.h>
+#include <syscall.h>
#include <time.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/times.cpp b/Userland/Libraries/LibC/times.cpp
index 012dfc7d70..78400a6294 100644
--- a/Userland/Libraries/LibC/times.cpp
+++ b/Userland/Libraries/LibC/times.cpp
@@ -24,9 +24,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <sys/times.h>
+#include <syscall.h>
clock_t times(struct tms* buf)
{
diff --git a/Userland/Libraries/LibC/unistd.cpp b/Userland/Libraries/LibC/unistd.cpp
index b87220f25d..40544d56f0 100644
--- a/Userland/Libraries/LibC/unistd.cpp
+++ b/Userland/Libraries/LibC/unistd.cpp
@@ -27,7 +27,6 @@
#include <AK/ScopedValueRollback.h>
#include <AK/String.h>
#include <AK/Vector.h>
-#include <Kernel/API/Syscall.h>
#include <alloca.h>
#include <assert.h>
#include <errno.h>
@@ -42,6 +41,7 @@
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/types.h>
+#include <syscall.h>
#include <termios.h>
#include <time.h>
#include <unistd.h>
diff --git a/Userland/Libraries/LibC/utime.cpp b/Userland/Libraries/LibC/utime.cpp
index 501d7f06c2..a75908d80a 100644
--- a/Userland/Libraries/LibC/utime.cpp
+++ b/Userland/Libraries/LibC/utime.cpp
@@ -24,9 +24,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <string.h>
+#include <syscall.h>
#include <utime.h>
extern "C" {
diff --git a/Userland/Libraries/LibC/utsname.cpp b/Userland/Libraries/LibC/utsname.cpp
index 23d10ee7e9..c0b9484f1f 100644
--- a/Userland/Libraries/LibC/utsname.cpp
+++ b/Userland/Libraries/LibC/utsname.cpp
@@ -24,9 +24,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <sys/utsname.h>
+#include <syscall.h>
extern "C" {
diff --git a/Userland/Libraries/LibCore/AnonymousBuffer.cpp b/Userland/Libraries/LibCore/AnonymousBuffer.cpp
index 40853ff732..8f6b1bedad 100644
--- a/Userland/Libraries/LibCore/AnonymousBuffer.cpp
+++ b/Userland/Libraries/LibCore/AnonymousBuffer.cpp
@@ -33,7 +33,6 @@
#include <sys/mman.h>
#if defined(__serenity__)
-# include <Kernel/API/Syscall.h>
# include <serenity.h>
#endif
diff --git a/Userland/Libraries/LibCore/File.cpp b/Userland/Libraries/LibCore/File.cpp
index 44ba8d41d7..38da00fb81 100644
--- a/Userland/Libraries/LibCore/File.cpp
+++ b/Userland/Libraries/LibCore/File.cpp
@@ -25,7 +25,6 @@
*/
#ifdef __serenity__
-# include <Kernel/API/Syscall.h>
# include <serenity.h>
#endif
#include <AK/ScopeGuard.h>
diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp
index dd2f61a4ef..92b790eb54 100644
--- a/Userland/Libraries/LibELF/DynamicLinker.cpp
+++ b/Userland/Libraries/LibELF/DynamicLinker.cpp
@@ -31,7 +31,6 @@
#include <AK/LexicalPath.h>
#include <AK/LogStream.h>
#include <AK/ScopeGuard.h>
-#include <Kernel/API/Syscall.h>
#include <LibC/mman.h>
#include <LibC/stdio.h>
#include <LibC/sys/internals.h>
@@ -45,6 +44,7 @@
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
+#include <syscall.h>
namespace ELF {
@@ -216,7 +216,7 @@ static NonnullRefPtr<DynamicLoader> commit_elf(const String& name)
auto object = loader->load_stage_3(RTLD_GLOBAL | RTLD_LAZY, g_total_tls_size);
ASSERT(object);
- if (name.is_one_of("libc.so", "libpthread.so", "/bin/UserspaceEmulator")) {
+ if (name == "libsystem.so") {
if (syscall(SC_msyscall, object->base_address().as_ptr())) {
ASSERT_NOT_REACHED();
}
diff --git a/Userland/Libraries/LibKeyboard/CharacterMap.cpp b/Userland/Libraries/LibKeyboard/CharacterMap.cpp
index 011a935ffc..cf5771d67f 100644
--- a/Userland/Libraries/LibKeyboard/CharacterMap.cpp
+++ b/Userland/Libraries/LibKeyboard/CharacterMap.cpp
@@ -26,7 +26,6 @@
#include "CharacterMap.h"
#include <AK/StringBuilder.h>
-#include <Kernel/API/Syscall.h>
#include <LibKeyboard/CharacterMapFile.h>
#ifndef KERNEL
diff --git a/Userland/Libraries/LibPthread/CMakeLists.txt b/Userland/Libraries/LibPthread/CMakeLists.txt
index c8644e0868..c28f072b5e 100644
--- a/Userland/Libraries/LibPthread/CMakeLists.txt
+++ b/Userland/Libraries/LibPthread/CMakeLists.txt
@@ -4,5 +4,5 @@ set(SOURCES
)
serenity_libc(LibPthread pthread)
-target_link_libraries(LibPthread LibC)
+target_link_libraries(LibPthread LibC LibSystem)
target_include_directories(LibPthread PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/Userland/Libraries/LibPthread/pthread.cpp b/Userland/Libraries/LibPthread/pthread.cpp
index b366b773b5..b4b5240efa 100644
--- a/Userland/Libraries/LibPthread/pthread.cpp
+++ b/Userland/Libraries/LibPthread/pthread.cpp
@@ -28,7 +28,6 @@
#include <AK/Atomic.h>
#include <AK/Debug.h>
#include <AK/StdLibExtras.h>
-#include <Kernel/API/Syscall.h>
#include <limits.h>
#include <pthread.h>
#include <serenity.h>
@@ -36,6 +35,7 @@
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
+#include <syscall.h>
#include <time.h>
#include <unistd.h>
diff --git a/Userland/Libraries/LibSystem/CMakeLists.txt b/Userland/Libraries/LibSystem/CMakeLists.txt
new file mode 100644
index 0000000000..f93dbe2c9b
--- /dev/null
+++ b/Userland/Libraries/LibSystem/CMakeLists.txt
@@ -0,0 +1,7 @@
+set(SOURCES
+ syscall.cpp
+)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib")
+serenity_libc(LibSystem system)
+target_include_directories(LibSystem PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/Userland/Libraries/LibSystem/syscall.cpp b/Userland/Libraries/LibSystem/syscall.cpp
new file mode 100644
index 0000000000..081d3709e7
--- /dev/null
+++ b/Userland/Libraries/LibSystem/syscall.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <Kernel/API/Syscall.h>
+#include <LibSystem/syscall.h>
+
+extern "C" {
+
+uintptr_t syscall0(uintptr_t function)
+{
+ return Syscall::invoke((Syscall::Function)function);
+}
+
+uintptr_t syscall1(uintptr_t function, uintptr_t arg0)
+{
+ return Syscall::invoke((Syscall::Function)function, arg0);
+}
+
+uintptr_t syscall2(uintptr_t function, uintptr_t arg0, uintptr_t arg1)
+{
+ return Syscall::invoke((Syscall::Function)function, arg0, arg1);
+}
+
+uintptr_t syscall3(uintptr_t function, uintptr_t arg0, uintptr_t arg1, uintptr_t arg2)
+{
+ return Syscall::invoke((Syscall::Function)function, arg0, arg1, arg2);
+}
+}
diff --git a/Userland/Libraries/LibSystem/syscall.h b/Userland/Libraries/LibSystem/syscall.h
new file mode 100644
index 0000000000..68aea02258
--- /dev/null
+++ b/Userland/Libraries/LibSystem/syscall.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <Kernel/API/Syscall.h>
+#include <sys/types.h>
+
+extern "C" {
+
+uintptr_t syscall0(uintptr_t function);
+uintptr_t syscall1(uintptr_t function, uintptr_t arg0);
+uintptr_t syscall2(uintptr_t function, uintptr_t arg0, uintptr_t arg1);
+uintptr_t syscall3(uintptr_t function, uintptr_t arg0, uintptr_t arg1, uintptr_t arg2);
+}
+
+#ifdef __cplusplus
+
+inline uintptr_t syscall(auto function)
+{
+ return syscall0(function);
+}
+
+inline uintptr_t syscall(auto function, auto arg0)
+{
+ return syscall1((uintptr_t)function, (uintptr_t)arg0);
+}
+
+inline uintptr_t syscall(auto function, auto arg0, auto arg1)
+{
+ return syscall2((uintptr_t)function, (uintptr_t)arg0, (uintptr_t)arg1);
+}
+
+inline uintptr_t syscall(auto function, auto arg0, auto arg1, auto arg2)
+{
+ return syscall3((uintptr_t)function, (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2);
+}
+
+#endif
diff --git a/Userland/Tests/Kernel/invalid-any-pointer-assert.cpp b/Userland/Tests/Kernel/invalid-any-pointer-assert.cpp
index afdd539e73..0491b79c91 100644
--- a/Userland/Tests/Kernel/invalid-any-pointer-assert.cpp
+++ b/Userland/Tests/Kernel/invalid-any-pointer-assert.cpp
@@ -25,9 +25,9 @@
*/
#include <AK/Format.h>
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <stdio.h>
+#include <syscall.h>
int main()
{
diff --git a/Userland/Tests/Kernel/invalid-path-pointer-assert.cpp b/Userland/Tests/Kernel/invalid-path-pointer-assert.cpp
index fe503753d1..85001f8dd6 100644
--- a/Userland/Tests/Kernel/invalid-path-pointer-assert.cpp
+++ b/Userland/Tests/Kernel/invalid-path-pointer-assert.cpp
@@ -24,10 +24,10 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
+#include <syscall.h>
int main()
{
diff --git a/Userland/Utilities/crash.cpp b/Userland/Utilities/crash.cpp
index 7e96360ddf..188eb690aa 100644
--- a/Userland/Utilities/crash.cpp
+++ b/Userland/Utilities/crash.cpp
@@ -27,13 +27,13 @@
#include <AK/Function.h>
#include <AK/String.h>
-#include <Kernel/API/Syscall.h>
#include <Kernel/IO.h>
#include <LibCore/ArgsParser.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/wait.h>
+#include <syscall.h>
#pragma GCC optimize("O0")
diff --git a/Userland/Utilities/functrace.cpp b/Userland/Utilities/functrace.cpp
index dcb2d046b3..01059090f9 100644
--- a/Userland/Utilities/functrace.cpp
+++ b/Userland/Utilities/functrace.cpp
@@ -32,7 +32,6 @@
#include <AK/NonnullOwnPtr.h>
#include <AK/StringBuilder.h>
#include <AK/kmalloc.h>
-#include <Kernel/API/Syscall.h>
#include <LibC/sys/arch/i386/regs.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/File.h>
@@ -45,6 +44,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <syscall.h>
#include <unistd.h>
static OwnPtr<Debug::DebugSession> g_debug_session;
diff --git a/Userland/Utilities/purge.cpp b/Userland/Utilities/purge.cpp
index 95257ec563..efd3e7a486 100644
--- a/Userland/Utilities/purge.cpp
+++ b/Userland/Utilities/purge.cpp
@@ -24,7 +24,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <LibCore/ArgsParser.h>
#include <serenity.h>
#include <stdio.h>
diff --git a/Userland/Utilities/strace.cpp b/Userland/Utilities/strace.cpp
index e915e7d3f2..64d005cfbb 100644
--- a/Userland/Utilities/strace.cpp
+++ b/Userland/Utilities/strace.cpp
@@ -27,7 +27,6 @@
#include <AK/Assertions.h>
#include <AK/LogStream.h>
#include <AK/Types.h>
-#include <Kernel/API/Syscall.h>
#include <LibC/sys/arch/i386/regs.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/File.h>
@@ -37,6 +36,7 @@
#include <string.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
+#include <syscall.h>
#include <unistd.h>
static int g_pid = -1;
diff --git a/Userland/Utilities/syscall.cpp b/Userland/Utilities/syscall.cpp
index fcb7862e3c..d80692ffec 100644
--- a/Userland/Utilities/syscall.cpp
+++ b/Userland/Utilities/syscall.cpp
@@ -24,13 +24,13 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <Kernel/API/Syscall.h>
#include <errno.h>
#include <getopt.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <syscall.h>
#include <unistd.h>
#if !defined __ENUMERATE_SYSCALL