[PATCH v3] RISC-V: Add CONFIG_{NON,}PORTABLE
Palmer Dabbelt
palmer at rivosinc.com
Thu Jul 14 14:26:10 PDT 2022
On Sat, 21 May 2022 12:33:57 PDT (-0700), Palmer Dabbelt wrote:
> From: Palmer Dabbelt <palmer at rivosinc.com>
>
> The RISC-V port has collected a handful of options that are
> fundamentally non-portable. To prevent users from shooting themselves
> in the foot, hide them all behind a config entry that explicitly calls
> out that non-portable binaries may be produced.
>
> Signed-off-by: Palmer Dabbelt <palmer at rivosinc.com>
> Reviewed-by: Arnd Bergmann <arnd at arndb.de>
> Signed-off-by: Palmer Dabbelt <palmer at rivosinc.com>
> ---
> Changes since v2:
>
> * Update the nommu and rv32 defconfigs. I'm still getting some ugliness
> like
>
> $ make.riscv rv32_defconfig
> *** Default configuration is based on 'defconfig'
> #
> # configuration written to .config
> #
> Using .config as base
> Merging ./arch/riscv/configs/32-bit.config
> Value of CONFIG_PORTABLE is redefined by fragment ./arch/riscv/configs/32-bit.config:
> Previous value: CONFIG_PORTABLE=y
> New value: # CONFIG_PORTABLE is not set
>
> Value of CONFIG_NONPORTABLE is redefined by fragment ./arch/riscv/configs/32-bit.config:
> Previous value: # CONFIG_NONPORTABLE is not set
> New value: CONFIG_NONPORTABLE=y
>
> #
> # merged configuration written to .config (needs make)
> #
> .config:3831:warning: override: ARCH_RV32I changes choice state
> #
> # configuration written to .config
> #
>
> not sure if there's a better way to do this.
>
> Changes since v1:
>
> * Fix a bunch of spelling mistakes.
> * Move NONPORTABLE under the "Platform type" sub-heading.
> * Fix the rv32i dependency.
>
> ---
> arch/riscv/Kconfig | 28 +++++++++++++++++--
> arch/riscv/configs/32-bit.config | 2 ++
> arch/riscv/configs/nommu_k210_defconfig | 1 +
> .../riscv/configs/nommu_k210_sdcard_defconfig | 1 +
> arch/riscv/configs/nommu_virt_defconfig | 1 +
> arch/riscv/configs/rv32_defconfig | 1 +
> 6 files changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index f863065b478c..cd67b09a80f5 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -222,6 +222,21 @@ source "arch/riscv/Kconfig.erratas"
>
> menu "Platform type"
>
> +config NONPORTABLE
> + bool "Allow configurations that result in non-portable kernels"
> + help
> + RISC-V kernel binaries are compatible between all known systems
> + whenever possible, but there are some use cases that can only be
> + satisfied by configurations that result in kernel binaries that are
> + not portable between systems.
> +
> + Selecting N does not guarantee kernels will be portable to all known
> + systems. Selecting any of the options guarded by NONPORTABLE will
> + result in kernel binaries that are unlikely to be portable between
> + systems.
> +
> + If unsure, say N.
> +
> choice
> prompt "Base ISA"
> default ARCH_RV64I
> @@ -231,6 +246,7 @@ choice
>
> config ARCH_RV32I
> bool "RV32I"
> + depends on NONPORTABLE
> select 32BIT
> select GENERIC_LIB_ASHLDI3
> select GENERIC_LIB_ASHRDI3
> @@ -541,6 +557,7 @@ config STACKPROTECTOR_PER_TASK
>
> config PHYS_RAM_BASE_FIXED
> bool "Explicitly specified physical RAM address"
> + depends on NONPORTABLE
> default n
>
> config PHYS_RAM_BASE
> @@ -554,7 +571,7 @@ config PHYS_RAM_BASE
>
> config XIP_KERNEL
> bool "Kernel Execute-In-Place from ROM"
> - depends on MMU && SPARSEMEM
> + depends on MMU && SPARSEMEM && NONPORTABLE
> # This prevents XIP from being enabled by all{yes,mod}config, which
> # fail to build since XIP doesn't support large kernels.
> depends on !COMPILE_TEST
> @@ -594,9 +611,16 @@ endmenu
>
> config BUILTIN_DTB
> bool
> - depends on OF
> + depends on OF && NONPORTABLE
> default y if XIP_KERNEL
>
> +config PORTABLE
> + bool
> + default !NONPORTABLE
> + select EFI
> + select OF
> + select MMU
> +
> menu "Power management options"
>
> source "kernel/power/Kconfig"
> diff --git a/arch/riscv/configs/32-bit.config b/arch/riscv/configs/32-bit.config
> index 43f41323b67e..f6af0f708df4 100644
> --- a/arch/riscv/configs/32-bit.config
> +++ b/arch/riscv/configs/32-bit.config
> @@ -1,2 +1,4 @@
> CONFIG_ARCH_RV32I=y
> CONFIG_32BIT=y
> +# CONFIG_PORTABLE is not set
> +CONFIG_NONPORTABLE=y
> diff --git a/arch/riscv/configs/nommu_k210_defconfig b/arch/riscv/configs/nommu_k210_defconfig
> index 2438fa39f8ae..96fe8def644c 100644
> --- a/arch/riscv/configs/nommu_k210_defconfig
> +++ b/arch/riscv/configs/nommu_k210_defconfig
> @@ -28,6 +28,7 @@ CONFIG_EMBEDDED=y
> CONFIG_SLOB=y
> # CONFIG_MMU is not set
> CONFIG_SOC_CANAAN=y
> +CONFIG_NONPORTABLE=y
> CONFIG_SMP=y
> CONFIG_NR_CPUS=2
> CONFIG_CMDLINE="earlycon console=ttySIF0"
> diff --git a/arch/riscv/configs/nommu_k210_sdcard_defconfig b/arch/riscv/configs/nommu_k210_sdcard_defconfig
> index 9a133e63ae5b..379740654373 100644
> --- a/arch/riscv/configs/nommu_k210_sdcard_defconfig
> +++ b/arch/riscv/configs/nommu_k210_sdcard_defconfig
> @@ -20,6 +20,7 @@ CONFIG_EMBEDDED=y
> CONFIG_SLOB=y
> # CONFIG_MMU is not set
> CONFIG_SOC_CANAAN=y
> +CONFIG_NONPORTABLE=y
> CONFIG_SMP=y
> CONFIG_NR_CPUS=2
> CONFIG_CMDLINE="earlycon console=ttySIF0 root=/dev/mmcblk0p1 rootwait ro"
> diff --git a/arch/riscv/configs/nommu_virt_defconfig b/arch/riscv/configs/nommu_virt_defconfig
> index 5269fbb6b4fc..1a56eda5ce46 100644
> --- a/arch/riscv/configs/nommu_virt_defconfig
> +++ b/arch/riscv/configs/nommu_virt_defconfig
> @@ -25,6 +25,7 @@ CONFIG_EXPERT=y
> CONFIG_SLOB=y
> # CONFIG_MMU is not set
> CONFIG_SOC_VIRT=y
> +CONFIG_NONPORTABLE=y
> CONFIG_SMP=y
> CONFIG_CMDLINE="root=/dev/vda rw earlycon=uart8250,mmio,0x10000000,115200n8 console=ttyS0"
> CONFIG_CMDLINE_FORCE=y
> diff --git a/arch/riscv/configs/rv32_defconfig b/arch/riscv/configs/rv32_defconfig
> index 7e5efdc3829d..77bdb1d05a88 100644
> --- a/arch/riscv/configs/rv32_defconfig
> +++ b/arch/riscv/configs/rv32_defconfig
> @@ -18,6 +18,7 @@ CONFIG_EXPERT=y
> CONFIG_PROFILING=y
> CONFIG_SOC_SIFIVE=y
> CONFIG_SOC_VIRT=y
> +CONFIG_NONPORTABLE=y
> CONFIG_ARCH_RV32I=y
> CONFIG_SMP=y
> CONFIG_HOTPLUG_CPU=y
This is on for-next.
More information about the linux-riscv
mailing list