diff options
Diffstat (limited to 'drivers/firmware/efi/libstub/randomalloc.c')
| -rw-r--r-- | drivers/firmware/efi/libstub/randomalloc.c | 11 | 
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/firmware/efi/libstub/randomalloc.c b/drivers/firmware/efi/libstub/randomalloc.c index 724155b9e10d..715f37479154 100644 --- a/drivers/firmware/efi/libstub/randomalloc.c +++ b/drivers/firmware/efi/libstub/randomalloc.c @@ -56,6 +56,7 @@ efi_status_t efi_random_alloc(unsigned long size,  			      unsigned long random_seed)  {  	unsigned long map_size, desc_size, total_slots = 0, target_slot; +	unsigned long total_mirrored_slots = 0;  	unsigned long buff_size;  	efi_status_t status;  	efi_memory_desc_t *memory_map; @@ -86,8 +87,14 @@ efi_status_t efi_random_alloc(unsigned long size,  		slots = get_entry_num_slots(md, size, ilog2(align));  		MD_NUM_SLOTS(md) = slots;  		total_slots += slots; +		if (md->attribute & EFI_MEMORY_MORE_RELIABLE) +			total_mirrored_slots += slots;  	} +	/* consider only mirrored slots for randomization if any exist */ +	if (total_mirrored_slots > 0) +		total_slots = total_mirrored_slots; +  	/* find a random number between 0 and total_slots */  	target_slot = (total_slots * (u64)(random_seed & U32_MAX)) >> 32; @@ -107,6 +114,10 @@ efi_status_t efi_random_alloc(unsigned long size,  		efi_physical_addr_t target;  		unsigned long pages; +		if (total_mirrored_slots > 0 && +		    !(md->attribute & EFI_MEMORY_MORE_RELIABLE)) +			continue; +  		if (target_slot >= MD_NUM_SLOTS(md)) {  			target_slot -= MD_NUM_SLOTS(md);  			continue;  | 
