Skip to content

Commit 44ef20b

Browse files
committed
Merge tag 's390-6.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 fixes from Vasily Gorbik: - A couple of fixes for regressions resulting from the uncoupling of physical vs virtual kernel address spaces: fix the mapping of the kernel image using large pages; enforce alignment checks on physical addresses before creating large pages - Update defconfigs * tag 's390-6.10-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/mm: Restore mapping of kernel image using large pages s390/mm: Allow large pages only for aligned physical addresses s390: Update defconfigs
2 parents d4332da + 693d41f commit 44ef20b

File tree

6 files changed

+103
-25
lines changed

6 files changed

+103
-25
lines changed

arch/s390/boot/startup.c

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ static void fixup_vmlinux_info(void)
384384
void startup_kernel(void)
385385
{
386386
unsigned long kernel_size = vmlinux.image_size + vmlinux.bss_size;
387-
unsigned long nokaslr_offset_phys = mem_safe_offset();
387+
unsigned long nokaslr_offset_phys, kaslr_large_page_offset;
388388
unsigned long amode31_lma = 0;
389389
unsigned long max_physmem_end;
390390
unsigned long asce_limit;
@@ -393,6 +393,12 @@ void startup_kernel(void)
393393

394394
fixup_vmlinux_info();
395395
setup_lpp();
396+
397+
/*
398+
* Non-randomized kernel physical start address must be _SEGMENT_SIZE
399+
* aligned (see blow).
400+
*/
401+
nokaslr_offset_phys = ALIGN(mem_safe_offset(), _SEGMENT_SIZE);
396402
safe_addr = PAGE_ALIGN(nokaslr_offset_phys + kernel_size);
397403

398404
/*
@@ -425,10 +431,25 @@ void startup_kernel(void)
425431
save_ipl_cert_comp_list();
426432
rescue_initrd(safe_addr, ident_map_size);
427433

428-
if (kaslr_enabled())
429-
__kaslr_offset_phys = randomize_within_range(kernel_size, THREAD_SIZE, 0, ident_map_size);
434+
/*
435+
* __kaslr_offset_phys must be _SEGMENT_SIZE aligned, so the lower
436+
* 20 bits (the offset within a large page) are zero. Copy the last
437+
* 20 bits of __kaslr_offset, which is THREAD_SIZE aligned, to
438+
* __kaslr_offset_phys.
439+
*
440+
* With this the last 20 bits of __kaslr_offset_phys and __kaslr_offset
441+
* are identical, which is required to allow for large mappings of the
442+
* kernel image.
443+
*/
444+
kaslr_large_page_offset = __kaslr_offset & ~_SEGMENT_MASK;
445+
if (kaslr_enabled()) {
446+
unsigned long end = ident_map_size - kaslr_large_page_offset;
447+
448+
__kaslr_offset_phys = randomize_within_range(kernel_size, _SEGMENT_SIZE, 0, end);
449+
}
430450
if (!__kaslr_offset_phys)
431451
__kaslr_offset_phys = nokaslr_offset_phys;
452+
__kaslr_offset_phys |= kaslr_large_page_offset;
432453
kaslr_adjust_vmlinux_info(__kaslr_offset_phys);
433454
physmem_reserve(RR_VMLINUX, __kaslr_offset_phys, kernel_size);
434455
deploy_kernel((void *)__kaslr_offset_phys);

arch/s390/boot/vmem.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,21 +261,27 @@ static unsigned long _pa(unsigned long addr, unsigned long size, enum populate_m
261261

262262
static bool large_allowed(enum populate_mode mode)
263263
{
264-
return (mode == POPULATE_DIRECT) || (mode == POPULATE_IDENTITY);
264+
return (mode == POPULATE_DIRECT) || (mode == POPULATE_IDENTITY) || (mode == POPULATE_KERNEL);
265265
}
266266

267267
static bool can_large_pud(pud_t *pu_dir, unsigned long addr, unsigned long end,
268268
enum populate_mode mode)
269269
{
270+
unsigned long size = end - addr;
271+
270272
return machine.has_edat2 && large_allowed(mode) &&
271-
IS_ALIGNED(addr, PUD_SIZE) && (end - addr) >= PUD_SIZE;
273+
IS_ALIGNED(addr, PUD_SIZE) && (size >= PUD_SIZE) &&
274+
IS_ALIGNED(_pa(addr, size, mode), PUD_SIZE);
272275
}
273276

274277
static bool can_large_pmd(pmd_t *pm_dir, unsigned long addr, unsigned long end,
275278
enum populate_mode mode)
276279
{
280+
unsigned long size = end - addr;
281+
277282
return machine.has_edat1 && large_allowed(mode) &&
278-
IS_ALIGNED(addr, PMD_SIZE) && (end - addr) >= PMD_SIZE;
283+
IS_ALIGNED(addr, PMD_SIZE) && (size >= PMD_SIZE) &&
284+
IS_ALIGNED(_pa(addr, size, mode), PMD_SIZE);
279285
}
280286

281287
static void pgtable_pte_populate(pmd_t *pmd, unsigned long addr, unsigned long end,

arch/s390/boot/vmlinux.lds.S

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ SECTIONS
109109
#ifdef CONFIG_KERNEL_UNCOMPRESSED
110110
. = ALIGN(PAGE_SIZE);
111111
. += AMODE31_SIZE; /* .amode31 section */
112+
. = ALIGN(1 << 20); /* _SEGMENT_SIZE */
112113
#else
113114
. = ALIGN(8);
114115
#endif

arch/s390/configs/debug_defconfig

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ CONFIG_PROFILING=y
4343
CONFIG_KEXEC=y
4444
CONFIG_KEXEC_FILE=y
4545
CONFIG_KEXEC_SIG=y
46-
CONFIG_CRASH_DUMP=y
4746
CONFIG_LIVEPATCH=y
4847
CONFIG_MARCH_Z13=y
4948
CONFIG_NR_CPUS=512
5049
CONFIG_NUMA=y
5150
CONFIG_HZ_100=y
5251
CONFIG_CERT_STORE=y
5352
CONFIG_EXPOLINE=y
53+
# CONFIG_EXPOLINE_EXTERN is not set
5454
CONFIG_EXPOLINE_AUTO=y
5555
CONFIG_CHSC_SCH=y
5656
CONFIG_VFIO_CCW=m
@@ -76,6 +76,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
7676
CONFIG_MODULE_UNLOAD_TAINT_TRACKING=y
7777
CONFIG_MODVERSIONS=y
7878
CONFIG_MODULE_SRCVERSION_ALL=y
79+
CONFIG_MODULE_SIG_SHA256=y
7980
CONFIG_BLK_DEV_THROTTLING=y
8081
CONFIG_BLK_WBT=y
8182
CONFIG_BLK_CGROUP_IOLATENCY=y
@@ -100,7 +101,6 @@ CONFIG_MEMORY_HOTPLUG=y
100101
CONFIG_MEMORY_HOTREMOVE=y
101102
CONFIG_KSM=y
102103
CONFIG_TRANSPARENT_HUGEPAGE=y
103-
CONFIG_CMA_DEBUG=y
104104
CONFIG_CMA_DEBUGFS=y
105105
CONFIG_CMA_SYSFS=y
106106
CONFIG_CMA_AREAS=7
@@ -119,6 +119,7 @@ CONFIG_UNIX_DIAG=m
119119
CONFIG_XFRM_USER=m
120120
CONFIG_NET_KEY=m
121121
CONFIG_SMC_DIAG=m
122+
CONFIG_SMC_LO=y
122123
CONFIG_INET=y
123124
CONFIG_IP_MULTICAST=y
124125
CONFIG_IP_ADVANCED_ROUTER=y
@@ -133,7 +134,6 @@ CONFIG_IP_MROUTE=y
133134
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
134135
CONFIG_IP_PIMSM_V1=y
135136
CONFIG_IP_PIMSM_V2=y
136-
CONFIG_SYN_COOKIES=y
137137
CONFIG_NET_IPVTI=m
138138
CONFIG_INET_AH=m
139139
CONFIG_INET_ESP=m
@@ -167,6 +167,7 @@ CONFIG_BRIDGE_NETFILTER=m
167167
CONFIG_NETFILTER_NETLINK_HOOK=m
168168
CONFIG_NF_CONNTRACK=m
169169
CONFIG_NF_CONNTRACK_SECMARK=y
170+
CONFIG_NF_CONNTRACK_ZONES=y
170171
CONFIG_NF_CONNTRACK_PROCFS=y
171172
CONFIG_NF_CONNTRACK_EVENTS=y
172173
CONFIG_NF_CONNTRACK_TIMEOUT=y
@@ -183,17 +184,39 @@ CONFIG_NF_CONNTRACK_SIP=m
183184
CONFIG_NF_CONNTRACK_TFTP=m
184185
CONFIG_NF_CT_NETLINK=m
185186
CONFIG_NF_CT_NETLINK_TIMEOUT=m
187+
CONFIG_NF_CT_NETLINK_HELPER=m
188+
CONFIG_NETFILTER_NETLINK_GLUE_CT=y
186189
CONFIG_NF_TABLES=m
187190
CONFIG_NF_TABLES_INET=y
191+
CONFIG_NF_TABLES_NETDEV=y
192+
CONFIG_NFT_NUMGEN=m
188193
CONFIG_NFT_CT=m
194+
CONFIG_NFT_FLOW_OFFLOAD=m
195+
CONFIG_NFT_CONNLIMIT=m
189196
CONFIG_NFT_LOG=m
190197
CONFIG_NFT_LIMIT=m
198+
CONFIG_NFT_MASQ=m
199+
CONFIG_NFT_REDIR=m
191200
CONFIG_NFT_NAT=m
201+
CONFIG_NFT_TUNNEL=m
202+
CONFIG_NFT_QUEUE=m
203+
CONFIG_NFT_QUOTA=m
192204
CONFIG_NFT_REJECT=m
193205
CONFIG_NFT_COMPAT=m
194206
CONFIG_NFT_HASH=m
195207
CONFIG_NFT_FIB_INET=m
196-
CONFIG_NETFILTER_XTABLES_COMPAT=y
208+
CONFIG_NFT_XFRM=m
209+
CONFIG_NFT_SOCKET=m
210+
CONFIG_NFT_OSF=m
211+
CONFIG_NFT_TPROXY=m
212+
CONFIG_NFT_SYNPROXY=m
213+
CONFIG_NFT_DUP_NETDEV=m
214+
CONFIG_NFT_FWD_NETDEV=m
215+
CONFIG_NFT_FIB_NETDEV=m
216+
CONFIG_NFT_REJECT_NETDEV=m
217+
CONFIG_NF_FLOW_TABLE_INET=m
218+
CONFIG_NF_FLOW_TABLE=m
219+
CONFIG_NF_FLOW_TABLE_PROCFS=y
197220
CONFIG_NETFILTER_XT_SET=m
198221
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
199222
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
@@ -206,8 +229,10 @@ CONFIG_NETFILTER_XT_TARGET_HMARK=m
206229
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
207230
CONFIG_NETFILTER_XT_TARGET_LOG=m
208231
CONFIG_NETFILTER_XT_TARGET_MARK=m
232+
CONFIG_NETFILTER_XT_TARGET_NETMAP=m
209233
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
210234
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
235+
CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
211236
CONFIG_NETFILTER_XT_TARGET_TEE=m
212237
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
213238
CONFIG_NETFILTER_XT_TARGET_TRACE=m
@@ -216,6 +241,7 @@ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
216241
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
217242
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
218243
CONFIG_NETFILTER_XT_MATCH_BPF=m
244+
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
219245
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
220246
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
221247
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
@@ -230,6 +256,7 @@ CONFIG_NETFILTER_XT_MATCH_DSCP=m
230256
CONFIG_NETFILTER_XT_MATCH_ESP=m
231257
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
232258
CONFIG_NETFILTER_XT_MATCH_HELPER=m
259+
CONFIG_NETFILTER_XT_MATCH_IPCOMP=m
233260
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
234261
CONFIG_NETFILTER_XT_MATCH_IPVS=m
235262
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
@@ -247,6 +274,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m
247274
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
248275
CONFIG_NETFILTER_XT_MATCH_REALM=m
249276
CONFIG_NETFILTER_XT_MATCH_RECENT=m
277+
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
250278
CONFIG_NETFILTER_XT_MATCH_STATE=m
251279
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
252280
CONFIG_NETFILTER_XT_MATCH_STRING=m
@@ -302,7 +330,6 @@ CONFIG_IP_NF_TARGET_ECN=m
302330
CONFIG_IP_NF_TARGET_TTL=m
303331
CONFIG_IP_NF_RAW=m
304332
CONFIG_IP_NF_SECURITY=m
305-
CONFIG_IP_NF_ARPTABLES=m
306333
CONFIG_IP_NF_ARPFILTER=m
307334
CONFIG_IP_NF_ARP_MANGLE=m
308335
CONFIG_NFT_FIB_IPV6=m
@@ -373,7 +400,6 @@ CONFIG_NET_ACT_POLICE=m
373400
CONFIG_NET_ACT_GACT=m
374401
CONFIG_GACT_PROB=y
375402
CONFIG_NET_ACT_MIRRED=m
376-
CONFIG_NET_ACT_IPT=m
377403
CONFIG_NET_ACT_NAT=m
378404
CONFIG_NET_ACT_PEDIT=m
379405
CONFIG_NET_ACT_SIMP=m
@@ -462,6 +488,7 @@ CONFIG_DM_VERITY=m
462488
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
463489
CONFIG_DM_SWITCH=m
464490
CONFIG_DM_INTEGRITY=m
491+
CONFIG_DM_VDO=m
465492
CONFIG_NETDEVICES=y
466493
CONFIG_BONDING=m
467494
CONFIG_DUMMY=m
@@ -574,7 +601,6 @@ CONFIG_WATCHDOG=y
574601
CONFIG_WATCHDOG_NOWAYOUT=y
575602
CONFIG_SOFT_WATCHDOG=m
576603
CONFIG_DIAG288_WATCHDOG=m
577-
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
578604
CONFIG_FB=y
579605
# CONFIG_FB_DEVICE is not set
580606
CONFIG_FRAMEBUFFER_CONSOLE=y
@@ -645,7 +671,6 @@ CONFIG_MSDOS_FS=m
645671
CONFIG_VFAT_FS=m
646672
CONFIG_EXFAT_FS=m
647673
CONFIG_NTFS_FS=m
648-
CONFIG_NTFS_RW=y
649674
CONFIG_PROC_KCORE=y
650675
CONFIG_TMPFS=y
651676
CONFIG_TMPFS_POSIX_ACL=y
@@ -663,6 +688,7 @@ CONFIG_SQUASHFS_XZ=y
663688
CONFIG_SQUASHFS_ZSTD=y
664689
CONFIG_ROMFS_FS=m
665690
CONFIG_NFS_FS=m
691+
CONFIG_NFS_V2=m
666692
CONFIG_NFS_V3_ACL=y
667693
CONFIG_NFS_V4=m
668694
CONFIG_NFS_SWAP=y
@@ -879,6 +905,5 @@ CONFIG_RBTREE_TEST=y
879905
CONFIG_INTERVAL_TREE_TEST=m
880906
CONFIG_PERCPU_TEST=m
881907
CONFIG_ATOMIC64_SELFTEST=y
882-
CONFIG_STRING_SELFTEST=y
883908
CONFIG_TEST_BITOPS=m
884909
CONFIG_TEST_BPF=m

0 commit comments

Comments
 (0)