diff options
Diffstat (limited to 'arch/x86/boot/compressed/aslr.c')
| -rw-r--r-- | arch/x86/boot/compressed/aslr.c | 15 | 
1 files changed, 15 insertions, 0 deletions
diff --git a/arch/x86/boot/compressed/aslr.c b/arch/x86/boot/compressed/aslr.c index fc6091abedb7..d39189ba7f8e 100644 --- a/arch/x86/boot/compressed/aslr.c +++ b/arch/x86/boot/compressed/aslr.c @@ -183,12 +183,27 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size,  static bool mem_avoid_overlap(struct mem_vector *img)  {  	int i; +	struct setup_data *ptr;  	for (i = 0; i < MEM_AVOID_MAX; i++) {  		if (mem_overlaps(img, &mem_avoid[i]))  			return true;  	} +	/* Avoid all entries in the setup_data linked list. */ +	ptr = (struct setup_data *)(unsigned long)real_mode->hdr.setup_data; +	while (ptr) { +		struct mem_vector avoid; + +		avoid.start = (u64)ptr; +		avoid.size = sizeof(*ptr) + ptr->len; + +		if (mem_overlaps(img, &avoid)) +			return true; + +		ptr = (struct setup_data *)(unsigned long)ptr->next; +	} +  	return false;  }  |