diff options
Diffstat (limited to 'arch/x86/boot/compressed/eboot.c')
| -rw-r--r-- | arch/x86/boot/compressed/eboot.c | 47 | 
1 files changed, 47 insertions, 0 deletions
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index c205035a6b9..35ee62fccf9 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c @@ -251,6 +251,51 @@ static void find_bits(unsigned long mask, u8 *pos, u8 *size)  	*size = len;  } +static efi_status_t setup_efi_vars(struct boot_params *params) +{ +	struct setup_data *data; +	struct efi_var_bootdata *efidata; +	u64 store_size, remaining_size, var_size; +	efi_status_t status; + +	if (sys_table->runtime->hdr.revision < EFI_2_00_SYSTEM_TABLE_REVISION) +		return EFI_UNSUPPORTED; + +	data = (struct setup_data *)(unsigned long)params->hdr.setup_data; + +	while (data && data->next) +		data = (struct setup_data *)(unsigned long)data->next; + +	status = efi_call_phys4((void *)sys_table->runtime->query_variable_info, +				EFI_VARIABLE_NON_VOLATILE | +				EFI_VARIABLE_BOOTSERVICE_ACCESS | +				EFI_VARIABLE_RUNTIME_ACCESS, &store_size, +				&remaining_size, &var_size); + +	if (status != EFI_SUCCESS) +		return status; + +	status = efi_call_phys3(sys_table->boottime->allocate_pool, +				EFI_LOADER_DATA, sizeof(*efidata), &efidata); + +	if (status != EFI_SUCCESS) +		return status; + +	efidata->data.type = SETUP_EFI_VARS; +	efidata->data.len = sizeof(struct efi_var_bootdata) - +		sizeof(struct setup_data); +	efidata->data.next = 0; +	efidata->store_size = store_size; +	efidata->remaining_size = remaining_size; +	efidata->max_var_size = var_size; + +	if (data) +		data->next = (unsigned long)efidata; +	else +		params->hdr.setup_data = (unsigned long)efidata; + +} +  static efi_status_t setup_efi_pci(struct boot_params *params)  {  	efi_pci_io_protocol *pci; @@ -1157,6 +1202,8 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table,  	setup_graphics(boot_params); +	setup_efi_vars(boot_params); +  	setup_efi_pci(boot_params);  	status = efi_call_phys3(sys_table->boottime->allocate_pool,  |