119
121
/* Uggh, the address 0 was allocated... This is too annoying,
120
122
so reallocate another one. */
121
address = 0xffffffff;
123
address = GRUB_EFI_MAX_USABLE_ADDRESS;
122
124
status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address);
123
125
grub_efi_free_pages (0, pages);
124
126
if (status != GRUB_EFI_SUCCESS)
142
144
#if defined (__i386__) || defined (__x86_64__)
146
/* Helper for stop_broadcom. */
148
find_card (grub_pci_device_t dev, grub_pci_id_t pciid,
149
void *data __attribute__ ((unused)))
151
grub_pci_address_t addr;
153
grub_uint16_t pm_state;
155
if ((pciid & 0xffff) != GRUB_PCI_VENDOR_BROADCOM)
158
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
159
if (grub_pci_read (addr) >> 24 != GRUB_PCI_CLASS_NETWORK)
161
cap = grub_pci_find_capability (dev, GRUB_PCI_CAP_POWER_MANAGEMENT);
164
addr = grub_pci_make_address (dev, cap + 4);
165
pm_state = grub_pci_read_word (addr);
166
pm_state = pm_state | 0x03;
167
grub_pci_write_word (addr, pm_state);
168
grub_pci_read_word (addr);
145
173
stop_broadcom (void)
147
auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
148
grub_pci_id_t pciid);
150
int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
153
grub_pci_address_t addr;
155
grub_uint16_t pm_state;
157
if ((pciid & 0xffff) != GRUB_PCI_VENDOR_BROADCOM)
160
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
161
if (grub_pci_read (addr) >> 24 != GRUB_PCI_CLASS_NETWORK)
163
cap = grub_pci_find_capability (dev, GRUB_PCI_CAP_POWER_MANAGEMENT);
166
addr = grub_pci_make_address (dev, cap + 4);
167
pm_state = grub_pci_read_word (addr);
168
pm_state = pm_state | 0x03;
169
grub_pci_write_word (addr, pm_state);
170
grub_pci_read_word (addr);
174
grub_pci_iterate (find_card);
175
grub_pci_iterate (find_card, NULL);
193
194
apple, sizeof (apple)) == 0);
196
if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
197
&finish_desc_size, &finish_desc_version) < 0)
198
return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
200
if (outbuf && *outbuf_size < finish_mmap_size)
201
return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
203
finish_mmap_buf = grub_malloc (finish_mmap_size);
204
if (!finish_mmap_buf)
207
if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
208
&finish_desc_size, &finish_desc_version) <= 0)
209
return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
211
b = grub_efi_system_table->boot_services;
212
status = efi_call_2 (b->exit_boot_services, grub_efi_image_handle,
214
if (status != GRUB_EFI_SUCCESS)
215
return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
199
if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
200
&finish_desc_size, &finish_desc_version) < 0)
201
return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
203
if (outbuf && *outbuf_size < finish_mmap_size)
204
return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
206
finish_mmap_buf = grub_malloc (finish_mmap_size);
207
if (!finish_mmap_buf)
210
if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
211
&finish_desc_size, &finish_desc_version) <= 0)
213
grub_free (finish_mmap_buf);
214
return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
217
b = grub_efi_system_table->boot_services;
218
status = efi_call_2 (b->exit_boot_services, grub_efi_image_handle,
220
if (status == GRUB_EFI_SUCCESS)
223
if (status != GRUB_EFI_INVALID_PARAMETER)
225
grub_free (finish_mmap_buf);
226
return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
229
grub_free (finish_mmap_buf);
230
grub_printf ("Trying to terminate EFI services again\n");
217
232
grub_efi_is_finished = 1;
219
234
*outbuf_size = finish_mmap_size;
357
372
if (BYTES_TO_PAGES (filtered_desc->physical_start)
358
373
+ filtered_desc->num_pages
359
> BYTES_TO_PAGES (0x100000000LL))
374
> BYTES_TO_PAGES_DOWN (GRUB_EFI_MAX_USABLE_ADDRESS))
360
375
filtered_desc->num_pages
361
= (BYTES_TO_PAGES (0x100000000LL)
376
= (BYTES_TO_PAGES_DOWN (GRUB_EFI_MAX_USABLE_ADDRESS)
362
377
- BYTES_TO_PAGES (filtered_desc->physical_start));