From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 95670C433F5 for ; Tue, 21 Dec 2021 16:35:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239824AbhLUQfw (ORCPT ); Tue, 21 Dec 2021 11:35:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237679AbhLUQfv (ORCPT ); Tue, 21 Dec 2021 11:35:51 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1DEB1C06173F; Tue, 21 Dec 2021 08:35:51 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id DDE0CB8160F; Tue, 21 Dec 2021 16:35:49 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2F16BC36AEA; Tue, 21 Dec 2021 16:35:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104548; bh=SmCMwMB6mifMZHjrcjCqP+LFszJlcLxeNHrU1HuSk/I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UxRGiRlaQYSsTlirDmwYntSHHymyhgcC8AEnnu17ddJvJItWTlnsohLSeBfvgi+2e SQDarQX8FFipDnFLitVcZdC+7AeK9C6K1fiUlN3sIVWeYaF5vFwaRnk4x1RzvPbEAw lbP5XOXe8vdyk/to4wXp/B2kzH4JkeKORiTpiretHXyebtBygeefjYA660rFFgMABM p2VJ3hK91g+Mmv4E+Nq6qmDQbfepgEgvq4b8B+RQl0unfXXlkJwW0YY1IdRXm2f1DK yg998nApFn5uY9rD2neBOes7Xw+Zwz2rZ2NIbUYwfdw3X2icgtbR0QBlgTdrNyOhR3 WLrTutABc8XqA== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 01/13] syscalls: compat: Fix the missing part for __SYSCALL_COMPAT Date: Wed, 22 Dec 2021 00:35:20 +0800 Message-Id: <20211221163532.2636028-2-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Make "uapi asm unistd.h" could be used for architectures' COMPAT mode. The __SYSCALL_COMPAT is first used in riscv. Signed-off-by: Guo Ren --- include/uapi/asm-generic/unistd.h | 4 ++-- tools/include/uapi/asm-generic/unistd.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/u= nistd.h index 4557a8b6086f..aafe5cfeb27c 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -383,7 +383,7 @@ __SYSCALL(__NR_syslog, sys_syslog) =20 /* kernel/ptrace.c */ #define __NR_ptrace 117 -__SYSCALL(__NR_ptrace, sys_ptrace) +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) =20 /* kernel/sched/core.c */ #define __NR_sched_setparam 118 @@ -779,7 +779,7 @@ __SYSCALL(__NR_rseq, sys_rseq) #define __NR_kexec_file_load 294 __SYSCALL(__NR_kexec_file_load, sys_kexec_file_load) /* 295 through 402 are unassigned to sync up with generic numbers, don't u= se */ -#if __BITS_PER_LONG =3D=3D 32 +#if defined(__SYSCALL_COMPAT) || __BITS_PER_LONG =3D=3D 32 #define __NR_clock_gettime64 403 __SYSCALL(__NR_clock_gettime64, sys_clock_gettime) #define __NR_clock_settime64 404 diff --git a/tools/include/uapi/asm-generic/unistd.h b/tools/include/uapi/a= sm-generic/unistd.h index 4557a8b6086f..aafe5cfeb27c 100644 --- a/tools/include/uapi/asm-generic/unistd.h +++ b/tools/include/uapi/asm-generic/unistd.h @@ -383,7 +383,7 @@ __SYSCALL(__NR_syslog, sys_syslog) =20 /* kernel/ptrace.c */ #define __NR_ptrace 117 -__SYSCALL(__NR_ptrace, sys_ptrace) +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) =20 /* kernel/sched/core.c */ #define __NR_sched_setparam 118 @@ -779,7 +779,7 @@ __SYSCALL(__NR_rseq, sys_rseq) #define __NR_kexec_file_load 294 __SYSCALL(__NR_kexec_file_load, sys_kexec_file_load) /* 295 through 402 are unassigned to sync up with generic numbers, don't u= se */ -#if __BITS_PER_LONG =3D=3D 32 +#if defined(__SYSCALL_COMPAT) || __BITS_PER_LONG =3D=3D 32 #define __NR_clock_gettime64 403 __SYSCALL(__NR_clock_gettime64, sys_clock_gettime) #define __NR_clock_settime64 404 --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 661D4C433EF for ; Tue, 21 Dec 2021 16:36:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239829AbhLUQf4 (ORCPT ); Tue, 21 Dec 2021 11:35:56 -0500 Received: from dfw.source.kernel.org ([139.178.84.217]:58700 "EHLO dfw.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239831AbhLUQfz (ORCPT ); Tue, 21 Dec 2021 11:35:55 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2429861687; Tue, 21 Dec 2021 16:35:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 85005C36AEC; Tue, 21 Dec 2021 16:35:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104554; bh=37IMHVJWT8iFSW/Zorv/QJp1kD8U97EWQ2fm9ilMpcc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VfEInCc2gJ4DYuWbzUYNrwXfVQGQjJAMy91gcX96jrWtFEc29ZVC7UnokxDKgBzSh a9x1wEB96ZmjCL7OfQKIgr/f5kSzJe3XqtPnT596EG6n99f8KjhHvHWVBbWQKFbXle rfRv98Icm3wXYg/4FvFUlNNQwHRqPuJYRQ7lbiJzPf61nWstQBQOyfNeGPL/T5MeyT 79zCVZ+79QIGx5KwYAwSQLFvxgIfK7CJSTWEDjLIw3j6RwKKAUNK1QQpvY9dqadVsf 6uB85ssbwsCR2zticdQLEcnTtdB7XkwxhYSSDO1GfwhJpyShJS+XVjdI172ra2x/kQ Lf7h36qQ+L9HA== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 02/13] riscv: Fixup difference with defconfig Date: Wed, 22 Dec 2021 00:35:21 +0800 Message-Id: <20211221163532.2636028-3-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Let's follow the origin patch's spirit. The only difference between rv32_defconfig and defconfig is that rv32_defconfig has CONFIG_ARCH_RV32I=3Dy. This is helpful to compare rv64-compat-rv32 v.s. rv32-linux. Fixes: 1b937e8faa87ccfb ("RISC-V: Add separate defconfig for 32bit systems") Signed-off-by: Guo Ren Cc: Anup Patel Cc: Palmer Dabbelt --- arch/riscv/configs/rv32_defconfig | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/arch/riscv/configs/rv32_defconfig b/arch/riscv/configs/rv32_de= fconfig index 6e9f12ff968a..d858906cff2d 100644 --- a/arch/riscv/configs/rv32_defconfig +++ b/arch/riscv/configs/rv32_defconfig @@ -1,3 +1,4 @@ +CONFIG_ARCH_RV32I=3Dy CONFIG_SYSVIPC=3Dy CONFIG_POSIX_MQUEUE=3Dy CONFIG_NO_HZ_IDLE=3Dy @@ -16,7 +17,7 @@ CONFIG_EXPERT=3Dy CONFIG_BPF_SYSCALL=3Dy CONFIG_SOC_SIFIVE=3Dy CONFIG_SOC_VIRT=3Dy -CONFIG_ARCH_RV32I=3Dy +CONFIG_SOC_MICROCHIP_POLARFIRE=3Dy CONFIG_SMP=3Dy CONFIG_HOTPLUG_CPU=3Dy CONFIG_VIRTUALIZATION=3Dy @@ -41,10 +42,12 @@ CONFIG_PCI=3Dy CONFIG_PCIEPORTBUS=3Dy CONFIG_PCI_HOST_GENERIC=3Dy CONFIG_PCIE_XILINX=3Dy +CONFIG_PCIE_FU740=3Dy CONFIG_DEVTMPFS=3Dy CONFIG_DEVTMPFS_MOUNT=3Dy CONFIG_BLK_DEV_LOOP=3Dy CONFIG_VIRTIO_BLK=3Dy +CONFIG_BLK_DEV_NVME=3Dm CONFIG_BLK_DEV_SD=3Dy CONFIG_BLK_DEV_SR=3Dy CONFIG_SCSI_VIRTIO=3Dy @@ -68,11 +71,14 @@ CONFIG_HW_RANDOM=3Dy CONFIG_HW_RANDOM_VIRTIO=3Dy CONFIG_SPI=3Dy CONFIG_SPI_SIFIVE=3Dy +CONFIG_GPIOLIB=3Dy +CONFIG_GPIO_SIFIVE=3Dy # CONFIG_PTP_1588_CLOCK is not set CONFIG_POWER_RESET=3Dy -CONFIG_DRM=3Dy -CONFIG_DRM_RADEON=3Dy -CONFIG_DRM_VIRTIO_GPU=3Dy +CONFIG_DRM=3Dm +CONFIG_DRM_RADEON=3Dm +CONFIG_DRM_NOUVEAU=3Dm +CONFIG_DRM_VIRTIO_GPU=3Dm CONFIG_FRAMEBUFFER_CONSOLE=3Dy CONFIG_USB=3Dy CONFIG_USB_XHCI_HCD=3Dy @@ -83,6 +89,9 @@ CONFIG_USB_OHCI_HCD=3Dy CONFIG_USB_OHCI_HCD_PLATFORM=3Dy CONFIG_USB_STORAGE=3Dy CONFIG_USB_UAS=3Dy +CONFIG_MMC_SDHCI=3Dy +CONFIG_MMC_SDHCI_PLTFM=3Dy +CONFIG_MMC_SDHCI_CADENCE=3Dy CONFIG_MMC=3Dy CONFIG_MMC_SPI=3Dy CONFIG_RTC_CLASS=3Dy @@ -105,6 +114,8 @@ CONFIG_NFS_V4_1=3Dy CONFIG_NFS_V4_2=3Dy CONFIG_ROOT_NFS=3Dy CONFIG_9P_FS=3Dy +CONFIG_NLS_CODEPAGE_437=3Dy +CONFIG_NLS_ISO8859_1=3Dm CONFIG_CRYPTO_USER_API_HASH=3Dy CONFIG_CRYPTO_DEV_VIRTIO=3Dy CONFIG_PRINTK_TIME=3Dy @@ -133,3 +144,4 @@ CONFIG_RCU_EQS_DEBUG=3Dy # CONFIG_RUNTIME_TESTING_MENU is not set CONFIG_MEMTEST=3Dy # CONFIG_SYSFS_SYSCALL is not set +CONFIG_EFI=3Dy --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 47142C4332F for ; Tue, 21 Dec 2021 16:36:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239837AbhLUQgD (ORCPT ); Tue, 21 Dec 2021 11:36:03 -0500 Received: from ams.source.kernel.org ([145.40.68.75]:53700 "EHLO ams.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237679AbhLUQgB (ORCPT ); Tue, 21 Dec 2021 11:36:01 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id EEC3BB8173F; Tue, 21 Dec 2021 16:35:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2F804C36AEA; Tue, 21 Dec 2021 16:35:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104558; bh=KjgCin2hved0yaQS5eqq61a1K9YAgWp53QVssgFiofs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KAMXmW+9ncaDlFiRY4Lu9smDgU9x99exzCHsw+o2vczL0324mWSFYYv5PAXG/ZPLN 9d7zDmqmDrQTdMg8R2ghmbtJ/o69N28Mu/oyE23MJqo5fYXilmTNhIh36jtjfBadKr n/AZZcIWDG+UtvxioqVkFGLSl5wPhFNnmLoeSLU5I3/hsPkGSBBfsmaUxlQzzUstMS 7O8kGq6DbluITpSdP+86yiDc59L+CXPg1naFSoVcUCKYsDxEbIkNk0YlbcL2s1Nr/+ T0oIYAskxuifci9B66VXa2OXlPRzTiz3dwWBp79cYhjn7wrcnYJq6+Nw74haD2+ccb r5YAumnfjQI1w== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 03/13] riscv: compat: Add basic compat date type implementation Date: Wed, 22 Dec 2021 00:35:22 +0800 Message-Id: <20211221163532.2636028-4-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Implement asm/compat.h for struct compat_xxx, RLIM_INFINITY, OFF_T_MAX, is_compat_task, compat_user_regset, regset convert. Signed-off-by: Guo Ren --- arch/riscv/include/asm/compat.h | 259 +++++++++++++++++++++++++++ arch/riscv/include/asm/thread_info.h | 1 + 2 files changed, 260 insertions(+) create mode 100644 arch/riscv/include/asm/compat.h diff --git a/arch/riscv/include/asm/compat.h b/arch/riscv/include/asm/compa= t.h new file mode 100644 index 000000000000..8e9777811f3b --- /dev/null +++ b/arch/riscv/include/asm/compat.h @@ -0,0 +1,259 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __ASM_COMPAT_H +#define __ASM_COMPAT_H + +#define compat_mode_t compat_mode_t +typedef u16 compat_mode_t; + +/* + * Architecture specific compatibility types + */ +#include +#include +#include +#include + +#define COMPAT_USER_HZ 100 +#define COMPAT_UTS_MACHINE "riscv\0\0" + +typedef compat_uint_t __compat_uid_t; +typedef compat_uint_t __compat_gid_t; +typedef compat_uint_t compat_dev_t; +typedef compat_int_t compat_ipc_pid_t; + +struct compat_stat { + compat_ulong_t st_dev; + compat_ulong_t st_ino; + compat_uint_t st_mode; + compat_uint_t st_nlink; + compat_uint_t st_uid; + compat_uint_t st_gid; + compat_ulong_t st_rdev; + compat_ulong_t __pad1; + compat_long_t st_size; + compat_int_t st_blksize; + compat_int_t __pad2; + compat_long_t st_blocks; + compat_long_t st_atime; + compat_ulong_t st_atime_nsec; + compat_long_t st_mtime; + compat_ulong_t st_mtime_nsec; + compat_long_t st_ctime; + compat_ulong_t st_ctime_nsec; + compat_uint_t __unused4; + compat_uint_t __unused5; +}; + +struct compat_flock { + compat_short_t l_type; + compat_short_t l_whence; + compat_off_t l_start; + compat_off_t l_len; + compat_pid_t l_pid; + /* No __ARCH_FLOCK_PAD in riscv */ +}; + +#define F_GETLK64 12 +#define F_SETLK64 13 +#define F_SETLKW64 14 + +struct compat_flock64 { + compat_short_t l_type; + compat_short_t l_whence; + compat_loff_t l_start; + compat_loff_t l_len; + compat_pid_t l_pid; + /* No __ARCH_FLOCK64_PAD in riscv */ +}; + +struct compat_statfs { + compat_uint_t f_type; + compat_uint_t f_bsize; + compat_uint_t f_blocks; + compat_uint_t f_bfree; + compat_uint_t f_bavail; + compat_uint_t f_files; + compat_uint_t f_ffree; + __kernel_fsid_t f_fsid; + compat_uint_t f_namelen; + compat_uint_t f_frsize; + compat_uint_t f_flags; + compat_uint_t f_spare[4]; +}; + +#define COMPAT_RLIM_INFINITY 0x7fffffff +#define COMPAT_OFF_T_MAX COMPAT_RLIM_INFINITY + +struct compat_ipc64_perm { + compat_key_t key; + __compat_uid32_t uid; + __compat_gid32_t gid; + __compat_uid32_t cuid; + __compat_gid32_t cgid; + compat_mode_t mode; + unsigned char __pad1[4 - sizeof(compat_mode_t)]; + compat_ushort_t seq; + compat_ushort_t __pad2; + compat_ulong_t unused1; + compat_ulong_t unused2; +}; + +struct compat_semid64_ds { + struct compat_ipc64_perm sem_perm; + compat_ulong_t sem_otime; + compat_ulong_t sem_otime_high; + compat_ulong_t sem_ctime; + compat_ulong_t sem_ctime_high; + compat_ulong_t sem_nsems; + compat_ulong_t __unused3; + compat_ulong_t __unused4; +}; + +struct compat_msqid64_ds { + struct compat_ipc64_perm msg_perm; + compat_ulong_t msg_stime; + compat_ulong_t msg_stime_high; + compat_ulong_t msg_rtime; + compat_ulong_t msg_rtime_high; + compat_ulong_t msg_ctime; + compat_ulong_t msg_ctime_high; + compat_ulong_t msg_cbytes; + compat_ulong_t msg_qnum; + compat_ulong_t msg_qbytes; + compat_pid_t msg_lspid; + compat_pid_t msg_lrpid; + compat_ulong_t __unused4; + compat_ulong_t __unused5; +}; + +struct compat_shmid64_ds { + struct compat_ipc64_perm shm_perm; + compat_size_t shm_segsz; + compat_ulong_t shm_atime; + compat_ulong_t shm_atime_high; + compat_ulong_t shm_dtime; + compat_ulong_t shm_dtime_high; + compat_ulong_t shm_ctime; + compat_ulong_t shm_ctime_high; + compat_pid_t shm_cpid; + compat_pid_t shm_lpid; + compat_ulong_t shm_nattch; + compat_ulong_t __unused4; + compat_ulong_t __unused5; +}; + +static inline int is_compat_task(void) +{ + return test_thread_flag(TIF_32BIT); +} + +struct compat_user_regs_struct { + compat_ulong_t pc; + compat_ulong_t ra; + compat_ulong_t sp; + compat_ulong_t gp; + compat_ulong_t tp; + compat_ulong_t t0; + compat_ulong_t t1; + compat_ulong_t t2; + compat_ulong_t s0; + compat_ulong_t s1; + compat_ulong_t a0; + compat_ulong_t a1; + compat_ulong_t a2; + compat_ulong_t a3; + compat_ulong_t a4; + compat_ulong_t a5; + compat_ulong_t a6; + compat_ulong_t a7; + compat_ulong_t s2; + compat_ulong_t s3; + compat_ulong_t s4; + compat_ulong_t s5; + compat_ulong_t s6; + compat_ulong_t s7; + compat_ulong_t s8; + compat_ulong_t s9; + compat_ulong_t s10; + compat_ulong_t s11; + compat_ulong_t t3; + compat_ulong_t t4; + compat_ulong_t t5; + compat_ulong_t t6; +}; + +static inline void regs_to_cregs(struct compat_user_regs_struct *cregs, + struct pt_regs *regs) +{ + cregs->pc =3D (compat_ulong_t) regs->epc; + cregs->ra =3D (compat_ulong_t) regs->ra; + cregs->sp =3D (compat_ulong_t) regs->sp; + cregs->gp =3D (compat_ulong_t) regs->gp; + cregs->tp =3D (compat_ulong_t) regs->tp; + cregs->t0 =3D (compat_ulong_t) regs->t0; + cregs->t1 =3D (compat_ulong_t) regs->t1; + cregs->t2 =3D (compat_ulong_t) regs->t2; + cregs->s0 =3D (compat_ulong_t) regs->s0; + cregs->s1 =3D (compat_ulong_t) regs->s1; + cregs->a0 =3D (compat_ulong_t) regs->a0; + cregs->a1 =3D (compat_ulong_t) regs->a1; + cregs->a2 =3D (compat_ulong_t) regs->a2; + cregs->a3 =3D (compat_ulong_t) regs->a3; + cregs->a4 =3D (compat_ulong_t) regs->a4; + cregs->a5 =3D (compat_ulong_t) regs->a5; + cregs->a6 =3D (compat_ulong_t) regs->a6; + cregs->a7 =3D (compat_ulong_t) regs->a7; + cregs->s2 =3D (compat_ulong_t) regs->s2; + cregs->s3 =3D (compat_ulong_t) regs->s3; + cregs->s4 =3D (compat_ulong_t) regs->s4; + cregs->s5 =3D (compat_ulong_t) regs->s5; + cregs->s6 =3D (compat_ulong_t) regs->s6; + cregs->s7 =3D (compat_ulong_t) regs->s7; + cregs->s8 =3D (compat_ulong_t) regs->s8; + cregs->s9 =3D (compat_ulong_t) regs->s9; + cregs->s10 =3D (compat_ulong_t) regs->s10; + cregs->s11 =3D (compat_ulong_t) regs->s11; + cregs->t3 =3D (compat_ulong_t) regs->t3; + cregs->t4 =3D (compat_ulong_t) regs->t4; + cregs->t5 =3D (compat_ulong_t) regs->t5; + cregs->t6 =3D (compat_ulong_t) regs->t6; +}; + +static inline void cregs_to_regs(struct compat_user_regs_struct *cregs, + struct pt_regs *regs) +{ + regs->epc =3D (unsigned long) cregs->pc; + regs->ra =3D (unsigned long) cregs->ra; + regs->sp =3D (unsigned long) cregs->sp; + regs->gp =3D (unsigned long) cregs->gp; + regs->tp =3D (unsigned long) cregs->tp; + regs->t0 =3D (unsigned long) cregs->t0; + regs->t1 =3D (unsigned long) cregs->t1; + regs->t2 =3D (unsigned long) cregs->t2; + regs->s0 =3D (unsigned long) cregs->s0; + regs->s1 =3D (unsigned long) cregs->s1; + regs->a0 =3D (unsigned long) cregs->a0; + regs->a1 =3D (unsigned long) cregs->a1; + regs->a2 =3D (unsigned long) cregs->a2; + regs->a3 =3D (unsigned long) cregs->a3; + regs->a4 =3D (unsigned long) cregs->a4; + regs->a5 =3D (unsigned long) cregs->a5; + regs->a6 =3D (unsigned long) cregs->a6; + regs->a7 =3D (unsigned long) cregs->a7; + regs->s2 =3D (unsigned long) cregs->s2; + regs->s3 =3D (unsigned long) cregs->s3; + regs->s4 =3D (unsigned long) cregs->s4; + regs->s5 =3D (unsigned long) cregs->s5; + regs->s6 =3D (unsigned long) cregs->s6; + regs->s7 =3D (unsigned long) cregs->s7; + regs->s8 =3D (unsigned long) cregs->s8; + regs->s9 =3D (unsigned long) cregs->s9; + regs->s10 =3D (unsigned long) cregs->s10; + regs->s11 =3D (unsigned long) cregs->s11; + regs->t3 =3D (unsigned long) cregs->t3; + regs->t4 =3D (unsigned long) cregs->t4; + regs->t5 =3D (unsigned long) cregs->t5; + regs->t6 =3D (unsigned long) cregs->t6; +}; + +#endif /* __ASM_COMPAT_H */ diff --git a/arch/riscv/include/asm/thread_info.h b/arch/riscv/include/asm/= thread_info.h index 60da0dcacf14..9392e35c689d 100644 --- a/arch/riscv/include/asm/thread_info.h +++ b/arch/riscv/include/asm/thread_info.h @@ -91,6 +91,7 @@ struct thread_info { #define TIF_SECCOMP 8 /* syscall secure computing */ #define TIF_NOTIFY_SIGNAL 9 /* signal notifications exist */ #define TIF_UPROBE 10 /* uprobe breakpoint or singlestep */ +#define TIF_32BIT 11 /* 32bit process */ =20 #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D6109C4332F for ; Tue, 21 Dec 2021 16:36:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239848AbhLUQgI (ORCPT ); Tue, 21 Dec 2021 11:36:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47688 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239856AbhLUQgF (ORCPT ); Tue, 21 Dec 2021 11:36:05 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2C8F0C061401; Tue, 21 Dec 2021 08:36:05 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id EA799B81722; Tue, 21 Dec 2021 16:36:03 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 486E2C36AE8; Tue, 21 Dec 2021 16:35:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104562; bh=cBmBjJqc39uhGxOHQbIuz8go+AJACz6x34Rsmj9vtKw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z20TRxowOiWW5Y8Oy0qdAA/PB8BLdrgphbD5xpDZ4vwY7/XrQvUQEjpjzQJM5/pO2 kQ43LXYB1Chei/6vua5YzYwz7FUN7ypTomA9MxNYkl8luch/MRkHaXrI+7/x2p7Uoy 5lycFkaR2DyJSZPh8b9/BZf8TfaFYdN0Sz+SKUpt55qca4j/sCgUA12uqXUD07HfUz GAZupTGtlG22DBcWHypaX3FCH9UCE+Ac24uwIIovEgLgvoM8GLWCpryNvuFC2+1dMu GsD6HNUTkiFtiqnwEVEUbkGKEBer+YA7dI/5cNOT2ZqwU5HEz9nST8gybQPQUZO5Hf UYzd0UXoxypgw== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 04/13] riscv: compat: Re-implement TASK_SIZE for COMPAT_32BIT Date: Wed, 22 Dec 2021 00:35:23 +0800 Message-Id: <20211221163532.2636028-5-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Make TASK_SIZE from const to dynamic detect TIF_32BIT flag function. Refer to arm64 to implement DEFAULT_MAP_WINDOW_64 for efi-stub. Limit 32-bit compatible process in 0-2GB virtual address range (which is enough for real scenarios), because it could avoid address sign extend problem when 32-bit enter 64-bit and ease software design. The standard 32-bit TASK_SIZE is 0x9dc00000:FIXADDR_START, and compared to a compatible 32-bit, it increases 476MB for the application's virtual address. Signed-off-by: Guo Ren --- arch/riscv/include/asm/pgtable.h | 11 ++++++++++- arch/riscv/include/asm/processor.h | 6 ++++++ drivers/firmware/efi/libstub/efi-stub.c | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgta= ble.h index bf204e7c1f74..2dd5b8674380 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -663,7 +663,16 @@ static inline pmd_t pmdp_establish(struct vm_area_stru= ct *vma, * Note that PGDIR_SIZE must evenly divide TASK_SIZE. */ #ifdef CONFIG_64BIT -#define TASK_SIZE (PGDIR_SIZE * PTRS_PER_PGD / 2) +#define TASK_SIZE_64 (PGDIR_SIZE * PTRS_PER_PGD / 2) + +#ifdef CONFIG_COMPAT +#define TASK_SIZE_32 (_AC(0x80000000, UL) - PAGE_SIZE) +#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ + TASK_SIZE_32 : TASK_SIZE_64) +#else +#define TASK_SIZE TASK_SIZE_64 +#endif + #else #define TASK_SIZE FIXADDR_START #endif diff --git a/arch/riscv/include/asm/processor.h b/arch/riscv/include/asm/pr= ocessor.h index 0749924d9e55..8649436b8fcf 100644 --- a/arch/riscv/include/asm/processor.h +++ b/arch/riscv/include/asm/processor.h @@ -61,6 +61,12 @@ static inline void arch_thread_struct_whitelist(unsigned= long *offset, extern void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp); =20 +#ifdef CONFIG_COMPAT +#define DEFAULT_MAP_WINDOW_64 TASK_SIZE_64 +#else +#define DEFAULT_MAP_WINDOW_64 TASK_SIZE +#endif + /* Free all resources held by a thread. */ static inline void release_thread(struct task_struct *dead_task) { diff --git a/drivers/firmware/efi/libstub/efi-stub.c b/drivers/firmware/efi= /libstub/efi-stub.c index 26e69788f27a..4075fd19d219 100644 --- a/drivers/firmware/efi/libstub/efi-stub.c +++ b/drivers/firmware/efi/libstub/efi-stub.c @@ -38,7 +38,7 @@ #define EFI_RT_VIRTUAL_BASE SZ_512M #define EFI_RT_VIRTUAL_SIZE SZ_512M =20 -#ifdef CONFIG_ARM64 +#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) # define EFI_RT_VIRTUAL_LIMIT DEFAULT_MAP_WINDOW_64 #else # define EFI_RT_VIRTUAL_LIMIT TASK_SIZE --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4BE25C433F5 for ; Tue, 21 Dec 2021 16:36:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239857AbhLUQgL (ORCPT ); Tue, 21 Dec 2021 11:36:11 -0500 Received: from ams.source.kernel.org ([145.40.68.75]:53790 "EHLO ams.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239850AbhLUQgJ (ORCPT ); Tue, 21 Dec 2021 11:36:09 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id D20C6B8173F; Tue, 21 Dec 2021 16:36:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4D353C36AEA; Tue, 21 Dec 2021 16:36:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104566; bh=faphGyURWtXEOMLKUCGGnY6spV2KyoBcjjwgGbOApL0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aR/lUQ3Dl/Yrlw2FPQpM8gDT3ARBPF5FXM+b7HA2ng28yMnFUO6rxFWxKmsmJT0Xi cAfsd31NvOSrnEzrHbhpPRcWHE2pLL+b2JfaPqbFeqiERHGx60Xl4qOnp/YWbCw4Qh tbtJ2+eCNx5b3jmpR6mzxVUTb18DrtjHAYBAUmNYgSTE8YF0Z00XgSp1RfER8jkFu9 OCEAMYW7ntoWpg+XcHMIy8zGsYdNXzsw7D42lTB+uWG1PvMAtxyo2D0BgaTS1YHe8R F9+/wdd2guvw60dADD1QmDVxx14WxZA/sgjV0FraFibyNP0e1QxLyaW2mjTuCF/IUH m8U61P3lOguJQ== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 05/13] riscv: compat: syscall: Add compat_sys_call_table implementation Date: Wed, 22 Dec 2021 00:35:24 +0800 Message-Id: <20211221163532.2636028-6-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Implement compat_syscall_table.c with compat_sys_call_table & fixup system call such as truncate64,pread64,fallocate which need two regs to indicate 64bit-arg (copied from arm64). Signed-off-by: Guo Ren --- arch/riscv/include/asm/syscall.h | 3 + arch/riscv/kernel/compat_syscall_table.c | 84 ++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 arch/riscv/kernel/compat_syscall_table.c diff --git a/arch/riscv/include/asm/syscall.h b/arch/riscv/include/asm/sysc= all.h index 7ac6a0e275f2..4ff98a22ef24 100644 --- a/arch/riscv/include/asm/syscall.h +++ b/arch/riscv/include/asm/syscall.h @@ -16,6 +16,9 @@ =20 /* The array of function pointers for syscalls. */ extern void * const sys_call_table[]; +#ifdef CONFIG_COMPAT +extern void * const compat_sys_call_table[]; +#endif =20 /* * Only the low 32 bits of orig_r0 are meaningful, so we return int. diff --git a/arch/riscv/kernel/compat_syscall_table.c b/arch/riscv/kernel/c= ompat_syscall_table.c new file mode 100644 index 000000000000..9b81fb9a8683 --- /dev/null +++ b/arch/riscv/kernel/compat_syscall_table.c @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#define __SYSCALL_COMPAT +#undef __LP64__ + +#include +#include +#include +#include +#include + +SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, + unsigned long, prot, unsigned long, flags, + unsigned long, fd, unsigned long, offset) +{ + if ((prot & PROT_WRITE) && (prot & PROT_EXEC)) + if (unlikely(!(prot & PROT_READ))) + return -EINVAL; + + return ksys_mmap_pgoff(addr, len, prot, flags, fd, offset); +} + +#define arg_u32p(name) u32, name##_lo, u32, name##_hi + +#define arg_u64(name) (((u64)name##_hi << 32) | \ + ((u64)name##_lo & 0xffffffff)) + +COMPAT_SYSCALL_DEFINE3(truncate64, const char __user *, pathname, + arg_u32p(length)) +{ + return ksys_truncate(pathname, arg_u64(length)); +} + +COMPAT_SYSCALL_DEFINE3(ftruncate64, unsigned int, fd, arg_u32p(length)) +{ + return ksys_ftruncate(fd, arg_u64(length)); +} + +COMPAT_SYSCALL_DEFINE6(fallocate, int, fd, int, mode, + arg_u32p(offset), arg_u32p(len)) +{ + return ksys_fallocate(fd, mode, arg_u64(offset), arg_u64(len)); +} + +COMPAT_SYSCALL_DEFINE5(pread64, unsigned int, fd, char __user *, buf, + size_t, count, arg_u32p(pos)) +{ + return ksys_pread64(fd, buf, count, arg_u64(pos)); +} + +COMPAT_SYSCALL_DEFINE5(pwrite64, unsigned int, fd, + const char __user *, buf, size_t, count, arg_u32p(pos)) +{ + return ksys_pwrite64(fd, buf, count, arg_u64(pos)); +} + +COMPAT_SYSCALL_DEFINE6(sync_file_range, int, fd, arg_u32p(offset), + arg_u32p(nbytes), unsigned int, flags) +{ + return ksys_sync_file_range(fd, arg_u64(offset), arg_u64(nbytes), + flags); +} + +COMPAT_SYSCALL_DEFINE4(readahead, int, fd, arg_u32p(offset), + size_t, count) +{ + return ksys_readahead(fd, arg_u64(offset), count); +} + +COMPAT_SYSCALL_DEFINE6(fadvise64_64, int, fd, int, advice, arg_u32p(offset= ), + arg_u32p(len)) +{ + return ksys_fadvise64_64(fd, arg_u64(offset), arg_u64(len), advice); +} + +#undef __SYSCALL +#define __SYSCALL(nr, call) [nr] =3D (call), + +asmlinkage long compat_sys_rt_sigreturn(void); + +void * const compat_sys_call_table[__NR_syscalls] =3D { + [0 ... __NR_syscalls - 1] =3D sys_ni_syscall, +#include +}; --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8E351C433EF for ; Tue, 21 Dec 2021 16:36:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239864AbhLUQgO (ORCPT ); Tue, 21 Dec 2021 11:36:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47728 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239868AbhLUQgN (ORCPT ); Tue, 21 Dec 2021 11:36:13 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 29FEAC061746; Tue, 21 Dec 2021 08:36:13 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id E6988B816D8; Tue, 21 Dec 2021 16:36:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1DBC9C36AE9; Tue, 21 Dec 2021 16:36:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104570; bh=pyNDRrLm8h1op2D/CnDPZ+t7MIQaxafy6aTK+h3aaoA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BXFzUjg0CKVpXzn/vqjFhfWcIKxxKh5+2lJH05zapwEnp3pKszZuliqDGV5DGu/+k o/NWNQZmRh+kLW0qYhoecVjD1QZUch/9ltyKjmkY4mtef6TxnjIkUPsMYv1l/bExfZ yO6pA1aDjJov5LHVef6Ab4zk20H8BcpThqysCNzuPMd5LG9gxIyP0we+dNRFE7DcKQ fHxBjmiOCmzxUvpDnZBVKPUD9zaX3B4/9mBS9A4ti4k9GEYJ3aiyMdL56p8awVcdMq 8Q4ayAgOMGHT5cB00WHezk6wHQ1R0ZK8txkLtINMIjmNO0mQOcdfMtdXIYkfHttiRa MvlX1pR32ewnQ== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 06/13] riscv: compat: syscall: Add entry.S implementation Date: Wed, 22 Dec 2021 00:35:25 +0800 Message-Id: <20211221163532.2636028-7-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Implement the entry of compat_sys_call_table[] in asm. Ref to riscv-privileged spec 4.1.1 Supervisor Status Register (sstatus): BIT[32:33] =3D UXL[1:0]: - 1:32 - 2:64 - 3:128 Signed-off-by: Guo Ren --- arch/riscv/include/asm/csr.h | 7 +++++++ arch/riscv/kernel/entry.S | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h index 5046f431645c..7dac12366833 100644 --- a/arch/riscv/include/asm/csr.h +++ b/arch/riscv/include/asm/csr.h @@ -36,6 +36,13 @@ #define SR_SD _AC(0x8000000000000000, UL) /* FS/XS dirty */ #endif =20 +#ifdef CONFIG_COMPAT +#define SR_UXL _AC(0x300000000, UL) /* XLEN mask for U-mode */ +#define SR_UXL_32 _AC(0x100000000, UL) /* XLEN =3D 32 for U-mode */ +#define SR_UXL_64 _AC(0x200000000, UL) /* XLEN =3D 64 for U-mode */ +#define SR_UXL_SHIFT 32 +#endif + /* SATP flags */ #ifndef CONFIG_64BIT #define SATP_PPN _AC(0x003FFFFF, UL) diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S index ed29e9c8f660..1951743f09b3 100644 --- a/arch/riscv/kernel/entry.S +++ b/arch/riscv/kernel/entry.S @@ -207,13 +207,27 @@ check_syscall_nr: * Syscall number held in a7. * If syscall number is above allowed value, redirect to ni_syscall. */ - bgeu a7, t0, 1f + bgeu a7, t0, 3f +#ifdef CONFIG_COMPAT + REG_L s0, PT_STATUS(sp) + srli s0, s0, SR_UXL_SHIFT + andi s0, s0, (SR_UXL >> SR_UXL_SHIFT) + li t0, (SR_UXL_32 >> SR_UXL_SHIFT) + sub t0, s0, t0 + bnez t0, 1f + + /* Call compat_syscall */ + la s0, compat_sys_call_table + j 2f +1: +#endif /* Call syscall */ la s0, sys_call_table +2: slli t0, a7, RISCV_LGPTR add s0, s0, t0 REG_L s0, 0(s0) -1: +3: jalr s0 =20 ret_from_syscall: --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 357A8C433EF for ; Tue, 21 Dec 2021 16:36:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239886AbhLUQgV (ORCPT ); Tue, 21 Dec 2021 11:36:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47746 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239880AbhLUQgQ (ORCPT ); Tue, 21 Dec 2021 11:36:16 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 027A0C06173F; Tue, 21 Dec 2021 08:36:16 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id A101861660; Tue, 21 Dec 2021 16:36:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 31437C36AFC; Tue, 21 Dec 2021 16:36:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104575; bh=P1KXPJVc0uF2McVIgYSbKY226nQDQV6xLJ8uZLP12bI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lvRwFBKj3auRlx0iE8ICGY/OVB+2bgk2t9YAsnSYjaIzrKXLHkaYoY/pIRJpsD0nh bsJlB5c+vXbAlK8qzfdrIqxTibubgaIxUExYfekObkEKDTqqHhbE/w3wTWTLLzzai1 /8wCw1F4h5GE78DRC7X5zUD+Ix1dopEoamsT8pDyxDCvhRDKCc1Lf+qaIm6yjB6loD vu1PZGzGBQlNTMhqjcMlLzxRwXGD9ZwcDcuhBppO6DA5BoMHQsxeIBnydEF72nD6hA QllFYYGTxrzSycp9hqIu+78ZlsACiwaMYCMvGke6rvzpSOPQAgvMTYvSsecc5f3W9p wG4PQtpD0oqoQ== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 07/13] riscv: compat: Add elf.h implementation Date: Wed, 22 Dec 2021 00:35:26 +0800 Message-Id: <20211221163532.2636028-8-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Implement necessary type and macro for compat elf. See the code comment for detail. Signed-off-by: Guo Ren --- arch/riscv/include/asm/elf.h | 42 +++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/arch/riscv/include/asm/elf.h b/arch/riscv/include/asm/elf.h index f53c40026c7a..48c116f3c12d 100644 --- a/arch/riscv/include/asm/elf.h +++ b/arch/riscv/include/asm/elf.h @@ -8,6 +8,8 @@ #ifndef _ASM_RISCV_ELF_H #define _ASM_RISCV_ELF_H =20 +#include +#include #include #include #include @@ -18,11 +20,13 @@ */ #define ELF_ARCH EM_RISCV =20 +#ifndef ELF_CLASS #ifdef CONFIG_64BIT #define ELF_CLASS ELFCLASS64 #else #define ELF_CLASS ELFCLASS32 #endif +#endif =20 #define ELF_DATA ELFDATA2LSB =20 @@ -31,6 +35,8 @@ */ #define elf_check_arch(x) ((x)->e_machine =3D=3D EM_RISCV) =20 +#define compat_elf_check_arch(x) ((x)->e_machine =3D=3D EM_RISCV) + #define CORE_DUMP_USE_REGSET #define ELF_EXEC_PAGESIZE (PAGE_SIZE) =20 @@ -43,8 +49,14 @@ #define ELF_ET_DYN_BASE ((TASK_SIZE / 3) * 2) =20 #ifdef CONFIG_64BIT +#ifdef CONFIG_COMPAT +#define STACK_RND_MASK (test_thread_flag(TIF_32BIT) ? \ + 0x7ff >> (PAGE_SHIFT - 12) : \ + 0x3ffff >> (PAGE_SHIFT - 12)) +#else #define STACK_RND_MASK (0x3ffff >> (PAGE_SHIFT - 12)) #endif +#endif /* * This yields a mask that user programs can use to figure out what * instruction set this CPU supports. This could be done in user space, @@ -60,11 +72,19 @@ extern unsigned long elf_hwcap; */ #define ELF_PLATFORM (NULL) =20 +#define COMPAT_ELF_PLATFORM (NULL) + #ifdef CONFIG_MMU #define ARCH_DLINFO \ do { \ + /* \ + * Note that we add ulong after elf_addr_t because \ + * casting current->mm->context.vdso triggers a cast \ + * warning of cast from pointer to integer for \ + * COMPAT ELFCLASS32. \ + */ \ NEW_AUX_ENT(AT_SYSINFO_EHDR, \ - (elf_addr_t)current->mm->context.vdso); \ + (elf_addr_t)(ulong)current->mm->context.vdso); \ NEW_AUX_ENT(AT_L1I_CACHESIZE, \ get_cache_size(1, CACHE_TYPE_INST)); \ NEW_AUX_ENT(AT_L1I_CACHEGEOMETRY, \ @@ -90,4 +110,24 @@ do { \ *(struct user_regs_struct *)regs; \ } while (0); =20 +#ifdef CONFIG_COMPAT + +/* + * FIXME: not sure SET_PERSONALITY for compat process is right! + */ +#define SET_PERSONALITY(ex) \ +do { if ((ex).e_ident[EI_CLASS] =3D=3D ELFCLASS32) \ + set_thread_flag(TIF_32BIT); \ + else \ + clear_thread_flag(TIF_32BIT); \ + set_personality(PER_LINUX | (current->personality & (~PER_MASK))); \ +} while (0) + +#define COMPAT_ELF_ET_DYN_BASE ((TASK_SIZE_32 / 3) * 2) + +/* rv32 registers */ +typedef compat_ulong_t compat_elf_greg_t; +typedef compat_elf_greg_t compat_elf_gregset_t[ELF_NGREG]; + +#endif /* CONFIG_COMPAT */ #endif /* _ASM_RISCV_ELF_H */ --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 80FEDC433EF for ; Tue, 21 Dec 2021 16:36:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239904AbhLUQgX (ORCPT ); Tue, 21 Dec 2021 11:36:23 -0500 Received: from dfw.source.kernel.org ([139.178.84.217]:59048 "EHLO dfw.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239882AbhLUQgU (ORCPT ); Tue, 21 Dec 2021 11:36:20 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 6D4D76163F; Tue, 21 Dec 2021 16:36:20 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 98AE6C36AEB; Tue, 21 Dec 2021 16:36:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104579; bh=fapZiwfOp6P4ipryF44VXjiGuUYPa79CVgYJTucz1Cg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ctwtEXwzhjNh3I4oNGVFpED0WOtjyzD4i7HQkVITSP7zM7bZ4U+IsHA+UW0ryBzNE QszDZbnsjfanF2OH0oLvA6QLzis3hSgWyBgG4TQksfgV5QtqJ0eSY90JHVae5EyJP7 XH8wIToAAgdyWfa96G3qNXSD1Pxb+DOSrBM/9iwuU55FVjW8cqSwynASOQDjoncGt+ sgvstfYxyOS0R3LuCzxvxnPXsz9LuU2fI5zWttITZo7qzluBz0QBOFTtHC5qcKKR6T xoKFfVSMtTVOFqyRh5WrST9AHGpkwQhHCw8cED+YmX12cxZ6IgVhqA4mewaD0/dsoq KT+4+FsWLrjaw== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 08/13] riscv: compat: Add COMPAT Kbuild skeletal support Date: Wed, 22 Dec 2021 00:35:27 +0800 Message-Id: <20211221163532.2636028-9-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Adds initial skeletal COMPAT Kbuild (Runing 32bit U-mode on 64bit S-mode) support. - Setup kconfig & dummy functions for compiling. - Implement compat_start_thread by the way. Signed-off-by: Guo Ren --- arch/riscv/Kconfig | 22 ++++++++++++++++++++++ arch/riscv/include/asm/elf.h | 8 ++++++++ arch/riscv/include/asm/processor.h | 3 +++ arch/riscv/kernel/Makefile | 2 ++ arch/riscv/kernel/compat_signal.c | 18 ++++++++++++++++++ arch/riscv/kernel/process.c | 10 ++++++++++ arch/riscv/kernel/ptrace.c | 9 +++++++++ arch/riscv/kernel/vdso.c | 8 ++++++++ 8 files changed, 80 insertions(+) create mode 100644 arch/riscv/kernel/compat_signal.c diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 821252b65f89..6c3515a492a8 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -72,6 +72,7 @@ config RISCV select HAVE_ARCH_KGDB if !XIP_KERNEL select HAVE_ARCH_KGDB_QXFER_PKT select HAVE_ARCH_MMAP_RND_BITS if MMU + select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRANSPARENT_HUGEPAGE if 64BIT && MMU @@ -122,12 +123,18 @@ config ARCH_MMAP_RND_BITS_MIN default 18 if 64BIT default 8 =20 +config ARCH_MMAP_RND_COMPAT_BITS_MIN + default 8 + # max bits determined by the following formula: # VA_BITS - PAGE_SHIFT - 3 config ARCH_MMAP_RND_BITS_MAX default 24 if 64BIT # SV39 based default 17 =20 +config ARCH_MMAP_RND_COMPAT_BITS_MAX + default 17 + # set if we run in machine mode, cleared if we run in supervisor mode config RISCV_M_MODE bool @@ -427,6 +434,21 @@ config CRASH_DUMP =20 For more details see Documentation/admin-guide/kdump/kdump.rst =20 +config COMPAT + bool "Kernel support for 32-bit U-mode" + depends on 64BIT && MMU + help + This option enables support for a 32-bit U-mode running under a 64-bit + kernel at S-mode. riscv32-specific components such as system calls, + the user helper functions (vdso), signal rt_frame functions and the + ptrace interface are handled appropriately by the kernel. + + If you want to execute 32-bit userspace applications, say Y. + +config SYSVIPC_COMPAT + def_bool y + depends on COMPAT && SYSVIPC + endmenu =20 menu "Boot options" diff --git a/arch/riscv/include/asm/elf.h b/arch/riscv/include/asm/elf.h index 48c116f3c12d..37f1cbdaa242 100644 --- a/arch/riscv/include/asm/elf.h +++ b/arch/riscv/include/asm/elf.h @@ -129,5 +129,13 @@ do { if ((ex).e_ident[EI_CLASS] =3D=3D ELFCLASS32) = \ typedef compat_ulong_t compat_elf_greg_t; typedef compat_elf_greg_t compat_elf_gregset_t[ELF_NGREG]; =20 +#define compat_start_thread compat_start_thread + + +extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm, + int uses_interp); +#define compat_arch_setup_additional_pages \ + compat_arch_setup_additional_pages + #endif /* CONFIG_COMPAT */ #endif /* _ASM_RISCV_ELF_H */ diff --git a/arch/riscv/include/asm/processor.h b/arch/riscv/include/asm/pr= ocessor.h index 8649436b8fcf..9544c138d9ce 100644 --- a/arch/riscv/include/asm/processor.h +++ b/arch/riscv/include/asm/processor.h @@ -62,6 +62,9 @@ extern void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp); =20 #ifdef CONFIG_COMPAT +extern void compat_start_thread(struct pt_regs *regs, + unsigned long pc, unsigned long sp); + #define DEFAULT_MAP_WINDOW_64 TASK_SIZE_64 #else #define DEFAULT_MAP_WINDOW_64 TASK_SIZE diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile index 3397ddac1a30..f83e22affd5f 100644 --- a/arch/riscv/kernel/Makefile +++ b/arch/riscv/kernel/Makefile @@ -65,3 +65,5 @@ obj-$(CONFIG_CRASH_DUMP) +=3D crash_dump.o obj-$(CONFIG_JUMP_LABEL) +=3D jump_label.o =20 obj-$(CONFIG_EFI) +=3D efi.o +obj-$(CONFIG_COMPAT) +=3D compat_syscall_table.o +obj-$(CONFIG_COMPAT) +=3D compat_signal.o diff --git a/arch/riscv/kernel/compat_signal.c b/arch/riscv/kernel/compat_s= ignal.c new file mode 100644 index 000000000000..1ad3d348f37c --- /dev/null +++ b/arch/riscv/kernel/compat_signal.c @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +COMPAT_SYSCALL_DEFINE0(rt_sigreturn) +{ + return 0; +} diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c index 03ac3aa611f5..9ebf9a95e5ea 100644 --- a/arch/riscv/kernel/process.c +++ b/arch/riscv/kernel/process.c @@ -15,6 +15,7 @@ #include #include #include +#include =20 #include #include @@ -99,6 +100,15 @@ void start_thread(struct pt_regs *regs, unsigned long p= c, regs->sp =3D sp; } =20 +#ifdef CONFIG_COMPAT +void compat_start_thread(struct pt_regs *regs, unsigned long pc, + unsigned long sp) +{ + start_thread(regs, pc, sp); + regs->status |=3D SR_UXL_32; +} +#endif + void flush_thread(void) { #ifdef CONFIG_FPU diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c index 9c0511119bad..55dd50f8a5cc 100644 --- a/arch/riscv/kernel/ptrace.c +++ b/arch/riscv/kernel/ptrace.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -275,3 +276,11 @@ __visible void do_syscall_trace_exit(struct pt_regs *r= egs) trace_sys_exit(regs, regs_return_value(regs)); #endif } + +#ifdef CONFIG_COMPAT +long compat_arch_ptrace(struct task_struct *child, compat_long_t request, + compat_ulong_t caddr, compat_ulong_t cdata) +{ + return 0; +} +#endif diff --git a/arch/riscv/kernel/vdso.c b/arch/riscv/kernel/vdso.c index a9436a65161a..4f523a23a5d1 100644 --- a/arch/riscv/kernel/vdso.c +++ b/arch/riscv/kernel/vdso.c @@ -253,6 +253,14 @@ static int __setup_additional_pages(struct mm_struct *= mm, return PTR_ERR(ret); } =20 +#ifdef CONFIG_COMPAT +int compat_arch_setup_additional_pages(struct linux_binprm *bprm, + int uses_interp) +{ + return 0; +} +#endif + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm =3D current->mm; --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 95E16C433EF for ; Tue, 21 Dec 2021 16:36:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236464AbhLUQgb (ORCPT ); Tue, 21 Dec 2021 11:36:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47810 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239890AbhLUQg2 (ORCPT ); Tue, 21 Dec 2021 11:36:28 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A4B1CC061574; Tue, 21 Dec 2021 08:36:27 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 6AD6AB8173F; Tue, 21 Dec 2021 16:36:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A8DBDC36AEA; Tue, 21 Dec 2021 16:36:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104585; bh=j5BMG/TlqJiS3H88CCcEO/YtNAJlUD2an1CKTCwrVQI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z7Ah1c3xM04iiNkRDzJp2uJVpNvC6tg64M0I0MlmMf5NA0Aw8idG4DSy1RXB7pWHi bCwFoUMWucI9zeFijSY6WekCMibm8n9RYH7MoDjSqZEcx8gdSmsDzVRiWw2E4WlShz KTBEvThGy7ulrgAk1xDX29kj5VGle2+wO13SdWxUV1VSXG//4985CCTgEWDPS71Iuu jIfDhTtBkFjXSrvIuWySEkh8ZM9HESTtVlOJasS7t2zp4d1ivfhVNmLijUv9I+2IyY sn7z8zFz3Jo9vb+WV/4XOU1EOMAB+oOFe/L+72ErEJc/kaXAFlEJqXTxmQz6viYRj+ kFXPnI4TtUlPQ== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 09/13] riscv: compat: init: Add hw-cap detect in setup_arch Date: Wed, 22 Dec 2021 00:35:28 +0800 Message-Id: <20211221163532.2636028-10-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Detect hardware COMPAT (32bit U-mode) capability in rv64. If not support COMPAT mode in hw, compat_elf_check_arch would return false by compat_binfmt_elf.c Signed-off-by: Guo Ren --- arch/riscv/include/asm/elf.h | 5 ++++- arch/riscv/include/asm/processor.h | 1 + arch/riscv/kernel/process.c | 22 ++++++++++++++++++++++ arch/riscv/kernel/setup.c | 5 +++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/arch/riscv/include/asm/elf.h b/arch/riscv/include/asm/elf.h index 37f1cbdaa242..6baa49c4fba1 100644 --- a/arch/riscv/include/asm/elf.h +++ b/arch/riscv/include/asm/elf.h @@ -35,7 +35,10 @@ */ #define elf_check_arch(x) ((x)->e_machine =3D=3D EM_RISCV) =20 -#define compat_elf_check_arch(x) ((x)->e_machine =3D=3D EM_RISCV) +#ifdef CONFIG_COMPAT +extern bool compat_elf_check_arch(Elf32_Ehdr *hdr); +#define compat_elf_check_arch compat_elf_check_arch +#endif =20 #define CORE_DUMP_USE_REGSET #define ELF_EXEC_PAGESIZE (PAGE_SIZE) diff --git a/arch/riscv/include/asm/processor.h b/arch/riscv/include/asm/pr= ocessor.h index 9544c138d9ce..8b288ac0d704 100644 --- a/arch/riscv/include/asm/processor.h +++ b/arch/riscv/include/asm/processor.h @@ -64,6 +64,7 @@ extern void start_thread(struct pt_regs *regs, #ifdef CONFIG_COMPAT extern void compat_start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp); +extern void compat_mode_detect(void); =20 #define DEFAULT_MAP_WINDOW_64 TASK_SIZE_64 #else diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c index 9ebf9a95e5ea..496d09c5d384 100644 --- a/arch/riscv/kernel/process.c +++ b/arch/riscv/kernel/process.c @@ -101,6 +101,28 @@ void start_thread(struct pt_regs *regs, unsigned long = pc, } =20 #ifdef CONFIG_COMPAT +static bool compat_mode_support __read_mostly =3D false; + +bool compat_elf_check_arch(Elf32_Ehdr *hdr) +{ + if (compat_mode_support && (hdr->e_machine =3D=3D EM_RISCV)) + return true; + + return false; +} + +void compat_mode_detect(void) +{ + csr_write(CSR_STATUS, (csr_read(CSR_STATUS) & ~SR_UXL) | SR_UXL_32); + + if ((csr_read(CSR_STATUS) & SR_UXL) !=3D SR_UXL_32) + return; + + compat_mode_support =3D true; + + pr_info("riscv: compat: 32bit U-mode applications support\n"); +} + void compat_start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) { diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c index b42bfdc67482..be131219d549 100644 --- a/arch/riscv/kernel/setup.c +++ b/arch/riscv/kernel/setup.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -294,6 +295,10 @@ void __init setup_arch(char **cmdline_p) setup_smp(); #endif =20 +#ifdef CONFIG_COMPAT + compat_mode_detect(); +#endif + riscv_fill_hwcap(); } =20 --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B0E94C433F5 for ; Tue, 21 Dec 2021 16:36:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239912AbhLUQgd (ORCPT ); Tue, 21 Dec 2021 11:36:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47836 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239873AbhLUQgc (ORCPT ); Tue, 21 Dec 2021 11:36:32 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 31638C061574; Tue, 21 Dec 2021 08:36:32 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id F183DB8160F; Tue, 21 Dec 2021 16:36:30 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A946CC36AEB; Tue, 21 Dec 2021 16:36:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104589; bh=7zpS4YdMAnGvm0LNck619/OiY8SMrdJJ8nj63fHkDDs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BqlH4BjaJ5116XfsDW1oguZOKMpj/8+p/2RBfcyHdEEITN0YOYhr6eDabviT3FGB4 FZWm4tgfUVlfZW9qB33z+mTrOurowhmtI0cXmnLu0T1nLpqZsmE2jxOgKaeJIwTPzD odZVkqcHwFGKQnCvp+h6dFsmcttrh67U2mFhIkIn04Ncd7rw/1KIuvSYOvwRiHov8H oU9smMUy3KCVoUIcr5NnUJJI8Uj89TT7cnFZAiFziPOd5Jv+SP7mKU6RCyc9EGcR0s WWOgxtyGexHu5tTSggqQml7oJ20gVn8u3HAncAO4BLIaJm7bxbFWdiu+tbUbsggRGR L+ino+b6hzUdw== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 10/13] riscv: compat: vdso: Add rv32 VDSO base code implementation Date: Wed, 22 Dec 2021 00:35:29 +0800 Message-Id: <20211221163532.2636028-11-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren There is no vgettimeofday supported in rv32 that makes simple to generate rv32 vdso code which only needs riscv64 compiler. Other architectures need change compiler or -m (machine parameter) to support vdso32 compiling. If rv32 support vgettimeofday (which cause C compile) in future, we would add CROSS_COMPILE to support that makes more requirement on compiler enviornment. linux-rv64/arch/riscv/kernel/compat_vdso/compat_vdso.so.dbg: file format elf64-littleriscv Disassembly of section .text: 0000000000000800 <__vdso_rt_sigreturn>: 800: 08b00893 li a7,139 804: 00000073 ecall 808: 0000 unimp ... 000000000000080c <__vdso_getcpu>: 80c: 0a800893 li a7,168 810: 00000073 ecall 814: 8082 ret ... 0000000000000818 <__vdso_flush_icache>: 818: 10300893 li a7,259 81c: 00000073 ecall 820: 8082 ret linux-rv32/arch/riscv/kernel/vdso/vdso.so.dbg: file format elf32-littleriscv Disassembly of section .text: 00000800 <__vdso_rt_sigreturn>: 800: 08b00893 li a7,139 804: 00000073 ecall 808: 0000 unimp ... 0000080c <__vdso_getcpu>: 80c: 0a800893 li a7,168 810: 00000073 ecall 814: 8082 ret ... 00000818 <__vdso_flush_icache>: 818: 10300893 li a7,259 81c: 00000073 ecall 820: 8082 ret Finally, reuse all *.S from vdso in compat_vdso that makes implementation clear and readable. Signed-off-by: Guo Ren --- arch/riscv/Makefile | 5 ++ arch/riscv/include/asm/vdso.h | 9 +++ arch/riscv/kernel/Makefile | 1 + arch/riscv/kernel/compat_vdso/.gitignore | 2 + arch/riscv/kernel/compat_vdso/Makefile | 68 +++++++++++++++++++ arch/riscv/kernel/compat_vdso/compat_vdso.S | 8 +++ .../kernel/compat_vdso/compat_vdso.lds.S | 3 + arch/riscv/kernel/compat_vdso/flush_icache.S | 3 + .../compat_vdso/gen_compat_vdso_offsets.sh | 5 ++ arch/riscv/kernel/compat_vdso/getcpu.S | 3 + arch/riscv/kernel/compat_vdso/note.S | 3 + arch/riscv/kernel/compat_vdso/rt_sigreturn.S | 3 + arch/riscv/kernel/vdso/vdso.S | 6 +- 13 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 arch/riscv/kernel/compat_vdso/.gitignore create mode 100644 arch/riscv/kernel/compat_vdso/Makefile create mode 100644 arch/riscv/kernel/compat_vdso/compat_vdso.S create mode 100644 arch/riscv/kernel/compat_vdso/compat_vdso.lds.S create mode 100644 arch/riscv/kernel/compat_vdso/flush_icache.S create mode 100755 arch/riscv/kernel/compat_vdso/gen_compat_vdso_offsets.sh create mode 100644 arch/riscv/kernel/compat_vdso/getcpu.S create mode 100644 arch/riscv/kernel/compat_vdso/note.S create mode 100644 arch/riscv/kernel/compat_vdso/rt_sigreturn.S diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile index 8a107ed18b0d..fb984b8721ef 100644 --- a/arch/riscv/Makefile +++ b/arch/riscv/Makefile @@ -106,12 +106,17 @@ libs-$(CONFIG_EFI_STUB) +=3D $(objtree)/drivers/firmw= are/efi/libstub/lib.a PHONY +=3D vdso_install vdso_install: $(Q)$(MAKE) $(build)=3Darch/riscv/kernel/vdso $@ + $(if $(CONFIG_COMPAT),$(Q)$(MAKE) \ + $(build)=3Darch/riscv/kernel/compat_vdso $@) =20 ifeq ($(KBUILD_EXTMOD),) ifeq ($(CONFIG_MMU),y) prepare: vdso_prepare vdso_prepare: prepare0 $(Q)$(MAKE) $(build)=3Darch/riscv/kernel/vdso include/generated/vdso-offs= ets.h + $(if $(CONFIG_COMPAT),$(Q)$(MAKE) \ + $(build)=3Darch/riscv/kernel/compat_vdso include/generated/compat_vdso-o= ffsets.h) + endif endif =20 diff --git a/arch/riscv/include/asm/vdso.h b/arch/riscv/include/asm/vdso.h index bc6f75f3a199..af981426fe0f 100644 --- a/arch/riscv/include/asm/vdso.h +++ b/arch/riscv/include/asm/vdso.h @@ -21,6 +21,15 @@ =20 #define VDSO_SYMBOL(base, name) \ (void __user *)((unsigned long)(base) + __vdso_##name##_offset) + +#ifdef CONFIG_COMPAT +#include + +#define COMPAT_VDSO_SYMBOL(base, name) \ + (void __user *)((unsigned long)(base) + compat__vdso_##name##_offset) + +#endif /* CONFIG_COMPAT */ + #endif /* !__ASSEMBLY__ */ =20 #endif /* CONFIG_MMU */ diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile index f83e22affd5f..ef47f7d5843f 100644 --- a/arch/riscv/kernel/Makefile +++ b/arch/riscv/kernel/Makefile @@ -67,3 +67,4 @@ obj-$(CONFIG_JUMP_LABEL) +=3D jump_label.o obj-$(CONFIG_EFI) +=3D efi.o obj-$(CONFIG_COMPAT) +=3D compat_syscall_table.o obj-$(CONFIG_COMPAT) +=3D compat_signal.o +obj-$(CONFIG_COMPAT) +=3D compat_vdso/ diff --git a/arch/riscv/kernel/compat_vdso/.gitignore b/arch/riscv/kernel/c= ompat_vdso/.gitignore new file mode 100644 index 000000000000..19d83d846c1e --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +compat_vdso.lds diff --git a/arch/riscv/kernel/compat_vdso/Makefile b/arch/riscv/kernel/com= pat_vdso/Makefile new file mode 100644 index 000000000000..7bbbbf94307f --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/Makefile @@ -0,0 +1,68 @@ +# SPDX-License-Identifier: GPL-2.0-only + +# Absolute relocation type $(ARCH_REL_TYPE_ABS) needs to be defined before +# the inclusion of generic Makefile. +ARCH_REL_TYPE_ABS :=3D R_RISCV_32|R_RISCV_64|R_RISCV_JUMP_SLOT +include $(srctree)/lib/vdso/Makefile +# Symbols present in the compat_vdso +compat_vdso-syms =3D rt_sigreturn +compat_vdso-syms +=3D getcpu +compat_vdso-syms +=3D flush_icache + +# Files to link into the compat_vdso +obj-compat_vdso =3D $(patsubst %, %.o, $(compat_vdso-syms)) note.o + +ccflags-y :=3D -fno-stack-protector + +# Build rules +targets :=3D $(obj-compat_vdso) compat_vdso.so compat_vdso.so.dbg compat_v= dso.lds +obj-compat_vdso :=3D $(addprefix $(obj)/, $(obj-compat_vdso)) + +obj-y +=3D compat_vdso.o +CPPFLAGS_compat_vdso.lds +=3D -P -C -U$(ARCH) + +# Disable profiling and instrumentation for VDSO code +GCOV_PROFILE :=3D n +KCOV_INSTRUMENT :=3D n +KASAN_SANITIZE :=3D n +UBSAN_SANITIZE :=3D n + +# Force dependency +$(obj)/compat_vdso.o: $(obj)/compat_vdso.so + +# link rule for the .so file, .lds has to be first +$(obj)/compat_vdso.so.dbg: $(obj)/compat_vdso.lds $(obj-compat_vdso) FORCE + $(call if_changed,compat_vdsold) +LDFLAGS_compat_vdso.so.dbg =3D -shared -S -soname=3Dlinux-compat_vdso.so.1= \ + --build-id=3Dsha1 --hash-style=3Dboth --eh-frame-hdr + +# strip rule for the .so file +$(obj)/%.so: OBJCOPYFLAGS :=3D -S +$(obj)/%.so: $(obj)/%.so.dbg FORCE + $(call if_changed,objcopy) + +# Generate VDSO offsets using helper script +gen-compat_vdsosym :=3D $(srctree)/$(src)/gen_compat_vdso_offsets.sh +quiet_cmd_compat_vdsosym =3D VDSOSYM $@ + cmd_compat_vdsosym =3D $(NM) $< | $(gen-compat_vdsosym) | LC_ALL=3DC sort= > $@ + +include/generated/compat_vdso-offsets.h: $(obj)/compat_vdso.so.dbg FORCE + $(call if_changed,compat_vdsosym) + +# actual build commands +# The DSO images are built using a special linker script +# Make sure only to export the intended __compat_vdso_xxx symbol offsets. +quiet_cmd_compat_vdsold =3D VDSOLD $@ + cmd_compat_vdsold =3D $(LD) $(ld_flags) -T $(filter-out FORCE,$^) -o= $@.tmp && \ + $(OBJCOPY) $(patsubst %, -G __compat_vdso_%, $(compat_v= dso-syms)) $@.tmp $@ && \ + rm $@.tmp + +# install commands for the unstripped file +quiet_cmd_compat_vdso_install =3D INSTALL $@ + cmd_compat_vdso_install =3D cp $(obj)/$@.dbg $(MODLIB)/compat_vdso/$@ + +compat_vdso.so: $(obj)/compat_vdso.so.dbg + @mkdir -p $(MODLIB)/compat_vdso + $(call cmd,compat_vdso_install) + +compat_vdso_install: compat_vdso.so diff --git a/arch/riscv/kernel/compat_vdso/compat_vdso.S b/arch/riscv/kerne= l/compat_vdso/compat_vdso.S new file mode 100644 index 000000000000..fea4a8b0c45d --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/compat_vdso.S @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#define vdso_start compat_vdso_start +#define vdso_end compat_vdso_end + +#define __VDSO_PATH "arch/riscv/kernel/compat_vdso/compat_vdso.so" + +#include <../vdso/vdso.S> diff --git a/arch/riscv/kernel/compat_vdso/compat_vdso.lds.S b/arch/riscv/k= ernel/compat_vdso/compat_vdso.lds.S new file mode 100644 index 000000000000..02a9ec5dc7f6 --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/compat_vdso.lds.S @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <../vdso/vdso.lds.S> diff --git a/arch/riscv/kernel/compat_vdso/flush_icache.S b/arch/riscv/kern= el/compat_vdso/flush_icache.S new file mode 100644 index 000000000000..88e21a84a974 --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/flush_icache.S @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <../vdso/flush_icache.S> diff --git a/arch/riscv/kernel/compat_vdso/gen_compat_vdso_offsets.sh b/arc= h/riscv/kernel/compat_vdso/gen_compat_vdso_offsets.sh new file mode 100755 index 000000000000..8ac070c783b3 --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/gen_compat_vdso_offsets.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +LC_ALL=3DC +sed -n -e 's/^[0]\+\(0[0-9a-fA-F]*\) . \(__vdso_[a-zA-Z0-9_]*\)$/\#define = compat\2_offset\t0x\1/p' diff --git a/arch/riscv/kernel/compat_vdso/getcpu.S b/arch/riscv/kernel/com= pat_vdso/getcpu.S new file mode 100644 index 000000000000..946449a15a94 --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/getcpu.S @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <../vdso/getcpu.S> diff --git a/arch/riscv/kernel/compat_vdso/note.S b/arch/riscv/kernel/compa= t_vdso/note.S new file mode 100644 index 000000000000..67c50898b8e5 --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/note.S @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <../vdso/note.S> diff --git a/arch/riscv/kernel/compat_vdso/rt_sigreturn.S b/arch/riscv/kern= el/compat_vdso/rt_sigreturn.S new file mode 100644 index 000000000000..f4c98f18c053 --- /dev/null +++ b/arch/riscv/kernel/compat_vdso/rt_sigreturn.S @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <../vdso/rt_sigreturn.S> diff --git a/arch/riscv/kernel/vdso/vdso.S b/arch/riscv/kernel/vdso/vdso.S index df222245be05..83f1c899e8d8 100644 --- a/arch/riscv/kernel/vdso/vdso.S +++ b/arch/riscv/kernel/vdso/vdso.S @@ -7,12 +7,16 @@ #include #include =20 +#ifndef __VDSO_PATH +#define __VDSO_PATH "arch/riscv/kernel/vdso/vdso.so" +#endif + __PAGE_ALIGNED_DATA =20 .globl vdso_start, vdso_end .balign PAGE_SIZE vdso_start: - .incbin "arch/riscv/kernel/vdso/vdso.so" + .incbin __VDSO_PATH .balign PAGE_SIZE vdso_end: =20 --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5DC89C433EF for ; Tue, 21 Dec 2021 16:36:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239928AbhLUQgk (ORCPT ); Tue, 21 Dec 2021 11:36:40 -0500 Received: from dfw.source.kernel.org ([139.178.84.217]:59206 "EHLO dfw.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239909AbhLUQge (ORCPT ); Tue, 21 Dec 2021 11:36:34 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 8792661682; Tue, 21 Dec 2021 16:36:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 53FE6C36AEA; Tue, 21 Dec 2021 16:36:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104594; bh=EVaTO2DeXNYGndqVY2E9gGPs9Se6iurzYp6o4ptspGc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VpKlPb33JoXhqCPnC+c7DU0MHbauTDMaX5pggD1lzGKMIdqZu8EcP9PuR72zPn4y0 M5F1U5VuuCzFlZoVZur8JU8QH2a+C1YTq74yiahx4zu5MaCIP01vhWQHaawH8jbR/d mYF7gVt/AnOb+G1aSzEXHjYaQ6EXGe6hQ1s/i1ZDGMzpMW0nlEN9vsr09VkwN1QDqk 95eGE/M3FszldW2kSnXnircZh9fluxAn/s8Qj20loUlkIWAHZOdQVIwDCfP1Ck08Fq dEeL5rr4Fd5wqdJnzvDOPSaVLUWXPY1P6GmC1rEQA2y3Dwq7/Jo5I/xKr7mMATn1iN 4eNAep9E1kQkg== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 11/13] riscv: compat: vdso: Add setup additional pages implementation Date: Wed, 22 Dec 2021 00:35:30 +0800 Message-Id: <20211221163532.2636028-12-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Reconstruct __setup_additional_pages() by appending vdso info pointer argument to meet compat_vdso_info requirement. And change vm_special_mapping *dm, *cm initialization into static. Signed-off-by: Guo Ren --- arch/riscv/include/asm/mmu.h | 1 + arch/riscv/kernel/vdso.c | 98 +++++++++++++++++++++++++----------- 2 files changed, 69 insertions(+), 30 deletions(-) diff --git a/arch/riscv/include/asm/mmu.h b/arch/riscv/include/asm/mmu.h index 0099dc116168..cedcf8ea3c76 100644 --- a/arch/riscv/include/asm/mmu.h +++ b/arch/riscv/include/asm/mmu.h @@ -16,6 +16,7 @@ typedef struct { atomic_long_t id; #endif void *vdso; + void *vdso_info; #ifdef CONFIG_SMP /* A local icache flush is needed before user execution can resume. */ cpumask_t icache_stale_mask; diff --git a/arch/riscv/kernel/vdso.c b/arch/riscv/kernel/vdso.c index 4f523a23a5d1..deca69524799 100644 --- a/arch/riscv/kernel/vdso.c +++ b/arch/riscv/kernel/vdso.c @@ -23,6 +23,9 @@ struct vdso_data { #endif =20 extern char vdso_start[], vdso_end[]; +#ifdef CONFIG_COMPAT +extern char compat_vdso_start[], compat_vdso_end[]; +#endif =20 enum vvar_pages { VVAR_DATA_PAGE_OFFSET, @@ -30,6 +33,11 @@ enum vvar_pages { VVAR_NR_PAGES, }; =20 +enum rv_vdso_map { + RV_VDSO_MAP_VVAR, + RV_VDSO_MAP_VDSO, +}; + #define VVAR_SIZE (VVAR_NR_PAGES << PAGE_SHIFT) =20 /* @@ -52,12 +60,6 @@ struct __vdso_info { struct vm_special_mapping *cm; }; =20 -static struct __vdso_info vdso_info __ro_after_init =3D { - .name =3D "vdso", - .vdso_code_start =3D vdso_start, - .vdso_code_end =3D vdso_end, -}; - static int vdso_mremap(const struct vm_special_mapping *sm, struct vm_area_struct *new_vma) { @@ -66,35 +68,35 @@ static int vdso_mremap(const struct vm_special_mapping = *sm, return 0; } =20 -static int __init __vdso_init(void) +static int __init __vdso_init(struct __vdso_info *vdso_info) { unsigned int i; struct page **vdso_pagelist; unsigned long pfn; =20 - if (memcmp(vdso_info.vdso_code_start, "\177ELF", 4)) { + if (memcmp(vdso_info->vdso_code_start, "\177ELF", 4)) { pr_err("vDSO is not a valid ELF object!\n"); return -EINVAL; } =20 - vdso_info.vdso_pages =3D ( - vdso_info.vdso_code_end - - vdso_info.vdso_code_start) >> + vdso_info->vdso_pages =3D ( + vdso_info->vdso_code_end - + vdso_info->vdso_code_start) >> PAGE_SHIFT; =20 - vdso_pagelist =3D kcalloc(vdso_info.vdso_pages, + vdso_pagelist =3D kcalloc(vdso_info->vdso_pages, sizeof(struct page *), GFP_KERNEL); if (vdso_pagelist =3D=3D NULL) return -ENOMEM; =20 /* Grab the vDSO code pages. */ - pfn =3D sym_to_pfn(vdso_info.vdso_code_start); + pfn =3D sym_to_pfn(vdso_info->vdso_code_start); =20 - for (i =3D 0; i < vdso_info.vdso_pages; i++) + for (i =3D 0; i < vdso_info->vdso_pages; i++) vdso_pagelist[i] =3D pfn_to_page(pfn + i); =20 - vdso_info.cm->pages =3D vdso_pagelist; + vdso_info->cm->pages =3D vdso_pagelist; =20 return 0; } @@ -116,13 +118,14 @@ int vdso_join_timens(struct task_struct *task, struct= time_namespace *ns) { struct mm_struct *mm =3D task->mm; struct vm_area_struct *vma; + struct __vdso_info *vdso_info =3D mm->context.vdso_info; =20 mmap_read_lock(mm); =20 for (vma =3D mm->mmap; vma; vma =3D vma->vm_next) { unsigned long size =3D vma->vm_end - vma->vm_start; =20 - if (vma_is_special_mapping(vma, vdso_info.dm)) + if (vma_is_special_mapping(vma, vdso_info->dm)) zap_page_range(vma, vma->vm_start, size); } =20 @@ -187,11 +190,6 @@ static vm_fault_t vvar_fault(const struct vm_special_m= apping *sm, return vmf_insert_pfn(vma, vmf->address, pfn); } =20 -enum rv_vdso_map { - RV_VDSO_MAP_VVAR, - RV_VDSO_MAP_VDSO, -}; - static struct vm_special_mapping rv_vdso_maps[] __ro_after_init =3D { [RV_VDSO_MAP_VVAR] =3D { .name =3D "[vvar]", @@ -203,25 +201,53 @@ static struct vm_special_mapping rv_vdso_maps[] __ro_= after_init =3D { }, }; =20 +static struct __vdso_info vdso_info __ro_after_init =3D { + .name =3D "vdso", + .vdso_code_start =3D vdso_start, + .vdso_code_end =3D vdso_end, + .dm =3D &rv_vdso_maps[RV_VDSO_MAP_VVAR], + .cm =3D &rv_vdso_maps[RV_VDSO_MAP_VDSO], +}; + +#ifdef CONFIG_COMPAT +static struct __vdso_info compat_vdso_info __ro_after_init =3D { + .name =3D "compat_vdso", + .vdso_code_start =3D compat_vdso_start, + .vdso_code_end =3D compat_vdso_end, + .dm =3D &rv_vdso_maps[RV_VDSO_MAP_VVAR], + .cm =3D &rv_vdso_maps[RV_VDSO_MAP_VDSO], +}; +#endif + static int __init vdso_init(void) { - vdso_info.dm =3D &rv_vdso_maps[RV_VDSO_MAP_VVAR]; - vdso_info.cm =3D &rv_vdso_maps[RV_VDSO_MAP_VDSO]; + int ret; + + ret =3D __vdso_init(&vdso_info); + if (ret) + goto out; =20 - return __vdso_init(); +#ifdef CONFIG_COMPAT + ret =3D __vdso_init(&compat_vdso_info); + if (ret) + goto out; +#endif +out: + return ret; } arch_initcall(vdso_init); =20 static int __setup_additional_pages(struct mm_struct *mm, struct linux_binprm *bprm, - int uses_interp) + int uses_interp, + struct __vdso_info *vdso_info) { unsigned long vdso_base, vdso_text_len, vdso_mapping_len; void *ret; =20 BUILD_BUG_ON(VVAR_NR_PAGES !=3D __VVAR_PAGES); =20 - vdso_text_len =3D vdso_info.vdso_pages << PAGE_SHIFT; + vdso_text_len =3D vdso_info->vdso_pages << PAGE_SHIFT; /* Be sure to map the data page */ vdso_mapping_len =3D vdso_text_len + VVAR_SIZE; =20 @@ -232,16 +258,18 @@ static int __setup_additional_pages(struct mm_struct = *mm, } =20 ret =3D _install_special_mapping(mm, vdso_base, VVAR_SIZE, - (VM_READ | VM_MAYREAD | VM_PFNMAP), vdso_info.dm); + (VM_READ | VM_MAYREAD | VM_PFNMAP), vdso_info->dm); if (IS_ERR(ret)) goto up_fail; =20 vdso_base +=3D VVAR_SIZE; mm->context.vdso =3D (void *)vdso_base; + mm->context.vdso_info =3D (void *)vdso_info; + ret =3D _install_special_mapping(mm, vdso_base, vdso_text_len, (VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC), - vdso_info.cm); + vdso_info->cm); =20 if (IS_ERR(ret)) goto up_fail; @@ -257,7 +285,17 @@ static int __setup_additional_pages(struct mm_struct *= mm, int compat_arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { - return 0; + struct mm_struct *mm =3D current->mm; + int ret; + + if (mmap_write_lock_killable(mm)) + return -EINTR; + + ret =3D __setup_additional_pages(mm, bprm, uses_interp, + &compat_vdso_info); + mmap_write_unlock(mm); + + return ret; } #endif =20 @@ -269,7 +307,7 @@ int arch_setup_additional_pages(struct linux_binprm *bp= rm, int uses_interp) if (mmap_write_lock_killable(mm)) return -EINTR; =20 - ret =3D __setup_additional_pages(mm, bprm, uses_interp); + ret =3D __setup_additional_pages(mm, bprm, uses_interp, &vdso_info); mmap_write_unlock(mm); =20 return ret; --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 78383C433F5 for ; Tue, 21 Dec 2021 16:36:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236497AbhLUQgq (ORCPT ); Tue, 21 Dec 2021 11:36:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47884 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239909AbhLUQgl (ORCPT ); Tue, 21 Dec 2021 11:36:41 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 62884C061574; Tue, 21 Dec 2021 08:36:40 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id F29D3B8173F; Tue, 21 Dec 2021 16:36:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 78393C36AE8; Tue, 21 Dec 2021 16:36:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104597; bh=SN9l8I8kfnKshmzHeKICf8D0lbRE5oOt9OcSP99i48k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OQYohjpcxaBrc2Rxcyhx2KK1cJG2wS+ANrnLWDmV5AsN6SlxK1LeAbx+01Y4WDQfl 75sYsWkgvGZtox6uXke30cGAP4DYZKVNUQ5DATb6k+vsf0eEm6o2VMH7/pr0vv779a YvJrsykE1kbwb9BH18hJRq8IkCNqnS1fxq5VjAoC9kQrXeKtncL3EfD6/G7RSvbWkg ONjtME5o8iG5ep/5WSK+/VGVzsXdMIdla2afZPd2HIE45qlJrTGyFa7tcfdQ43cADF vfvl8WVW2/g4Wda4S9vUW972V1CMqHXRFon5gJq+kDprD5PMQL0Ds30afGniP0pZO0 qt/M9AZfB6i+A== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 12/13] riscv: compat: signal: Add rt_frame implementation Date: Wed, 22 Dec 2021 00:35:31 +0800 Message-Id: <20211221163532.2636028-13-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Implement compat_setup_rt_frame for sigcontext save & restore. The main process is the same with signal, but the rv32 pt_regs' size is different from rv64's, so we needs convert them. Signed-off-by: Guo Ren --- arch/riscv/kernel/compat_signal.c | 225 ++++++++++++++++++++++++++++++ arch/riscv/kernel/signal.c | 13 +- 2 files changed, 237 insertions(+), 1 deletion(-) diff --git a/arch/riscv/kernel/compat_signal.c b/arch/riscv/kernel/compat_s= ignal.c index 1ad3d348f37c..7041742ded08 100644 --- a/arch/riscv/kernel/compat_signal.c +++ b/arch/riscv/kernel/compat_signal.c @@ -12,7 +12,232 @@ #include #include =20 +#define COMPAT_DEBUG_SIG 0 + +struct compat_sigcontext { + struct compat_user_regs_struct sc_regs; + union __riscv_fp_state sc_fpregs; +}; + +struct compat_ucontext { + compat_ulong_t uc_flags; + struct compat_ucontext *uc_link; + compat_stack_t uc_stack; + sigset_t uc_sigmask; + /* There's some padding here to allow sigset_t to be expanded in the + * future. Though this is unlikely, other architectures put uc_sigmask + * at the end of this structure and explicitly state it can be + * expanded, so we didn't want to box ourselves in here. */ + __u8 __unused[1024 / 8 - sizeof(sigset_t)]; + /* We can't put uc_sigmask at the end of this structure because we need + * to be able to expand sigcontext in the future. For example, the + * vector ISA extension will almost certainly add ISA state. We want + * to ensure all user-visible ISA state can be saved and restored via a + * ucontext, so we're putting this at the end in order to allow for + * infinite extensibility. Since we know this will be extended and we + * assume sigset_t won't be extended an extreme amount, we're + * prioritizing this. */ + struct compat_sigcontext uc_mcontext; +}; + +struct compat_rt_sigframe { + struct compat_siginfo info; + struct compat_ucontext uc; +}; + +#ifdef CONFIG_FPU +static long compat_restore_fp_state(struct pt_regs *regs, + union __riscv_fp_state __user *sc_fpregs) +{ + long err; + struct __riscv_d_ext_state __user *state =3D &sc_fpregs->d; + size_t i; + + err =3D __copy_from_user(¤t->thread.fstate, state, sizeof(*state)); + if (unlikely(err)) + return err; + + fstate_restore(current, regs); + + /* We support no other extension state at this time. */ + for (i =3D 0; i < ARRAY_SIZE(sc_fpregs->q.reserved); i++) { + u32 value; + + err =3D __get_user(value, &sc_fpregs->q.reserved[i]); + if (unlikely(err)) + break; + if (value !=3D 0) + return -EINVAL; + } + + return err; +} + +static long compat_save_fp_state(struct pt_regs *regs, + union __riscv_fp_state __user *sc_fpregs) +{ + long err; + struct __riscv_d_ext_state __user *state =3D &sc_fpregs->d; + size_t i; + + fstate_save(current, regs); + err =3D __copy_to_user(state, ¤t->thread.fstate, sizeof(*state)); + if (unlikely(err)) + return err; + + /* We support no other extension state at this time. */ + for (i =3D 0; i < ARRAY_SIZE(sc_fpregs->q.reserved); i++) { + err =3D __put_user(0, &sc_fpregs->q.reserved[i]); + if (unlikely(err)) + break; + } + + return err; +} +#else +#define compat_save_fp_state(task, regs) (0) +#define compat_restore_fp_state(task, regs) (0) +#endif + +static long compat_restore_sigcontext(struct pt_regs *regs, + struct compat_sigcontext __user *sc) +{ + long err; + struct compat_user_regs_struct cregs; + + /* sc_regs is structured the same as the start of pt_regs */ + err =3D __copy_from_user(&cregs, &sc->sc_regs, sizeof(sc->sc_regs)); + + cregs_to_regs(&cregs, regs); + + /* Restore the floating-point state. */ + if (has_fpu()) + err |=3D compat_restore_fp_state(regs, &sc->sc_fpregs); + return err; +} + COMPAT_SYSCALL_DEFINE0(rt_sigreturn) { + struct pt_regs *regs =3D current_pt_regs(); + struct compat_rt_sigframe __user *frame; + struct task_struct *task; + sigset_t set; + + /* Always make any pending restarted system calls return -EINTR */ + current->restart_block.fn =3D do_no_restart_syscall; + + frame =3D (struct compat_rt_sigframe __user *)regs->sp; + + if (!access_ok(frame, sizeof(*frame))) + goto badframe; + + if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) + goto badframe; + + set_current_blocked(&set); + + if (compat_restore_sigcontext(regs, &frame->uc.uc_mcontext)) + goto badframe; + + if (compat_restore_altstack(&frame->uc.uc_stack)) + goto badframe; + + return regs->a0; + +badframe: + task =3D current; + if (show_unhandled_signals) { + pr_info_ratelimited( + "%s[%d]: bad frame in %s: frame=3D%p pc=3D%p sp=3D%p\n", + task->comm, task_pid_nr(task), __func__, + frame, (void *)regs->epc, (void *)regs->sp); + } + force_sig(SIGSEGV); + return 0; +} + +static long compat_setup_sigcontext(struct compat_rt_sigframe __user *fram= e, + struct pt_regs *regs) +{ + struct compat_sigcontext __user *sc =3D &frame->uc.uc_mcontext; + struct compat_user_regs_struct cregs; + long err; + + regs_to_cregs(&cregs, regs); + + /* sc_regs is structured the same as the start of pt_regs */ + err =3D __copy_to_user(&sc->sc_regs, &cregs, sizeof(sc->sc_regs)); + /* Save the floating-point state. */ + if (has_fpu()) + err |=3D compat_save_fp_state(regs, &sc->sc_fpregs); + return err; +} + +static inline void __user *compat_get_sigframe(struct ksignal *ksig, + struct pt_regs *regs, size_t framesize) +{ + unsigned long sp; + /* Default to using normal stack */ + sp =3D regs->sp; + + /* + * If we are on the alternate signal stack and would overflow it, don't. + * Return an always-bogus address instead so we will die with SIGSEGV. + */ + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) + return (void __user __force *)(-1UL); + + /* This is the X/Open sanctioned signal stack switching. */ + sp =3D sigsp(sp, ksig) - framesize; + + /* Align the stack frame. */ + sp &=3D ~0xfUL; + + return (void __user *)sp; +} + +int compat_setup_rt_frame(struct ksignal *ksig, sigset_t *set, + struct pt_regs *regs) +{ + struct compat_rt_sigframe __user *frame; + long err =3D 0; + + frame =3D compat_get_sigframe(ksig, regs, sizeof(*frame)); + if (!access_ok(frame, sizeof(*frame))) + return -EFAULT; + + err |=3D copy_siginfo_to_user32(&frame->info, &ksig->info); + + /* Create the ucontext. */ + err |=3D __put_user(0, &frame->uc.uc_flags); + err |=3D __put_user(NULL, &frame->uc.uc_link); + err |=3D __compat_save_altstack(&frame->uc.uc_stack, regs->sp); + err |=3D compat_setup_sigcontext(frame, regs); + err |=3D __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); + if (err) + return -EFAULT; + + regs->ra =3D (unsigned long)COMPAT_VDSO_SYMBOL( + current->mm->context.vdso, rt_sigreturn); + + /* + * Set up registers for signal handler. + * Registers that we don't modify keep the value they had from + * user-space at the time we took the signal. + * We always pass siginfo and mcontext, regardless of SA_SIGINFO, + * since some things rely on this (e.g. glibc's debug/segfault.c). + */ + regs->epc =3D (unsigned long)ksig->ka.sa.sa_handler; + regs->sp =3D (unsigned long)frame; + regs->a0 =3D ksig->sig; /* a0: signal number */ + regs->a1 =3D (unsigned long)(&frame->info); /* a1: siginfo pointer */ + regs->a2 =3D (unsigned long)(&frame->uc); /* a2: ucontext pointer */ + +#if COMPAT_DEBUG_SIG + pr_info("SIG deliver (%s:%d): sig=3D%d pc=3D%p ra=3D%p sp=3D%p\n", + current->comm, task_pid_nr(current), ksig->sig, + (void *)regs->epc, (void *)regs->ra, frame); +#endif + return 0; } diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c index c2d5ecbe5526..27d8f39228c4 100644 --- a/arch/riscv/kernel/signal.c +++ b/arch/riscv/kernel/signal.c @@ -6,6 +6,7 @@ * Copyright (C) 2012 Regents of the University of California */ =20 +#include #include #include #include @@ -229,6 +230,11 @@ static int setup_rt_frame(struct ksignal *ksig, sigset= _t *set, return 0; } =20 +#ifdef CONFIG_COMPAT +extern int compat_setup_rt_frame(struct ksignal *ksig, sigset_t *set, + struct pt_regs *regs); +#endif + static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) { sigset_t *oldset =3D sigmask_to_save(); @@ -258,8 +264,13 @@ static void handle_signal(struct ksignal *ksig, struct= pt_regs *regs) } } =20 +#ifdef CONFIG_COMPAT /* Set up the stack frame */ - ret =3D setup_rt_frame(ksig, oldset, regs); + if (is_compat_task()) + ret =3D compat_setup_rt_frame(ksig, oldset, regs); + else +#endif + ret =3D setup_rt_frame(ksig, oldset, regs); =20 signal_setup_done(ret, ksig, 0); } --=20 2.25.1 From nobody Wed Jul 1 13:24:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 43D78C433EF for ; Tue, 21 Dec 2021 16:36:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239911AbhLUQgt (ORCPT ); Tue, 21 Dec 2021 11:36:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47902 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239959AbhLUQgo (ORCPT ); Tue, 21 Dec 2021 11:36:44 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2C7E1C061747; Tue, 21 Dec 2021 08:36:44 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id E7FBCB817BB; Tue, 21 Dec 2021 16:36:42 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 466E5C36AEA; Tue, 21 Dec 2021 16:36:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1640104601; bh=Raa20oTo55bW6fRnesFHj7YQjLtEnX8esLtzywI76A4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=twN39g170uyrsJj31r1hpC5+M6PPY8IcmqdvVkc8SoPSfZTBEXteJdbJ27bBEl7Kt ++4Lbva4Wpgqy6J8NKPBYpJqlxjaZLPaN0F4ZNz1tzxOH6G+y7Cq3Jhr1wIUJrd7qI tLPOzYMnXbux8ZXrT/5+FxqIgL1AjuE6a0gk/6Dq8H1mM3u0yvTFd1MoV2U4JTUyfH jT5CR0lR43+5hSrhqiuozecY4WQsEvv9jjzTvQTn98U6GK5XeQtOfbYOzZfnefVtP9 reicZKmyhx7GAZb87b8nIi8jP9tL1RKHjRuCJngFNyOS9kNN6n+h55rWQzafemUgZa OqWE3XUOQYbvQ== From: guoren@kernel.org To: guoren@kernel.org, palmer@dabbelt.com, arnd@arndb.de, anup.patel@wdc.com, gregkh@linuxfoundation.org, liush@allwinnertech.com, wefu@redhat.com, drew@beagleboard.org, wangjunqiang@iscas.ac.cn, lazyparser@gmail.com Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-csky@vger.kernel.org, Guo Ren Subject: [PATCH 13/13] riscv: compat: ptrace: Add compat_arch_ptrace implement Date: Wed, 22 Dec 2021 00:35:32 +0800 Message-Id: <20211221163532.2636028-14-guoren@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211221163532.2636028-1-guoren@kernel.org> References: <20211221163532.2636028-1-guoren@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Guo Ren Now, you can use native gdb on riscv64 for rv32 app debugging. $ uname -a Linux buildroot 5.16.0-rc4-00036-gbef6b82fdf23-dirty #53 SMP Mon Dec 20 23:= 06:53 CST 2021 riscv64 GNU/Linux $ cat /proc/cpuinfo processor : 0 hart : 0 isa : rv64imafdcsuh mmu : sv48 $ file /bin/busybox /bin/busybox: setuid ELF 32-bit LSB shared object, UCB RISC-V, version 1 (S= YSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, fo= r GNU/Linux 5.15.0, stripped $ file /usr/bin/gdb /usr/bin/gdb: ELF 32-bit LSB shared object, UCB RISC-V, version 1 (GNU/Linu= x), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for = GNU/Linux 5.15.0, stripped $ /usr/bin/gdb /bin/busybox GNU gdb (GDB) 10.2 Copyright (C) 2021 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later ... Reading symbols from /bin/busybox... (No debugging symbols found in /bin/busybox) (gdb) b main Breakpoint 1 at 0x8ddc (gdb) r Starting program: /bin/busybox Failed to read a valid object file image from memory. Breakpoint 1, 0x555a8ddc in main () (gdb) i r ra 0x77df0b74 0x77df0b74 sp 0x7fdd3d10 0x7fdd3d10 gp 0x5567e800 0x5567e800 tp 0x77f64280 0x77f64280 t0 0x0 0 t1 0x555a6fac 1431990188 t2 0x77dd8db4 2011008436 fp 0x7fdd3e34 0x7fdd3e34 s1 0x7fdd3e34 2145205812 a0 0xffffffff -1 a1 0x2000 8192 a2 0x7fdd3e3c 2145205820 a3 0x0 0 a4 0x7fdd3d30 2145205552 a5 0x555a8dc0 1431997888 a6 0x77f2c170 2012397936 a7 0x6a7c7a2f 1786542639 s2 0x0 0 s3 0x0 0 s4 0x555a8dc0 1431997888 s5 0x77f8a3a8 2012783528 s6 0x7fdd3e3c 2145205820 s7 0x5567cecc 1432866508 --Type for more, q to quit, c to continue without paging-- s8 0x1 1 s9 0x0 0 s10 0x55634448 1432568904 s11 0x0 0 t3 0x77df0bb8 2011106232 t4 0x42fc 17148 t5 0x0 0 t6 0x40 64 pc 0x555a8ddc 0x555a8ddc (gdb) si 0x555a78f0 in mallopt@plt () (gdb) c Continuing. BusyBox v1.34.1 (2021-12-19 22:39:48 CST) multi-call binary. BusyBox is copyrighted by many authors between 1998-2015. Licensed under GPLv2. See source distribution for detailed copyright notices. Usage: busybox [function [arguments]...] or: busybox --list[-full] ... [Inferior 1 (process 107) exited normally] (gdb) q Signed-off-by: Guo Ren --- arch/riscv/kernel/ptrace.c | 80 +++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c index 55dd50f8a5cc..76042ed861a3 100644 --- a/arch/riscv/kernel/ptrace.c +++ b/arch/riscv/kernel/ptrace.c @@ -114,11 +114,6 @@ static const struct user_regset_view riscv_user_native= _view =3D { .n =3D ARRAY_SIZE(riscv_user_regset), }; =20 -const struct user_regset_view *task_user_regset_view(struct task_struct *t= ask) -{ - return &riscv_user_native_view; -} - struct pt_regs_offset { const char *name; int offset; @@ -278,9 +273,82 @@ __visible void do_syscall_trace_exit(struct pt_regs *r= egs) } =20 #ifdef CONFIG_COMPAT +static int compat_riscv_gpr_get(struct task_struct *target, + const struct user_regset *regset, + struct membuf to) +{ + struct compat_user_regs_struct cregs; + + regs_to_cregs(&cregs, task_pt_regs(target)); + + return membuf_write(&to, &cregs, + sizeof(struct compat_user_regs_struct)); +} + +static int compat_riscv_gpr_set(struct task_struct *target, + const struct user_regset *regset, + unsigned int pos, unsigned int count, + const void *kbuf, const void __user *ubuf) +{ + int ret; + struct compat_user_regs_struct cregs; + + ret =3D user_regset_copyin(&pos, &count, &kbuf, &ubuf, &cregs, 0, -1); + + cregs_to_regs(&cregs, task_pt_regs(target)); + + return ret; +} + +static const struct user_regset compat_riscv_user_regset[] =3D { + [REGSET_X] =3D { + .core_note_type =3D NT_PRSTATUS, + .n =3D ELF_NGREG, + .size =3D sizeof(compat_elf_greg_t), + .align =3D sizeof(compat_elf_greg_t), + .regset_get =3D compat_riscv_gpr_get, + .set =3D compat_riscv_gpr_set, + }, +#ifdef CONFIG_FPU + [REGSET_F] =3D { + .core_note_type =3D NT_PRFPREG, + .n =3D ELF_NFPREG, + .size =3D sizeof(elf_fpreg_t), + .align =3D sizeof(elf_fpreg_t), + .regset_get =3D riscv_fpr_get, + .set =3D riscv_fpr_set, + }, +#endif +}; + +static const struct user_regset_view compat_riscv_user_native_view =3D { + .name =3D "riscv", + .e_machine =3D EM_RISCV, + .regsets =3D compat_riscv_user_regset, + .n =3D ARRAY_SIZE(compat_riscv_user_regset), +}; + long compat_arch_ptrace(struct task_struct *child, compat_long_t request, compat_ulong_t caddr, compat_ulong_t cdata) { - return 0; + long ret =3D -EIO; + + switch (request) { + default: + ret =3D compat_ptrace_request(child, request, caddr, cdata); + break; + } + + return ret; } +#endif /* CONFIG_COMPAT */ + +const struct user_regset_view *task_user_regset_view(struct task_struct *t= ask) +{ +#ifdef CONFIG_COMPAT + if (test_tsk_thread_flag(task, TIF_32BIT)) + return &compat_riscv_user_native_view; + else #endif + return &riscv_user_native_view; +} --=20 2.25.1