1 /* 2 * Originally from efivars.c 3 * 4 * Copyright (C) 2001,2003,2004 Dell <Matt_Domsch@dell.com> 5 * Copyright (C) 2004 Intel Corporation <matthew.e.tolentino@intel.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 22 #include <linux/capability.h> 23 #include <linux/types.h> 24 #include <linux/errno.h> 25 #include <linux/init.h> 26 #include <linux/mm.h> 27 #include <linux/module.h> 28 #include <linux/string.h> 29 #include <linux/smp.h> 30 #include <linux/efi.h> 31 #include <linux/sysfs.h> 32 #include <linux/device.h> 33 #include <linux/slab.h> 34 #include <linux/ctype.h> 35 #include <linux/ucs2_string.h> 36 37 /* Private pointer to registered efivars */ 38 static struct efivars *__efivars; 39 40 static bool efivar_wq_enabled = true; 41 DECLARE_WORK(efivar_work, NULL); 42 EXPORT_SYMBOL_GPL(efivar_work); 43 44 static bool 45 validate_device_path(efi_char16_t *var_name, int match, u8 *buffer, 46 unsigned long len) 47 { 48 struct efi_generic_dev_path *node; 49 int offset = 0; 50 51 node = (struct efi_generic_dev_path *)buffer; 52 53 if (len < sizeof(*node)) 54 return false; 55 56 while (offset <= len - sizeof(*node) && 57 node->length >= sizeof(*node) && 58 node->length <= len - offset) { 59 offset += node->length; 60 61 if ((node->type == EFI_DEV_END_PATH || 62 node->type == EFI_DEV_END_PATH2) && 63 node->sub_type == EFI_DEV_END_ENTIRE) 64 return true; 65 66 node = (struct efi_generic_dev_path *)(buffer + offset); 67 } 68 69 /* 70 * If we're here then either node->length pointed past the end 71 * of the buffer or we reached the end of the buffer without 72 * finding a device path end node. 73 */ 74 return false; 75 } 76 77 static bool 78 validate_boot_order(efi_char16_t *var_name, int match, u8 *buffer, 79 unsigned long len) 80 { 81 /* An array of 16-bit integers */ 82 if ((len % 2) != 0) 83 return false; 84 85 return true; 86 } 87 88 static bool 89 validate_load_option(efi_char16_t *var_name, int match, u8 *buffer, 90 unsigned long len) 91 { 92 u16 filepathlength; 93 int i, desclength = 0, namelen; 94 95 namelen = ucs2_strnlen(var_name, EFI_VAR_NAME_LEN); 96 97 /* Either "Boot" or "Driver" followed by four digits of hex */ 98 for (i = match; i < match+4; i++) { 99 if (var_name[i] > 127 || 100 hex_to_bin(var_name[i] & 0xff) < 0) 101 return true; 102 } 103 104 /* Reject it if there's 4 digits of hex and then further content */ 105 if (namelen > match + 4) 106 return false; 107 108 /* A valid entry must be at least 8 bytes */ 109 if (len < 8) 110 return false; 111 112 filepathlength = buffer[4] | buffer[5] << 8; 113 114 /* 115 * There's no stored length for the description, so it has to be 116 * found by hand 117 */ 118 desclength = ucs2_strsize((efi_char16_t *)(buffer + 6), len - 6) + 2; 119 120 /* Each boot entry must have a descriptor */ 121 if (!desclength) 122 return false; 123 124 /* 125 * If the sum of the length of the description, the claimed filepath 126 * length and the original header are greater than the length of the 127 * variable, it's malformed 128 */ 129 if ((desclength + filepathlength + 6) > len) 130 return false; 131 132 /* 133 * And, finally, check the filepath 134 */ 135 return validate_device_path(var_name, match, buffer + desclength + 6, 136 filepathlength); 137 } 138 139 static bool 140 validate_uint16(efi_char16_t *var_name, int match, u8 *buffer, 141 unsigned long len) 142 { 143 /* A single 16-bit integer */ 144 if (len != 2) 145 return false; 146 147 return true; 148 } 149 150 static bool 151 validate_ascii_string(efi_char16_t *var_name, int match, u8 *buffer, 152 unsigned long len) 153 { 154 int i; 155 156 for (i = 0; i < len; i++) { 157 if (buffer[i] > 127) 158 return false; 159 160 if (buffer[i] == 0) 161 return true; 162 } 163 164 return false; 165 } 166 167 struct variable_validate { 168 char *name; 169 bool (*validate)(efi_char16_t *var_name, int match, u8 *data, 170 unsigned long len); 171 }; 172 173 static const struct variable_validate variable_validate[] = { 174 { "BootNext", validate_uint16 }, 175 { "BootOrder", validate_boot_order }, 176 { "DriverOrder", validate_boot_order }, 177 { "Boot*", validate_load_option }, 178 { "Driver*", validate_load_option }, 179 { "ConIn", validate_device_path }, 180 { "ConInDev", validate_device_path }, 181 { "ConOut", validate_device_path }, 182 { "ConOutDev", validate_device_path }, 183 { "ErrOut", validate_device_path }, 184 { "ErrOutDev", validate_device_path }, 185 { "Timeout", validate_uint16 }, 186 { "Lang", validate_ascii_string }, 187 { "PlatformLang", validate_ascii_string }, 188 { "", NULL }, 189 }; 190 191 bool 192 efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long len) 193 { 194 int i; 195 u16 *unicode_name = var_name; 196 197 for (i = 0; variable_validate[i].validate != NULL; i++) { 198 const char *name = variable_validate[i].name; 199 int match; 200 201 for (match = 0; ; match++) { 202 char c = name[match]; 203 u16 u = unicode_name[match]; 204 205 /* All special variables are plain ascii */ 206 if (u > 127) 207 return true; 208 209 /* Wildcard in the matching name means we've matched */ 210 if (c == '*') 211 return variable_validate[i].validate(var_name, 212 match, data, len); 213 214 /* Case sensitive match */ 215 if (c != u) 216 break; 217 218 /* Reached the end of the string while matching */ 219 if (!c) 220 return variable_validate[i].validate(var_name, 221 match, data, len); 222 } 223 } 224 225 return true; 226 } 227 EXPORT_SYMBOL_GPL(efivar_validate); 228 229 static efi_status_t 230 check_var_size(u32 attributes, unsigned long size) 231 { 232 const struct efivar_operations *fops = __efivars->ops; 233 234 if (!fops->query_variable_store) 235 return EFI_UNSUPPORTED; 236 237 return fops->query_variable_store(attributes, size); 238 } 239 240 static int efi_status_to_err(efi_status_t status) 241 { 242 int err; 243 244 switch (status) { 245 case EFI_SUCCESS: 246 err = 0; 247 break; 248 case EFI_INVALID_PARAMETER: 249 err = -EINVAL; 250 break; 251 case EFI_OUT_OF_RESOURCES: 252 err = -ENOSPC; 253 break; 254 case EFI_DEVICE_ERROR: 255 err = -EIO; 256 break; 257 case EFI_WRITE_PROTECTED: 258 err = -EROFS; 259 break; 260 case EFI_SECURITY_VIOLATION: 261 err = -EACCES; 262 break; 263 case EFI_NOT_FOUND: 264 err = -ENOENT; 265 break; 266 default: 267 err = -EINVAL; 268 } 269 270 return err; 271 } 272 273 static bool variable_is_present(efi_char16_t *variable_name, efi_guid_t *vendor, 274 struct list_head *head) 275 { 276 struct efivar_entry *entry, *n; 277 unsigned long strsize1, strsize2; 278 bool found = false; 279 280 strsize1 = ucs2_strsize(variable_name, 1024); 281 list_for_each_entry_safe(entry, n, head, list) { 282 strsize2 = ucs2_strsize(entry->var.VariableName, 1024); 283 if (strsize1 == strsize2 && 284 !memcmp(variable_name, &(entry->var.VariableName), 285 strsize2) && 286 !efi_guidcmp(entry->var.VendorGuid, 287 *vendor)) { 288 found = true; 289 break; 290 } 291 } 292 return found; 293 } 294 295 /* 296 * Returns the size of variable_name, in bytes, including the 297 * terminating NULL character, or variable_name_size if no NULL 298 * character is found among the first variable_name_size bytes. 299 */ 300 static unsigned long var_name_strnsize(efi_char16_t *variable_name, 301 unsigned long variable_name_size) 302 { 303 unsigned long len; 304 efi_char16_t c; 305 306 /* 307 * The variable name is, by definition, a NULL-terminated 308 * string, so make absolutely sure that variable_name_size is 309 * the value we expect it to be. If not, return the real size. 310 */ 311 for (len = 2; len <= variable_name_size; len += sizeof(c)) { 312 c = variable_name[(len / sizeof(c)) - 1]; 313 if (!c) 314 break; 315 } 316 317 return min(len, variable_name_size); 318 } 319 320 /* 321 * Print a warning when duplicate EFI variables are encountered and 322 * disable the sysfs workqueue since the firmware is buggy. 323 */ 324 static void dup_variable_bug(efi_char16_t *str16, efi_guid_t *vendor_guid, 325 unsigned long len16) 326 { 327 size_t i, len8 = len16 / sizeof(efi_char16_t); 328 char *str8; 329 330 /* 331 * Disable the workqueue since the algorithm it uses for 332 * detecting new variables won't work with this buggy 333 * implementation of GetNextVariableName(). 334 */ 335 efivar_wq_enabled = false; 336 337 str8 = kzalloc(len8, GFP_KERNEL); 338 if (!str8) 339 return; 340 341 for (i = 0; i < len8; i++) 342 str8[i] = str16[i]; 343 344 printk(KERN_WARNING "efivars: duplicate variable: %s-%pUl\n", 345 str8, vendor_guid); 346 kfree(str8); 347 } 348 349 /** 350 * efivar_init - build the initial list of EFI variables 351 * @func: callback function to invoke for every variable 352 * @data: function-specific data to pass to @func 353 * @atomic: do we need to execute the @func-loop atomically? 354 * @duplicates: error if we encounter duplicates on @head? 355 * @head: initialised head of variable list 356 * 357 * Get every EFI variable from the firmware and invoke @func. @func 358 * should call efivar_entry_add() to build the list of variables. 359 * 360 * Returns 0 on success, or a kernel error code on failure. 361 */ 362 int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *), 363 void *data, bool atomic, bool duplicates, 364 struct list_head *head) 365 { 366 const struct efivar_operations *ops = __efivars->ops; 367 unsigned long variable_name_size = 1024; 368 efi_char16_t *variable_name; 369 efi_status_t status; 370 efi_guid_t vendor_guid; 371 int err = 0; 372 373 variable_name = kzalloc(variable_name_size, GFP_KERNEL); 374 if (!variable_name) { 375 printk(KERN_ERR "efivars: Memory allocation failed.\n"); 376 return -ENOMEM; 377 } 378 379 spin_lock_irq(&__efivars->lock); 380 381 /* 382 * Per EFI spec, the maximum storage allocated for both 383 * the variable name and variable data is 1024 bytes. 384 */ 385 386 do { 387 variable_name_size = 1024; 388 389 status = ops->get_next_variable(&variable_name_size, 390 variable_name, 391 &vendor_guid); 392 switch (status) { 393 case EFI_SUCCESS: 394 if (!atomic) 395 spin_unlock_irq(&__efivars->lock); 396 397 variable_name_size = var_name_strnsize(variable_name, 398 variable_name_size); 399 400 /* 401 * Some firmware implementations return the 402 * same variable name on multiple calls to 403 * get_next_variable(). Terminate the loop 404 * immediately as there is no guarantee that 405 * we'll ever see a different variable name, 406 * and may end up looping here forever. 407 */ 408 if (duplicates && 409 variable_is_present(variable_name, &vendor_guid, head)) { 410 dup_variable_bug(variable_name, &vendor_guid, 411 variable_name_size); 412 if (!atomic) 413 spin_lock_irq(&__efivars->lock); 414 415 status = EFI_NOT_FOUND; 416 break; 417 } 418 419 err = func(variable_name, vendor_guid, variable_name_size, data); 420 if (err) 421 status = EFI_NOT_FOUND; 422 423 if (!atomic) 424 spin_lock_irq(&__efivars->lock); 425 426 break; 427 case EFI_NOT_FOUND: 428 break; 429 default: 430 printk(KERN_WARNING "efivars: get_next_variable: status=%lx\n", 431 status); 432 status = EFI_NOT_FOUND; 433 break; 434 } 435 436 } while (status != EFI_NOT_FOUND); 437 438 spin_unlock_irq(&__efivars->lock); 439 440 kfree(variable_name); 441 442 return err; 443 } 444 EXPORT_SYMBOL_GPL(efivar_init); 445 446 /** 447 * efivar_entry_add - add entry to variable list 448 * @entry: entry to add to list 449 * @head: list head 450 */ 451 void efivar_entry_add(struct efivar_entry *entry, struct list_head *head) 452 { 453 spin_lock_irq(&__efivars->lock); 454 list_add(&entry->list, head); 455 spin_unlock_irq(&__efivars->lock); 456 } 457 EXPORT_SYMBOL_GPL(efivar_entry_add); 458 459 /** 460 * efivar_entry_remove - remove entry from variable list 461 * @entry: entry to remove from list 462 */ 463 void efivar_entry_remove(struct efivar_entry *entry) 464 { 465 spin_lock_irq(&__efivars->lock); 466 list_del(&entry->list); 467 spin_unlock_irq(&__efivars->lock); 468 } 469 EXPORT_SYMBOL_GPL(efivar_entry_remove); 470 471 /* 472 * efivar_entry_list_del_unlock - remove entry from variable list 473 * @entry: entry to remove 474 * 475 * Remove @entry from the variable list and release the list lock. 476 * 477 * NOTE: slightly weird locking semantics here - we expect to be 478 * called with the efivars lock already held, and we release it before 479 * returning. This is because this function is usually called after 480 * set_variable() while the lock is still held. 481 */ 482 static void efivar_entry_list_del_unlock(struct efivar_entry *entry) 483 { 484 lockdep_assert_held(&__efivars->lock); 485 486 list_del(&entry->list); 487 spin_unlock_irq(&__efivars->lock); 488 } 489 490 /** 491 * __efivar_entry_delete - delete an EFI variable 492 * @entry: entry containing EFI variable to delete 493 * 494 * Delete the variable from the firmware but leave @entry on the 495 * variable list. 496 * 497 * This function differs from efivar_entry_delete() because it does 498 * not remove @entry from the variable list. Also, it is safe to be 499 * called from within a efivar_entry_iter_begin() and 500 * efivar_entry_iter_end() region, unlike efivar_entry_delete(). 501 * 502 * Returns 0 on success, or a converted EFI status code if 503 * set_variable() fails. 504 */ 505 int __efivar_entry_delete(struct efivar_entry *entry) 506 { 507 const struct efivar_operations *ops = __efivars->ops; 508 efi_status_t status; 509 510 lockdep_assert_held(&__efivars->lock); 511 512 status = ops->set_variable(entry->var.VariableName, 513 &entry->var.VendorGuid, 514 0, 0, NULL); 515 516 return efi_status_to_err(status); 517 } 518 EXPORT_SYMBOL_GPL(__efivar_entry_delete); 519 520 /** 521 * efivar_entry_delete - delete variable and remove entry from list 522 * @entry: entry containing variable to delete 523 * 524 * Delete the variable from the firmware and remove @entry from the 525 * variable list. It is the caller's responsibility to free @entry 526 * once we return. 527 * 528 * Returns 0 on success, or a converted EFI status code if 529 * set_variable() fails. 530 */ 531 int efivar_entry_delete(struct efivar_entry *entry) 532 { 533 const struct efivar_operations *ops = __efivars->ops; 534 efi_status_t status; 535 536 spin_lock_irq(&__efivars->lock); 537 status = ops->set_variable(entry->var.VariableName, 538 &entry->var.VendorGuid, 539 0, 0, NULL); 540 if (!(status == EFI_SUCCESS || status == EFI_NOT_FOUND)) { 541 spin_unlock_irq(&__efivars->lock); 542 return efi_status_to_err(status); 543 } 544 545 efivar_entry_list_del_unlock(entry); 546 return 0; 547 } 548 EXPORT_SYMBOL_GPL(efivar_entry_delete); 549 550 /** 551 * efivar_entry_set - call set_variable() 552 * @entry: entry containing the EFI variable to write 553 * @attributes: variable attributes 554 * @size: size of @data buffer 555 * @data: buffer containing variable data 556 * @head: head of variable list 557 * 558 * Calls set_variable() for an EFI variable. If creating a new EFI 559 * variable, this function is usually followed by efivar_entry_add(). 560 * 561 * Before writing the variable, the remaining EFI variable storage 562 * space is checked to ensure there is enough room available. 563 * 564 * If @head is not NULL a lookup is performed to determine whether 565 * the entry is already on the list. 566 * 567 * Returns 0 on success, -EEXIST if a lookup is performed and the entry 568 * already exists on the list, or a converted EFI status code if 569 * set_variable() fails. 570 */ 571 int efivar_entry_set(struct efivar_entry *entry, u32 attributes, 572 unsigned long size, void *data, struct list_head *head) 573 { 574 const struct efivar_operations *ops = __efivars->ops; 575 efi_status_t status; 576 efi_char16_t *name = entry->var.VariableName; 577 efi_guid_t vendor = entry->var.VendorGuid; 578 579 spin_lock_irq(&__efivars->lock); 580 581 if (head && efivar_entry_find(name, vendor, head, false)) { 582 spin_unlock_irq(&__efivars->lock); 583 return -EEXIST; 584 } 585 586 status = check_var_size(attributes, size + ucs2_strsize(name, 1024)); 587 if (status == EFI_SUCCESS || status == EFI_UNSUPPORTED) 588 status = ops->set_variable(name, &vendor, 589 attributes, size, data); 590 591 spin_unlock_irq(&__efivars->lock); 592 593 return efi_status_to_err(status); 594 595 } 596 EXPORT_SYMBOL_GPL(efivar_entry_set); 597 598 /* 599 * efivar_entry_set_nonblocking - call set_variable_nonblocking() 600 * 601 * This function is guaranteed to not block and is suitable for calling 602 * from crash/panic handlers. 603 * 604 * Crucially, this function will not block if it cannot acquire 605 * __efivars->lock. Instead, it returns -EBUSY. 606 */ 607 static int 608 efivar_entry_set_nonblocking(efi_char16_t *name, efi_guid_t vendor, 609 u32 attributes, unsigned long size, void *data) 610 { 611 const struct efivar_operations *ops = __efivars->ops; 612 unsigned long flags; 613 efi_status_t status; 614 615 if (!spin_trylock_irqsave(&__efivars->lock, flags)) 616 return -EBUSY; 617 618 status = check_var_size(attributes, size + ucs2_strsize(name, 1024)); 619 if (status != EFI_SUCCESS) { 620 spin_unlock_irqrestore(&__efivars->lock, flags); 621 return -ENOSPC; 622 } 623 624 status = ops->set_variable_nonblocking(name, &vendor, attributes, 625 size, data); 626 627 spin_unlock_irqrestore(&__efivars->lock, flags); 628 return efi_status_to_err(status); 629 } 630 631 /** 632 * efivar_entry_set_safe - call set_variable() if enough space in firmware 633 * @name: buffer containing the variable name 634 * @vendor: variable vendor guid 635 * @attributes: variable attributes 636 * @block: can we block in this context? 637 * @size: size of @data buffer 638 * @data: buffer containing variable data 639 * 640 * Ensures there is enough free storage in the firmware for this variable, and 641 * if so, calls set_variable(). If creating a new EFI variable, this function 642 * is usually followed by efivar_entry_add(). 643 * 644 * Returns 0 on success, -ENOSPC if the firmware does not have enough 645 * space for set_variable() to succeed, or a converted EFI status code 646 * if set_variable() fails. 647 */ 648 int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, 649 bool block, unsigned long size, void *data) 650 { 651 const struct efivar_operations *ops = __efivars->ops; 652 unsigned long flags; 653 efi_status_t status; 654 655 if (!ops->query_variable_store) 656 return -ENOSYS; 657 658 /* 659 * If the EFI variable backend provides a non-blocking 660 * ->set_variable() operation and we're in a context where we 661 * cannot block, then we need to use it to avoid live-locks, 662 * since the implication is that the regular ->set_variable() 663 * will block. 664 * 665 * If no ->set_variable_nonblocking() is provided then 666 * ->set_variable() is assumed to be non-blocking. 667 */ 668 if (!block && ops->set_variable_nonblocking) 669 return efivar_entry_set_nonblocking(name, vendor, attributes, 670 size, data); 671 672 if (!block) { 673 if (!spin_trylock_irqsave(&__efivars->lock, flags)) 674 return -EBUSY; 675 } else { 676 spin_lock_irqsave(&__efivars->lock, flags); 677 } 678 679 status = check_var_size(attributes, size + ucs2_strsize(name, 1024)); 680 if (status != EFI_SUCCESS) { 681 spin_unlock_irqrestore(&__efivars->lock, flags); 682 return -ENOSPC; 683 } 684 685 status = ops->set_variable(name, &vendor, attributes, size, data); 686 687 spin_unlock_irqrestore(&__efivars->lock, flags); 688 689 return efi_status_to_err(status); 690 } 691 EXPORT_SYMBOL_GPL(efivar_entry_set_safe); 692 693 /** 694 * efivar_entry_find - search for an entry 695 * @name: the EFI variable name 696 * @guid: the EFI variable vendor's guid 697 * @head: head of the variable list 698 * @remove: should we remove the entry from the list? 699 * 700 * Search for an entry on the variable list that has the EFI variable 701 * name @name and vendor guid @guid. If an entry is found on the list 702 * and @remove is true, the entry is removed from the list. 703 * 704 * The caller MUST call efivar_entry_iter_begin() and 705 * efivar_entry_iter_end() before and after the invocation of this 706 * function, respectively. 707 * 708 * Returns the entry if found on the list, %NULL otherwise. 709 */ 710 struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid, 711 struct list_head *head, bool remove) 712 { 713 struct efivar_entry *entry, *n; 714 int strsize1, strsize2; 715 bool found = false; 716 717 lockdep_assert_held(&__efivars->lock); 718 719 list_for_each_entry_safe(entry, n, head, list) { 720 strsize1 = ucs2_strsize(name, 1024); 721 strsize2 = ucs2_strsize(entry->var.VariableName, 1024); 722 if (strsize1 == strsize2 && 723 !memcmp(name, &(entry->var.VariableName), strsize1) && 724 !efi_guidcmp(guid, entry->var.VendorGuid)) { 725 found = true; 726 break; 727 } 728 } 729 730 if (!found) 731 return NULL; 732 733 if (remove) { 734 if (entry->scanning) { 735 /* 736 * The entry will be deleted 737 * after scanning is completed. 738 */ 739 entry->deleting = true; 740 } else 741 list_del(&entry->list); 742 } 743 744 return entry; 745 } 746 EXPORT_SYMBOL_GPL(efivar_entry_find); 747 748 /** 749 * efivar_entry_size - obtain the size of a variable 750 * @entry: entry for this variable 751 * @size: location to store the variable's size 752 */ 753 int efivar_entry_size(struct efivar_entry *entry, unsigned long *size) 754 { 755 const struct efivar_operations *ops = __efivars->ops; 756 efi_status_t status; 757 758 *size = 0; 759 760 spin_lock_irq(&__efivars->lock); 761 status = ops->get_variable(entry->var.VariableName, 762 &entry->var.VendorGuid, NULL, size, NULL); 763 spin_unlock_irq(&__efivars->lock); 764 765 if (status != EFI_BUFFER_TOO_SMALL) 766 return efi_status_to_err(status); 767 768 return 0; 769 } 770 EXPORT_SYMBOL_GPL(efivar_entry_size); 771 772 /** 773 * __efivar_entry_get - call get_variable() 774 * @entry: read data for this variable 775 * @attributes: variable attributes 776 * @size: size of @data buffer 777 * @data: buffer to store variable data 778 * 779 * The caller MUST call efivar_entry_iter_begin() and 780 * efivar_entry_iter_end() before and after the invocation of this 781 * function, respectively. 782 */ 783 int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 784 unsigned long *size, void *data) 785 { 786 const struct efivar_operations *ops = __efivars->ops; 787 efi_status_t status; 788 789 lockdep_assert_held(&__efivars->lock); 790 791 status = ops->get_variable(entry->var.VariableName, 792 &entry->var.VendorGuid, 793 attributes, size, data); 794 795 return efi_status_to_err(status); 796 } 797 EXPORT_SYMBOL_GPL(__efivar_entry_get); 798 799 /** 800 * efivar_entry_get - call get_variable() 801 * @entry: read data for this variable 802 * @attributes: variable attributes 803 * @size: size of @data buffer 804 * @data: buffer to store variable data 805 */ 806 int efivar_entry_get(struct efivar_entry *entry, u32 *attributes, 807 unsigned long *size, void *data) 808 { 809 const struct efivar_operations *ops = __efivars->ops; 810 efi_status_t status; 811 812 spin_lock_irq(&__efivars->lock); 813 status = ops->get_variable(entry->var.VariableName, 814 &entry->var.VendorGuid, 815 attributes, size, data); 816 spin_unlock_irq(&__efivars->lock); 817 818 return efi_status_to_err(status); 819 } 820 EXPORT_SYMBOL_GPL(efivar_entry_get); 821 822 /** 823 * efivar_entry_set_get_size - call set_variable() and get new size (atomic) 824 * @entry: entry containing variable to set and get 825 * @attributes: attributes of variable to be written 826 * @size: size of data buffer 827 * @data: buffer containing data to write 828 * @set: did the set_variable() call succeed? 829 * 830 * This is a pretty special (complex) function. See efivarfs_file_write(). 831 * 832 * Atomically call set_variable() for @entry and if the call is 833 * successful, return the new size of the variable from get_variable() 834 * in @size. The success of set_variable() is indicated by @set. 835 * 836 * Returns 0 on success, -EINVAL if the variable data is invalid, 837 * -ENOSPC if the firmware does not have enough available space, or a 838 * converted EFI status code if either of set_variable() or 839 * get_variable() fail. 840 * 841 * If the EFI variable does not exist when calling set_variable() 842 * (EFI_NOT_FOUND), @entry is removed from the variable list. 843 */ 844 int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes, 845 unsigned long *size, void *data, bool *set) 846 { 847 const struct efivar_operations *ops = __efivars->ops; 848 efi_char16_t *name = entry->var.VariableName; 849 efi_guid_t *vendor = &entry->var.VendorGuid; 850 efi_status_t status; 851 int err; 852 853 *set = false; 854 855 if (efivar_validate(name, data, *size) == false) 856 return -EINVAL; 857 858 /* 859 * The lock here protects the get_variable call, the conditional 860 * set_variable call, and removal of the variable from the efivars 861 * list (in the case of an authenticated delete). 862 */ 863 spin_lock_irq(&__efivars->lock); 864 865 /* 866 * Ensure that the available space hasn't shrunk below the safe level 867 */ 868 status = check_var_size(attributes, *size + ucs2_strsize(name, 1024)); 869 if (status != EFI_SUCCESS) { 870 if (status != EFI_UNSUPPORTED) { 871 err = efi_status_to_err(status); 872 goto out; 873 } 874 875 if (*size > 65536) { 876 err = -ENOSPC; 877 goto out; 878 } 879 } 880 881 status = ops->set_variable(name, vendor, attributes, *size, data); 882 if (status != EFI_SUCCESS) { 883 err = efi_status_to_err(status); 884 goto out; 885 } 886 887 *set = true; 888 889 /* 890 * Writing to the variable may have caused a change in size (which 891 * could either be an append or an overwrite), or the variable to be 892 * deleted. Perform a GetVariable() so we can tell what actually 893 * happened. 894 */ 895 *size = 0; 896 status = ops->get_variable(entry->var.VariableName, 897 &entry->var.VendorGuid, 898 NULL, size, NULL); 899 900 if (status == EFI_NOT_FOUND) 901 efivar_entry_list_del_unlock(entry); 902 else 903 spin_unlock_irq(&__efivars->lock); 904 905 if (status && status != EFI_BUFFER_TOO_SMALL) 906 return efi_status_to_err(status); 907 908 return 0; 909 910 out: 911 spin_unlock_irq(&__efivars->lock); 912 return err; 913 914 } 915 EXPORT_SYMBOL_GPL(efivar_entry_set_get_size); 916 917 /** 918 * efivar_entry_iter_begin - begin iterating the variable list 919 * 920 * Lock the variable list to prevent entry insertion and removal until 921 * efivar_entry_iter_end() is called. This function is usually used in 922 * conjunction with __efivar_entry_iter() or efivar_entry_iter(). 923 */ 924 void efivar_entry_iter_begin(void) 925 { 926 spin_lock_irq(&__efivars->lock); 927 } 928 EXPORT_SYMBOL_GPL(efivar_entry_iter_begin); 929 930 /** 931 * efivar_entry_iter_end - finish iterating the variable list 932 * 933 * Unlock the variable list and allow modifications to the list again. 934 */ 935 void efivar_entry_iter_end(void) 936 { 937 spin_unlock_irq(&__efivars->lock); 938 } 939 EXPORT_SYMBOL_GPL(efivar_entry_iter_end); 940 941 /** 942 * __efivar_entry_iter - iterate over variable list 943 * @func: callback function 944 * @head: head of the variable list 945 * @data: function-specific data to pass to callback 946 * @prev: entry to begin iterating from 947 * 948 * Iterate over the list of EFI variables and call @func with every 949 * entry on the list. It is safe for @func to remove entries in the 950 * list via efivar_entry_delete(). 951 * 952 * You MUST call efivar_enter_iter_begin() before this function, and 953 * efivar_entry_iter_end() afterwards. 954 * 955 * It is possible to begin iteration from an arbitrary entry within 956 * the list by passing @prev. @prev is updated on return to point to 957 * the last entry passed to @func. To begin iterating from the 958 * beginning of the list @prev must be %NULL. 959 * 960 * The restrictions for @func are the same as documented for 961 * efivar_entry_iter(). 962 */ 963 int __efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 964 struct list_head *head, void *data, 965 struct efivar_entry **prev) 966 { 967 struct efivar_entry *entry, *n; 968 int err = 0; 969 970 if (!prev || !*prev) { 971 list_for_each_entry_safe(entry, n, head, list) { 972 err = func(entry, data); 973 if (err) 974 break; 975 } 976 977 if (prev) 978 *prev = entry; 979 980 return err; 981 } 982 983 984 list_for_each_entry_safe_continue((*prev), n, head, list) { 985 err = func(*prev, data); 986 if (err) 987 break; 988 } 989 990 return err; 991 } 992 EXPORT_SYMBOL_GPL(__efivar_entry_iter); 993 994 /** 995 * efivar_entry_iter - iterate over variable list 996 * @func: callback function 997 * @head: head of variable list 998 * @data: function-specific data to pass to callback 999 * 1000 * Iterate over the list of EFI variables and call @func with every 1001 * entry on the list. It is safe for @func to remove entries in the 1002 * list via efivar_entry_delete() while iterating. 1003 * 1004 * Some notes for the callback function: 1005 * - a non-zero return value indicates an error and terminates the loop 1006 * - @func is called from atomic context 1007 */ 1008 int efivar_entry_iter(int (*func)(struct efivar_entry *, void *), 1009 struct list_head *head, void *data) 1010 { 1011 int err = 0; 1012 1013 efivar_entry_iter_begin(); 1014 err = __efivar_entry_iter(func, head, data, NULL); 1015 efivar_entry_iter_end(); 1016 1017 return err; 1018 } 1019 EXPORT_SYMBOL_GPL(efivar_entry_iter); 1020 1021 /** 1022 * efivars_kobject - get the kobject for the registered efivars 1023 * 1024 * If efivars_register() has not been called we return NULL, 1025 * otherwise return the kobject used at registration time. 1026 */ 1027 struct kobject *efivars_kobject(void) 1028 { 1029 if (!__efivars) 1030 return NULL; 1031 1032 return __efivars->kobject; 1033 } 1034 EXPORT_SYMBOL_GPL(efivars_kobject); 1035 1036 /** 1037 * efivar_run_worker - schedule the efivar worker thread 1038 */ 1039 void efivar_run_worker(void) 1040 { 1041 if (efivar_wq_enabled) 1042 schedule_work(&efivar_work); 1043 } 1044 EXPORT_SYMBOL_GPL(efivar_run_worker); 1045 1046 /** 1047 * efivars_register - register an efivars 1048 * @efivars: efivars to register 1049 * @ops: efivars operations 1050 * @kobject: @efivars-specific kobject 1051 * 1052 * Only a single efivars can be registered at any time. 1053 */ 1054 int efivars_register(struct efivars *efivars, 1055 const struct efivar_operations *ops, 1056 struct kobject *kobject) 1057 { 1058 spin_lock_init(&efivars->lock); 1059 efivars->ops = ops; 1060 efivars->kobject = kobject; 1061 1062 __efivars = efivars; 1063 1064 return 0; 1065 } 1066 EXPORT_SYMBOL_GPL(efivars_register); 1067 1068 /** 1069 * efivars_unregister - unregister an efivars 1070 * @efivars: efivars to unregister 1071 * 1072 * The caller must have already removed every entry from the list, 1073 * failure to do so is an error. 1074 */ 1075 int efivars_unregister(struct efivars *efivars) 1076 { 1077 int rv; 1078 1079 if (!__efivars) { 1080 printk(KERN_ERR "efivars not registered\n"); 1081 rv = -EINVAL; 1082 goto out; 1083 } 1084 1085 if (__efivars != efivars) { 1086 rv = -EINVAL; 1087 goto out; 1088 } 1089 1090 __efivars = NULL; 1091 1092 rv = 0; 1093 out: 1094 return rv; 1095 } 1096 EXPORT_SYMBOL_GPL(efivars_unregister); 1097