|
@@ -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->query_variable_info)
|
|
|
+ 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(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,
|