From patchwork Tue Aug 8 14:17:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818639 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=GsPJ2a9+; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwNT2Vvdz1yYl for ; Wed, 9 Aug 2023 00:21:29 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYP-0001DY-Bg; Tue, 08 Aug 2023 10:19:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYB-0001Cf-JM for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:08 -0400 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNY9-0000Co-TN for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:07 -0400 Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-1bc7e65ea44so7149075ad.1 for ; Tue, 08 Aug 2023 07:19:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504343; x=1692109143; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qumuadsDsJtyCTa73O2rn/870w3uCbJzS1LzmOVmXtY=; b=GsPJ2a9+BK+4U9e3NQ30cQYb+u1w4aZUlI5ipHmIVpAWum6KihaWZ+QrvqbVhEkl+G UQY2lg1/rV234Buobv4pkLH9AZpnLBc1Db3O87lu7bQWG8SEjIVemrV+Ct/EBphGFUtn U5yU98iEaSPtPHTHZzffYfvPDmLwVTcUn7Ko9mlQTGIJuV/50QhkLYAl3OxycjVWbTi2 UJo90QF+R6NELy1ZpDHNiRbkCDUrSdl0ko8uvQiILHY3rs95KAsjbobbuRrwf03Ngwy1 t/pVcNVWo/bR8ndrx1PdTWUfZNQyuOKj93xHzHSlhI1ag49ololJKe3CU9aUyDdrQI/9 5YUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504343; x=1692109143; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qumuadsDsJtyCTa73O2rn/870w3uCbJzS1LzmOVmXtY=; b=lp6wtA/YheZx86KEjCmcb+KYv/9F4yEJoVpGI1SC1O5rUwI7llFBANoE+NhqLdVQPm ne7PfhX8UbLQ4ibu/D4PHhoqwgGLshv6skUqQPAuJ3VbVOhe21OkXNC1wxkmKdGsZb1s rPfi2bswOqW4nZzuGrObFz5JL3pGr0043/8daMkW+RGuVJLrT1L6QCwuMocroD827rpj ggJToQhVZdBJJ1aDhGNoi/l5ZBNHtTdz2j4faAvSeivzlsowkC9qpZo9WanuFF4FQIgE YUjz9F/Ymb5c8Dj+y2p5K8YD3GEhp1P5S40cr+aS1CtVzZFvSLLXMCrBbiuYgC/8G7nv OePg== X-Gm-Message-State: AOJu0YwSGNa4oMT3a6ynORys/n4eUjW0akgEOIm4A2upIVa8oEwU7Cf5 x2QgT/q5PPyv2S0aLvLA3/glfMOkAq+ovIKs X-Google-Smtp-Source: AGHT+IE6roGROIvRAxP2tWG84pAxzXRYsgSDMHYtDcnw6Cm3b9gEyYavodecXI/9rRvkH1TZAta1Nw== X-Received: by 2002:a17:902:f547:b0:1bc:4df5:8bfe with SMTP id h7-20020a170902f54700b001bc4df58bfemr11007836plf.20.1691504343399; Tue, 08 Aug 2023 07:19:03 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.18.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:03 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu , Paolo Bonzini , Thomas Huth Subject: [RFC v4 01/11] build: Implement logic for sharing cross-building config files Date: Tue, 8 Aug 2023 22:17:29 +0800 Message-Id: <20230808141739.3110740-2-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62e; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x62e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Yeqi Fu --- configure | 57 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/configure b/configure index 2b41c49c0d..a076583141 100755 --- a/configure +++ b/configure @@ -1751,56 +1751,67 @@ if test "$ccache_cpp2" = "yes"; then echo "export CCACHE_CPP2=y" >> $config_host_mak fi -# tests/tcg configuration -(config_host_mak=tests/tcg/config-host.mak -mkdir -p tests/tcg -echo "# Automatically generated by configure - do not modify" > $config_host_mak -echo "SRC_PATH=$source_path" >> $config_host_mak -echo "HOST_CC=$host_cc" >> $config_host_mak +# Prepare the config files for cross building. +# This process generates 'cross-build//config-target.mak' files. +# These files are then symlinked to the directories that need them which +# including the TCG tests (tests/tcg/) and the libnative library +# for linux-user (common/native//). +mkdir -p cross-build -# versioned checked in the main config_host.mak above -if test -n "$gdb_bin"; then - echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak -fi -if test "$plugins" = "yes" ; then - echo "CONFIG_PLUGIN=y" >> $config_host_mak -fi - -tcg_tests_targets= for target in $target_list; do arch=${target%%-*} - case $target in xtensa*-linux-user) - # the toolchain is not complete with headers, only build softmmu tests + # the toolchain for tests/tcg is not complete with headers continue ;; *-softmmu) - test -f "$source_path/tests/tcg/$arch/Makefile.softmmu-target" || continue qemu="qemu-system-$arch" ;; *-linux-user|*-bsd-user) qemu="qemu-$arch" ;; esac - if probe_target_compiler $target || test -n "$container_image"; then test -n "$container_image" && build_static=y - mkdir -p "tests/tcg/$target" - config_target_mak=tests/tcg/$target/config-target.mak - ln -sf "$source_path/tests/tcg/Makefile.target" "tests/tcg/$target/Makefile" + mkdir -p "cross-build/$target" + config_target_mak=cross-build/$target/config-target.mak echo "# Automatically generated by configure - do not modify" > "$config_target_mak" echo "TARGET_NAME=$arch" >> "$config_target_mak" echo "TARGET=$target" >> "$config_target_mak" - write_target_makefile "build-tcg-tests-$target" >> "$config_target_mak" + write_target_makefile "$target" >> "$config_target_mak" echo "BUILD_STATIC=$build_static" >> "$config_target_mak" echo "QEMU=$PWD/$qemu" >> "$config_target_mak" + # get the interpreter prefix and the path of libnative required for native call tests + if [ -d "/usr/$(echo "$target_cc" | sed 's/-gcc//')" ]; then + echo "LD_PREFIX=/usr/$(echo "$target_cc" | sed 's/-gcc//')" >> "$config_target_mak" + fi + # will GDB work with these binaries? if test "${gdb_arches#*$arch}" != "$gdb_arches"; then echo "HOST_GDB_SUPPORTS_ARCH=y" >> "$config_target_mak" fi + fi +done + +# tests/tcg configuration +(mkdir -p tests/tcg +# create a symlink to the config-host.mak file in the tests/tcg +ln -srf $config_host_mak tests/tcg/config-host.mak + +tcg_tests_targets= +for target in $target_list; do + case $target in + *-softmmu) + test -f "$source_path/tests/tcg/$arch/Makefile.softmmu-target" || continue + ;; + esac + if test -f cross-build/$target/config-target.mak; then + mkdir -p "tests/tcg/$target" + ln -srf cross-build/$target/config-target.mak tests/tcg/$target/config-target.mak + ln -sf $source_path/tests/tcg/Makefile.target tests/tcg/$target/Makefile echo "run-tcg-tests-$target: $qemu\$(EXESUF)" >> Makefile.prereqs tcg_tests_targets="$tcg_tests_targets $target" fi From patchwork Tue Aug 8 14:17:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818638 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=gpVj7T45; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwNS2ySPz1yYC for ; Wed, 9 Aug 2023 00:21:28 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYP-0001Dc-Gn; Tue, 08 Aug 2023 10:19:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYH-0001Cs-G9 for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:15 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYF-0000E0-N9 for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:13 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-1bc02bd4eafso48750995ad.1 for ; Tue, 08 Aug 2023 07:19:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504349; x=1692109149; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dk/DO9DbVQteeuSu76KVEhnNigAZjlVyLgHlftMISps=; b=gpVj7T45dZ/RNqU7fu1jts6tqsosNDl7hCXRBtGeDxIGRt2w360gDCgOaymtXv0+tz vc8FFnZPb3nNsQNCjY2FlYFQ2lzgDmY38alz8AaTdlXiNOjGYYfOTWi+Ac1BKIL21Iwq p1P4FQJXoAugZvgkOhsuTMo3C0WuimxYha6t8XtQXTm+sMGnyCtO/mY5o6ZinvFx57RD rk0b/fxJ4bnXUf0ShMh9IKwB+kwUXkX8x9AJtFxzhg5cRCPSzopzI9tv6jmPRTXLzeje kAGkx/EzqdSDMJoDoU/mmggeC458Js0t/rHUi280O3iBj43TISyProkkFBFV6wO8lWo3 CWGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504349; x=1692109149; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dk/DO9DbVQteeuSu76KVEhnNigAZjlVyLgHlftMISps=; b=Y+2rYuduZONkMdwWcBwWgZKx75Dhh2W4o8fxppulQUDo5AX1INCrR+fIlckKhep1Gd 0rv3XIGsvdk3Dz0Le6gvKQ6txhYHj0KMUGZWfZwIzU2o/JQfWmlL2aidvi18GjztVZD/ AyeYnlb7T+SepFgOiP8amv1nltLGm21lkbEbG8zKoIlBVq321PY5LgYkCP1VN8QcluUN iKNBFrrqTv7OUYA9FwrVqvGAR+Xw+G5jO20q+LwPZrtcyO5r+TELS87lVL7NHIuNvwQL M4XId3l1XI65cUm/XcoH5O5fsy0hwI2nUd3GWGEIO7iq4kdn1X9Wr/Mj7T+9y+NKo8oc yrEA== X-Gm-Message-State: AOJu0YwojfNhK5MC9hALgaRMfQbIgjCh1NhHz9JuUSBk5pez5l6PvLxa RKER5YtSgs9xdaHbPdUnjc6tlFm+TVhwZscM X-Google-Smtp-Source: AGHT+IH3NeW45usox02RX6NALdReV4asCC6cX7VcubVLYtzDrMGT0LsXI3RyJyfKWK2t2VeufCiF0Q== X-Received: by 2002:a17:902:76c8:b0:1b8:6cae:3570 with SMTP id j8-20020a17090276c800b001b86cae3570mr12572802plt.11.1691504348735; Tue, 08 Aug 2023 07:19:08 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:08 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu , Paolo Bonzini , Thomas Huth , Riku Voipio Subject: [RFC v4 02/11] build: Implement libnative library and the build machinery for libnative Date: Tue, 8 Aug 2023 22:17:30 +0800 Message-Id: <20230808141739.3110740-3-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This commit implements a shared library, where native functions are rewritten as special instructions. At runtime, user programs load the shared library, and special instructions are executed when native functions are called. Signed-off-by: Yeqi Fu --- Makefile | 2 + common-user/native/Makefile.include | 9 ++++ common-user/native/Makefile.target | 22 ++++++++++ common-user/native/libnative.c | 67 +++++++++++++++++++++++++++++ configure | 39 +++++++++++++++++ include/native/libnative.h | 8 ++++ 6 files changed, 147 insertions(+) create mode 100644 common-user/native/Makefile.include create mode 100644 common-user/native/Makefile.target create mode 100644 common-user/native/libnative.c create mode 100644 include/native/libnative.h diff --git a/Makefile b/Makefile index 5d48dfac18..6f6147b40f 100644 --- a/Makefile +++ b/Makefile @@ -182,6 +182,8 @@ SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) include $(SRC_PATH)/tests/Makefile.include +include $(SRC_PATH)/common-user/native/Makefile.include + all: recurse-all ROMS_RULES=$(foreach t, all clean distclean, $(addsuffix /$(t), $(ROMS))) diff --git a/common-user/native/Makefile.include b/common-user/native/Makefile.include new file mode 100644 index 0000000000..40d20bcd4c --- /dev/null +++ b/common-user/native/Makefile.include @@ -0,0 +1,9 @@ +.PHONY: build-native +build-native: $(NATIVE_TARGETS:%=build-native-library-%) +$(NATIVE_TARGETS:%=build-native-library-%): build-native-library-%: + $(call quiet-command, \ + $(MAKE) -C common-user/native/$* $(SUBDIR_MAKEFLAGS), \ + "BUILD","$* native library") +# endif + +all: build-native diff --git a/common-user/native/Makefile.target b/common-user/native/Makefile.target new file mode 100644 index 0000000000..0c1241b368 --- /dev/null +++ b/common-user/native/Makefile.target @@ -0,0 +1,22 @@ +# -*- Mode: makefile -*- +# +# Library for native calls +# + +all: +-include ../../config-host.mak +-include config-target.mak + +CFLAGS+=-O1 -fPIC -shared -fno-stack-protector -I$(SRC_PATH)/include -D$(TARGET_NAME) +LDFLAGS+= + +SRC = $(SRC_PATH)/common-user/native/libnative.c +LIBNATIVE = libnative.so + +all: $(LIBNATIVE) + +$(LIBNATIVE): $(SRC) + $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(EXTRA_NATIVE_CALL_FLAGS) $< -o $@ $(LDFLAGS) + +clean: + rm -f $(LIBNATIVE) diff --git a/common-user/native/libnative.c b/common-user/native/libnative.c new file mode 100644 index 0000000000..662ae6fbfe --- /dev/null +++ b/common-user/native/libnative.c @@ -0,0 +1,67 @@ +#include +#include +#include + +#include "native/libnative.h" + +#define WRAP_NATIVE() \ + do { \ + __asm__ volatile(__CALL_EXPR : : : "memory"); \ + } while (0) + +#if defined(i386) || defined(x86_64) +/* + * An unused instruction is utilized to mark a native call. + */ +#define __CALL_EXPR ".byte 0x0f, 0xff;" +#endif + +#if defined(arm) || defined(aarch64) +/* + * HLT is an invalid instruction for userspace and usefully has 16 + * bits of spare immeadiate data which we can stuff data in. + */ +#define __CALL_EXPR "hlt 0xffff;" +#endif + +#if defined(mips) || defined(mips64) +/* + * The syscall instruction contains 20 unused bits, which are typically + * set to 0. These bits can be used to store non-zero data, + * distinguishing them from a regular syscall instruction. + */ +#define __CALL_EXPR "syscall 0xffff;" +#endif + +void *memcpy(void *dest, const void *src, size_t n) +{ + WRAP_NATIVE(); +} +int memcmp(const void *s1, const void *s2, size_t n) +{ + WRAP_NATIVE(); +} +void *memset(void *s, int c, size_t n) +{ + WRAP_NATIVE(); +} +char *strncpy(char *dest, const char *src, size_t n) +{ + WRAP_NATIVE(); +} +int strncmp(const char *s1, const char *s2, size_t n) +{ + WRAP_NATIVE(); +} +char *strcpy(char *dest, const char *src) +{ + WRAP_NATIVE(); +} +char *strcat(char *dest, const char *src) +{ + WRAP_NATIVE(); +} +int strcmp(const char *s1, const char *s2) +{ + WRAP_NATIVE(); +} diff --git a/configure b/configure index a076583141..e02fc2c5c0 100755 --- a/configure +++ b/configure @@ -1822,6 +1822,45 @@ if test "$tcg" = "enabled"; then fi ) +# common-user/native configuration +(mkdir -p common-user/native + +native_targets= +for target in $target_list; do + case $target in + *-softmmu) + continue + ;; + esac + + # native call is only supported on these architectures + arch=${target%%-*} + config_target_mak=common-user/native/$target/config-target.mak + case $arch in + i386|x86_64|arm|aarch64|mips|mips64) + if test -f cross-build/$target/config-target.mak; then + mkdir -p "common-user/native/$target" + ln -srf cross-build/$target/config-target.mak "$config_target_mak" + if test $arch = arm; then + echo "EXTRA_NATIVE_CALL_FLAGS=-marm" >> "$config_target_mak" + fi + if test $arch = $cpu || \ + { test $arch = i386 && test $cpu = x86_64; } || \ + { test $arch = arm && test $cpu = aarch64; } || \ + { test $arch = mips && test $cpu = mips64; }; then + echo "LD_PREFIX=/" >> "$config_target_mak" + fi + echo "LIBNATIVE=$PWD/common-user/native/$target/libnative.so" >> "$config_target_mak" + ln -sf $source_path/common-user/native/Makefile.target common-user/native/$target/Makefile + native_targets="$native_targets $target" + fi + ;; + esac +done + +echo "NATIVE_TARGETS=$native_targets" >> config-host.mak +) + if test "$skip_meson" = no; then cross="config-meson.cross.new" meson_quote() { diff --git a/include/native/libnative.h b/include/native/libnative.h new file mode 100644 index 0000000000..ec990d8e5f --- /dev/null +++ b/include/native/libnative.h @@ -0,0 +1,8 @@ +void *memset(void *s, int c, size_t n); +void *memcpy(void *dest, const void *src, size_t n); +char *strncpy(char *dest, const char *src, size_t n); +int memcmp(const void *s1, const void *s2, size_t n); +int strncmp(const char *s1, const char *s2, size_t n); +char *strcpy(char *dest, const char *src); +char *strcat(char *dest, const char *src); +int strcmp(const char *s1, const char *s2); From patchwork Tue Aug 8 14:17:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818630 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=o2EaCPJJ; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwM30mKBz1yYC for ; Wed, 9 Aug 2023 00:20:15 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYV-0001FJ-OF; Tue, 08 Aug 2023 10:19:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYP-0001Dh-GH for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:21 -0400 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYL-0000FA-3p for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:20 -0400 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-1bbd03cb7c1so37064265ad.3 for ; Tue, 08 Aug 2023 07:19:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504353; x=1692109153; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=M3BM9BzxXOpCLcC2shnZCuIGaJIXuF6fdRmpn3JtABg=; b=o2EaCPJJVxBdZLR/6hEwbNOA27YnxbnNvnZnWa8Xk8Hv0sIivneFt8a87tpSxOIDbm pN37ynMn5g8zu4pluX7Ll2MoNjgLsJKlOE9HjKP6M0lwmr902sS/OyKuzjKcstjOBr3r FB6nLa9W9oGXzFzJSM8CONOMrmr5x0EG2wNgbhVotXxy3sQ06XCNtG2YaiwAtP43/RVC G/fH/mgpzkf5AFPLa035f89z0KPHRF+dpIhjg/4ZtPSpNRWo+YXpFV7sXFV5VDNtfRz2 af0C2Oa3GW4po2s8jB2jPePBQp5dvNJmytEGizRrb3BXj1o9c3EHdYf/mmNz24vTjfzA J94w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504353; x=1692109153; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=M3BM9BzxXOpCLcC2shnZCuIGaJIXuF6fdRmpn3JtABg=; b=HKOth0t7cSUvSWU3bwnkJHJR/YhSC8erCOfqUbVnku+Lei/ASgdif/P/PpzdJtKDOv 2DpMTa4XrcB6S1o9VjDpRpOSAR6c2+nvisYmKtMrjo8Bn9TY07KnXGxHt+oSDKQh3KA7 x9FutEk3DpoKPCouSFfa5uVNu+TBaHLajEOnBpFOoYObuTZBvdP74ayjBEk2mK0ztj+8 yBZcaHeVMlEUwWbu4PD7bqjpwKCUMJzYs+jIE1mX0yNMwgnYb6HjqAGvvl4tNbh7bT9n 8NHqTA8TT+9kQrpLGyRMbPl05StAnP9CrMRUR/JYjSy2G/ISZimZ7sovvXAnhND+vAl0 8Qqw== X-Gm-Message-State: AOJu0YzySS71t4ZpvWws4y1AEspEvCv3M5JMPfhmfmyUxuMMoaphKrsM dW/+YLidr/O/W3tNzicHzVBtOivQcBJviqN+ X-Google-Smtp-Source: AGHT+IHuDmAMB+YhTJWAI1nKGwJneUcrZzBHw51y0rsretTsqk0Epi8AmPVObZ8ReD5LpG5HZJ03KA== X-Received: by 2002:a17:902:c94e:b0:1b6:7f96:42ca with SMTP id i14-20020a170902c94e00b001b67f9642camr10574403pla.66.1691504352740; Tue, 08 Aug 2023 07:19:12 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:12 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu Subject: [RFC v4 03/11] linux-user: Implement envlist_appendenv and add tests for envlist Date: Tue, 8 Aug 2023 22:17:31 +0800 Message-Id: <20230808141739.3110740-4-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Yeqi Fu Reviewed-by: Alex Bennée --- include/qemu/envlist.h | 13 ++++++ tests/unit/meson.build | 1 + tests/unit/test-envlist.c | 94 +++++++++++++++++++++++++++++++++++++++ util/envlist.c | 71 ++++++++++++++++++++++++----- 4 files changed, 169 insertions(+), 10 deletions(-) create mode 100644 tests/unit/test-envlist.c diff --git a/include/qemu/envlist.h b/include/qemu/envlist.h index 6006dfae44..9eb1459e79 100644 --- a/include/qemu/envlist.h +++ b/include/qemu/envlist.h @@ -1,12 +1,25 @@ #ifndef ENVLIST_H #define ENVLIST_H +#include "qemu/queue.h" + +struct envlist_entry { + const char *ev_var; /* actual env value */ + QLIST_ENTRY(envlist_entry) ev_link; +}; + +struct envlist { + QLIST_HEAD(, envlist_entry) el_entries; /* actual entries */ + size_t el_count; /* number of entries */ +}; + typedef struct envlist envlist_t; envlist_t *envlist_create(void); void envlist_free(envlist_t *); int envlist_setenv(envlist_t *, const char *); int envlist_unsetenv(envlist_t *, const char *); +int envlist_appendenv(envlist_t *, const char *, const char *); int envlist_parse_set(envlist_t *, const char *); int envlist_parse_unset(envlist_t *, const char *); char **envlist_to_environ(const envlist_t *, size_t *); diff --git a/tests/unit/meson.build b/tests/unit/meson.build index 93977cc32d..9b25b45271 100644 --- a/tests/unit/meson.build +++ b/tests/unit/meson.build @@ -50,6 +50,7 @@ tests = { 'test-qapi-util': [], 'test-interval-tree': [], 'test-xs-node': [qom], + 'test-envlist': [], } if have_system or have_tools diff --git a/tests/unit/test-envlist.c b/tests/unit/test-envlist.c new file mode 100644 index 0000000000..d1e148f738 --- /dev/null +++ b/tests/unit/test-envlist.c @@ -0,0 +1,94 @@ +/* + * testenvlist unit-tests. + */ + +#include "qemu/osdep.h" +#include "qemu/envlist.h" + +static void envlist_create_free_test(void) +{ + envlist_t *testenvlist; + + testenvlist = envlist_create(); + g_assert(testenvlist != NULL); + g_assert(testenvlist->el_count == 0); + + envlist_free(testenvlist); +} + +static void envlist_set_unset_test(void) +{ + envlist_t *testenvlist; + const char *env = "TEST=123"; + struct envlist_entry *entry; + + testenvlist = envlist_create(); + g_assert(envlist_setenv(testenvlist, env) == 0); + g_assert(testenvlist->el_count == 1); + entry = testenvlist->el_entries.lh_first; + g_assert_cmpstr(entry->ev_var, ==, "TEST=123"); + g_assert(envlist_unsetenv(testenvlist, "TEST") == 0); + g_assert(testenvlist->el_count == 0); + + envlist_free(testenvlist); +} + +static void envlist_parse_set_unset_test(void) +{ + envlist_t *testenvlist; + const char *env = "TEST1=123,TEST2=456"; + + testenvlist = envlist_create(); + g_assert(envlist_parse_set(testenvlist, env) == 0); + g_assert(testenvlist->el_count == 2); + g_assert(envlist_parse_unset(testenvlist, "TEST1,TEST2") == 0); + g_assert(testenvlist->el_count == 0); + + envlist_free(testenvlist); +} + +static void envlist_appendenv_test(void) +{ + envlist_t *testenvlist; + const char *env = "TEST=123"; + struct envlist_entry *entry; + + testenvlist = envlist_create(); + g_assert(envlist_setenv(testenvlist, env) == 0); + g_assert(envlist_appendenv(testenvlist, "TEST=456", ";") == 0); + entry = testenvlist->el_entries.lh_first; + g_assert_cmpstr(entry->ev_var, ==, "TEST=123;456"); + + envlist_free(testenvlist); +} + +static void envlist_to_environ_test(void) +{ + envlist_t *testenvlist; + const char *env = "TEST1=123,TEST2=456"; + size_t count; + char **environ; + + testenvlist = envlist_create(); + g_assert(envlist_parse_set(testenvlist, env) == 0); + g_assert(testenvlist->el_count == 2); + environ = envlist_to_environ(testenvlist, &count); + g_assert(count == 2); + g_assert_cmpstr(environ[1], ==, "TEST1=123"); + g_assert_cmpstr(environ[0], ==, "TEST2=456"); + + envlist_free(testenvlist); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + g_test_add_func("/envlist/create_free", envlist_create_free_test); + g_test_add_func("/envlist/set_unset", envlist_set_unset_test); + g_test_add_func("/envlist/parse_set_unset", envlist_parse_set_unset_test); + g_test_add_func("/envlist/appendenv", envlist_appendenv_test); + g_test_add_func("/envlist/to_environ", envlist_to_environ_test); + + return g_test_run(); +} diff --git a/util/envlist.c b/util/envlist.c index db937c0427..2570f0e30c 100644 --- a/util/envlist.c +++ b/util/envlist.c @@ -2,16 +2,6 @@ #include "qemu/queue.h" #include "qemu/envlist.h" -struct envlist_entry { - const char *ev_var; /* actual env value */ - QLIST_ENTRY(envlist_entry) ev_link; -}; - -struct envlist { - QLIST_HEAD(, envlist_entry) el_entries; /* actual entries */ - size_t el_count; /* number of entries */ -}; - static int envlist_parse(envlist_t *envlist, const char *env, int (*)(envlist_t *, const char *)); @@ -201,6 +191,67 @@ envlist_unsetenv(envlist_t *envlist, const char *env) return (0); } +/* + * Appends environment value to envlist. If the environment + * variable already exists, the new value is appended to the + * existing one. + * + * Returns 0 in success, errno otherwise. + */ +int +envlist_appendenv(envlist_t *envlist, const char *env, const char *separator) +{ + struct envlist_entry *entry = NULL; + const char *eq_sign; + size_t envname_len; + + if ((envlist == NULL) || (env == NULL) || (separator == NULL)) { + return -EINVAL; + } + + /* find out first equals sign in given env */ + eq_sign = strchr(env, '='); + if (eq_sign == NULL) { + return -EINVAL; + } + + if (strchr(eq_sign + 1, '=') != NULL) { + return -EINVAL; + } + + envname_len = eq_sign - env + 1; + + /* + * If there already exists variable with given name, + * we append the new value to the existing one. + */ + for (entry = envlist->el_entries.lh_first; entry != NULL; + entry = entry->ev_link.le_next) { + if (strncmp(entry->ev_var, env, envname_len) == 0) { + break; + } + } + + if (entry != NULL) { + char *new_env_value = NULL; + size_t new_env_len = strlen(entry->ev_var) + strlen(eq_sign) + + strlen(separator) + 1; + new_env_value = g_malloc(new_env_len); + strcpy(new_env_value, entry->ev_var); + strcat(new_env_value, separator); + strcat(new_env_value, eq_sign + 1); + g_free((char *)entry->ev_var); + entry->ev_var = new_env_value; + } else { + envlist->el_count++; + entry = g_malloc(sizeof(*entry)); + entry->ev_var = g_strdup(env); + QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link); + } + + return 0; +} + /* * Returns given envlist as array of strings (in same form that * global variable environ is). Caller must free returned memory From patchwork Tue Aug 8 14:17:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818636 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=fbcsjSpF; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwNH3db7z1yYl for ; Wed, 9 Aug 2023 00:21:19 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYW-0001FK-8W; Tue, 08 Aug 2023 10:19:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYQ-0001Dx-Vo for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:24 -0400 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYN-0000G8-Gy for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:21 -0400 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-1bc7b25c699so9706935ad.1 for ; Tue, 08 Aug 2023 07:19:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504357; x=1692109157; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7x2M2P5Izg3o7S+bwnSV9JjqJW9CHCr4Letv8ueV1xE=; b=fbcsjSpFKdrkiXnrm0vbD3hVuw/pRpypL4CPlSAP+zLFJWM9kj1r12j8yosFS30vEL j9qF2ZMbOuF2/yd84mvmk2oRvw9d8Q2Zy66elgWK2LpyqLnj9MVjAc4NVqfqDDPcj0ar nNkiQDX4S0XwivQv92WApcX8JG/o2OP1TkS9FtOUrd8jMhfqUcD+iwllh+sEKY6tmbqy CXxqck6v3ozwmsGz1Nj0xRvz+OmdVaCKJxeaB3iiHApiZudlwMHRHbV8rpGPxH1skxjw uhnwBUiEHmgRij96FohZi5M3PzzVZZ7rPHK27ZT4HHb0MfRldUjhql23qKPkjGqLWThH Lp4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504357; x=1692109157; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7x2M2P5Izg3o7S+bwnSV9JjqJW9CHCr4Letv8ueV1xE=; b=ktXsVHO0b4q7IowrIAxESZWP4ivhBONqD7e4IEbq69ZuhIosIVW2X51kOHzuUBDcNE N06XOvlUAvnh7j8CBFWYG+71ASy/GGLwl+p+ztV4l/txcYfvcvmAalhyWjtY8r69ieZG gWtRss/7mFCbAnzl4Z0K+mF+pDORFJlxG0V5So0BR5zCKUCMar4gZVbWOEG9yzAhhBDL ewHGNsJu3dW3u4x90Or42qL0EF+P2VJmHuwLOzw9Rz6fwxwcoVUKwrI6TEl0lEjFm61u rSe0+oZj05QVAENS6uSs1uGy7pTImfqbOxKHIqiIOhkjzhZgPiHfOtK0Iad020D1b3bA 7csQ== X-Gm-Message-State: AOJu0Yyi43P4PEhKdMCl2mZSRbzXgK81JcIawEgbbSciCxGQLE8TYhQj 31TDfrKM4LK37TZULbXQ28Y= X-Google-Smtp-Source: AGHT+IEmU6jdsLausXl506jEUb1C7pQKszBl3eewT1FLNLxlQODF6MngyFc6gVcrqMFH4LWL0gICdA== X-Received: by 2002:a17:902:d4c1:b0:1bc:6dd9:82c3 with SMTP id o1-20020a170902d4c100b001bc6dd982c3mr6603133plg.37.1691504357067; Tue, 08 Aug 2023 07:19:17 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:16 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu , Laurent Vivier Subject: [RFC v4 04/11] linux-user: Implement native-bypass option support Date: Tue, 8 Aug 2023 22:17:32 +0800 Message-Id: <20230808141739.3110740-5-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This commit implements the -native-bypass support in linux-user. The native_calls_enabled() function can be true only when the '-native-bypass' option is given. Signed-off-by: Yeqi Fu Reviewed-by: Alex Bennée --- include/native/native.h | 9 +++++++++ linux-user/main.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 include/native/native.h diff --git a/include/native/native.h b/include/native/native.h new file mode 100644 index 0000000000..62951fafb1 --- /dev/null +++ b/include/native/native.h @@ -0,0 +1,9 @@ +/* + * Check if the native bypass feature is enabled. + */ +#if defined(CONFIG_USER_ONLY) && defined(CONFIG_NATIVE_CALL) +extern char *native_lib_path; +#define native_bypass_enabled() native_lib_path ? true : false +#else +#define native_bypass_enabled() false +#endif diff --git a/linux-user/main.c b/linux-user/main.c index dba67ffa36..86ea0191f7 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -60,6 +60,11 @@ #include "semihosting/semihost.h" #endif +#if defined(CONFIG_NATIVE_CALL) +#include "native/native.h" +char *native_lib_path; +#endif + #ifndef AT_FLAGS_PRESERVE_ARGV0 #define AT_FLAGS_PRESERVE_ARGV0_BIT 0 #define AT_FLAGS_PRESERVE_ARGV0 (1 << AT_FLAGS_PRESERVE_ARGV0_BIT) @@ -293,6 +298,17 @@ static void handle_arg_set_env(const char *arg) free(r); } +#if defined(CONFIG_NATIVE_CALL) +static void handle_arg_native_bypass(const char *arg) +{ + if (access(arg, F_OK) != 0) { + fprintf(stderr, "native library %s does not exist\n", arg); + exit(EXIT_FAILURE); + } + native_lib_path = strdup(arg); +} +#endif + static void handle_arg_unset_env(const char *arg) { char *r, *p, *token; @@ -522,6 +538,10 @@ static const struct qemu_argument arg_table[] = { "", "Generate a /tmp/perf-${pid}.map file for perf"}, {"jitdump", "QEMU_JITDUMP", false, handle_arg_jitdump, "", "Generate a jit-${pid}.dump file for perf"}, +#if defined(CONFIG_NATIVE_CALL) + {"native-bypass", "QEMU_NATIVE_BYPASS", true, handle_arg_native_bypass, + "", "native bypass for library calls in user mode only."}, +#endif {NULL, NULL, false, NULL, NULL, NULL} }; @@ -834,6 +854,24 @@ int main(int argc, char **argv, char **envp) } } +#if defined(CONFIG_NATIVE_CALL) + /* Set the library for native bypass */ + if (native_lib_path) { + if (g_file_test(native_lib_path, G_FILE_TEST_EXISTS)) { + GString *lib = g_string_new(native_lib_path); + lib = g_string_prepend(lib, "LD_PRELOAD="); + if (envlist_appendenv(envlist, g_string_free(lib, false), ":")) { + fprintf(stderr, + "failed to append the native library to environment.\n"); + exit(EXIT_FAILURE); + } + } else { + fprintf(stderr, "native library %s does not exist.\n", + native_lib_path); + exit(EXIT_FAILURE); + } + } +#endif target_environ = envlist_to_environ(envlist, NULL); envlist_free(envlist); From patchwork Tue Aug 8 14:17:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818637 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=UBMN7lHp; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwNK21gSz1yYC for ; Wed, 9 Aug 2023 00:21:21 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYW-0001FL-PQ; Tue, 08 Aug 2023 10:19:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYT-0001EZ-Ur for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:26 -0400 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYR-0000He-8h for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:25 -0400 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-1bc7b25c699so9707545ad.1 for ; Tue, 08 Aug 2023 07:19:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504362; x=1692109162; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZAHN5GS4NUQT6M8ktSLZlWet0VNdf0LHMoqp/AaJeH8=; b=UBMN7lHpnh2eNK1cl2LNUg2DKQaQZlyNmYEjgKn1USoxXUov7y4M0vWTWmQ5rLwvtG 5gPPfcnyphY9o0L2wWx1J9zEtAZY8DCbfe3C99mEq1eyw15liW18wBl5XYVZ2lMEhDmr VdZ5SFL3m2j8abnf6hZDQ9EKFyR65hSFhy4saXxpHReJU3TD4lzmQf2aqHVOdSMOt3GF eJLkFmsimdhFNNiILLzIY4por6aFimryheE7zxCAqKGOqUzMVbL10IEZsKVPaYcpCsZc ipTLUTRQlsf46PCziBOlfbPoaCMG5RCmMP2u9+sLmZyAIrN3fB7EjGm+QdD0aLIWDU5m 3ejQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504362; x=1692109162; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZAHN5GS4NUQT6M8ktSLZlWet0VNdf0LHMoqp/AaJeH8=; b=eQAkwj8xWdTFhedGCt9xKa0suRp9e/sTYP74YimPgHZpWbUHb3yI4IYenIhSEhhjXr sUBptioL94FZhe1CgSFRH057OM+eg3fqTeLf/O4mmZTMMfF87aB31C4YTOuAfr0tojnQ VL3kIBwXhBhhrAEtp5doL1qHrVDRTGwdvlxvrXNAX63dTiSDQ7CcxQRc3yU2FjBmMepJ x+RxpdeYfbs4eOSM0OBQXAKP4g0EGiofoOi0VNlX2N/8KnQfzk4rF1/GB1T5KeUjC7oW 6JNfL+ErG2maMcmR+nMtk3bLqmeGkLy2frIBxA/l3ndw/XvPg1/1Y5FAxa8mxt5qgx1b 1TlA== X-Gm-Message-State: AOJu0Yx36RaBUQVTH8pEMlA5gS6Dr7PSXON3ERFIUot1Yna4VxB4xOFG z/4L55nfGI/nqL6NYij3ERSEpjqahbM6xARR X-Google-Smtp-Source: AGHT+IFOgNWBXOHdM/IIsVgRYQgfG56wHh+TBaDUovJ31r8rwffic2EwIXsEDke26VKp5OmYvIsjEQ== X-Received: by 2002:a17:902:d482:b0:1b9:e1d6:7c7d with SMTP id c2-20020a170902d48200b001b9e1d67c7dmr12386614plg.47.1691504361769; Tue, 08 Aug 2023 07:19:21 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:21 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu , Laurent Vivier Subject: [RFC v4 05/11] linux-user/elfload: Add support for parsing symbols of native libraries. Date: Tue, 8 Aug 2023 22:17:33 +0800 Message-Id: <20230808141739.3110740-6-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62f; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x62f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This commit addresses the need to parse symbols of native libraries. The base address of a shared library is determined by the dynamic linker. To simplify the process, we focus on the last three digits, which reside within the same page and remain unaffected by the base address. Signed-off-by: Yeqi Fu --- linux-user/elfload.c | 85 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 9a2ec568b0..9448f91005 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -22,6 +22,9 @@ #include "qemu/error-report.h" #include "target_signal.h" #include "accel/tcg/debuginfo.h" +#if defined(CONFIG_NATIVE_CALL) +#include "native/native.h" +#endif #ifdef _ARCH_PPC64 #undef ARCH_DLINFO @@ -2038,8 +2041,10 @@ static inline void bswap_mips_abiflags(Mips_elf_abiflags_v0 *abiflags) { } #ifdef USE_ELF_CORE_DUMP static int elf_core_dump(int, const CPUArchState *); #endif /* USE_ELF_CORE_DUMP */ -static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias); - +static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias, + uint load_type); +#define ELF_SYM 1 +#define NATIVE_LIB_SYM 2 /* Verify the portions of EHDR within E_IDENT for the target. This can be performed before bswapping the entire header. */ static bool elf_check_ident(struct elfhdr *ehdr) @@ -3302,7 +3307,7 @@ static void load_elf_image(const char *image_name, int image_fd, } if (qemu_log_enabled()) { - load_symbols(ehdr, image_fd, load_bias); + load_symbols(ehdr, image_fd, load_bias, ELF_SYM); } debuginfo_report_elf(image_name, image_fd, load_bias); @@ -3398,7 +3403,8 @@ static int symcmp(const void *s0, const void *s1) } /* Best attempt to load symbols from this ELF object. */ -static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias) +static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias, + uint load_type) { int i, shnum, nsyms, sym_idx = 0, str_idx = 0; uint64_t segsz; @@ -3456,7 +3462,21 @@ static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias) for (i = 0; i < nsyms; ) { bswap_sym(syms + i); /* Throw away entries which we do not need. */ - if (syms[i].st_shndx == SHN_UNDEF + if (load_type == NATIVE_LIB_SYM) { + /* + * Load the native library. + * Since the base address of a shared library is determined + * by the dynamic linker, we only consider the last three + * digits here, which are within the same page and are not + * affected by the base address. + */ +#if defined(TARGET_ARM) || defined(TARGET_MIPS) + /* The bottom address bit marks a Thumb or MIPS16 symbol. */ + syms[i].st_value &= ~(target_ulong)1; +#endif + syms[i].st_value &= 0xfff; + i++; + } else if (syms[i].st_shndx == SHN_UNDEF || syms[i].st_shndx >= SHN_LORESERVE || ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) { if (i < --nsyms) { @@ -3542,14 +3562,63 @@ uint32_t get_elf_eflags(int fd) return ehdr.e_flags; } +#if defined(CONFIG_NATIVE_CALL) +static void load_native_library(const char *filename, struct image_info *info, + char bprm_buf[BPRM_BUF_SIZE]) +{ + int fd, retval; + Error *err = NULL; + + fd = open(path(filename), O_RDONLY); + if (fd < 0) { + error_setg_file_open(&err, errno, filename); + error_report_err(err); + exit(-1); + } + + retval = read(fd, bprm_buf, BPRM_BUF_SIZE); + if (retval < 0) { + error_setg_errno(&err, errno, "Error reading file header"); + error_reportf_err(err, "%s: ", filename); + exit(-1); + } + + if (retval < BPRM_BUF_SIZE) { + memset(bprm_buf + retval, 0, BPRM_BUF_SIZE - retval); + } + + struct elfhdr *ehdr = (struct elfhdr *)bprm_buf; + + if (!elf_check_ident(ehdr)) { + error_setg(&err, "Invalid ELF image for this architecture"); + goto exit_errmsg; + } + bswap_ehdr(ehdr); + if (!elf_check_ehdr(ehdr)) { + error_setg(&err, "Invalid ELF image for this architecture"); + goto exit_errmsg; + } + + /* We are only concerned with the symbols of native library. */ + load_symbols(ehdr, fd, 0, NATIVE_LIB_SYM); + return; + +exit_errmsg: + error_reportf_err(err, "%s: ", filename); + exit(-1); +} +#endif + int load_elf_binary(struct linux_binprm *bprm, struct image_info *info) { struct image_info interp_info; + struct image_info nativelib_info; struct elfhdr elf_ex; char *elf_interpreter = NULL; char *scratch; memset(&interp_info, 0, sizeof(interp_info)); + memset(&nativelib_info, 0, sizeof(nativelib_info)); #ifdef TARGET_MIPS interp_info.fp_abi = MIPS_ABI_FP_UNKNOWN; #endif @@ -3665,6 +3734,12 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info) target_munmap(start_brk, end_brk - start_brk); } +#if defined(CONFIG_NATIVE_CALL) + if (native_bypass_enabled()) { + load_native_library(native_lib_path, &nativelib_info, bprm->buf); + } +#endif + return 0; } From patchwork Tue Aug 8 14:17:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818635 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=CxYDgjC8; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwNG4VRDz1yYC for ; Wed, 9 Aug 2023 00:21:18 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYZ-0001G5-3x; Tue, 08 Aug 2023 10:19:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYX-0001FQ-5y for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:29 -0400 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYV-0000Il-Ck for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:28 -0400 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-1bb9e6c2a90so49927395ad.1 for ; Tue, 08 Aug 2023 07:19:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504366; x=1692109166; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GrdwntijzI3EO9KK5le2/eCTA0TEbyfqQ9FwIk1g+vc=; b=CxYDgjC8e3Wv/ZduDoFXrFzgEk/uezmvxCjeN3SX5ym/0+T50w5q+tpdVQOG/yic9U 2fUv1NptfF8Iii4lCLnZ7wkZ59VVuuv4VJOy36crBMgWzCeAgsI7PpQWmlVCIzg2pwN9 l8e9YdePZ+WyUcY5GKmMTsh5WJIOF2jWQtbQCNkR0ErlBI+4s2kxOZ466HTepwuxQPw6 0BIY2y1o8yzGNClaju7TZfRF7PFU8ey0Ok9OcTbCzJ6irDvJlMSlUaBpuyHpwbml+Min N5Wt5FFa189lc7g9aaZbtfBowbYgJNFBDNrQdgU0eyewAJQgncDwmGtjhNzfeevWml/7 O7GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504366; x=1692109166; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GrdwntijzI3EO9KK5le2/eCTA0TEbyfqQ9FwIk1g+vc=; b=QsWz121BMhZqDK9U4Fe61JccRde7OU60Dx4hDPZhT/ZnH8n6Sd5IPSy1f9IWJ91b36 96kISGMH2OrLI6tVg++NyIp6lUi/sxMi/by9wlZMGZPGh0kH3VLYXQtbGz+NMXqmnuBP mcdk+2DRxz7mNe32/oLryMGyE1dRN+uhM5d+Zm1IyuzMA6hT75yWb9bsLPqMdjTL9Qoo 6TSNw5theMOfa7TL3yhTfXGZYQAvYvqrHVXDnL/C+co3Sfev2mKMFwjpiSJARyJevRss IQPIT4BaMebqNxlB/CB+cS0C3dEzuLinDknb/bI8S82hozwpYApMauDk8cawHqUZARmB vXOg== X-Gm-Message-State: AOJu0YxmCLjxZmjWZ7yUfsaEmaF2yfRfjIXsejhv0oF/ACFfGzLpYMmA /f7szTn5Y7mFnTqrmDBoheM= X-Google-Smtp-Source: AGHT+IEtLwgWEEwuNcfxNNW8nYVUP5D+p8KeULxARhuF1It6xV4nGnIR+HdbaeRV3CSavqfc8Oc9yQ== X-Received: by 2002:a17:902:eb42:b0:1b8:7e53:704 with SMTP id i2-20020a170902eb4200b001b87e530704mr13161408pli.27.1691504366113; Tue, 08 Aug 2023 07:19:26 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:25 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu , Paolo Bonzini Subject: [RFC v4 06/11] tcg: Add tcg opcodes and helpers for native library calls Date: Tue, 8 Aug 2023 22:17:34 +0800 Message-Id: <20230808141739.3110740-7-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This commit implements tcg opcodes and helpers for extracting and invoke native functions. Signed-off-by: Yeqi Fu --- accel/tcg/tcg-runtime.h | 22 ++++++ include/tcg/tcg-op-common.h | 11 +++ include/tcg/tcg.h | 9 +++ tcg/tcg-op.c | 140 ++++++++++++++++++++++++++++++++++++ 4 files changed, 182 insertions(+) diff --git a/accel/tcg/tcg-runtime.h b/accel/tcg/tcg-runtime.h index 39e68007f9..bda78b4489 100644 --- a/accel/tcg/tcg-runtime.h +++ b/accel/tcg/tcg-runtime.h @@ -37,6 +37,28 @@ DEF_HELPER_FLAGS_1(exit_atomic, TCG_CALL_NO_WG, noreturn, env) */ #define helper_memset memset DEF_HELPER_FLAGS_3(memset, TCG_CALL_NO_RWG, ptr, ptr, int, ptr) + +#define helper_memcpy memcpy +DEF_HELPER_FLAGS_3(memcpy, TCG_CALL_NO_RWG, ptr, ptr, ptr, ptr) + +#define helper_strncpy strncpy +DEF_HELPER_FLAGS_3(strncpy, TCG_CALL_NO_RWG, ptr, ptr, ptr, ptr) + +#define helper_memcmp memcmp +DEF_HELPER_FLAGS_3(memcmp, TCG_CALL_NO_RWG, int, ptr, ptr, ptr) + +#define helper_strncmp strncmp +DEF_HELPER_FLAGS_3(strncmp, TCG_CALL_NO_RWG, int, ptr, ptr, ptr) + +#define helper_strcpy strcpy +DEF_HELPER_FLAGS_2(strcpy, TCG_CALL_NO_RWG, ptr, ptr, ptr) + +#define helper_strcat strcat +DEF_HELPER_FLAGS_2(strcat, TCG_CALL_NO_RWG, ptr, ptr, ptr) + +#define helper_strcmp strcmp +DEF_HELPER_FLAGS_2(strcmp, TCG_CALL_NO_RWG, int, ptr, ptr) + #endif /* IN_HELPER_PROTO */ DEF_HELPER_FLAGS_3(ld_i128, TCG_CALL_NO_WG, i128, env, i64, i32) diff --git a/include/tcg/tcg-op-common.h b/include/tcg/tcg-op-common.h index be382bbf77..2e712f1573 100644 --- a/include/tcg/tcg-op-common.h +++ b/include/tcg/tcg-op-common.h @@ -903,6 +903,12 @@ void tcg_gen_ld_vec(TCGv_vec r, TCGv_ptr base, TCGArg offset); void tcg_gen_st_vec(TCGv_vec r, TCGv_ptr base, TCGArg offset); void tcg_gen_stl_vec(TCGv_vec r, TCGv_ptr base, TCGArg offset, TCGType t); +/* Host <-> guest conversions */ +void tcg_gen_g2h_i32(TCGv_ptr ret, TCGv_i32 arg); +void tcg_gen_g2h_i64(TCGv_ptr ret, TCGv_i64 arg); +void tcg_gen_h2g_i32(TCGv_i32 ret, TCGv_ptr arg); +void tcg_gen_h2g_i64(TCGv_i64 ret, TCGv_ptr arg); + /* Host pointer ops */ #if UINTPTR_MAX == UINT32_MAX @@ -938,6 +944,11 @@ static inline void tcg_gen_addi_ptr(TCGv_ptr r, TCGv_ptr a, intptr_t b) glue(tcg_gen_addi_,PTR)((NAT)r, (NAT)a, b); } +static inline void tcg_gen_subi_ptr(TCGv_ptr r, TCGv_ptr a, intptr_t b) +{ + glue(tcg_gen_subi_, PTR)((NAT)r, (NAT)a, b); +} + static inline void tcg_gen_mov_ptr(TCGv_ptr d, TCGv_ptr s) { glue(tcg_gen_mov_,PTR)((NAT)d, (NAT)s); diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h index 0875971719..7c7fafb1cd 100644 --- a/include/tcg/tcg.h +++ b/include/tcg/tcg.h @@ -35,6 +35,9 @@ #include "tcg-target.h" #include "tcg/tcg-cond.h" #include "tcg/debug-assert.h" +#ifdef CONFIG_USER_ONLY +#include "exec/user/guest-base.h" +#endif /* XXX: make safe guess about sizes */ #define MAX_OP_PER_INSTR 266 @@ -1148,4 +1151,10 @@ static inline const TCGOpcode *tcg_swap_vecop_list(const TCGOpcode *n) bool tcg_can_emit_vecop_list(const TCGOpcode *, TCGType, unsigned); +/* native call */ +void gen_native_call_i32(const char *fun_name, TCGv_i32 ret, + TCGv_i32 arg1, TCGv_i32 arg2, TCGv_i32 arg3); +void gen_native_call_i64(const char *fun_name, TCGv_i64 ret, + TCGv_i64 arg1, TCGv_i64 arg2, TCGv_i64 arg3); + #endif /* TCG_H */ diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 7aadb37756..83e3a5682c 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -2852,3 +2852,143 @@ void tcg_gen_lookup_and_goto_ptr(void) tcg_gen_op1i(INDEX_op_goto_ptr, tcgv_ptr_arg(ptr)); tcg_temp_free_ptr(ptr); } + +#ifdef CONFIG_USER_ONLY +void tcg_gen_g2h_i32(TCGv_ptr ret, TCGv_i32 arg) +{ + TCGv_ptr temp = tcg_temp_new_ptr(); + tcg_gen_ext_i32_ptr(temp, arg); + tcg_gen_addi_ptr(ret, temp, guest_base); + tcg_temp_free_ptr(temp); +} + +void tcg_gen_g2h_i64(TCGv_ptr ret, TCGv_i64 arg) +{ + TCGv_ptr temp = tcg_temp_new_ptr(); + tcg_gen_trunc_i64_ptr(temp, arg); /* Not sure */ + tcg_gen_addi_ptr(ret, temp, guest_base); + tcg_temp_free_ptr(temp); +} + +void tcg_gen_h2g_i32(TCGv_i32 ret, TCGv_ptr arg) +{ + TCGv_ptr temp = tcg_temp_new_ptr(); + tcg_gen_subi_ptr(temp, arg, guest_base); + tcg_gen_trunc_ptr_i32(ret, temp); + tcg_temp_free_ptr(temp); +} + +void tcg_gen_h2g_i64(TCGv_i64 ret, TCGv_ptr arg) +{ + TCGv_ptr temp = tcg_temp_new_ptr(); + tcg_gen_subi_ptr(temp, arg, guest_base); + tcg_gen_extu_ptr_i64(ret, temp); + tcg_temp_free_ptr(temp); +} + +#else +void tcg_gen_g2h_i32(TCGv_ptr ret, TCGv_i32 arg) +{ +} +void tcg_gen_g2h_i64(TCGv_ptr ret, TCGv_i64 arg) +{ +} +void tcg_gen_h2g_i32(TCGv_i32 ret, TCGv_ptr arg) +{ +} +void tcg_gen_h2g_i64(TCGv_i64 ret, TCGv_ptr arg) +{ +} +#endif + +/* p: iptr ; i: i32 ; a: ptr(address) */ +void gen_native_call_i32(const char *fun_name, TCGv_i32 ret, + TCGv_i32 arg1, TCGv_i32 arg2, TCGv_i32 arg3) +{ + TCGv_ptr arg1_ptr = tcg_temp_new_ptr(); + TCGv_ptr arg2_ptr = tcg_temp_new_ptr(); + TCGv_ptr arg3_ptr = tcg_temp_new_ptr(); + TCGv_ptr ret_ptr = tcg_temp_new_ptr(); + tcg_gen_g2h_i32(arg1_ptr, arg1); + if (strcmp(fun_name, "memset") == 0) {/* a aip */ + tcg_gen_ext_i32_ptr(arg3_ptr, arg3); + gen_helper_memset(ret_ptr, arg1_ptr, arg2, arg3_ptr); + goto ret_ptr; + } + tcg_gen_g2h_i32(arg2_ptr, arg2); + if (strcmp(fun_name, "strcpy") == 0) { /* a aa */ + gen_helper_strcpy(ret_ptr, arg1_ptr, arg2_ptr); + goto ret_ptr; + } else if (strcmp(fun_name, "strcat") == 0) { /* a aa */ + gen_helper_strcat(ret_ptr, arg1_ptr, arg2_ptr); + goto ret_ptr; + } else if (strcmp(fun_name, "strcmp") == 0) { /* i aa */ + gen_helper_strcmp(ret, arg1_ptr, arg2_ptr); + } + tcg_gen_ext_i32_ptr(arg3_ptr, arg3); + if (strcmp(fun_name, "memcpy") == 0) { /* a aap */ + gen_helper_memcpy(ret_ptr, arg1_ptr, arg2_ptr, arg3_ptr); + goto ret_ptr; + } else if (strcmp(fun_name, "strncpy") == 0) { /* a aap */ + gen_helper_strncpy(ret_ptr, arg1_ptr, arg2_ptr, arg3_ptr); + goto ret_ptr; + } else if (strcmp(fun_name, "memcmp") == 0) { /* i aap */ + gen_helper_memcmp(ret, arg1_ptr, arg2_ptr, arg3_ptr); + } else if (strcmp(fun_name, "strncmp") == 0) { /* i aap */ + gen_helper_strncmp(ret, arg1_ptr, arg2_ptr, arg3_ptr); + } + return; +ret_ptr: + tcg_gen_h2g_i32(ret, ret_ptr); + return; +} + +void gen_native_call_i64(const char *fun_name, TCGv_i64 ret, + TCGv_i64 arg1, TCGv_i64 arg2, TCGv_i64 arg3) +{ + TCGv_ptr arg1_ptr = tcg_temp_new_ptr(); + TCGv_ptr arg2_ptr = tcg_temp_new_ptr(); + TCGv_ptr arg3_ptr = tcg_temp_new_ptr(); + TCGv_ptr ret_ptr = tcg_temp_new_ptr(); + TCGv_i32 arg2_i32, ret_i32 = tcg_temp_new_i32(); + tcg_gen_g2h_i64(arg1_ptr, arg1); + if (strcmp(fun_name, "memset") == 0) { /* a aip */ + arg2_i32 = tcg_temp_new_i32(); + tcg_gen_extrl_i64_i32(arg2_i32, arg2); + tcg_gen_trunc_i64_ptr(arg3_ptr, arg3); + gen_helper_memset(ret_ptr, arg1_ptr, arg2_i32, arg3_ptr); + goto ret_ptr; + } + tcg_gen_g2h_i64(arg2_ptr, arg2); + if (strcmp(fun_name, "strcpy") == 0) { /* a aa */ + gen_helper_strcpy(ret_ptr, arg1_ptr, arg2_ptr); + goto ret_ptr; + } else if (strcmp(fun_name, "strcat") == 0) { /* a aa */ + gen_helper_strcat(ret_ptr, arg1_ptr, arg2_ptr); + goto ret_ptr; + } else if (strcmp(fun_name, "strcmp") == 0) { /* i aa */ + gen_helper_strcmp(ret_i32, arg1_ptr, arg2_ptr); + goto ret_i32; + } + tcg_gen_trunc_i64_ptr(arg3_ptr, arg3); + if (strcmp(fun_name, "memcpy") == 0) { /* a aap */ + gen_helper_memcpy(ret_ptr, arg1_ptr, arg2_ptr, arg3_ptr); + goto ret_ptr; + } else if (strcmp(fun_name, "strncpy") == 0) { /* a aap */ + gen_helper_strncpy(ret_ptr, arg1_ptr, arg2_ptr, arg3_ptr); + goto ret_ptr; + } else if (strcmp(fun_name, "memcmp") == 0) { /* i aap */ + gen_helper_memcmp(ret_i32, arg1_ptr, arg2_ptr, arg3_ptr); + goto ret_i32; + } else if (strcmp(fun_name, "strncmp") == 0) { /* i aap */ + gen_helper_strncmp(ret_i32, arg1_ptr, arg2_ptr, arg3_ptr); + goto ret_i32; + } + return; +ret_ptr: + tcg_gen_h2g_i64(ret, ret_ptr); + return; +ret_i32: + tcg_gen_extu_i32_i64(ret, ret_i32); + return; +} From patchwork Tue Aug 8 14:17:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818631 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=eNRcKWI9; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwMJ46gwz1yYC for ; Wed, 9 Aug 2023 00:20:28 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYc-0001GW-Q2; Tue, 08 Aug 2023 10:19:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYb-0001GN-JQ for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:33 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYa-0000Ju-2O for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:33 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-1bc63ef9959so24046015ad.2 for ; Tue, 08 Aug 2023 07:19:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504371; x=1692109171; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FQa/+lANshzAG+Ialc3M5x9ofhEssVixSOCCrfqyi5M=; b=eNRcKWI9TkhHXTvuHvMvj13NO5hhvhNwDov/xnlBCF0Ex9adDUY2hIlxUsGJ8bzq8G k7WTtl+6e+wQ9hqFwz/Qe1+BEF1iy0E8i3EFt/Aket6dj7D923flsDvg1v8MyyP4m7pW Yt/JEsWzP71g4QhSDMao32Lzk1ShOm43nTi7F3GFljdld9foHeH9JB+IXgevalk1PMx4 zcG1ig3LIilZajeifd6Uk7tdNUQRFmP1uITkUYm2MU1y3i/RpZlRbgpPJp1MOTQxJHk+ kVU9n9pifKRU6pIPgn5RVmebNwBmY/UZzOldvaTCqBs23hDh0REgb/SQ1HYNdpnrC1cY dBxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504371; x=1692109171; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FQa/+lANshzAG+Ialc3M5x9ofhEssVixSOCCrfqyi5M=; b=eyDLlUEsrfK5+V0ZS6HnhLL/g1ilzJOeUKs8692cC/qF1y96c/rQ9cxYl12so1o8dE TMChcvl2jg5/1l2CrBxIOxijXoAfYTIoPnof3qJKkGvij3EkJJtEPe3LAm9LUdVXUw5C 2bfIW1LnjTeKV2z1MJLALx/flDRoe/s5xF2RvLPw6nw2T5fO8R/wJnaRwWYcxUe/NoF7 heCsdf61H9w3do1j44IBUSIsVu1w83w3FqdMQU/zmdkfy1/IDjCV1/026Z2eyRFXsmJY 3WJWaFZHZl1eORYB3d5ZWh8DwDVKTk9/xXJC+ccZZSBPBqkFza43dKGXSwKap2i5Ar5C Y44Q== X-Gm-Message-State: AOJu0YyYBW5kl0V8QT2v/kH0ak9M896KE8SFVbgKBExYo2KBQFN8IvJM SM9lrZFDHn3dyM7yJQuINTQ= X-Google-Smtp-Source: AGHT+IGSsKoajrk9YL3I7O1dOJEuxnuv7pDBEX60/UkX1EfA3Lei9DHdaqVpLClTF5CerMGKHwhIeA== X-Received: by 2002:a17:902:ea09:b0:1bb:7b6c:983a with SMTP id s9-20020a170902ea0900b001bb7b6c983amr14272862plg.59.1691504370936; Tue, 08 Aug 2023 07:19:30 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:30 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu , Laurent Vivier , Paolo Bonzini , Eduardo Habkost Subject: [RFC v4 07/11] target/i386: Add support for native library calls Date: Tue, 8 Aug 2023 22:17:35 +0800 Message-Id: <20230808141739.3110740-8-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This commit introduces support for native library calls on the i386 target. When special instructions reserved for native calls are encountered, the code now performs address translation and generates the corresponding native call. Signed-off-by: Yeqi Fu --- configs/targets/i386-linux-user.mak | 1 + configs/targets/x86_64-linux-user.mak | 1 + target/i386/tcg/translate.c | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/configs/targets/i386-linux-user.mak b/configs/targets/i386-linux-user.mak index 5b2546a430..2d8bca8f93 100644 --- a/configs/targets/i386-linux-user.mak +++ b/configs/targets/i386-linux-user.mak @@ -2,3 +2,4 @@ TARGET_ARCH=i386 TARGET_SYSTBL_ABI=i386 TARGET_SYSTBL=syscall_32.tbl TARGET_XML_FILES= gdb-xml/i386-32bit.xml +CONFIG_NATIVE_CALL=y diff --git a/configs/targets/x86_64-linux-user.mak b/configs/targets/x86_64-linux-user.mak index 9ceefbb615..a53b017454 100644 --- a/configs/targets/x86_64-linux-user.mak +++ b/configs/targets/x86_64-linux-user.mak @@ -3,3 +3,4 @@ TARGET_BASE_ARCH=i386 TARGET_SYSTBL_ABI=common,64 TARGET_SYSTBL=syscall_64.tbl TARGET_XML_FILES= gdb-xml/i386-64bit.xml +CONFIG_NATIVE_CALL=y diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 90c7b32f36..28bf4477fb 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -33,6 +33,7 @@ #include "helper-tcg.h" #include "exec/log.h" +#include "native/native.h" #define HELPER_H "helper.h" #include "exec/helper-info.c.inc" @@ -6810,6 +6811,32 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) case 0x1d0 ... 0x1fe: disas_insn_new(s, cpu, b); break; + case 0x1ff: + if (native_bypass_enabled()) { + TCGv ret = tcg_temp_new(); + TCGv arg1 = tcg_temp_new(); + TCGv arg2 = tcg_temp_new(); + TCGv arg3 = tcg_temp_new(); + const char *fun_name = lookup_symbol((s->base.pc_next) & 0xfff); +#ifdef TARGET_X86_64 + tcg_gen_mov_tl(arg1, cpu_regs[R_EDI]); + tcg_gen_mov_tl(arg2, cpu_regs[R_ESI]); + tcg_gen_mov_tl(arg3, cpu_regs[R_EDX]); + gen_native_call_i64(fun_name, ret, arg1, arg2, arg3); +#else + uintptr_t ra = GETPC(); + uint32_t a1 = cpu_ldl_data_ra(env, env->regs[R_ESP] + 4, ra); + uint32_t a2 = cpu_ldl_data_ra(env, env->regs[R_ESP] + 8, ra); + uint32_t a3 = cpu_ldl_data_ra(env, env->regs[R_ESP] + 12, ra); + tcg_gen_movi_tl(arg1, a1); + tcg_gen_movi_tl(arg2, a2); + tcg_gen_movi_tl(arg3, a3); + gen_native_call_i32(fun_name, ret, arg1, arg2, arg3); +#endif + tcg_gen_mov_tl(cpu_regs[R_EAX], ret); + break; + } + break; default: goto unknown_op; } From patchwork Tue Aug 8 14:17:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818629 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=DjPDKkCY; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwLq0swNz1yYl for ; Wed, 9 Aug 2023 00:20:02 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYj-0001H3-4q; Tue, 08 Aug 2023 10:19:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYh-0001Gu-Ci for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:39 -0400 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYf-0000Kv-Qn for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:39 -0400 Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-1bb84194bf3so37314275ad.3 for ; Tue, 08 Aug 2023 07:19:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504376; x=1692109176; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WP5X3yCy/F02UfY2IJEZNxNCZRfNcnMSpoz9Z2/i/O0=; b=DjPDKkCYUrLbCi3qVOlSJpUQ6MH4oxO+uWmqHQ+3G73C8vfHV4l/X2crQqxR9KJTHs kqLhOhwuX6ifJPOuPug6uclbJ5Qj6ktLQAgw2Y+NorXhLlApgHtNwo0O4+KjlVMDj+kQ ehXjlEndlX+7z/PZeuD+zoyIX1QqM4fDqhOQa6FVgM82EK7igag9QswGmwLgfDUrTF87 hknskbn8K4UxS/EgFpa15npy+lZy8s69JLGJJxHmSa2PS8dxhOmhPmQr3InzWBacdMEI FTy9rx/ig+4ZwnUbJM/jKYHeBB7DyNiI+DbV4Txva+Fnu9FAlyArUhJQaWpjGSIBKKFn 95Xw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504376; x=1692109176; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WP5X3yCy/F02UfY2IJEZNxNCZRfNcnMSpoz9Z2/i/O0=; b=dlm79IzlpaYaqW+Dpog9xwSM1E6Vl1cy+uI31hTp9tX6ZySAQhWewgw+cAbLZ8bDop hCYyHDdbib2G6inEwjK9+Xb/6Y3bFVtXixphWQNxwibns9srtHwKBLp1nQYa2x1P/pSe 2GtjhXeELpvkggKr+jIGAlb5ijBzpKS30o1v6EK2+3qtSYLqfr23bE2AllgSY3TaSe0I RRhtL0n1sEmbEsOe7itWonv3eVhHiTGuVIep4Bv6noJY6Bdf8PDtqzJ0GveYvhKP+dfw Y/VLW0D2BWQa08eYhvBXxc8DnBAGhFCoioFwld3XAmgvIuuzRKrQaf9LdUZVPr6BUSMm ukxg== X-Gm-Message-State: AOJu0Yx1lU3uWR0uadWIzUnX/wnjf4svxuqYdhpn9xWDCcPmnvAuVgAO VRClWZ0c31LJABcS8q9Qzhk= X-Google-Smtp-Source: AGHT+IE5ZaWCfvmAmuZTBgI/nHMnBXeXe1R1RtofICQ3orHjer1jyiUkCvogs8/5v0s2gRz5NRISeQ== X-Received: by 2002:a17:902:7683:b0:1bb:141c:3034 with SMTP id m3-20020a170902768300b001bb141c3034mr11812569pll.12.1691504376306; Tue, 08 Aug 2023 07:19:36 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:36 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu , Laurent Vivier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Jiaxun Yang , Aurelien Jarno , Aleksandar Rikalo Subject: [RFC v4 08/11] target/mips: Add support for native library calls Date: Tue, 8 Aug 2023 22:17:36 +0800 Message-Id: <20230808141739.3110740-9-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::636; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x636.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This commit introduces support for native library calls on the mips target. When special instructions reserved for native calls are encountered, the code now performs address translation and generates the corresponding native call. Signed-off-by: Yeqi Fu --- configs/targets/mips-linux-user.mak | 1 + configs/targets/mips64-linux-user.mak | 1 + target/mips/tcg/translate.c | 21 ++++++++++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/configs/targets/mips-linux-user.mak b/configs/targets/mips-linux-user.mak index b4569a9893..fa005d487a 100644 --- a/configs/targets/mips-linux-user.mak +++ b/configs/targets/mips-linux-user.mak @@ -3,3 +3,4 @@ TARGET_ABI_MIPSO32=y TARGET_SYSTBL_ABI=o32 TARGET_SYSTBL=syscall_o32.tbl TARGET_BIG_ENDIAN=y +CONFIG_NATIVE_CALL=y diff --git a/configs/targets/mips64-linux-user.mak b/configs/targets/mips64-linux-user.mak index d2ff509a11..ecfe6bcf73 100644 --- a/configs/targets/mips64-linux-user.mak +++ b/configs/targets/mips64-linux-user.mak @@ -4,3 +4,4 @@ TARGET_BASE_ARCH=mips TARGET_SYSTBL_ABI=n64 TARGET_SYSTBL=syscall_n64.tbl TARGET_BIG_ENDIAN=y +CONFIG_NATIVE_CALL=y diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c index 74af91e4f5..51a5c1d49b 100644 --- a/target/mips/tcg/translate.c +++ b/target/mips/tcg/translate.c @@ -36,6 +36,7 @@ #include "exec/helper-info.c.inc" #undef HELPER_H +#include "native/native.h" /* * Many sysemu-only helpers are not reachable for user-only. @@ -13487,7 +13488,7 @@ static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx) static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx) { int rs, rt, rd, sa; - uint32_t op1; + uint32_t op1, sig; rs = (ctx->opcode >> 21) & 0x1f; rt = (ctx->opcode >> 16) & 0x1f; @@ -13583,6 +13584,24 @@ static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx) #endif break; case OPC_SYSCALL: + sig = (ctx->opcode) >> 6; + if ((sig == 0xffff) && native_bypass_enabled()) { + TCGv arg1 = tcg_temp_new(); + TCGv arg2 = tcg_temp_new(); + TCGv arg3 = tcg_temp_new(); + TCGv ret = tcg_temp_new(); + const char *fun_name = lookup_symbol((ctx->base.pc_next) & 0xfff); + tcg_gen_mov_tl(arg1, cpu_gpr[4]); + tcg_gen_mov_tl(arg2, cpu_gpr[5]); + tcg_gen_mov_tl(arg3, cpu_gpr[6]); +#if defined(TARGET_MIPS64) + gen_native_call_i64(fun_name, ret, arg1, arg2, arg3); +#else + gen_native_call_i32(fun_name, ret, arg1, arg2, arg3); +#endif + tcg_gen_mov_tl(cpu_gpr[2], ret); + break; + } generate_exception_end(ctx, EXCP_SYSCALL); break; case OPC_BREAK: From patchwork Tue Aug 8 14:17:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818633 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=QIrgOx3Q; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwMc2Vv9z1yYC for ; Wed, 9 Aug 2023 00:20:44 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYo-0001Hp-AL; Tue, 08 Aug 2023 10:19:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYm-0001HP-Ta; Tue, 08 Aug 2023 10:19:44 -0400 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYl-0000Oz-8Z; Tue, 08 Aug 2023 10:19:44 -0400 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-1bc83a96067so4075485ad.0; Tue, 08 Aug 2023 07:19:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504381; x=1692109181; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mf2N6SezX4W3DKkhSHLdtBmZLWd1QdX4LdESVzPnYbo=; b=QIrgOx3QmetwrI/AsEqyVSIGu3U5LKvGC0y/4Ots6XzUyKv6ugBd6jz/IEvP03knRZ Yzw9TrXirpQEy0itWF5lleJN9Og+bg1FTD0uxi76mDYY8ccmnsmpTdS5Q6G8bmPEjgzr r4LKIYgCuxG3c1eY/bnBLWxWMG1mvALCxK1zwfqU9ZRFp4P96oAHbR+KrR/mBSJcsUCU ZJAiEQb7YwPjaXAI4r1P2NYVg8o/uR0j/3yVsqACYR4fEZftpVlqldSgCg0mG+ur7E/9 6stk47FGwNSVCQ+BeTDYx38FpRcJwvHPQ9S2YYOIQRJNcpO2YZUlE5+ancvWKbjmwSyZ EuiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504381; x=1692109181; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mf2N6SezX4W3DKkhSHLdtBmZLWd1QdX4LdESVzPnYbo=; b=HDoTa9ieFz9zK9vj/99LDKjmbl4MeV1DF6t38W6TTWaS0OUu2TPLbocWmLd+hSW/sN D57YOAHjNbd/YkpQ8URCQPjoaZDq4uQu0lfQEajhMQpMQN2EajEzf9Pln3IEm14DTUbv ddWTeW7Cgq2U3uxmzNl0MPAKc5sCe9HWzvOi4rQ6DJMC+xvKUYUBa0fZdbRYnA2A7aYp lixm4R3ObBdSJLDktP0diXqydurItlHMDUAVXztXyiFua8/7h+r3osw6ornDpso71GK2 aCseflxst54Fgs0Ep9ixlpyP33Nqq3ZT435Y0rVvI0990YUxtANqsOmoqfNHANyMm5Ag A+Iw== X-Gm-Message-State: AOJu0YyJ4UqqdgzVb0C3axiwWsf8COMjcBHZtsz2ZuN2YBHtyYkonPxs Nv54ZANq5bfFnnxykRBh33j3q1zwXv3Qc6sT X-Google-Smtp-Source: AGHT+IF5r0w7UHfokoRrcnZ3Ohll5jr5lhOigingkY1h78bNSaGTyYwKqJR/OaVGyhPqycbUaI4dmQ== X-Received: by 2002:a17:903:22c6:b0:1bc:6707:f451 with SMTP id y6-20020a17090322c600b001bc6707f451mr6712771plg.42.1691504381474; Tue, 08 Aug 2023 07:19:41 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:41 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu , Laurent Vivier , Peter Maydell , qemu-arm@nongnu.org (open list:ARM TCG CPUs) Subject: [RFC v4 09/11] target/arm: Add support for native library calls Date: Tue, 8 Aug 2023 22:17:37 +0800 Message-Id: <20230808141739.3110740-10-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::633; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This commit introduces support for native library calls on the arm target. When special instructions reserved for native calls are encountered, the code now performs address translation and generates the corresponding native call. Signed-off-by: Yeqi Fu --- configs/targets/aarch64-linux-user.mak | 1 + configs/targets/arm-linux-user.mak | 1 + target/arm/tcg/translate-a64.c | 14 ++++++++++++++ target/arm/tcg/translate.c | 11 +++++++++++ 4 files changed, 27 insertions(+) diff --git a/configs/targets/aarch64-linux-user.mak b/configs/targets/aarch64-linux-user.mak index ba8bc5fe3f..5a8fd98cd9 100644 --- a/configs/targets/aarch64-linux-user.mak +++ b/configs/targets/aarch64-linux-user.mak @@ -4,3 +4,4 @@ TARGET_XML_FILES= gdb-xml/aarch64-core.xml gdb-xml/aarch64-fpu.xml gdb-xml/aarch TARGET_HAS_BFLT=y CONFIG_SEMIHOSTING=y CONFIG_ARM_COMPATIBLE_SEMIHOSTING=y +CONFIG_NATIVE_CALL=y diff --git a/configs/targets/arm-linux-user.mak b/configs/targets/arm-linux-user.mak index 7f5d65794c..f934fb82da 100644 --- a/configs/targets/arm-linux-user.mak +++ b/configs/targets/arm-linux-user.mak @@ -5,3 +5,4 @@ TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml TARGET_HAS_BFLT=y CONFIG_SEMIHOSTING=y CONFIG_ARM_COMPATIBLE_SEMIHOSTING=y +CONFIG_NATIVE_CALL=y diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c index 3baab6aa60..422d943f92 100644 --- a/target/arm/tcg/translate-a64.c +++ b/target/arm/tcg/translate-a64.c @@ -25,6 +25,7 @@ #include "arm_ldst.h" #include "semihosting/semihost.h" #include "cpregs.h" +#include "native/native.h" static TCGv_i64 cpu_X[32]; static TCGv_i64 cpu_pc; @@ -2400,6 +2401,19 @@ static bool trans_HLT(DisasContext *s, arg_i *a) * it is required for halting debug disabled: it will UNDEF. * Secondly, "HLT 0xf000" is the A64 semihosting syscall instruction. */ + if (native_bypass_enabled() && (a->imm == 0xffff)) { + TCGv_i64 arg1 = tcg_temp_new_i64(); + TCGv_i64 arg2 = tcg_temp_new_i64(); + TCGv_i64 arg3 = tcg_temp_new_i64(); + TCGv_i64 ret = tcg_temp_new_i64(); + const char *fun_name = lookup_symbol((s->base.pc_next) & 0xfff); + tcg_gen_mov_i64(arg1, cpu_reg(s, 0)); + tcg_gen_mov_i64(arg2, cpu_reg(s, 1)); + tcg_gen_mov_i64(arg3, cpu_reg(s, 2)); + gen_native_call_i64(fun_name, ret, arg1, arg2, arg3); + tcg_gen_mov_i64(cpu_reg(s, 0), ret); + return true; + } if (semihosting_enabled(s->current_el == 0) && a->imm == 0xf000) { gen_exception_internal_insn(s, EXCP_SEMIHOST); } else { diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c index 13c88ba1b9..a095ebcea6 100644 --- a/target/arm/tcg/translate.c +++ b/target/arm/tcg/translate.c @@ -27,6 +27,7 @@ #include "arm_ldst.h" #include "semihosting/semihost.h" #include "cpregs.h" +#include "native/native.h" #include "exec/helper-proto.h" #define HELPER_H "helper.h" @@ -1139,6 +1140,16 @@ static inline void gen_hlt(DisasContext *s, int imm) * semihosting, to provide some semblance of security * (and for consistency with our 32-bit semihosting). */ + if (native_bypass_enabled() && (imm == 0xffff)) { + TCGv_i32 arg1 = load_reg(s, 0); + TCGv_i32 arg2 = load_reg(s, 1); + TCGv_i32 arg3 = load_reg(s, 2); + TCGv_i32 ret = tcg_temp_new_i32(); + const char *fun_name = lookup_symbol((s->base.pc_next) & 0xfff); + gen_native_call_i32(fun_name, ret, arg1, arg2, arg3); + store_reg(s, 0, ret); + return; + } if (semihosting_enabled(s->current_el == 0) && (imm == (s->thumb ? 0x3c : 0xf000))) { gen_exception_internal_insn(s, EXCP_SEMIHOST); From patchwork Tue Aug 8 14:17:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818634 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=I5agK3QE; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwN32f3Qz1yYC for ; Wed, 9 Aug 2023 00:21:07 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYr-0001L4-No; Tue, 08 Aug 2023 10:19:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYq-0001Kq-BT for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:48 -0400 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYo-0000Ra-Od for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:48 -0400 Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-686b9920362so3840039b3a.1 for ; Tue, 08 Aug 2023 07:19:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504385; x=1692109185; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=m8X/U9yzOHTgapxb29qT1DD+OGFIOVrJO+35tPcxDbA=; b=I5agK3QEuKQfPbj+FQUfwL/8aXrTvksdCC8ZFKbp/BiN2cUAQrdu8yMv/Uf7KYmFF8 153F1UJoM0WlVtXIxSpy0pjDXvIOQCh861ulwEApT/qjH8Jm4c5A6ET/tXm7VyS1cg7Y V6qysRx/Oe5fMxo4AST/MmJyqDuT1z+EscHrBz9eUiWC65LZ+OdGwpoH+fVo8pDEXQxh UF/qaAJSIV+Tp/XvOaun3SQzcQ7kauC87Ca5IIAnqrllJ1i1CITxUbO8OW4uSO/vkx2Q b4mPg5jjoQWr23KUN1Ww8cNJmzF+dritk/O1DBmoIjrzeg7Lxh1Gx9Plt7q4b7kC+CHR X5gA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504385; x=1692109185; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=m8X/U9yzOHTgapxb29qT1DD+OGFIOVrJO+35tPcxDbA=; b=DqQI+iX9YlUZ9iH/JH6rH/36Y5qoAKFf8TJ5lecFZ+m2uAnCYCc5ihui8EKKwhEAxZ V+tZ4Kyx/uu+1Uyof+MabjCw8QzH6imqm0cI8wYKnz9vmcuBlU89r+SftHlcz4hBmGqO drlDL5h+0DTV0Q0n4BlQx+qI83ORDmHAEghWV07Sxw6O0c+wS+NfLr0oUdPmOtohuMW2 Wp2tpmEBW4+dlrMAWYaGXSY1IUrWmOmcO3zFEHCfNg5h3hkT5m1M4A67kgoknOScbue/ T2pAPHDEVuZ5BT0J+Wtn3FF27BlIrhOInaAlJZbJlydndMNDletxBXCOvDKBSk33AK+o bSeg== X-Gm-Message-State: AOJu0YwxAGXFSvrlge5TzxmGFrhHc52bwk4EXg94FOV+esYYcgmDoRDe pqXe3mr4rhueRShdx7VbeycJ/55Kn7WSdmQh X-Google-Smtp-Source: AGHT+IHzOb8xgzfgVfLYwcVU7QCXQHtRSutc7oT5xEBTMGYjXZTIjUk6HTNizNNdvC3NTXxRXI/o/A== X-Received: by 2002:a17:903:2281:b0:1bb:c5b5:8353 with SMTP id b1-20020a170903228100b001bbc5b58353mr11652023plh.4.1691504385506; Tue, 08 Aug 2023 07:19:45 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:45 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu Subject: [RFC v4 10/11] tests/tcg/multiarch: Add nativecall.c test Date: Tue, 8 Aug 2023 22:17:38 +0800 Message-Id: <20230808141739.3110740-11-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::434; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pf1-x434.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Introduce a new test for native calls to ensure their functionality. The process involves cross-compiling the test cases, building them as dynamically linked binaries, and running these binaries which necessitates the addition of the appropriate interpreter prefix. Signed-off-by: Yeqi Fu --- tests/tcg/multiarch/Makefile.target | 17 +++++ tests/tcg/multiarch/native/nativecall.c | 98 +++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 tests/tcg/multiarch/native/nativecall.c diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target index 43bddeaf21..5231df34ba 100644 --- a/tests/tcg/multiarch/Makefile.target +++ b/tests/tcg/multiarch/Makefile.target @@ -138,5 +138,22 @@ run-plugin-semiconsole-with-%: TESTS += semihosting semiconsole endif +nativecall: native/nativecall.c + $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(filter-out -static,$(LDFLAGS)) + +ifneq ($(LD_PREFIX),) +ifneq ($(wildcard $(LIBNATIVE)),) +run-nativecall: nativecall + $(call run-test,$<, $(QEMU) -L $(LD_PREFIX) --native-bypass $(LIBNATIVE) $<, "nativecall") +else +run-nativecall: nativecall + $(call skip-test, $<, "no native library found") +endif +else +run-nativecall: nativecall + $(call skip-test, $<, "no elf interpreter prefix found") +endif +EXTRA_RUNS += run-nativecall + # Update TESTS TESTS += $(MULTIARCH_TESTS) diff --git a/tests/tcg/multiarch/native/nativecall.c b/tests/tcg/multiarch/native/nativecall.c new file mode 100644 index 0000000000..d3f6f49ed0 --- /dev/null +++ b/tests/tcg/multiarch/native/nativecall.c @@ -0,0 +1,98 @@ +#include +#include +#include +#include +#include + +void compare_memory(const void *a, const void *b, size_t n) +{ + const unsigned char *p1 = a; + const unsigned char *p2 = b; + for (size_t i = 0; i < n; i++) { + assert(p1[i] == p2[i]); + } +} + +void test_memcpy() +{ + char src[] = "Hello, world!"; + char dest[20]; + memcpy(dest, src, 13); + compare_memory(dest, src, 13); +} + +void test_strncpy() +{ + char src[] = "Hello, world!"; + char dest[20]; + strncpy(dest, src, 13); + compare_memory(dest, src, 13); +} + +void test_strcpy() +{ + char src[] = "Hello, world!"; + char dest[20]; + strcpy(dest, src); + compare_memory(dest, src, 13); +} + +void test_strcat() +{ + char src[20] = "Hello, "; + char dst[] = "world!"; + char str[] = "Hello, world!"; + strcat(src, dest); + compare_memory(src, str, 13); +} + +void test_memcmp() +{ + char str1[] = "abc"; + char str2[] = "abc"; + char str3[] = "def"; + assert(memcmp(str1, str2, 3) == 0); + assert(memcmp(str1, str3, 3) != 0); +} + +void test_strncmp() +{ + char str1[] = "abc"; + char str2[] = "abc"; + char str3[] = "def"; + assert(strncmp(str1, str2, 2) == 0); + assert(strncmp(str1, str3, 2) != 0); +} + +void test_strcmp() +{ + char str1[] = "abc"; + char str2[] = "abc"; + char str3[] = "def"; + assert(strcmp(str1, str2) == 0); + assert(strcmp(str1, str3) != 0); +} + +void test_memset() +{ + char buffer[10]; + memset(buffer, 'A', 10); + int i; + for (i = 0; i < 10; i++) { + assert(buffer[i] == 'A'); + } +} + +int main() +{ + test_memset(); + test_memcpy(); + test_strncpy(); + test_memcmp(); + test_strncmp(); + test_strcpy(); + test_strcmp(); + test_strcat(); + + return EXIT_SUCCESS; +} From patchwork Tue Aug 8 14:17:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yeqi Fu X-Patchwork-Id: 1818632 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20221208 header.b=e17Q11Ky; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RKwMM20dGz1yYC for ; Wed, 9 Aug 2023 00:20:31 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qTNYz-0001M5-IP; Tue, 08 Aug 2023 10:19:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qTNYu-0001Ld-HV for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:53 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qTNYs-0000VA-Tk for qemu-devel@nongnu.org; Tue, 08 Aug 2023 10:19:52 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-1b9c5e07c1bso50885855ad.2 for ; Tue, 08 Aug 2023 07:19:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691504390; x=1692109190; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vuQ2Qkfj6B3zA1uyx3Q0Q6mG7A7//D96fP1uqBR5p/8=; b=e17Q11KyGXTeKFPK1QOLHSJwvEVtlOXvkqlQUTOlXn3mrLbzFqgq63dkYvjwYYwGQg yAv3Nb8M0e817YIrpZrKqwcRTd+ef4y4Df7PMUWkKiLTrEsS9Lqp6/jY9EcSYIe+LGbE aW7nYu1IDwMqUKmslytOv4dWODEd2ZcNzKTqqqZgadl45ulBVVgp1lHKtvVK9COft2GK 7RIa/bSNWpNMXCU0+jKPMopeBtFiRUFZc7xaSYRoyNJCdTrEP16ZWB/vSVklEcdj4VJC nbfU3nba8AMvxhpRBbAZ6/YIoiZcvglYrR2SPhmHWcEIP007fQiNQrkqpXoKDIIqC6lN 6w3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691504390; x=1692109190; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vuQ2Qkfj6B3zA1uyx3Q0Q6mG7A7//D96fP1uqBR5p/8=; b=F+AtbKsb5K1CqiweN0I8e2zntDIItCUw0O7J43NB95OSVknK9o9c5/zg8nKmgLjlSq oelTvrBt1B45fIt6pT3I02H4E2/RU+omb4ROTi4Dqc7R9oA6X/Rim134JMBZ8A2qVhZq UMIqRGftzpGEFTOItYeu1PWrCnjdv1o1oyyREE1DFKGp3oR7iCF/Tpx2G0EPD1OsYXeh 8/xEnSPy7FUuuHJ793MJ9xaJlH9QGeE79R7MovS2lA69Ux5MkrUVolYLHNHSgDuH5W69 d1K3+y+sETVujHXfrX/gZk+BMdiSN5oOzemHRHzLaopLkKg4ctpqZCxiULhB6kyYgLVu 2CAw== X-Gm-Message-State: AOJu0YwZTc1tx0Bi6AlnvLmJx09vfE4A2vmdC+W8+ialRpLUeh35jw5t E+RJ3Vv8l+IbmK/cTMTrw3PCC0UWZ5c0zFk9 X-Google-Smtp-Source: AGHT+IHK+WBxU8zzO1B2I6B1hbv6Bz50yFqt55plcWiCMAWVtJBM0vdFu8k8iTQ7PBhho7LP1iLzXA== X-Received: by 2002:a17:902:dad1:b0:1b8:6987:de84 with SMTP id q17-20020a170902dad100b001b86987de84mr16354252plx.48.1691504389643; Tue, 08 Aug 2023 07:19:49 -0700 (PDT) Received: from localhost.localdomain ([223.104.41.22]) by smtp.gmail.com with ESMTPSA id c3-20020a170902b68300b001bb1f0605b2sm9043985pls.214.2023.08.08.07.19.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 07:19:49 -0700 (PDT) From: Yeqi Fu To: alex.bennee@linaro.org Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org, Yeqi Fu Subject: [RFC v4 11/11] docs/user: Add doc for native library calls Date: Tue, 8 Aug 2023 22:17:39 +0800 Message-Id: <20230808141739.3110740-12-fufuyqqqqqq@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> References: <20230808141739.3110740-1-fufuyqqqqqq@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=fufuyqqqqqq@gmail.com; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HK_RANDOM_ENVFROM=0.001, HK_RANDOM_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Yeqi Fu Reviewed-by: Emmanouil Pitsidianakis --- docs/user/index.rst | 1 + docs/user/native_calls.rst | 90 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 docs/user/native_calls.rst diff --git a/docs/user/index.rst b/docs/user/index.rst index 782d27cda2..d3fc9b7af1 100644 --- a/docs/user/index.rst +++ b/docs/user/index.rst @@ -12,3 +12,4 @@ processes compiled for one CPU on another CPU. :maxdepth: 2 main + native_calls diff --git a/docs/user/native_calls.rst b/docs/user/native_calls.rst new file mode 100644 index 0000000000..c4b854096a --- /dev/null +++ b/docs/user/native_calls.rst @@ -0,0 +1,90 @@ +Native Library Calls Optimization +================================= + +Description +----------- + +Executing a program under QEMU's user mode subjects the entire +program, including all library calls, to translation. It's important +to understand that many of these library functions are optimized +specifically for the guest architecture. Therefore, their +translation might not yield the most efficient execution. + +When the semantics of a library function are well defined, we can +capitalize on this by substituting the translated version with a call +to the native equivalent function. + +To achieve tangible results, focus should be given to functions such +as memory-related ('mem*') and string-related ('str*') functions. +These subsets of functions often have the most significant effect +on overall performance, making them optimal candidates for +optimization. + +Implementation +-------------- + +Upon setting the LD_PRELOAD environment variable, the dynamic linker +will load the library specified in LD_PRELOAD preferentially. If there +exist functions in the LD_PRELOAD library that share names with those +in other libraries, they will override the corresponding functions in +those other libraries. + +To implement native library bypass, we created a shared library and +re-implemented the native functions within it as a special +instruction sequence. By means of the LD_PRELOAD environment +variable, we load this shared library into the user program. +Therefore, when the user program calls a native function, it actually +executes this special instruction sequence. During execution, QEMU's +translator captures these special instructions and executes the +corresponding native functions. + +These special instructions are implemented using +architecture-specific unused or invalid opcodes, ensuring that they +do not conflict with existing instructions. + + +i386 and x86_64 +--------------- +An unused instruction is utilized to mark a native call. + +arm and aarch64 +--------------- +HLT is an invalid instruction for userspace and usefully has 16 +bits of spare immeadiate data which we can stuff data in. + +mips and mips64 +--------------- +The syscall instruction contains 20 unused bits, which are typically +set to 0. These bits can be used to store non-zero data, +distinguishing them from a regular syscall instruction. + +Usage +----- + +1. Install cross-compilation tools + +Cross-compilation tools are required to build the shared libraries +that can hook the necessary library functions. For example, a viable +command on Ubuntu is: + +:: + + apt install gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu \ + gcc-mips-linux-gnu gcc-mips64-linux-gnuabi64 + + +2. Locate the compiled libnative.so + +After compilation, the libnative.so file can be found in the +``./build/common-user/native/-linux-user`` directory. + +3. Run the program with the ``--native-bypass`` option + +To run your program with native library bypass, use the +``--native-bypass`` option to import libnative.so: + +:: + + qemu- --native-bypass \ + ./build/common-user/native/-linux-user/libnative.so ./program +