mbox series

[V11,00/20] riscv: Add COMPAT mode support for rv64

Message ID 20220402135256.2691868-1-guoren@kernel.org (mailing list archive)
Headers show
Series riscv: Add COMPAT mode support for rv64 | expand

Message

Guo Ren April 2, 2022, 1:52 p.m. UTC
From: Guo Ren <guoren@linux.alibaba.com>

Currently, most 64-bit architectures (x86, parisc, powerpc, arm64,
s390, mips, sparc) have supported COMPAT mode. But they all have
history issues and can't use standard linux unistd.h. RISC-V would
be first standard __SYSCALL_COMPAT user of include/uapi/asm-generic
/unistd.h.

The patchset are based on v5.17-rc8, you can compare rv64-compat
v.s. rv32-native in qemu with following steps:

 - Prepare rv32 rootfs & fw_jump.bin by buildroot.org
   $ git clone git://git.busybox.net/buildroot
   $ cd buildroot
   $ make qemu_riscv32_virt_defconfig O=qemu_riscv32_virt_defconfig
   $ make -C qemu_riscv32_virt_defconfig
   $ make qemu_riscv64_virt_defconfig O=qemu_riscv64_virt_defconfig
   $ make -C qemu_riscv64_virt_defconfig
   (Got fw_jump.bin & rootfs.ext2 in qemu_riscvXX_virt_defconfig/images)

 - Prepare Linux rv32 & rv64 Image
   $ git clone git@github.com:c-sky/csky-linux.git -b riscv_compat_v11 linux
   $ cd linux
   $ echo "CONFIG_STRICT_KERNEL_RWX=n" >> arch/riscv/configs/defconfig
   $ echo "CONFIG_STRICT_MODULE_RWX=n" >> arch/riscv/configs/defconfig
   $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ rv32_defconfig
   $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ Image
   $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ defconfig
   $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ Image

 - Prepare Qemu:
   $ git clone https://gitlab.com/qemu-project/qemu.git -b master linux
   $ cd qemu
   $ ./configure --target-list="riscv64-softmmu riscv32-softmmu"
   $ make

Now let's compare rv64-compat with rv32-native memory footprint with almost the same
defconfig, rootfs, opensbi in one qemu.

 - Run rv64 with rv32 rootfs in compat mode:
   $ ./build/qemu-system-riscv64 -cpu rv64 -M virt -m 64m -nographic -bios qemu_riscv64_virt_defconfig/images/fw_jump.bin -kernel build-rv64/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0

QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
OpenSBI v0.9
[    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv64-unknown-linux-gnu-gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.37) #96 SMP Tue Dec 28 21:01:55 CST 2021
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Machine model: riscv-virtio,qemu
[    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
[    0.000000] printk: bootconsole [sbi0] enabled
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x0000000083ffffff]
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080200000-0x0000000083ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x0000000083ffffff]
[    0.000000] SBI specification v0.2 detected
[    0.000000] SBI implementation ID=0x1 Version=0x9
[    0.000000] SBI TIME extension detected
[    0.000000] SBI IPI extension detected
[    0.000000] SBI RFENCE extension detected
[    0.000000] SBI v0.2 HSM extension detected
[    0.000000] riscv: ISA extensions acdfhimsu
[    0.000000] riscv: ELF capabilities acdfim
[    0.000000] percpu: Embedded 17 pages/cpu s30696 r8192 d30744 u69632
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15655
[    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
[    0.000000] Dentry cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.000000] Inode-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Virtual kernel memory layout:
[    0.000000]       fixmap : 0xffffffcefee00000 - 0xffffffceff000000   (2048 kB)
[    0.000000]       pci io : 0xffffffceff000000 - 0xffffffcf00000000   (  16 MB)
[    0.000000]      vmemmap : 0xffffffcf00000000 - 0xffffffcfffffffff   (4095 MB)
[    0.000000]      vmalloc : 0xffffffd000000000 - 0xffffffdfffffffff   (65535 MB)
[    0.000000]       lowmem : 0xffffffe000000000 - 0xffffffe003e00000   (  62 MB)
[    0.000000]       kernel : 0xffffffff80000000 - 0xffffffffffffffff   (2047 MB)
[    0.000000] Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
[    0.000000] rcu:     RCU debug extended QS entry/exit.
[    0.000000]  Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] riscv-intc: 64 local interrupts mapped
[    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
...
Welcome to Buildroot
buildroot login: root
# 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 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
# ca[   78.386630] random: fast init done
# cat /proc/meminfo
MemTotal:          53076 kB
MemFree:           40264 kB
MemAvailable:      40244 kB
Buffers:             236 kB
Cached:             1560 kB
SwapCached:            0 kB
Active:             1700 kB
Inactive:            516 kB
Active(anon):         40 kB
Inactive(anon):      424 kB
Active(file):       1660 kB
Inactive(file):       92 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:           444 kB
Mapped:             1188 kB
Shmem:                44 kB
KReclaimable:        952 kB
Slab:               5744 kB
SReclaimable:        952 kB
SUnreclaim:         4792 kB
KernelStack:         624 kB
PageTables:          156 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       26536 kB
Committed_AS:       1748 kB
VmallocTotal:   67108863 kB
VmallocUsed:         652 kB
VmallocChunk:          0 kB
Percpu:               80 kB
#

 - Run rv32 with rv32 rootfs:
   $ ./build/qemu-system-riscv32 -cpu rv32 -M virt -m 64m -nographic -bios qemu_riscv32_virt_defconfig/images/fw_jump.bin -kernel build-rv32/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0

QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
OpenSBI v0.9
[    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv32-buildroot-linux-gnu-gcc.br_real (Buildroot 2021.11-201-g7600ca7960-dirty) 10.3.0, GNU ld (GNU Binutils) 2.36.1) #7 SMP Tue Dec 28 21:02:21 CST 2021
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80400000
[    0.000000] Machine model: riscv-virtio,qemu
[    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
[    0.000000] printk: bootconsole [sbi0] enabled
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000080400000-0x0000000083ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080400000-0x0000000083ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080400000-0x0000000083ffffff]
[    0.000000] SBI specification v0.2 detected
[    0.000000] SBI implementation ID=0x1 Version=0x9
[    0.000000] SBI TIME extension detected
[    0.000000] SBI IPI extension detected
[    0.000000] SBI RFENCE extension detected
[    0.000000] SBI v0.2 HSM extension detected
[    0.000000] riscv: ISA extensions acdfhimsu
[    0.000000] riscv: ELF capabilities acdfim
[    0.000000] percpu: Embedded 12 pages/cpu s16600 r8192 d24360 u49152
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15240
[    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
[    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Virtual kernel memory layout:
[    0.000000]       fixmap : 0x9dc00000 - 0x9e000000   (4096 kB)
[    0.000000]       pci io : 0x9e000000 - 0x9f000000   (  16 MB)
[    0.000000]      vmemmap : 0x9f000000 - 0x9fffffff   (  15 MB)
[    0.000000]      vmalloc : 0xa0000000 - 0xbfffffff   ( 511 MB)
[    0.000000]       lowmem : 0xc0000000 - 0xc3c00000   (  60 MB)
[    0.000000] Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss, 9516K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
[    0.000000] rcu:     RCU debug extended QS entry/exit.
[    0.000000]  Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] riscv-intc: 32 local interrupts mapped
[    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
...
Welcome to Buildroot
buildroot login: root
# cat /proc/cpuinfo
processor       : 0
hart            : 0
isa             : rv32imafdcsuh
mmu             : sv32

# file /bin/busybox
/bin/busybox: setuid ELF 32-bit LSB shared object, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
[   79.320589] random: fast init done
# cat /proc/meminfo
MemTotal:          52176 kB
MemFree:           41012 kB
MemAvailable:      42176 kB
Buffers:             644 kB
Cached:             2724 kB
SwapCached:            0 kB
Active:             3128 kB
Inactive:            752 kB
Active(anon):         40 kB
Inactive(anon):      516 kB
Active(file):       3088 kB
Inactive(file):      236 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:           556 kB
Mapped:             2172 kB
Shmem:                44 kB
KReclaimable:        656 kB
Slab:               3684 kB
SReclaimable:        656 kB
SUnreclaim:         3028 kB
KernelStack:         312 kB
PageTables:           88 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       26088 kB
Committed_AS:       2088 kB
VmallocTotal:     524287 kB
VmallocUsed:          12 kB
VmallocChunk:          0 kB
Percpu:               60 kB
#

 Some conclusions:
 - kernel statics:
   64: Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved)
   32: Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss,  9516K reserved)
   rv32 better than rv64:                  1%               22%           17%          13%        19%         11%
   The code size is very similar, but data size rv32 would be better.

 - rv32 kernel runtime KernelStack, Slab... are smaller,
   rv64: MemTotal: 53076 kB,        MemFree: 40264 kB
   rv32: MemTotal: 52176 + 2048 kB, MemFree: 41012  + 2048 kB
   rv32 better than rv64:       2%                         6%

   (Because opensbi problem, we could add another 2MB for rv32.)
   Overall in 64MB memory situation, rv64-compat is 6% worse than rv32-native
   at memory footprint. If the userspace memory usage increases, I think
   the gap will be further reduced.

Changes in v11:
 - Using arch instead of kconfig for commit subject by Masahiro Yamada

Changes in v10:
 - Fixup arm64 compile error with compat_statfs definition
 - Fixup compat_sys_fadvise64_64 function arguments error cause ltp failure

Changes in v9:
 - Fixup rv32 call rv64 segment fault
 - Ready for 5.18

Changes in v8:
 - Enhanced elf_check_arch with EI_CLASS
 - Fixup SR_UXL doesn't exist in CONFIG_32BIT
 - Add Tested-by with Heiko
 - Update qemu compile tips with upstream repo

Changes in v7:
 - Re-construct compat_vdso/Makefile
 - Fixup disable COMPAT compile error by csr.h's macro.
 - Optimize coding convention for lo/hi in compat.h

Changes in v6:
 - Rebase on linux-5.17-rc5
 - Optimize hw capability check for elf
 - Optimize comment in thread_info.h
 - Optimize start_thread with SR_UXL setting
 - Optimize vdso.c with direct panic

Changes in v5:
 - Rebase on linux-5.17-rc2
 - Include consolidate the fcntl patches by Christoph Hellwig
 - Remove F_GETLK64/F_SETLK64/F_SETLKW64 from asm/compat.h
 - Change COMPAT_RLIM_INFINITY from 0x7fffffff to 0xffffffff
 - Bring back "Add hw-cap detect in setup_arch patch" in v1

Changes in v4:
 - Rebase on linux-5.17-rc1
 - Optimize compat_sys_call_table implementation with Arnd's advice
 - Add reviewed-by for Arnd. Thx :)
 - Remove FIXME comment in elf.h
 - Optimize Cleanup duplicate definitions in compat.h with Arnd's advice

Changes in v3:
 - Rebase on newest master (pre linux-5.17-rc1)
 - Using newest qemu version v7 for test
 - Remove fcntl common modification
 - Fixup SET_PERSONALITY in elf.h by Arnd
 - Fixup KVM Kconfig
 - Update Acked-by & Reviewed-by

Changes in v2:
 - Add __ARCH_WANT_COMPAT_STAT suggested
 - Cleanup fcntl compatduplicate definitions
 - Cleanup compat.h
 - Move rv32_defconfig into Makefile
 - Fixup rv64 rootfs boot failed, remove hw_compat_mode_detect
 - Move SYSVIPC_COMPAT into init/Kconfig
 - Simplify compat_elf_check

Christoph Hellwig (3):
  uapi: simplify __ARCH_FLOCK{,64}_PAD a little
  uapi: always define F_GETLK64/F_SETLK64/F_SETLKW64 in fcntl.h
  compat: consolidate the compat_flock{,64} definition

Guo Ren (17):
  arch: Add SYSVIPC_COMPAT for all architectures
  fs: stat: compat: Add __ARCH_WANT_COMPAT_STAT
  asm-generic: compat: Cleanup duplicate definitions
  syscalls: compat: Fix the missing part for __SYSCALL_COMPAT
  riscv: Fixup difference with defconfig
  riscv: compat: Add basic compat data type implementation
  riscv: compat: Support TASK_SIZE for compat mode
  riscv: compat: syscall: Add compat_sys_call_table implementation
  riscv: compat: syscall: Add entry.S implementation
  riscv: compat: process: Add UXL_32 support in start_thread
  riscv: compat: Add elf.h implementation
  riscv: compat: Add hw capability check for elf
  riscv: compat: vdso: Add COMPAT_VDSO base code implementation
  riscv: compat: vdso: Add setup additional pages implementation
  riscv: compat: signal: Add rt_frame implementation
  riscv: compat: ptrace: Add compat_arch_ptrace implement
  riscv: compat: Add COMPAT Kbuild skeletal support

 arch/arm64/Kconfig                            |   4 -
 arch/arm64/include/asm/compat.h               |  93 +------
 arch/arm64/include/asm/unistd.h               |   1 +
 arch/mips/Kconfig                             |   5 -
 arch/mips/include/asm/compat.h                |  41 +--
 arch/mips/include/asm/unistd.h                |   2 +
 arch/mips/include/uapi/asm/fcntl.h            |  30 +--
 arch/parisc/Kconfig                           |   4 -
 arch/parisc/include/asm/compat.h              |  45 +---
 arch/parisc/include/asm/unistd.h              |   1 +
 arch/powerpc/Kconfig                          |   5 -
 arch/powerpc/include/asm/compat.h             |  50 +---
 arch/powerpc/include/asm/unistd.h             |   1 +
 arch/riscv/Kconfig                            |  19 ++
 arch/riscv/Makefile                           |   9 +
 arch/riscv/configs/rv32_defconfig             | 135 ----------
 arch/riscv/include/asm/compat.h               | 129 ++++++++++
 arch/riscv/include/asm/csr.h                  |   7 +
 arch/riscv/include/asm/elf.h                  |  50 +++-
 arch/riscv/include/asm/mmu.h                  |   1 +
 arch/riscv/include/asm/pgtable.h              |  13 +-
 arch/riscv/include/asm/processor.h            |   6 +-
 arch/riscv/include/asm/syscall.h              |   1 +
 arch/riscv/include/asm/thread_info.h          |   1 +
 arch/riscv/include/asm/unistd.h               |  11 +
 arch/riscv/include/asm/vdso.h                 |   9 +
 arch/riscv/include/uapi/asm/unistd.h          |   2 +-
 arch/riscv/kernel/Makefile                    |   3 +
 arch/riscv/kernel/compat_signal.c             | 243 ++++++++++++++++++
 arch/riscv/kernel/compat_syscall_table.c      |  19 ++
 arch/riscv/kernel/compat_vdso/.gitignore      |   2 +
 arch/riscv/kernel/compat_vdso/Makefile        |  78 ++++++
 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/entry.S                     |  18 +-
 arch/riscv/kernel/process.c                   |  37 +++
 arch/riscv/kernel/ptrace.c                    |  87 ++++++-
 arch/riscv/kernel/signal.c                    |  13 +-
 arch/riscv/kernel/sys_riscv.c                 |   6 +-
 arch/riscv/kernel/vdso.c                      | 105 +++++---
 arch/riscv/kernel/vdso/vdso.S                 |   6 +-
 arch/s390/Kconfig                             |   3 -
 arch/s390/include/asm/compat.h                |  99 +------
 arch/s390/include/asm/unistd.h                |   1 +
 arch/sparc/Kconfig                            |   5 -
 arch/sparc/include/asm/compat.h               |  61 ++---
 arch/sparc/include/asm/unistd.h               |   1 +
 arch/x86/Kconfig                              |   4 -
 arch/x86/include/asm/compat.h                 | 104 ++------
 arch/x86/include/asm/unistd.h                 |   1 +
 fs/open.c                                     |  24 ++
 fs/read_write.c                               |  16 ++
 fs/stat.c                                     |   2 +-
 fs/sync.c                                     |   9 +
 include/asm-generic/compat.h                  | 113 ++++++++
 include/linux/compat.h                        |  68 +++++
 include/uapi/asm-generic/fcntl.h              |  23 +-
 include/uapi/asm-generic/unistd.h             |   4 +-
 init/Kconfig                                  |   4 +
 mm/fadvise.c                                  |  11 +
 mm/readahead.c                                |   7 +
 tools/include/uapi/asm-generic/fcntl.h        |  21 +-
 tools/include/uapi/asm-generic/unistd.h       |   4 +-
 68 files changed, 1207 insertions(+), 698 deletions(-)
 delete mode 100644 arch/riscv/configs/rv32_defconfig
 create mode 100644 arch/riscv/include/asm/compat.h
 create mode 100644 arch/riscv/kernel/compat_signal.c
 create mode 100644 arch/riscv/kernel/compat_syscall_table.c
 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

Comments

Guo Ren April 2, 2022, 2:04 p.m. UTC | #1
Hi Palmer,

Sorry for the late reply, I still want COMPAT to catch up at 5.18..
I've pushed it into my next branch, and it would get in linux-next the
next day. You could have a look at that. The repo is:
https://github.com/c-sky/csky-linux/tree/linux-next

We still need your sending pull request for COMPAT, thank you very much.

On Sat, Apr 2, 2022 at 9:53 PM <guoren@kernel.org> wrote:
>
> From: Guo Ren <guoren@linux.alibaba.com>
>
> Currently, most 64-bit architectures (x86, parisc, powerpc, arm64,
> s390, mips, sparc) have supported COMPAT mode. But they all have
> history issues and can't use standard linux unistd.h. RISC-V would
> be first standard __SYSCALL_COMPAT user of include/uapi/asm-generic
> /unistd.h.
>
> The patchset are based on v5.17-rc8, you can compare rv64-compat
> v.s. rv32-native in qemu with following steps:
>
>  - Prepare rv32 rootfs & fw_jump.bin by buildroot.org
>    $ git clone git://git.busybox.net/buildroot
>    $ cd buildroot
>    $ make qemu_riscv32_virt_defconfig O=qemu_riscv32_virt_defconfig
>    $ make -C qemu_riscv32_virt_defconfig
>    $ make qemu_riscv64_virt_defconfig O=qemu_riscv64_virt_defconfig
>    $ make -C qemu_riscv64_virt_defconfig
>    (Got fw_jump.bin & rootfs.ext2 in qemu_riscvXX_virt_defconfig/images)
>
>  - Prepare Linux rv32 & rv64 Image
>    $ git clone git@github.com:c-sky/csky-linux.git -b riscv_compat_v11 linux
>    $ cd linux
>    $ echo "CONFIG_STRICT_KERNEL_RWX=n" >> arch/riscv/configs/defconfig
>    $ echo "CONFIG_STRICT_MODULE_RWX=n" >> arch/riscv/configs/defconfig
>    $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ rv32_defconfig
>    $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ Image
>    $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ defconfig
>    $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ Image
>
>  - Prepare Qemu:
>    $ git clone https://gitlab.com/qemu-project/qemu.git -b master linux
>    $ cd qemu
>    $ ./configure --target-list="riscv64-softmmu riscv32-softmmu"
>    $ make
>
> Now let's compare rv64-compat with rv32-native memory footprint with almost the same
> defconfig, rootfs, opensbi in one qemu.
>
>  - Run rv64 with rv32 rootfs in compat mode:
>    $ ./build/qemu-system-riscv64 -cpu rv64 -M virt -m 64m -nographic -bios qemu_riscv64_virt_defconfig/images/fw_jump.bin -kernel build-rv64/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0
>
> QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
> OpenSBI v0.9
> [    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv64-unknown-linux-gnu-gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.37) #96 SMP Tue Dec 28 21:01:55 CST 2021
> [    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
> [    0.000000] Machine model: riscv-virtio,qemu
> [    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
> [    0.000000] printk: bootconsole [sbi0] enabled
> [    0.000000] efi: UEFI not found.
> [    0.000000] Zone ranges:
> [    0.000000]   DMA32    [mem 0x0000000080200000-0x0000000083ffffff]
> [    0.000000]   Normal   empty
> [    0.000000] Movable zone start for each node
> [    0.000000] Early memory node ranges
> [    0.000000]   node   0: [mem 0x0000000080200000-0x0000000083ffffff]
> [    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x0000000083ffffff]
> [    0.000000] SBI specification v0.2 detected
> [    0.000000] SBI implementation ID=0x1 Version=0x9
> [    0.000000] SBI TIME extension detected
> [    0.000000] SBI IPI extension detected
> [    0.000000] SBI RFENCE extension detected
> [    0.000000] SBI v0.2 HSM extension detected
> [    0.000000] riscv: ISA extensions acdfhimsu
> [    0.000000] riscv: ELF capabilities acdfim
> [    0.000000] percpu: Embedded 17 pages/cpu s30696 r8192 d30744 u69632
> [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15655
> [    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
> [    0.000000] Dentry cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> [    0.000000] Inode-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
> [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> [    0.000000] Virtual kernel memory layout:
> [    0.000000]       fixmap : 0xffffffcefee00000 - 0xffffffceff000000   (2048 kB)
> [    0.000000]       pci io : 0xffffffceff000000 - 0xffffffcf00000000   (  16 MB)
> [    0.000000]      vmemmap : 0xffffffcf00000000 - 0xffffffcfffffffff   (4095 MB)
> [    0.000000]      vmalloc : 0xffffffd000000000 - 0xffffffdfffffffff   (65535 MB)
> [    0.000000]       lowmem : 0xffffffe000000000 - 0xffffffe003e00000   (  62 MB)
> [    0.000000]       kernel : 0xffffffff80000000 - 0xffffffffffffffff   (2047 MB)
> [    0.000000] Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved, 0K cma-reserved)
> [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
> [    0.000000] rcu: Hierarchical RCU implementation.
> [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
> [    0.000000] rcu:     RCU debug extended QS entry/exit.
> [    0.000000]  Tracing variant of Tasks RCU enabled.
> [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
> [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> [    0.000000] riscv-intc: 64 local interrupts mapped
> [    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
> ...
> Welcome to Buildroot
> buildroot login: root
> # 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 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
> # ca[   78.386630] random: fast init done
> # cat /proc/meminfo
> MemTotal:          53076 kB
> MemFree:           40264 kB
> MemAvailable:      40244 kB
> Buffers:             236 kB
> Cached:             1560 kB
> SwapCached:            0 kB
> Active:             1700 kB
> Inactive:            516 kB
> Active(anon):         40 kB
> Inactive(anon):      424 kB
> Active(file):       1660 kB
> Inactive(file):       92 kB
> Unevictable:           0 kB
> Mlocked:               0 kB
> SwapTotal:             0 kB
> SwapFree:              0 kB
> Dirty:                 0 kB
> Writeback:             0 kB
> AnonPages:           444 kB
> Mapped:             1188 kB
> Shmem:                44 kB
> KReclaimable:        952 kB
> Slab:               5744 kB
> SReclaimable:        952 kB
> SUnreclaim:         4792 kB
> KernelStack:         624 kB
> PageTables:          156 kB
> NFS_Unstable:          0 kB
> Bounce:                0 kB
> WritebackTmp:          0 kB
> CommitLimit:       26536 kB
> Committed_AS:       1748 kB
> VmallocTotal:   67108863 kB
> VmallocUsed:         652 kB
> VmallocChunk:          0 kB
> Percpu:               80 kB
> #
>
>  - Run rv32 with rv32 rootfs:
>    $ ./build/qemu-system-riscv32 -cpu rv32 -M virt -m 64m -nographic -bios qemu_riscv32_virt_defconfig/images/fw_jump.bin -kernel build-rv32/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0
>
> QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
> OpenSBI v0.9
> [    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv32-buildroot-linux-gnu-gcc.br_real (Buildroot 2021.11-201-g7600ca7960-dirty) 10.3.0, GNU ld (GNU Binutils) 2.36.1) #7 SMP Tue Dec 28 21:02:21 CST 2021
> [    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80400000
> [    0.000000] Machine model: riscv-virtio,qemu
> [    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
> [    0.000000] printk: bootconsole [sbi0] enabled
> [    0.000000] efi: UEFI not found.
> [    0.000000] Zone ranges:
> [    0.000000]   Normal   [mem 0x0000000080400000-0x0000000083ffffff]
> [    0.000000] Movable zone start for each node
> [    0.000000] Early memory node ranges
> [    0.000000]   node   0: [mem 0x0000000080400000-0x0000000083ffffff]
> [    0.000000] Initmem setup node 0 [mem 0x0000000080400000-0x0000000083ffffff]
> [    0.000000] SBI specification v0.2 detected
> [    0.000000] SBI implementation ID=0x1 Version=0x9
> [    0.000000] SBI TIME extension detected
> [    0.000000] SBI IPI extension detected
> [    0.000000] SBI RFENCE extension detected
> [    0.000000] SBI v0.2 HSM extension detected
> [    0.000000] riscv: ISA extensions acdfhimsu
> [    0.000000] riscv: ELF capabilities acdfim
> [    0.000000] percpu: Embedded 12 pages/cpu s16600 r8192 d24360 u49152
> [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15240
> [    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
> [    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
> [    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
> [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> [    0.000000] Virtual kernel memory layout:
> [    0.000000]       fixmap : 0x9dc00000 - 0x9e000000   (4096 kB)
> [    0.000000]       pci io : 0x9e000000 - 0x9f000000   (  16 MB)
> [    0.000000]      vmemmap : 0x9f000000 - 0x9fffffff   (  15 MB)
> [    0.000000]      vmalloc : 0xa0000000 - 0xbfffffff   ( 511 MB)
> [    0.000000]       lowmem : 0xc0000000 - 0xc3c00000   (  60 MB)
> [    0.000000] Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss, 9516K reserved, 0K cma-reserved)
> [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
> [    0.000000] rcu: Hierarchical RCU implementation.
> [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
> [    0.000000] rcu:     RCU debug extended QS entry/exit.
> [    0.000000]  Tracing variant of Tasks RCU enabled.
> [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
> [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> [    0.000000] riscv-intc: 32 local interrupts mapped
> [    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
> ...
> Welcome to Buildroot
> buildroot login: root
> # cat /proc/cpuinfo
> processor       : 0
> hart            : 0
> isa             : rv32imafdcsuh
> mmu             : sv32
>
> # file /bin/busybox
> /bin/busybox: setuid ELF 32-bit LSB shared object, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
> [   79.320589] random: fast init done
> # cat /proc/meminfo
> MemTotal:          52176 kB
> MemFree:           41012 kB
> MemAvailable:      42176 kB
> Buffers:             644 kB
> Cached:             2724 kB
> SwapCached:            0 kB
> Active:             3128 kB
> Inactive:            752 kB
> Active(anon):         40 kB
> Inactive(anon):      516 kB
> Active(file):       3088 kB
> Inactive(file):      236 kB
> Unevictable:           0 kB
> Mlocked:               0 kB
> SwapTotal:             0 kB
> SwapFree:              0 kB
> Dirty:                 4 kB
> Writeback:             0 kB
> AnonPages:           556 kB
> Mapped:             2172 kB
> Shmem:                44 kB
> KReclaimable:        656 kB
> Slab:               3684 kB
> SReclaimable:        656 kB
> SUnreclaim:         3028 kB
> KernelStack:         312 kB
> PageTables:           88 kB
> NFS_Unstable:          0 kB
> Bounce:                0 kB
> WritebackTmp:          0 kB
> CommitLimit:       26088 kB
> Committed_AS:       2088 kB
> VmallocTotal:     524287 kB
> VmallocUsed:          12 kB
> VmallocChunk:          0 kB
> Percpu:               60 kB
> #
>
>  Some conclusions:
>  - kernel statics:
>    64: Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved)
>    32: Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss,  9516K reserved)
>    rv32 better than rv64:                  1%               22%           17%          13%        19%         11%
>    The code size is very similar, but data size rv32 would be better.
>
>  - rv32 kernel runtime KernelStack, Slab... are smaller,
>    rv64: MemTotal: 53076 kB,        MemFree: 40264 kB
>    rv32: MemTotal: 52176 + 2048 kB, MemFree: 41012  + 2048 kB
>    rv32 better than rv64:       2%                         6%
>
>    (Because opensbi problem, we could add another 2MB for rv32.)
>    Overall in 64MB memory situation, rv64-compat is 6% worse than rv32-native
>    at memory footprint. If the userspace memory usage increases, I think
>    the gap will be further reduced.
>
> Changes in v11:
>  - Using arch instead of kconfig for commit subject by Masahiro Yamada
>
> Changes in v10:
>  - Fixup arm64 compile error with compat_statfs definition
>  - Fixup compat_sys_fadvise64_64 function arguments error cause ltp failure
>
> Changes in v9:
>  - Fixup rv32 call rv64 segment fault
>  - Ready for 5.18
>
> Changes in v8:
>  - Enhanced elf_check_arch with EI_CLASS
>  - Fixup SR_UXL doesn't exist in CONFIG_32BIT
>  - Add Tested-by with Heiko
>  - Update qemu compile tips with upstream repo
>
> Changes in v7:
>  - Re-construct compat_vdso/Makefile
>  - Fixup disable COMPAT compile error by csr.h's macro.
>  - Optimize coding convention for lo/hi in compat.h
>
> Changes in v6:
>  - Rebase on linux-5.17-rc5
>  - Optimize hw capability check for elf
>  - Optimize comment in thread_info.h
>  - Optimize start_thread with SR_UXL setting
>  - Optimize vdso.c with direct panic
>
> Changes in v5:
>  - Rebase on linux-5.17-rc2
>  - Include consolidate the fcntl patches by Christoph Hellwig
>  - Remove F_GETLK64/F_SETLK64/F_SETLKW64 from asm/compat.h
>  - Change COMPAT_RLIM_INFINITY from 0x7fffffff to 0xffffffff
>  - Bring back "Add hw-cap detect in setup_arch patch" in v1
>
> Changes in v4:
>  - Rebase on linux-5.17-rc1
>  - Optimize compat_sys_call_table implementation with Arnd's advice
>  - Add reviewed-by for Arnd. Thx :)
>  - Remove FIXME comment in elf.h
>  - Optimize Cleanup duplicate definitions in compat.h with Arnd's advice
>
> Changes in v3:
>  - Rebase on newest master (pre linux-5.17-rc1)
>  - Using newest qemu version v7 for test
>  - Remove fcntl common modification
>  - Fixup SET_PERSONALITY in elf.h by Arnd
>  - Fixup KVM Kconfig
>  - Update Acked-by & Reviewed-by
>
> Changes in v2:
>  - Add __ARCH_WANT_COMPAT_STAT suggested
>  - Cleanup fcntl compatduplicate definitions
>  - Cleanup compat.h
>  - Move rv32_defconfig into Makefile
>  - Fixup rv64 rootfs boot failed, remove hw_compat_mode_detect
>  - Move SYSVIPC_COMPAT into init/Kconfig
>  - Simplify compat_elf_check
>
> Christoph Hellwig (3):
>   uapi: simplify __ARCH_FLOCK{,64}_PAD a little
>   uapi: always define F_GETLK64/F_SETLK64/F_SETLKW64 in fcntl.h
>   compat: consolidate the compat_flock{,64} definition
>
> Guo Ren (17):
>   arch: Add SYSVIPC_COMPAT for all architectures
>   fs: stat: compat: Add __ARCH_WANT_COMPAT_STAT
>   asm-generic: compat: Cleanup duplicate definitions
>   syscalls: compat: Fix the missing part for __SYSCALL_COMPAT
>   riscv: Fixup difference with defconfig
>   riscv: compat: Add basic compat data type implementation
>   riscv: compat: Support TASK_SIZE for compat mode
>   riscv: compat: syscall: Add compat_sys_call_table implementation
>   riscv: compat: syscall: Add entry.S implementation
>   riscv: compat: process: Add UXL_32 support in start_thread
>   riscv: compat: Add elf.h implementation
>   riscv: compat: Add hw capability check for elf
>   riscv: compat: vdso: Add COMPAT_VDSO base code implementation
>   riscv: compat: vdso: Add setup additional pages implementation
>   riscv: compat: signal: Add rt_frame implementation
>   riscv: compat: ptrace: Add compat_arch_ptrace implement
>   riscv: compat: Add COMPAT Kbuild skeletal support
>
>  arch/arm64/Kconfig                            |   4 -
>  arch/arm64/include/asm/compat.h               |  93 +------
>  arch/arm64/include/asm/unistd.h               |   1 +
>  arch/mips/Kconfig                             |   5 -
>  arch/mips/include/asm/compat.h                |  41 +--
>  arch/mips/include/asm/unistd.h                |   2 +
>  arch/mips/include/uapi/asm/fcntl.h            |  30 +--
>  arch/parisc/Kconfig                           |   4 -
>  arch/parisc/include/asm/compat.h              |  45 +---
>  arch/parisc/include/asm/unistd.h              |   1 +
>  arch/powerpc/Kconfig                          |   5 -
>  arch/powerpc/include/asm/compat.h             |  50 +---
>  arch/powerpc/include/asm/unistd.h             |   1 +
>  arch/riscv/Kconfig                            |  19 ++
>  arch/riscv/Makefile                           |   9 +
>  arch/riscv/configs/rv32_defconfig             | 135 ----------
>  arch/riscv/include/asm/compat.h               | 129 ++++++++++
>  arch/riscv/include/asm/csr.h                  |   7 +
>  arch/riscv/include/asm/elf.h                  |  50 +++-
>  arch/riscv/include/asm/mmu.h                  |   1 +
>  arch/riscv/include/asm/pgtable.h              |  13 +-
>  arch/riscv/include/asm/processor.h            |   6 +-
>  arch/riscv/include/asm/syscall.h              |   1 +
>  arch/riscv/include/asm/thread_info.h          |   1 +
>  arch/riscv/include/asm/unistd.h               |  11 +
>  arch/riscv/include/asm/vdso.h                 |   9 +
>  arch/riscv/include/uapi/asm/unistd.h          |   2 +-
>  arch/riscv/kernel/Makefile                    |   3 +
>  arch/riscv/kernel/compat_signal.c             | 243 ++++++++++++++++++
>  arch/riscv/kernel/compat_syscall_table.c      |  19 ++
>  arch/riscv/kernel/compat_vdso/.gitignore      |   2 +
>  arch/riscv/kernel/compat_vdso/Makefile        |  78 ++++++
>  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/entry.S                     |  18 +-
>  arch/riscv/kernel/process.c                   |  37 +++
>  arch/riscv/kernel/ptrace.c                    |  87 ++++++-
>  arch/riscv/kernel/signal.c                    |  13 +-
>  arch/riscv/kernel/sys_riscv.c                 |   6 +-
>  arch/riscv/kernel/vdso.c                      | 105 +++++---
>  arch/riscv/kernel/vdso/vdso.S                 |   6 +-
>  arch/s390/Kconfig                             |   3 -
>  arch/s390/include/asm/compat.h                |  99 +------
>  arch/s390/include/asm/unistd.h                |   1 +
>  arch/sparc/Kconfig                            |   5 -
>  arch/sparc/include/asm/compat.h               |  61 ++---
>  arch/sparc/include/asm/unistd.h               |   1 +
>  arch/x86/Kconfig                              |   4 -
>  arch/x86/include/asm/compat.h                 | 104 ++------
>  arch/x86/include/asm/unistd.h                 |   1 +
>  fs/open.c                                     |  24 ++
>  fs/read_write.c                               |  16 ++
>  fs/stat.c                                     |   2 +-
>  fs/sync.c                                     |   9 +
>  include/asm-generic/compat.h                  | 113 ++++++++
>  include/linux/compat.h                        |  68 +++++
>  include/uapi/asm-generic/fcntl.h              |  23 +-
>  include/uapi/asm-generic/unistd.h             |   4 +-
>  init/Kconfig                                  |   4 +
>  mm/fadvise.c                                  |  11 +
>  mm/readahead.c                                |   7 +
>  tools/include/uapi/asm-generic/fcntl.h        |  21 +-
>  tools/include/uapi/asm-generic/unistd.h       |   4 +-
>  68 files changed, 1207 insertions(+), 698 deletions(-)
>  delete mode 100644 arch/riscv/configs/rv32_defconfig
>  create mode 100644 arch/riscv/include/asm/compat.h
>  create mode 100644 arch/riscv/kernel/compat_signal.c
>  create mode 100644 arch/riscv/kernel/compat_syscall_table.c
>  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
>
> --
> 2.25.1
>
Guo Ren April 4, 2022, 2:28 p.m. UTC | #2
On Sat, Apr 2, 2022 at 10:04 PM Guo Ren <guoren@kernel.org> wrote:
>
> Hi Palmer,
>
> Sorry for the late reply, I still want COMPAT to catch up at 5.18..
> I've pushed it into my next branch, and it would get in linux-next the
> next day. You could have a look at that. The repo is:
> https://github.com/c-sky/csky-linux/tree/linux-next
>
> We still need your sending pull request for COMPAT, thank you very much.
Seems we have already missed 5.18, I just prepared the 5.18-rc1 for
you. It solved the arm64 compile problem and some conflicts, Hope you
could put it into your for-next (5.19-rc1).
https://github.com/c-sky/csky-linux/tree/riscv_compat_v12

>
> On Sat, Apr 2, 2022 at 9:53 PM <guoren@kernel.org> wrote:
> >
> > From: Guo Ren <guoren@linux.alibaba.com>
> >
> > Currently, most 64-bit architectures (x86, parisc, powerpc, arm64,
> > s390, mips, sparc) have supported COMPAT mode. But they all have
> > history issues and can't use standard linux unistd.h. RISC-V would
> > be first standard __SYSCALL_COMPAT user of include/uapi/asm-generic
> > /unistd.h.
> >
> > The patchset are based on v5.17-rc8, you can compare rv64-compat
> > v.s. rv32-native in qemu with following steps:
> >
> >  - Prepare rv32 rootfs & fw_jump.bin by buildroot.org
> >    $ git clone git://git.busybox.net/buildroot
> >    $ cd buildroot
> >    $ make qemu_riscv32_virt_defconfig O=qemu_riscv32_virt_defconfig
> >    $ make -C qemu_riscv32_virt_defconfig
> >    $ make qemu_riscv64_virt_defconfig O=qemu_riscv64_virt_defconfig
> >    $ make -C qemu_riscv64_virt_defconfig
> >    (Got fw_jump.bin & rootfs.ext2 in qemu_riscvXX_virt_defconfig/images)
> >
> >  - Prepare Linux rv32 & rv64 Image
> >    $ git clone git@github.com:c-sky/csky-linux.git -b riscv_compat_v11 linux
> >    $ cd linux
> >    $ echo "CONFIG_STRICT_KERNEL_RWX=n" >> arch/riscv/configs/defconfig
> >    $ echo "CONFIG_STRICT_MODULE_RWX=n" >> arch/riscv/configs/defconfig
> >    $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ rv32_defconfig
> >    $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ Image
> >    $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ defconfig
> >    $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ Image
> >
> >  - Prepare Qemu:
> >    $ git clone https://gitlab.com/qemu-project/qemu.git -b master linux
> >    $ cd qemu
> >    $ ./configure --target-list="riscv64-softmmu riscv32-softmmu"
> >    $ make
> >
> > Now let's compare rv64-compat with rv32-native memory footprint with almost the same
> > defconfig, rootfs, opensbi in one qemu.
> >
> >  - Run rv64 with rv32 rootfs in compat mode:
> >    $ ./build/qemu-system-riscv64 -cpu rv64 -M virt -m 64m -nographic -bios qemu_riscv64_virt_defconfig/images/fw_jump.bin -kernel build-rv64/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0
> >
> > QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
> > OpenSBI v0.9
> > [    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv64-unknown-linux-gnu-gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.37) #96 SMP Tue Dec 28 21:01:55 CST 2021
> > [    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
> > [    0.000000] Machine model: riscv-virtio,qemu
> > [    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
> > [    0.000000] printk: bootconsole [sbi0] enabled
> > [    0.000000] efi: UEFI not found.
> > [    0.000000] Zone ranges:
> > [    0.000000]   DMA32    [mem 0x0000000080200000-0x0000000083ffffff]
> > [    0.000000]   Normal   empty
> > [    0.000000] Movable zone start for each node
> > [    0.000000] Early memory node ranges
> > [    0.000000]   node   0: [mem 0x0000000080200000-0x0000000083ffffff]
> > [    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x0000000083ffffff]
> > [    0.000000] SBI specification v0.2 detected
> > [    0.000000] SBI implementation ID=0x1 Version=0x9
> > [    0.000000] SBI TIME extension detected
> > [    0.000000] SBI IPI extension detected
> > [    0.000000] SBI RFENCE extension detected
> > [    0.000000] SBI v0.2 HSM extension detected
> > [    0.000000] riscv: ISA extensions acdfhimsu
> > [    0.000000] riscv: ELF capabilities acdfim
> > [    0.000000] percpu: Embedded 17 pages/cpu s30696 r8192 d30744 u69632
> > [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15655
> > [    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
> > [    0.000000] Dentry cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> > [    0.000000] Inode-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
> > [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> > [    0.000000] Virtual kernel memory layout:
> > [    0.000000]       fixmap : 0xffffffcefee00000 - 0xffffffceff000000   (2048 kB)
> > [    0.000000]       pci io : 0xffffffceff000000 - 0xffffffcf00000000   (  16 MB)
> > [    0.000000]      vmemmap : 0xffffffcf00000000 - 0xffffffcfffffffff   (4095 MB)
> > [    0.000000]      vmalloc : 0xffffffd000000000 - 0xffffffdfffffffff   (65535 MB)
> > [    0.000000]       lowmem : 0xffffffe000000000 - 0xffffffe003e00000   (  62 MB)
> > [    0.000000]       kernel : 0xffffffff80000000 - 0xffffffffffffffff   (2047 MB)
> > [    0.000000] Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved, 0K cma-reserved)
> > [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
> > [    0.000000] rcu: Hierarchical RCU implementation.
> > [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
> > [    0.000000] rcu:     RCU debug extended QS entry/exit.
> > [    0.000000]  Tracing variant of Tasks RCU enabled.
> > [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> > [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
> > [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> > [    0.000000] riscv-intc: 64 local interrupts mapped
> > [    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
> > ...
> > Welcome to Buildroot
> > buildroot login: root
> > # 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 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
> > # ca[   78.386630] random: fast init done
> > # cat /proc/meminfo
> > MemTotal:          53076 kB
> > MemFree:           40264 kB
> > MemAvailable:      40244 kB
> > Buffers:             236 kB
> > Cached:             1560 kB
> > SwapCached:            0 kB
> > Active:             1700 kB
> > Inactive:            516 kB
> > Active(anon):         40 kB
> > Inactive(anon):      424 kB
> > Active(file):       1660 kB
> > Inactive(file):       92 kB
> > Unevictable:           0 kB
> > Mlocked:               0 kB
> > SwapTotal:             0 kB
> > SwapFree:              0 kB
> > Dirty:                 0 kB
> > Writeback:             0 kB
> > AnonPages:           444 kB
> > Mapped:             1188 kB
> > Shmem:                44 kB
> > KReclaimable:        952 kB
> > Slab:               5744 kB
> > SReclaimable:        952 kB
> > SUnreclaim:         4792 kB
> > KernelStack:         624 kB
> > PageTables:          156 kB
> > NFS_Unstable:          0 kB
> > Bounce:                0 kB
> > WritebackTmp:          0 kB
> > CommitLimit:       26536 kB
> > Committed_AS:       1748 kB
> > VmallocTotal:   67108863 kB
> > VmallocUsed:         652 kB
> > VmallocChunk:          0 kB
> > Percpu:               80 kB
> > #
> >
> >  - Run rv32 with rv32 rootfs:
> >    $ ./build/qemu-system-riscv32 -cpu rv32 -M virt -m 64m -nographic -bios qemu_riscv32_virt_defconfig/images/fw_jump.bin -kernel build-rv32/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0
> >
> > QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
> > OpenSBI v0.9
> > [    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv32-buildroot-linux-gnu-gcc.br_real (Buildroot 2021.11-201-g7600ca7960-dirty) 10.3.0, GNU ld (GNU Binutils) 2.36.1) #7 SMP Tue Dec 28 21:02:21 CST 2021
> > [    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80400000
> > [    0.000000] Machine model: riscv-virtio,qemu
> > [    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
> > [    0.000000] printk: bootconsole [sbi0] enabled
> > [    0.000000] efi: UEFI not found.
> > [    0.000000] Zone ranges:
> > [    0.000000]   Normal   [mem 0x0000000080400000-0x0000000083ffffff]
> > [    0.000000] Movable zone start for each node
> > [    0.000000] Early memory node ranges
> > [    0.000000]   node   0: [mem 0x0000000080400000-0x0000000083ffffff]
> > [    0.000000] Initmem setup node 0 [mem 0x0000000080400000-0x0000000083ffffff]
> > [    0.000000] SBI specification v0.2 detected
> > [    0.000000] SBI implementation ID=0x1 Version=0x9
> > [    0.000000] SBI TIME extension detected
> > [    0.000000] SBI IPI extension detected
> > [    0.000000] SBI RFENCE extension detected
> > [    0.000000] SBI v0.2 HSM extension detected
> > [    0.000000] riscv: ISA extensions acdfhimsu
> > [    0.000000] riscv: ELF capabilities acdfim
> > [    0.000000] percpu: Embedded 12 pages/cpu s16600 r8192 d24360 u49152
> > [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15240
> > [    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
> > [    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
> > [    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
> > [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> > [    0.000000] Virtual kernel memory layout:
> > [    0.000000]       fixmap : 0x9dc00000 - 0x9e000000   (4096 kB)
> > [    0.000000]       pci io : 0x9e000000 - 0x9f000000   (  16 MB)
> > [    0.000000]      vmemmap : 0x9f000000 - 0x9fffffff   (  15 MB)
> > [    0.000000]      vmalloc : 0xa0000000 - 0xbfffffff   ( 511 MB)
> > [    0.000000]       lowmem : 0xc0000000 - 0xc3c00000   (  60 MB)
> > [    0.000000] Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss, 9516K reserved, 0K cma-reserved)
> > [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
> > [    0.000000] rcu: Hierarchical RCU implementation.
> > [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
> > [    0.000000] rcu:     RCU debug extended QS entry/exit.
> > [    0.000000]  Tracing variant of Tasks RCU enabled.
> > [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> > [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
> > [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> > [    0.000000] riscv-intc: 32 local interrupts mapped
> > [    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
> > ...
> > Welcome to Buildroot
> > buildroot login: root
> > # cat /proc/cpuinfo
> > processor       : 0
> > hart            : 0
> > isa             : rv32imafdcsuh
> > mmu             : sv32
> >
> > # file /bin/busybox
> > /bin/busybox: setuid ELF 32-bit LSB shared object, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
> > [   79.320589] random: fast init done
> > # cat /proc/meminfo
> > MemTotal:          52176 kB
> > MemFree:           41012 kB
> > MemAvailable:      42176 kB
> > Buffers:             644 kB
> > Cached:             2724 kB
> > SwapCached:            0 kB
> > Active:             3128 kB
> > Inactive:            752 kB
> > Active(anon):         40 kB
> > Inactive(anon):      516 kB
> > Active(file):       3088 kB
> > Inactive(file):      236 kB
> > Unevictable:           0 kB
> > Mlocked:               0 kB
> > SwapTotal:             0 kB
> > SwapFree:              0 kB
> > Dirty:                 4 kB
> > Writeback:             0 kB
> > AnonPages:           556 kB
> > Mapped:             2172 kB
> > Shmem:                44 kB
> > KReclaimable:        656 kB
> > Slab:               3684 kB
> > SReclaimable:        656 kB
> > SUnreclaim:         3028 kB
> > KernelStack:         312 kB
> > PageTables:           88 kB
> > NFS_Unstable:          0 kB
> > Bounce:                0 kB
> > WritebackTmp:          0 kB
> > CommitLimit:       26088 kB
> > Committed_AS:       2088 kB
> > VmallocTotal:     524287 kB
> > VmallocUsed:          12 kB
> > VmallocChunk:          0 kB
> > Percpu:               60 kB
> > #
> >
> >  Some conclusions:
> >  - kernel statics:
> >    64: Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved)
> >    32: Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss,  9516K reserved)
> >    rv32 better than rv64:                  1%               22%           17%          13%        19%         11%
> >    The code size is very similar, but data size rv32 would be better.
> >
> >  - rv32 kernel runtime KernelStack, Slab... are smaller,
> >    rv64: MemTotal: 53076 kB,        MemFree: 40264 kB
> >    rv32: MemTotal: 52176 + 2048 kB, MemFree: 41012  + 2048 kB
> >    rv32 better than rv64:       2%                         6%
> >
> >    (Because opensbi problem, we could add another 2MB for rv32.)
> >    Overall in 64MB memory situation, rv64-compat is 6% worse than rv32-native
> >    at memory footprint. If the userspace memory usage increases, I think
> >    the gap will be further reduced.
> >
> > Changes in v11:
> >  - Using arch instead of kconfig for commit subject by Masahiro Yamada
> >
> > Changes in v10:
> >  - Fixup arm64 compile error with compat_statfs definition
> >  - Fixup compat_sys_fadvise64_64 function arguments error cause ltp failure
> >
> > Changes in v9:
> >  - Fixup rv32 call rv64 segment fault
> >  - Ready for 5.18
> >
> > Changes in v8:
> >  - Enhanced elf_check_arch with EI_CLASS
> >  - Fixup SR_UXL doesn't exist in CONFIG_32BIT
> >  - Add Tested-by with Heiko
> >  - Update qemu compile tips with upstream repo
> >
> > Changes in v7:
> >  - Re-construct compat_vdso/Makefile
> >  - Fixup disable COMPAT compile error by csr.h's macro.
> >  - Optimize coding convention for lo/hi in compat.h
> >
> > Changes in v6:
> >  - Rebase on linux-5.17-rc5
> >  - Optimize hw capability check for elf
> >  - Optimize comment in thread_info.h
> >  - Optimize start_thread with SR_UXL setting
> >  - Optimize vdso.c with direct panic
> >
> > Changes in v5:
> >  - Rebase on linux-5.17-rc2
> >  - Include consolidate the fcntl patches by Christoph Hellwig
> >  - Remove F_GETLK64/F_SETLK64/F_SETLKW64 from asm/compat.h
> >  - Change COMPAT_RLIM_INFINITY from 0x7fffffff to 0xffffffff
> >  - Bring back "Add hw-cap detect in setup_arch patch" in v1
> >
> > Changes in v4:
> >  - Rebase on linux-5.17-rc1
> >  - Optimize compat_sys_call_table implementation with Arnd's advice
> >  - Add reviewed-by for Arnd. Thx :)
> >  - Remove FIXME comment in elf.h
> >  - Optimize Cleanup duplicate definitions in compat.h with Arnd's advice
> >
> > Changes in v3:
> >  - Rebase on newest master (pre linux-5.17-rc1)
> >  - Using newest qemu version v7 for test
> >  - Remove fcntl common modification
> >  - Fixup SET_PERSONALITY in elf.h by Arnd
> >  - Fixup KVM Kconfig
> >  - Update Acked-by & Reviewed-by
> >
> > Changes in v2:
> >  - Add __ARCH_WANT_COMPAT_STAT suggested
> >  - Cleanup fcntl compatduplicate definitions
> >  - Cleanup compat.h
> >  - Move rv32_defconfig into Makefile
> >  - Fixup rv64 rootfs boot failed, remove hw_compat_mode_detect
> >  - Move SYSVIPC_COMPAT into init/Kconfig
> >  - Simplify compat_elf_check
> >
> > Christoph Hellwig (3):
> >   uapi: simplify __ARCH_FLOCK{,64}_PAD a little
> >   uapi: always define F_GETLK64/F_SETLK64/F_SETLKW64 in fcntl.h
> >   compat: consolidate the compat_flock{,64} definition
> >
> > Guo Ren (17):
> >   arch: Add SYSVIPC_COMPAT for all architectures
> >   fs: stat: compat: Add __ARCH_WANT_COMPAT_STAT
> >   asm-generic: compat: Cleanup duplicate definitions
> >   syscalls: compat: Fix the missing part for __SYSCALL_COMPAT
> >   riscv: Fixup difference with defconfig
> >   riscv: compat: Add basic compat data type implementation
> >   riscv: compat: Support TASK_SIZE for compat mode
> >   riscv: compat: syscall: Add compat_sys_call_table implementation
> >   riscv: compat: syscall: Add entry.S implementation
> >   riscv: compat: process: Add UXL_32 support in start_thread
> >   riscv: compat: Add elf.h implementation
> >   riscv: compat: Add hw capability check for elf
> >   riscv: compat: vdso: Add COMPAT_VDSO base code implementation
> >   riscv: compat: vdso: Add setup additional pages implementation
> >   riscv: compat: signal: Add rt_frame implementation
> >   riscv: compat: ptrace: Add compat_arch_ptrace implement
> >   riscv: compat: Add COMPAT Kbuild skeletal support
> >
> >  arch/arm64/Kconfig                            |   4 -
> >  arch/arm64/include/asm/compat.h               |  93 +------
> >  arch/arm64/include/asm/unistd.h               |   1 +
> >  arch/mips/Kconfig                             |   5 -
> >  arch/mips/include/asm/compat.h                |  41 +--
> >  arch/mips/include/asm/unistd.h                |   2 +
> >  arch/mips/include/uapi/asm/fcntl.h            |  30 +--
> >  arch/parisc/Kconfig                           |   4 -
> >  arch/parisc/include/asm/compat.h              |  45 +---
> >  arch/parisc/include/asm/unistd.h              |   1 +
> >  arch/powerpc/Kconfig                          |   5 -
> >  arch/powerpc/include/asm/compat.h             |  50 +---
> >  arch/powerpc/include/asm/unistd.h             |   1 +
> >  arch/riscv/Kconfig                            |  19 ++
> >  arch/riscv/Makefile                           |   9 +
> >  arch/riscv/configs/rv32_defconfig             | 135 ----------
> >  arch/riscv/include/asm/compat.h               | 129 ++++++++++
> >  arch/riscv/include/asm/csr.h                  |   7 +
> >  arch/riscv/include/asm/elf.h                  |  50 +++-
> >  arch/riscv/include/asm/mmu.h                  |   1 +
> >  arch/riscv/include/asm/pgtable.h              |  13 +-
> >  arch/riscv/include/asm/processor.h            |   6 +-
> >  arch/riscv/include/asm/syscall.h              |   1 +
> >  arch/riscv/include/asm/thread_info.h          |   1 +
> >  arch/riscv/include/asm/unistd.h               |  11 +
> >  arch/riscv/include/asm/vdso.h                 |   9 +
> >  arch/riscv/include/uapi/asm/unistd.h          |   2 +-
> >  arch/riscv/kernel/Makefile                    |   3 +
> >  arch/riscv/kernel/compat_signal.c             | 243 ++++++++++++++++++
> >  arch/riscv/kernel/compat_syscall_table.c      |  19 ++
> >  arch/riscv/kernel/compat_vdso/.gitignore      |   2 +
> >  arch/riscv/kernel/compat_vdso/Makefile        |  78 ++++++
> >  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/entry.S                     |  18 +-
> >  arch/riscv/kernel/process.c                   |  37 +++
> >  arch/riscv/kernel/ptrace.c                    |  87 ++++++-
> >  arch/riscv/kernel/signal.c                    |  13 +-
> >  arch/riscv/kernel/sys_riscv.c                 |   6 +-
> >  arch/riscv/kernel/vdso.c                      | 105 +++++---
> >  arch/riscv/kernel/vdso/vdso.S                 |   6 +-
> >  arch/s390/Kconfig                             |   3 -
> >  arch/s390/include/asm/compat.h                |  99 +------
> >  arch/s390/include/asm/unistd.h                |   1 +
> >  arch/sparc/Kconfig                            |   5 -
> >  arch/sparc/include/asm/compat.h               |  61 ++---
> >  arch/sparc/include/asm/unistd.h               |   1 +
> >  arch/x86/Kconfig                              |   4 -
> >  arch/x86/include/asm/compat.h                 | 104 ++------
> >  arch/x86/include/asm/unistd.h                 |   1 +
> >  fs/open.c                                     |  24 ++
> >  fs/read_write.c                               |  16 ++
> >  fs/stat.c                                     |   2 +-
> >  fs/sync.c                                     |   9 +
> >  include/asm-generic/compat.h                  | 113 ++++++++
> >  include/linux/compat.h                        |  68 +++++
> >  include/uapi/asm-generic/fcntl.h              |  23 +-
> >  include/uapi/asm-generic/unistd.h             |   4 +-
> >  init/Kconfig                                  |   4 +
> >  mm/fadvise.c                                  |  11 +
> >  mm/readahead.c                                |   7 +
> >  tools/include/uapi/asm-generic/fcntl.h        |  21 +-
> >  tools/include/uapi/asm-generic/unistd.h       |   4 +-
> >  68 files changed, 1207 insertions(+), 698 deletions(-)
> >  delete mode 100644 arch/riscv/configs/rv32_defconfig
> >  create mode 100644 arch/riscv/include/asm/compat.h
> >  create mode 100644 arch/riscv/kernel/compat_signal.c
> >  create mode 100644 arch/riscv/kernel/compat_syscall_table.c
> >  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
> >
> > --
> > 2.25.1
> >
>
>
> --
> Best Regards
>  Guo Ren
>
> ML: https://lore.kernel.org/linux-csky/
Palmer Dabbelt April 4, 2022, 11:06 p.m. UTC | #3
On Mon, 04 Apr 2022 07:28:50 PDT (-0700), guoren@kernel.org wrote:
> On Sat, Apr 2, 2022 at 10:04 PM Guo Ren <guoren@kernel.org> wrote:
>>
>> Hi Palmer,
>>
>> Sorry for the late reply, I still want COMPAT to catch up at 5.18..
>> I've pushed it into my next branch, and it would get in linux-next the
>> next day. You could have a look at that. The repo is:
>> https://github.com/c-sky/csky-linux/tree/linux-next
>>
>> We still need your sending pull request for COMPAT, thank you very much.

Sorry, but it was still failing the autobuilders on the previous 
versions and Saturday night is way, way too late for a respin of a big 
patch set.

> Seems we have already missed 5.18, I just prepared the 5.18-rc1 for
> you. It solved the arm64 compile problem and some conflicts, Hope you
> could put it into your for-next (5.19-rc1).
> https://github.com/c-sky/csky-linux/tree/riscv_compat_v12

This says v11, but that says v12.  I'm going to put the v11 that was 
sent to the lists in a branch for the autobuilders to test again, but 
LMK if there's a difference (maybe by sending the v12?).  Might take a 
bit for me to get everything bumped and tested, my machine's super flaky 
right now...

>
>>
>> On Sat, Apr 2, 2022 at 9:53 PM <guoren@kernel.org> wrote:
>> >
>> > From: Guo Ren <guoren@linux.alibaba.com>
>> >
>> > Currently, most 64-bit architectures (x86, parisc, powerpc, arm64,
>> > s390, mips, sparc) have supported COMPAT mode. But they all have
>> > history issues and can't use standard linux unistd.h. RISC-V would
>> > be first standard __SYSCALL_COMPAT user of include/uapi/asm-generic
>> > /unistd.h.
>> >
>> > The patchset are based on v5.17-rc8, you can compare rv64-compat
>> > v.s. rv32-native in qemu with following steps:
>> >
>> >  - Prepare rv32 rootfs & fw_jump.bin by buildroot.org
>> >    $ git clone git://git.busybox.net/buildroot
>> >    $ cd buildroot
>> >    $ make qemu_riscv32_virt_defconfig O=qemu_riscv32_virt_defconfig
>> >    $ make -C qemu_riscv32_virt_defconfig
>> >    $ make qemu_riscv64_virt_defconfig O=qemu_riscv64_virt_defconfig
>> >    $ make -C qemu_riscv64_virt_defconfig
>> >    (Got fw_jump.bin & rootfs.ext2 in qemu_riscvXX_virt_defconfig/images)
>> >
>> >  - Prepare Linux rv32 & rv64 Image
>> >    $ git clone git@github.com:c-sky/csky-linux.git -b riscv_compat_v11 linux
>> >    $ cd linux
>> >    $ echo "CONFIG_STRICT_KERNEL_RWX=n" >> arch/riscv/configs/defconfig
>> >    $ echo "CONFIG_STRICT_MODULE_RWX=n" >> arch/riscv/configs/defconfig
>> >    $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ rv32_defconfig
>> >    $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ Image
>> >    $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ defconfig
>> >    $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ Image
>> >
>> >  - Prepare Qemu:
>> >    $ git clone https://gitlab.com/qemu-project/qemu.git -b master linux
>> >    $ cd qemu
>> >    $ ./configure --target-list="riscv64-softmmu riscv32-softmmu"
>> >    $ make
>> >
>> > Now let's compare rv64-compat with rv32-native memory footprint with almost the same
>> > defconfig, rootfs, opensbi in one qemu.
>> >
>> >  - Run rv64 with rv32 rootfs in compat mode:
>> >    $ ./build/qemu-system-riscv64 -cpu rv64 -M virt -m 64m -nographic -bios qemu_riscv64_virt_defconfig/images/fw_jump.bin -kernel build-rv64/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0
>> >
>> > QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
>> > OpenSBI v0.9
>> > [    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv64-unknown-linux-gnu-gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.37) #96 SMP Tue Dec 28 21:01:55 CST 2021
>> > [    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
>> > [    0.000000] Machine model: riscv-virtio,qemu
>> > [    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
>> > [    0.000000] printk: bootconsole [sbi0] enabled
>> > [    0.000000] efi: UEFI not found.
>> > [    0.000000] Zone ranges:
>> > [    0.000000]   DMA32    [mem 0x0000000080200000-0x0000000083ffffff]
>> > [    0.000000]   Normal   empty
>> > [    0.000000] Movable zone start for each node
>> > [    0.000000] Early memory node ranges
>> > [    0.000000]   node   0: [mem 0x0000000080200000-0x0000000083ffffff]
>> > [    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x0000000083ffffff]
>> > [    0.000000] SBI specification v0.2 detected
>> > [    0.000000] SBI implementation ID=0x1 Version=0x9
>> > [    0.000000] SBI TIME extension detected
>> > [    0.000000] SBI IPI extension detected
>> > [    0.000000] SBI RFENCE extension detected
>> > [    0.000000] SBI v0.2 HSM extension detected
>> > [    0.000000] riscv: ISA extensions acdfhimsu
>> > [    0.000000] riscv: ELF capabilities acdfim
>> > [    0.000000] percpu: Embedded 17 pages/cpu s30696 r8192 d30744 u69632
>> > [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15655
>> > [    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
>> > [    0.000000] Dentry cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
>> > [    0.000000] Inode-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
>> > [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
>> > [    0.000000] Virtual kernel memory layout:
>> > [    0.000000]       fixmap : 0xffffffcefee00000 - 0xffffffceff000000   (2048 kB)
>> > [    0.000000]       pci io : 0xffffffceff000000 - 0xffffffcf00000000   (  16 MB)
>> > [    0.000000]      vmemmap : 0xffffffcf00000000 - 0xffffffcfffffffff   (4095 MB)
>> > [    0.000000]      vmalloc : 0xffffffd000000000 - 0xffffffdfffffffff   (65535 MB)
>> > [    0.000000]       lowmem : 0xffffffe000000000 - 0xffffffe003e00000   (  62 MB)
>> > [    0.000000]       kernel : 0xffffffff80000000 - 0xffffffffffffffff   (2047 MB)
>> > [    0.000000] Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved, 0K cma-reserved)
>> > [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
>> > [    0.000000] rcu: Hierarchical RCU implementation.
>> > [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
>> > [    0.000000] rcu:     RCU debug extended QS entry/exit.
>> > [    0.000000]  Tracing variant of Tasks RCU enabled.
>> > [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
>> > [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
>> > [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
>> > [    0.000000] riscv-intc: 64 local interrupts mapped
>> > [    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
>> > ...
>> > Welcome to Buildroot
>> > buildroot login: root
>> > # 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 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
>> > # ca[   78.386630] random: fast init done
>> > # cat /proc/meminfo
>> > MemTotal:          53076 kB
>> > MemFree:           40264 kB
>> > MemAvailable:      40244 kB
>> > Buffers:             236 kB
>> > Cached:             1560 kB
>> > SwapCached:            0 kB
>> > Active:             1700 kB
>> > Inactive:            516 kB
>> > Active(anon):         40 kB
>> > Inactive(anon):      424 kB
>> > Active(file):       1660 kB
>> > Inactive(file):       92 kB
>> > Unevictable:           0 kB
>> > Mlocked:               0 kB
>> > SwapTotal:             0 kB
>> > SwapFree:              0 kB
>> > Dirty:                 0 kB
>> > Writeback:             0 kB
>> > AnonPages:           444 kB
>> > Mapped:             1188 kB
>> > Shmem:                44 kB
>> > KReclaimable:        952 kB
>> > Slab:               5744 kB
>> > SReclaimable:        952 kB
>> > SUnreclaim:         4792 kB
>> > KernelStack:         624 kB
>> > PageTables:          156 kB
>> > NFS_Unstable:          0 kB
>> > Bounce:                0 kB
>> > WritebackTmp:          0 kB
>> > CommitLimit:       26536 kB
>> > Committed_AS:       1748 kB
>> > VmallocTotal:   67108863 kB
>> > VmallocUsed:         652 kB
>> > VmallocChunk:          0 kB
>> > Percpu:               80 kB
>> > #
>> >
>> >  - Run rv32 with rv32 rootfs:
>> >    $ ./build/qemu-system-riscv32 -cpu rv32 -M virt -m 64m -nographic -bios qemu_riscv32_virt_defconfig/images/fw_jump.bin -kernel build-rv32/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0
>> >
>> > QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
>> > OpenSBI v0.9
>> > [    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv32-buildroot-linux-gnu-gcc.br_real (Buildroot 2021.11-201-g7600ca7960-dirty) 10.3.0, GNU ld (GNU Binutils) 2.36.1) #7 SMP Tue Dec 28 21:02:21 CST 2021
>> > [    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80400000
>> > [    0.000000] Machine model: riscv-virtio,qemu
>> > [    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
>> > [    0.000000] printk: bootconsole [sbi0] enabled
>> > [    0.000000] efi: UEFI not found.
>> > [    0.000000] Zone ranges:
>> > [    0.000000]   Normal   [mem 0x0000000080400000-0x0000000083ffffff]
>> > [    0.000000] Movable zone start for each node
>> > [    0.000000] Early memory node ranges
>> > [    0.000000]   node   0: [mem 0x0000000080400000-0x0000000083ffffff]
>> > [    0.000000] Initmem setup node 0 [mem 0x0000000080400000-0x0000000083ffffff]
>> > [    0.000000] SBI specification v0.2 detected
>> > [    0.000000] SBI implementation ID=0x1 Version=0x9
>> > [    0.000000] SBI TIME extension detected
>> > [    0.000000] SBI IPI extension detected
>> > [    0.000000] SBI RFENCE extension detected
>> > [    0.000000] SBI v0.2 HSM extension detected
>> > [    0.000000] riscv: ISA extensions acdfhimsu
>> > [    0.000000] riscv: ELF capabilities acdfim
>> > [    0.000000] percpu: Embedded 12 pages/cpu s16600 r8192 d24360 u49152
>> > [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15240
>> > [    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
>> > [    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
>> > [    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
>> > [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
>> > [    0.000000] Virtual kernel memory layout:
>> > [    0.000000]       fixmap : 0x9dc00000 - 0x9e000000   (4096 kB)
>> > [    0.000000]       pci io : 0x9e000000 - 0x9f000000   (  16 MB)
>> > [    0.000000]      vmemmap : 0x9f000000 - 0x9fffffff   (  15 MB)
>> > [    0.000000]      vmalloc : 0xa0000000 - 0xbfffffff   ( 511 MB)
>> > [    0.000000]       lowmem : 0xc0000000 - 0xc3c00000   (  60 MB)
>> > [    0.000000] Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss, 9516K reserved, 0K cma-reserved)
>> > [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
>> > [    0.000000] rcu: Hierarchical RCU implementation.
>> > [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
>> > [    0.000000] rcu:     RCU debug extended QS entry/exit.
>> > [    0.000000]  Tracing variant of Tasks RCU enabled.
>> > [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
>> > [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
>> > [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
>> > [    0.000000] riscv-intc: 32 local interrupts mapped
>> > [    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
>> > ...
>> > Welcome to Buildroot
>> > buildroot login: root
>> > # cat /proc/cpuinfo
>> > processor       : 0
>> > hart            : 0
>> > isa             : rv32imafdcsuh
>> > mmu             : sv32
>> >
>> > # file /bin/busybox
>> > /bin/busybox: setuid ELF 32-bit LSB shared object, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
>> > [   79.320589] random: fast init done
>> > # cat /proc/meminfo
>> > MemTotal:          52176 kB
>> > MemFree:           41012 kB
>> > MemAvailable:      42176 kB
>> > Buffers:             644 kB
>> > Cached:             2724 kB
>> > SwapCached:            0 kB
>> > Active:             3128 kB
>> > Inactive:            752 kB
>> > Active(anon):         40 kB
>> > Inactive(anon):      516 kB
>> > Active(file):       3088 kB
>> > Inactive(file):      236 kB
>> > Unevictable:           0 kB
>> > Mlocked:               0 kB
>> > SwapTotal:             0 kB
>> > SwapFree:              0 kB
>> > Dirty:                 4 kB
>> > Writeback:             0 kB
>> > AnonPages:           556 kB
>> > Mapped:             2172 kB
>> > Shmem:                44 kB
>> > KReclaimable:        656 kB
>> > Slab:               3684 kB
>> > SReclaimable:        656 kB
>> > SUnreclaim:         3028 kB
>> > KernelStack:         312 kB
>> > PageTables:           88 kB
>> > NFS_Unstable:          0 kB
>> > Bounce:                0 kB
>> > WritebackTmp:          0 kB
>> > CommitLimit:       26088 kB
>> > Committed_AS:       2088 kB
>> > VmallocTotal:     524287 kB
>> > VmallocUsed:          12 kB
>> > VmallocChunk:          0 kB
>> > Percpu:               60 kB
>> > #
>> >
>> >  Some conclusions:
>> >  - kernel statics:
>> >    64: Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved)
>> >    32: Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss,  9516K reserved)
>> >    rv32 better than rv64:                  1%               22%           17%          13%        19%         11%
>> >    The code size is very similar, but data size rv32 would be better.
>> >
>> >  - rv32 kernel runtime KernelStack, Slab... are smaller,
>> >    rv64: MemTotal: 53076 kB,        MemFree: 40264 kB
>> >    rv32: MemTotal: 52176 + 2048 kB, MemFree: 41012  + 2048 kB
>> >    rv32 better than rv64:       2%                         6%
>> >
>> >    (Because opensbi problem, we could add another 2MB for rv32.)
>> >    Overall in 64MB memory situation, rv64-compat is 6% worse than rv32-native
>> >    at memory footprint. If the userspace memory usage increases, I think
>> >    the gap will be further reduced.
>> >
>> > Changes in v11:
>> >  - Using arch instead of kconfig for commit subject by Masahiro Yamada
>> >
>> > Changes in v10:
>> >  - Fixup arm64 compile error with compat_statfs definition
>> >  - Fixup compat_sys_fadvise64_64 function arguments error cause ltp failure
>> >
>> > Changes in v9:
>> >  - Fixup rv32 call rv64 segment fault
>> >  - Ready for 5.18
>> >
>> > Changes in v8:
>> >  - Enhanced elf_check_arch with EI_CLASS
>> >  - Fixup SR_UXL doesn't exist in CONFIG_32BIT
>> >  - Add Tested-by with Heiko
>> >  - Update qemu compile tips with upstream repo
>> >
>> > Changes in v7:
>> >  - Re-construct compat_vdso/Makefile
>> >  - Fixup disable COMPAT compile error by csr.h's macro.
>> >  - Optimize coding convention for lo/hi in compat.h
>> >
>> > Changes in v6:
>> >  - Rebase on linux-5.17-rc5
>> >  - Optimize hw capability check for elf
>> >  - Optimize comment in thread_info.h
>> >  - Optimize start_thread with SR_UXL setting
>> >  - Optimize vdso.c with direct panic
>> >
>> > Changes in v5:
>> >  - Rebase on linux-5.17-rc2
>> >  - Include consolidate the fcntl patches by Christoph Hellwig
>> >  - Remove F_GETLK64/F_SETLK64/F_SETLKW64 from asm/compat.h
>> >  - Change COMPAT_RLIM_INFINITY from 0x7fffffff to 0xffffffff
>> >  - Bring back "Add hw-cap detect in setup_arch patch" in v1
>> >
>> > Changes in v4:
>> >  - Rebase on linux-5.17-rc1
>> >  - Optimize compat_sys_call_table implementation with Arnd's advice
>> >  - Add reviewed-by for Arnd. Thx :)
>> >  - Remove FIXME comment in elf.h
>> >  - Optimize Cleanup duplicate definitions in compat.h with Arnd's advice
>> >
>> > Changes in v3:
>> >  - Rebase on newest master (pre linux-5.17-rc1)
>> >  - Using newest qemu version v7 for test
>> >  - Remove fcntl common modification
>> >  - Fixup SET_PERSONALITY in elf.h by Arnd
>> >  - Fixup KVM Kconfig
>> >  - Update Acked-by & Reviewed-by
>> >
>> > Changes in v2:
>> >  - Add __ARCH_WANT_COMPAT_STAT suggested
>> >  - Cleanup fcntl compatduplicate definitions
>> >  - Cleanup compat.h
>> >  - Move rv32_defconfig into Makefile
>> >  - Fixup rv64 rootfs boot failed, remove hw_compat_mode_detect
>> >  - Move SYSVIPC_COMPAT into init/Kconfig
>> >  - Simplify compat_elf_check
>> >
>> > Christoph Hellwig (3):
>> >   uapi: simplify __ARCH_FLOCK{,64}_PAD a little
>> >   uapi: always define F_GETLK64/F_SETLK64/F_SETLKW64 in fcntl.h
>> >   compat: consolidate the compat_flock{,64} definition
>> >
>> > Guo Ren (17):
>> >   arch: Add SYSVIPC_COMPAT for all architectures
>> >   fs: stat: compat: Add __ARCH_WANT_COMPAT_STAT
>> >   asm-generic: compat: Cleanup duplicate definitions
>> >   syscalls: compat: Fix the missing part for __SYSCALL_COMPAT
>> >   riscv: Fixup difference with defconfig
>> >   riscv: compat: Add basic compat data type implementation
>> >   riscv: compat: Support TASK_SIZE for compat mode
>> >   riscv: compat: syscall: Add compat_sys_call_table implementation
>> >   riscv: compat: syscall: Add entry.S implementation
>> >   riscv: compat: process: Add UXL_32 support in start_thread
>> >   riscv: compat: Add elf.h implementation
>> >   riscv: compat: Add hw capability check for elf
>> >   riscv: compat: vdso: Add COMPAT_VDSO base code implementation
>> >   riscv: compat: vdso: Add setup additional pages implementation
>> >   riscv: compat: signal: Add rt_frame implementation
>> >   riscv: compat: ptrace: Add compat_arch_ptrace implement
>> >   riscv: compat: Add COMPAT Kbuild skeletal support
>> >
>> >  arch/arm64/Kconfig                            |   4 -
>> >  arch/arm64/include/asm/compat.h               |  93 +------
>> >  arch/arm64/include/asm/unistd.h               |   1 +
>> >  arch/mips/Kconfig                             |   5 -
>> >  arch/mips/include/asm/compat.h                |  41 +--
>> >  arch/mips/include/asm/unistd.h                |   2 +
>> >  arch/mips/include/uapi/asm/fcntl.h            |  30 +--
>> >  arch/parisc/Kconfig                           |   4 -
>> >  arch/parisc/include/asm/compat.h              |  45 +---
>> >  arch/parisc/include/asm/unistd.h              |   1 +
>> >  arch/powerpc/Kconfig                          |   5 -
>> >  arch/powerpc/include/asm/compat.h             |  50 +---
>> >  arch/powerpc/include/asm/unistd.h             |   1 +
>> >  arch/riscv/Kconfig                            |  19 ++
>> >  arch/riscv/Makefile                           |   9 +
>> >  arch/riscv/configs/rv32_defconfig             | 135 ----------
>> >  arch/riscv/include/asm/compat.h               | 129 ++++++++++
>> >  arch/riscv/include/asm/csr.h                  |   7 +
>> >  arch/riscv/include/asm/elf.h                  |  50 +++-
>> >  arch/riscv/include/asm/mmu.h                  |   1 +
>> >  arch/riscv/include/asm/pgtable.h              |  13 +-
>> >  arch/riscv/include/asm/processor.h            |   6 +-
>> >  arch/riscv/include/asm/syscall.h              |   1 +
>> >  arch/riscv/include/asm/thread_info.h          |   1 +
>> >  arch/riscv/include/asm/unistd.h               |  11 +
>> >  arch/riscv/include/asm/vdso.h                 |   9 +
>> >  arch/riscv/include/uapi/asm/unistd.h          |   2 +-
>> >  arch/riscv/kernel/Makefile                    |   3 +
>> >  arch/riscv/kernel/compat_signal.c             | 243 ++++++++++++++++++
>> >  arch/riscv/kernel/compat_syscall_table.c      |  19 ++
>> >  arch/riscv/kernel/compat_vdso/.gitignore      |   2 +
>> >  arch/riscv/kernel/compat_vdso/Makefile        |  78 ++++++
>> >  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/entry.S                     |  18 +-
>> >  arch/riscv/kernel/process.c                   |  37 +++
>> >  arch/riscv/kernel/ptrace.c                    |  87 ++++++-
>> >  arch/riscv/kernel/signal.c                    |  13 +-
>> >  arch/riscv/kernel/sys_riscv.c                 |   6 +-
>> >  arch/riscv/kernel/vdso.c                      | 105 +++++---
>> >  arch/riscv/kernel/vdso/vdso.S                 |   6 +-
>> >  arch/s390/Kconfig                             |   3 -
>> >  arch/s390/include/asm/compat.h                |  99 +------
>> >  arch/s390/include/asm/unistd.h                |   1 +
>> >  arch/sparc/Kconfig                            |   5 -
>> >  arch/sparc/include/asm/compat.h               |  61 ++---
>> >  arch/sparc/include/asm/unistd.h               |   1 +
>> >  arch/x86/Kconfig                              |   4 -
>> >  arch/x86/include/asm/compat.h                 | 104 ++------
>> >  arch/x86/include/asm/unistd.h                 |   1 +
>> >  fs/open.c                                     |  24 ++
>> >  fs/read_write.c                               |  16 ++
>> >  fs/stat.c                                     |   2 +-
>> >  fs/sync.c                                     |   9 +
>> >  include/asm-generic/compat.h                  | 113 ++++++++
>> >  include/linux/compat.h                        |  68 +++++
>> >  include/uapi/asm-generic/fcntl.h              |  23 +-
>> >  include/uapi/asm-generic/unistd.h             |   4 +-
>> >  init/Kconfig                                  |   4 +
>> >  mm/fadvise.c                                  |  11 +
>> >  mm/readahead.c                                |   7 +
>> >  tools/include/uapi/asm-generic/fcntl.h        |  21 +-
>> >  tools/include/uapi/asm-generic/unistd.h       |   4 +-
>> >  68 files changed, 1207 insertions(+), 698 deletions(-)
>> >  delete mode 100644 arch/riscv/configs/rv32_defconfig
>> >  create mode 100644 arch/riscv/include/asm/compat.h
>> >  create mode 100644 arch/riscv/kernel/compat_signal.c
>> >  create mode 100644 arch/riscv/kernel/compat_syscall_table.c
>> >  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
>> >
>> > --
>> > 2.25.1
>> >
>>
>>
>> --
>> Best Regards
>>  Guo Ren
>>
>> ML: https://lore.kernel.org/linux-csky/
>
>
>
> -- 
> Best Regards
>  Guo Ren
>
> ML: https://lore.kernel.org/linux-csky/
Guo Ren April 5, 2022, 6:01 a.m. UTC | #4
Hi Palmer,

On Tue, Apr 5, 2022 at 7:06 AM Palmer Dabbelt <palmer@dabbelt.com> wrote:
>
> On Mon, 04 Apr 2022 07:28:50 PDT (-0700), guoren@kernel.org wrote:
> > On Sat, Apr 2, 2022 at 10:04 PM Guo Ren <guoren@kernel.org> wrote:
> >>
> >> Hi Palmer,
> >>
> >> Sorry for the late reply, I still want COMPAT to catch up at 5.18..
> >> I've pushed it into my next branch, and it would get in linux-next the
> >> next day. You could have a look at that. The repo is:
> >> https://github.com/c-sky/csky-linux/tree/linux-next
> >>
> >> We still need your sending pull request for COMPAT, thank you very much.
>
> Sorry, but it was still failing the autobuilders on the previous
> versions and Saturday night is way, way too late for a respin of a big
> patch set.
It's my fault to miss the arm64 auto builder problem, and I've fixed it in v12.

>
> > Seems we have already missed 5.18, I just prepared the 5.18-rc1 for
> > you. It solved the arm64 compile problem and some conflicts, Hope you
> > could put it into your for-next (5.19-rc1).
> > https://github.com/c-sky/csky-linux/tree/riscv_compat_v12
>
> This says v11, but that says v12.  I'm going to put the v11 that was
> sent to the lists in a branch for the autobuilders to test again, but
> LMK if there's a difference (maybe by sending the v12?).  Might take a
> bit for me to get everything bumped and tested, my machine's super flaky
> right now...
v11 is based on 5.17-rc8, so you could abandon it.:
https://github.com/c-sky/csky-linux/commits/riscv_compat_v11

v12 is based on 5.18-rc1 (I haven't sent patches series to the list):
https://github.com/c-sky/csky-linux/commits/riscv_compat_v12

A new compile problem has been reported by Nathan and I've fixed it in
v12. I will soon send out the v12 patchset series in the mail list.





>
> >
> >>
> >> On Sat, Apr 2, 2022 at 9:53 PM <guoren@kernel.org> wrote:
> >> >
> >> > From: Guo Ren <guoren@linux.alibaba.com>
> >> >
> >> > Currently, most 64-bit architectures (x86, parisc, powerpc, arm64,
> >> > s390, mips, sparc) have supported COMPAT mode. But they all have
> >> > history issues and can't use standard linux unistd.h. RISC-V would
> >> > be first standard __SYSCALL_COMPAT user of include/uapi/asm-generic
> >> > /unistd.h.
> >> >
> >> > The patchset are based on v5.17-rc8, you can compare rv64-compat
> >> > v.s. rv32-native in qemu with following steps:
> >> >
> >> >  - Prepare rv32 rootfs & fw_jump.bin by buildroot.org
> >> >    $ git clone git://git.busybox.net/buildroot
> >> >    $ cd buildroot
> >> >    $ make qemu_riscv32_virt_defconfig O=qemu_riscv32_virt_defconfig
> >> >    $ make -C qemu_riscv32_virt_defconfig
> >> >    $ make qemu_riscv64_virt_defconfig O=qemu_riscv64_virt_defconfig
> >> >    $ make -C qemu_riscv64_virt_defconfig
> >> >    (Got fw_jump.bin & rootfs.ext2 in qemu_riscvXX_virt_defconfig/images)
> >> >
> >> >  - Prepare Linux rv32 & rv64 Image
> >> >    $ git clone git@github.com:c-sky/csky-linux.git -b riscv_compat_v11 linux
> >> >    $ cd linux
> >> >    $ echo "CONFIG_STRICT_KERNEL_RWX=n" >> arch/riscv/configs/defconfig
> >> >    $ echo "CONFIG_STRICT_MODULE_RWX=n" >> arch/riscv/configs/defconfig
> >> >    $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ rv32_defconfig
> >> >    $ make ARCH=riscv CROSS_COMPILE=riscv32-buildroot-linux-gnu- O=../build-rv32/ Image
> >> >    $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ defconfig
> >> >    $ make ARCH=riscv CROSS_COMPILE=riscv64-buildroot-linux-gnu- O=../build-rv64/ Image
> >> >
> >> >  - Prepare Qemu:
> >> >    $ git clone https://gitlab.com/qemu-project/qemu.git -b master linux
> >> >    $ cd qemu
> >> >    $ ./configure --target-list="riscv64-softmmu riscv32-softmmu"
> >> >    $ make
> >> >
> >> > Now let's compare rv64-compat with rv32-native memory footprint with almost the same
> >> > defconfig, rootfs, opensbi in one qemu.
> >> >
> >> >  - Run rv64 with rv32 rootfs in compat mode:
> >> >    $ ./build/qemu-system-riscv64 -cpu rv64 -M virt -m 64m -nographic -bios qemu_riscv64_virt_defconfig/images/fw_jump.bin -kernel build-rv64/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0
> >> >
> >> > QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
> >> > OpenSBI v0.9
> >> > [    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv64-unknown-linux-gnu-gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.37) #96 SMP Tue Dec 28 21:01:55 CST 2021
> >> > [    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
> >> > [    0.000000] Machine model: riscv-virtio,qemu
> >> > [    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
> >> > [    0.000000] printk: bootconsole [sbi0] enabled
> >> > [    0.000000] efi: UEFI not found.
> >> > [    0.000000] Zone ranges:
> >> > [    0.000000]   DMA32    [mem 0x0000000080200000-0x0000000083ffffff]
> >> > [    0.000000]   Normal   empty
> >> > [    0.000000] Movable zone start for each node
> >> > [    0.000000] Early memory node ranges
> >> > [    0.000000]   node   0: [mem 0x0000000080200000-0x0000000083ffffff]
> >> > [    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x0000000083ffffff]
> >> > [    0.000000] SBI specification v0.2 detected
> >> > [    0.000000] SBI implementation ID=0x1 Version=0x9
> >> > [    0.000000] SBI TIME extension detected
> >> > [    0.000000] SBI IPI extension detected
> >> > [    0.000000] SBI RFENCE extension detected
> >> > [    0.000000] SBI v0.2 HSM extension detected
> >> > [    0.000000] riscv: ISA extensions acdfhimsu
> >> > [    0.000000] riscv: ELF capabilities acdfim
> >> > [    0.000000] percpu: Embedded 17 pages/cpu s30696 r8192 d30744 u69632
> >> > [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15655
> >> > [    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
> >> > [    0.000000] Dentry cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> >> > [    0.000000] Inode-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
> >> > [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> >> > [    0.000000] Virtual kernel memory layout:
> >> > [    0.000000]       fixmap : 0xffffffcefee00000 - 0xffffffceff000000   (2048 kB)
> >> > [    0.000000]       pci io : 0xffffffceff000000 - 0xffffffcf00000000   (  16 MB)
> >> > [    0.000000]      vmemmap : 0xffffffcf00000000 - 0xffffffcfffffffff   (4095 MB)
> >> > [    0.000000]      vmalloc : 0xffffffd000000000 - 0xffffffdfffffffff   (65535 MB)
> >> > [    0.000000]       lowmem : 0xffffffe000000000 - 0xffffffe003e00000   (  62 MB)
> >> > [    0.000000]       kernel : 0xffffffff80000000 - 0xffffffffffffffff   (2047 MB)
> >> > [    0.000000] Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved, 0K cma-reserved)
> >> > [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
> >> > [    0.000000] rcu: Hierarchical RCU implementation.
> >> > [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
> >> > [    0.000000] rcu:     RCU debug extended QS entry/exit.
> >> > [    0.000000]  Tracing variant of Tasks RCU enabled.
> >> > [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> >> > [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
> >> > [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> >> > [    0.000000] riscv-intc: 64 local interrupts mapped
> >> > [    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
> >> > ...
> >> > Welcome to Buildroot
> >> > buildroot login: root
> >> > # 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 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
> >> > # ca[   78.386630] random: fast init done
> >> > # cat /proc/meminfo
> >> > MemTotal:          53076 kB
> >> > MemFree:           40264 kB
> >> > MemAvailable:      40244 kB
> >> > Buffers:             236 kB
> >> > Cached:             1560 kB
> >> > SwapCached:            0 kB
> >> > Active:             1700 kB
> >> > Inactive:            516 kB
> >> > Active(anon):         40 kB
> >> > Inactive(anon):      424 kB
> >> > Active(file):       1660 kB
> >> > Inactive(file):       92 kB
> >> > Unevictable:           0 kB
> >> > Mlocked:               0 kB
> >> > SwapTotal:             0 kB
> >> > SwapFree:              0 kB
> >> > Dirty:                 0 kB
> >> > Writeback:             0 kB
> >> > AnonPages:           444 kB
> >> > Mapped:             1188 kB
> >> > Shmem:                44 kB
> >> > KReclaimable:        952 kB
> >> > Slab:               5744 kB
> >> > SReclaimable:        952 kB
> >> > SUnreclaim:         4792 kB
> >> > KernelStack:         624 kB
> >> > PageTables:          156 kB
> >> > NFS_Unstable:          0 kB
> >> > Bounce:                0 kB
> >> > WritebackTmp:          0 kB
> >> > CommitLimit:       26536 kB
> >> > Committed_AS:       1748 kB
> >> > VmallocTotal:   67108863 kB
> >> > VmallocUsed:         652 kB
> >> > VmallocChunk:          0 kB
> >> > Percpu:               80 kB
> >> > #
> >> >
> >> >  - Run rv32 with rv32 rootfs:
> >> >    $ ./build/qemu-system-riscv32 -cpu rv32 -M virt -m 64m -nographic -bios qemu_riscv32_virt_defconfig/images/fw_jump.bin -kernel build-rv32/Image -drive file qemu_riscv32_virt_defconfig/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi" -netdev user,id=net0 -device virtio-net-device,netdev=net0
> >> >
> >> > QEMU emulator version 6.2.50 (v6.2.0-29-g196d7182c8)
> >> > OpenSBI v0.9
> >> > [    0.000000] Linux version 5.16.0-rc6-00017-g750f87086bdd-dirty (guoren@guoren-Z87-HD3) (riscv32-buildroot-linux-gnu-gcc.br_real (Buildroot 2021.11-201-g7600ca7960-dirty) 10.3.0, GNU ld (GNU Binutils) 2.36.1) #7 SMP Tue Dec 28 21:02:21 CST 2021
> >> > [    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80400000
> >> > [    0.000000] Machine model: riscv-virtio,qemu
> >> > [    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
> >> > [    0.000000] printk: bootconsole [sbi0] enabled
> >> > [    0.000000] efi: UEFI not found.
> >> > [    0.000000] Zone ranges:
> >> > [    0.000000]   Normal   [mem 0x0000000080400000-0x0000000083ffffff]
> >> > [    0.000000] Movable zone start for each node
> >> > [    0.000000] Early memory node ranges
> >> > [    0.000000]   node   0: [mem 0x0000000080400000-0x0000000083ffffff]
> >> > [    0.000000] Initmem setup node 0 [mem 0x0000000080400000-0x0000000083ffffff]
> >> > [    0.000000] SBI specification v0.2 detected
> >> > [    0.000000] SBI implementation ID=0x1 Version=0x9
> >> > [    0.000000] SBI TIME extension detected
> >> > [    0.000000] SBI IPI extension detected
> >> > [    0.000000] SBI RFENCE extension detected
> >> > [    0.000000] SBI v0.2 HSM extension detected
> >> > [    0.000000] riscv: ISA extensions acdfhimsu
> >> > [    0.000000] riscv: ELF capabilities acdfim
> >> > [    0.000000] percpu: Embedded 12 pages/cpu s16600 r8192 d24360 u49152
> >> > [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 15240
> >> > [    0.000000] Kernel command line: rootwait root=/dev/vda ro console=ttyS0 earlycon=sbi
> >> > [    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
> >> > [    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
> >> > [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> >> > [    0.000000] Virtual kernel memory layout:
> >> > [    0.000000]       fixmap : 0x9dc00000 - 0x9e000000   (4096 kB)
> >> > [    0.000000]       pci io : 0x9e000000 - 0x9f000000   (  16 MB)
> >> > [    0.000000]      vmemmap : 0x9f000000 - 0x9fffffff   (  15 MB)
> >> > [    0.000000]      vmalloc : 0xa0000000 - 0xbfffffff   ( 511 MB)
> >> > [    0.000000]       lowmem : 0xc0000000 - 0xc3c00000   (  60 MB)
> >> > [    0.000000] Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss, 9516K reserved, 0K cma-reserved)
> >> > [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
> >> > [    0.000000] rcu: Hierarchical RCU implementation.
> >> > [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1.
> >> > [    0.000000] rcu:     RCU debug extended QS entry/exit.
> >> > [    0.000000]  Tracing variant of Tasks RCU enabled.
> >> > [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> >> > [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
> >> > [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> >> > [    0.000000] riscv-intc: 32 local interrupts mapped
> >> > [    0.000000] plic: plic@c000000: mapped 53 interrupts with 1 handlers for 2 contexts.
> >> > ...
> >> > Welcome to Buildroot
> >> > buildroot login: root
> >> > # cat /proc/cpuinfo
> >> > processor       : 0
> >> > hart            : 0
> >> > isa             : rv32imafdcsuh
> >> > mmu             : sv32
> >> >
> >> > # file /bin/busybox
> >> > /bin/busybox: setuid ELF 32-bit LSB shared object, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv32-ilp32d.so.1, for GNU/Linux 5.15.0, stripped
> >> > [   79.320589] random: fast init done
> >> > # cat /proc/meminfo
> >> > MemTotal:          52176 kB
> >> > MemFree:           41012 kB
> >> > MemAvailable:      42176 kB
> >> > Buffers:             644 kB
> >> > Cached:             2724 kB
> >> > SwapCached:            0 kB
> >> > Active:             3128 kB
> >> > Inactive:            752 kB
> >> > Active(anon):         40 kB
> >> > Inactive(anon):      516 kB
> >> > Active(file):       3088 kB
> >> > Inactive(file):      236 kB
> >> > Unevictable:           0 kB
> >> > Mlocked:               0 kB
> >> > SwapTotal:             0 kB
> >> > SwapFree:              0 kB
> >> > Dirty:                 4 kB
> >> > Writeback:             0 kB
> >> > AnonPages:           556 kB
> >> > Mapped:             2172 kB
> >> > Shmem:                44 kB
> >> > KReclaimable:        656 kB
> >> > Slab:               3684 kB
> >> > SReclaimable:        656 kB
> >> > SUnreclaim:         3028 kB
> >> > KernelStack:         312 kB
> >> > PageTables:           88 kB
> >> > NFS_Unstable:          0 kB
> >> > Bounce:                0 kB
> >> > WritebackTmp:          0 kB
> >> > CommitLimit:       26088 kB
> >> > Committed_AS:       2088 kB
> >> > VmallocTotal:     524287 kB
> >> > VmallocUsed:          12 kB
> >> > VmallocChunk:          0 kB
> >> > Percpu:               60 kB
> >> > #
> >> >
> >> >  Some conclusions:
> >> >  - kernel statics:
> >> >    64: Memory: 52788K/63488K available (6184K kernel code, 888K rwdata, 1917K rodata, 294K init, 297K bss, 10700K reserved)
> >> >    32: Memory: 51924K/61440K available (6117K kernel code, 695K rwdata, 1594K rodata, 255K init, 241K bss,  9516K reserved)
> >> >    rv32 better than rv64:                  1%               22%           17%          13%        19%         11%
> >> >    The code size is very similar, but data size rv32 would be better.
> >> >
> >> >  - rv32 kernel runtime KernelStack, Slab... are smaller,
> >> >    rv64: MemTotal: 53076 kB,        MemFree: 40264 kB
> >> >    rv32: MemTotal: 52176 + 2048 kB, MemFree: 41012  + 2048 kB
> >> >    rv32 better than rv64:       2%                         6%
> >> >
> >> >    (Because opensbi problem, we could add another 2MB for rv32.)
> >> >    Overall in 64MB memory situation, rv64-compat is 6% worse than rv32-native
> >> >    at memory footprint. If the userspace memory usage increases, I think
> >> >    the gap will be further reduced.
> >> >
> >> > Changes in v11:
> >> >  - Using arch instead of kconfig for commit subject by Masahiro Yamada
> >> >
> >> > Changes in v10:
> >> >  - Fixup arm64 compile error with compat_statfs definition
> >> >  - Fixup compat_sys_fadvise64_64 function arguments error cause ltp failure
> >> >
> >> > Changes in v9:
> >> >  - Fixup rv32 call rv64 segment fault
> >> >  - Ready for 5.18
> >> >
> >> > Changes in v8:
> >> >  - Enhanced elf_check_arch with EI_CLASS
> >> >  - Fixup SR_UXL doesn't exist in CONFIG_32BIT
> >> >  - Add Tested-by with Heiko
> >> >  - Update qemu compile tips with upstream repo
> >> >
> >> > Changes in v7:
> >> >  - Re-construct compat_vdso/Makefile
> >> >  - Fixup disable COMPAT compile error by csr.h's macro.
> >> >  - Optimize coding convention for lo/hi in compat.h
> >> >
> >> > Changes in v6:
> >> >  - Rebase on linux-5.17-rc5
> >> >  - Optimize hw capability check for elf
> >> >  - Optimize comment in thread_info.h
> >> >  - Optimize start_thread with SR_UXL setting
> >> >  - Optimize vdso.c with direct panic
> >> >
> >> > Changes in v5:
> >> >  - Rebase on linux-5.17-rc2
> >> >  - Include consolidate the fcntl patches by Christoph Hellwig
> >> >  - Remove F_GETLK64/F_SETLK64/F_SETLKW64 from asm/compat.h
> >> >  - Change COMPAT_RLIM_INFINITY from 0x7fffffff to 0xffffffff
> >> >  - Bring back "Add hw-cap detect in setup_arch patch" in v1
> >> >
> >> > Changes in v4:
> >> >  - Rebase on linux-5.17-rc1
> >> >  - Optimize compat_sys_call_table implementation with Arnd's advice
> >> >  - Add reviewed-by for Arnd. Thx :)
> >> >  - Remove FIXME comment in elf.h
> >> >  - Optimize Cleanup duplicate definitions in compat.h with Arnd's advice
> >> >
> >> > Changes in v3:
> >> >  - Rebase on newest master (pre linux-5.17-rc1)
> >> >  - Using newest qemu version v7 for test
> >> >  - Remove fcntl common modification
> >> >  - Fixup SET_PERSONALITY in elf.h by Arnd
> >> >  - Fixup KVM Kconfig
> >> >  - Update Acked-by & Reviewed-by
> >> >
> >> > Changes in v2:
> >> >  - Add __ARCH_WANT_COMPAT_STAT suggested
> >> >  - Cleanup fcntl compatduplicate definitions
> >> >  - Cleanup compat.h
> >> >  - Move rv32_defconfig into Makefile
> >> >  - Fixup rv64 rootfs boot failed, remove hw_compat_mode_detect
> >> >  - Move SYSVIPC_COMPAT into init/Kconfig
> >> >  - Simplify compat_elf_check
> >> >
> >> > Christoph Hellwig (3):
> >> >   uapi: simplify __ARCH_FLOCK{,64}_PAD a little
> >> >   uapi: always define F_GETLK64/F_SETLK64/F_SETLKW64 in fcntl.h
> >> >   compat: consolidate the compat_flock{,64} definition
> >> >
> >> > Guo Ren (17):
> >> >   arch: Add SYSVIPC_COMPAT for all architectures
> >> >   fs: stat: compat: Add __ARCH_WANT_COMPAT_STAT
> >> >   asm-generic: compat: Cleanup duplicate definitions
> >> >   syscalls: compat: Fix the missing part for __SYSCALL_COMPAT
> >> >   riscv: Fixup difference with defconfig
> >> >   riscv: compat: Add basic compat data type implementation
> >> >   riscv: compat: Support TASK_SIZE for compat mode
> >> >   riscv: compat: syscall: Add compat_sys_call_table implementation
> >> >   riscv: compat: syscall: Add entry.S implementation
> >> >   riscv: compat: process: Add UXL_32 support in start_thread
> >> >   riscv: compat: Add elf.h implementation
> >> >   riscv: compat: Add hw capability check for elf
> >> >   riscv: compat: vdso: Add COMPAT_VDSO base code implementation
> >> >   riscv: compat: vdso: Add setup additional pages implementation
> >> >   riscv: compat: signal: Add rt_frame implementation
> >> >   riscv: compat: ptrace: Add compat_arch_ptrace implement
> >> >   riscv: compat: Add COMPAT Kbuild skeletal support
> >> >
> >> >  arch/arm64/Kconfig                            |   4 -
> >> >  arch/arm64/include/asm/compat.h               |  93 +------
> >> >  arch/arm64/include/asm/unistd.h               |   1 +
> >> >  arch/mips/Kconfig                             |   5 -
> >> >  arch/mips/include/asm/compat.h                |  41 +--
> >> >  arch/mips/include/asm/unistd.h                |   2 +
> >> >  arch/mips/include/uapi/asm/fcntl.h            |  30 +--
> >> >  arch/parisc/Kconfig                           |   4 -
> >> >  arch/parisc/include/asm/compat.h              |  45 +---
> >> >  arch/parisc/include/asm/unistd.h              |   1 +
> >> >  arch/powerpc/Kconfig                          |   5 -
> >> >  arch/powerpc/include/asm/compat.h             |  50 +---
> >> >  arch/powerpc/include/asm/unistd.h             |   1 +
> >> >  arch/riscv/Kconfig                            |  19 ++
> >> >  arch/riscv/Makefile                           |   9 +
> >> >  arch/riscv/configs/rv32_defconfig             | 135 ----------
> >> >  arch/riscv/include/asm/compat.h               | 129 ++++++++++
> >> >  arch/riscv/include/asm/csr.h                  |   7 +
> >> >  arch/riscv/include/asm/elf.h                  |  50 +++-
> >> >  arch/riscv/include/asm/mmu.h                  |   1 +
> >> >  arch/riscv/include/asm/pgtable.h              |  13 +-
> >> >  arch/riscv/include/asm/processor.h            |   6 +-
> >> >  arch/riscv/include/asm/syscall.h              |   1 +
> >> >  arch/riscv/include/asm/thread_info.h          |   1 +
> >> >  arch/riscv/include/asm/unistd.h               |  11 +
> >> >  arch/riscv/include/asm/vdso.h                 |   9 +
> >> >  arch/riscv/include/uapi/asm/unistd.h          |   2 +-
> >> >  arch/riscv/kernel/Makefile                    |   3 +
> >> >  arch/riscv/kernel/compat_signal.c             | 243 ++++++++++++++++++
> >> >  arch/riscv/kernel/compat_syscall_table.c      |  19 ++
> >> >  arch/riscv/kernel/compat_vdso/.gitignore      |   2 +
> >> >  arch/riscv/kernel/compat_vdso/Makefile        |  78 ++++++
> >> >  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/entry.S                     |  18 +-
> >> >  arch/riscv/kernel/process.c                   |  37 +++
> >> >  arch/riscv/kernel/ptrace.c                    |  87 ++++++-
> >> >  arch/riscv/kernel/signal.c                    |  13 +-
> >> >  arch/riscv/kernel/sys_riscv.c                 |   6 +-
> >> >  arch/riscv/kernel/vdso.c                      | 105 +++++---
> >> >  arch/riscv/kernel/vdso/vdso.S                 |   6 +-
> >> >  arch/s390/Kconfig                             |   3 -
> >> >  arch/s390/include/asm/compat.h                |  99 +------
> >> >  arch/s390/include/asm/unistd.h                |   1 +
> >> >  arch/sparc/Kconfig                            |   5 -
> >> >  arch/sparc/include/asm/compat.h               |  61 ++---
> >> >  arch/sparc/include/asm/unistd.h               |   1 +
> >> >  arch/x86/Kconfig                              |   4 -
> >> >  arch/x86/include/asm/compat.h                 | 104 ++------
> >> >  arch/x86/include/asm/unistd.h                 |   1 +
> >> >  fs/open.c                                     |  24 ++
> >> >  fs/read_write.c                               |  16 ++
> >> >  fs/stat.c                                     |   2 +-
> >> >  fs/sync.c                                     |   9 +
> >> >  include/asm-generic/compat.h                  | 113 ++++++++
> >> >  include/linux/compat.h                        |  68 +++++
> >> >  include/uapi/asm-generic/fcntl.h              |  23 +-
> >> >  include/uapi/asm-generic/unistd.h             |   4 +-
> >> >  init/Kconfig                                  |   4 +
> >> >  mm/fadvise.c                                  |  11 +
> >> >  mm/readahead.c                                |   7 +
> >> >  tools/include/uapi/asm-generic/fcntl.h        |  21 +-
> >> >  tools/include/uapi/asm-generic/unistd.h       |   4 +-
> >> >  68 files changed, 1207 insertions(+), 698 deletions(-)
> >> >  delete mode 100644 arch/riscv/configs/rv32_defconfig
> >> >  create mode 100644 arch/riscv/include/asm/compat.h
> >> >  create mode 100644 arch/riscv/kernel/compat_signal.c
> >> >  create mode 100644 arch/riscv/kernel/compat_syscall_table.c
> >> >  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
> >> >
> >> > --
> >> > 2.25.1
> >> >
> >>
> >>
> >> --
> >> Best Regards
> >>  Guo Ren
> >>
> >> ML: https://lore.kernel.org/linux-csky/
> >
> >
> >
> > --
> > Best Regards
> >  Guo Ren
> >
> > ML: https://lore.kernel.org/linux-csky/



--
Best Regards
 Guo Ren

ML: https://lore.kernel.org/linux-csky/