diff options
Diffstat (limited to 'arch/s390/mm/kasan_init.c')
| -rw-r--r-- | arch/s390/mm/kasan_init.c | 43 | 
1 files changed, 21 insertions, 22 deletions
diff --git a/arch/s390/mm/kasan_init.c b/arch/s390/mm/kasan_init.c index a0fdc6dc5f9d..3e4735168019 100644 --- a/arch/s390/mm/kasan_init.c +++ b/arch/s390/mm/kasan_init.c @@ -107,6 +107,9 @@ static void __init kasan_early_pgtable_populate(unsigned long address,  		sgt_prot &= ~_SEGMENT_ENTRY_NOEXEC;  	} +	/* +	 * The first 1MB of 1:1 mapping is mapped with 4KB pages +	 */  	while (address < end) {  		pg_dir = pgd_offset_k(address);  		if (pgd_none(*pg_dir)) { @@ -157,30 +160,26 @@ static void __init kasan_early_pgtable_populate(unsigned long address,  		pm_dir = pmd_offset(pu_dir, address);  		if (pmd_none(*pm_dir)) { -			if (mode == POPULATE_ZERO_SHADOW && -			    IS_ALIGNED(address, PMD_SIZE) && +			if (IS_ALIGNED(address, PMD_SIZE) &&  			    end - address >= PMD_SIZE) { -				pmd_populate(&init_mm, pm_dir, -						kasan_early_shadow_pte); -				address = (address + PMD_SIZE) & PMD_MASK; -				continue; -			} -			/* the first megabyte of 1:1 is mapped with 4k pages */ -			if (has_edat && address && end - address >= PMD_SIZE && -			    mode != POPULATE_ZERO_SHADOW) { -				void *page; - -				if (mode == POPULATE_ONE2ONE) { -					page = (void *)address; -				} else { -					page = kasan_early_alloc_segment(); -					memset(page, 0, _SEGMENT_SIZE); +				if (mode == POPULATE_ZERO_SHADOW) { +					pmd_populate(&init_mm, pm_dir, kasan_early_shadow_pte); +					address = (address + PMD_SIZE) & PMD_MASK; +					continue; +				} else if (has_edat && address) { +					void *page; + +					if (mode == POPULATE_ONE2ONE) { +						page = (void *)address; +					} else { +						page = kasan_early_alloc_segment(); +						memset(page, 0, _SEGMENT_SIZE); +					} +					pmd_val(*pm_dir) = __pa(page) | sgt_prot; +					address = (address + PMD_SIZE) & PMD_MASK; +					continue;  				} -				pmd_val(*pm_dir) = __pa(page) | sgt_prot; -				address = (address + PMD_SIZE) & PMD_MASK; -				continue;  			} -  			pt_dir = kasan_early_pte_alloc();  			pmd_populate(&init_mm, pm_dir, pt_dir);  		} else if (pmd_large(*pm_dir)) { @@ -300,7 +299,7 @@ void __init kasan_early_init(void)  	pgalloc_low = round_up((unsigned long)_end, _SEGMENT_SIZE);  	if (IS_ENABLED(CONFIG_BLK_DEV_INITRD)) {  		initrd_end = -		    round_up(INITRD_START + INITRD_SIZE, _SEGMENT_SIZE); +		    round_up(initrd_data.start + initrd_data.size, _SEGMENT_SIZE);  		pgalloc_low = max(pgalloc_low, initrd_end);  	}  | 
