diff options
Diffstat (limited to 'arch/s390/mm/init.c')
| -rw-r--r-- | arch/s390/mm/init.c | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index f6391442c0c2..e769d2726f4e 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c @@ -49,6 +49,7 @@  #include <asm/uv.h>  #include <linux/virtio_anchor.h>  #include <linux/virtio_config.h> +#include <linux/execmem.h>  pgd_t swapper_pg_dir[PTRS_PER_PGD] __section(".bss..swapper_pg_dir");  pgd_t invalid_pg_dir[PTRS_PER_PGD] __section(".bss..invalid_pg_dir"); @@ -302,3 +303,32 @@ void arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap)  	vmem_remove_mapping(start, size);  }  #endif /* CONFIG_MEMORY_HOTPLUG */ + +#ifdef CONFIG_EXECMEM +static struct execmem_info execmem_info __ro_after_init; + +struct execmem_info __init *execmem_arch_setup(void) +{ +	unsigned long module_load_offset = 0; +	unsigned long start; + +	if (kaslr_enabled()) +		module_load_offset = get_random_u32_inclusive(1, 1024) * PAGE_SIZE; + +	start = MODULES_VADDR + module_load_offset; + +	execmem_info = (struct execmem_info){ +		.ranges = { +			[EXECMEM_DEFAULT] = { +				.flags	= EXECMEM_KASAN_SHADOW, +				.start	= start, +				.end	= MODULES_END, +				.pgprot	= PAGE_KERNEL, +				.alignment = MODULE_ALIGN, +			}, +		}, +	}; + +	return &execmem_info; +} +#endif /* CONFIG_EXECMEM */  |