0023-efi-capsule-loader-Use-page-addresses-rather-than-st.patch 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. From 30e7ad8198b22063c242d6f349d1e9d948e4d34d Mon Sep 17 00:00:00 2001
  2. From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
  3. Date: Tue, 28 Mar 2017 18:09:39 +0100
  4. Subject: [PATCH 23/27] efi/capsule-loader: Use page addresses rather than
  5. struct page pointers
  6. To give some leeway to code that handles non-standard capsule headers,
  7. let's keep an array of page addresses rather than struct page pointers.
  8. This gives special implementations of efi_capsule_setup_info() the
  9. opportunity to mangle the payload a bit before it is presented to the
  10. firmware, without putting any knowledge of the nature of such quirks
  11. into the generic code.
  12. Cc: Matt Fleming <matt@codeblueprint.co.uk>
  13. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
  14. ---
  15. drivers/firmware/efi/capsule-loader.c | 12 ++++++++----
  16. drivers/firmware/efi/capsule.c | 7 ++++---
  17. include/linux/efi.h | 4 ++--
  18. 3 files changed, 14 insertions(+), 9 deletions(-)
  19. diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
  20. index f7fdeab0bc37..feeafb673c07 100644
  21. --- a/drivers/firmware/efi/capsule-loader.c
  22. +++ b/drivers/firmware/efi/capsule-loader.c
  23. @@ -20,6 +20,10 @@
  24. #define NO_FURTHER_WRITE_ACTION -1
  25. +#ifndef phys_to_page
  26. +#define phys_to_page(x) pfn_to_page((x) >> PAGE_SHIFT)
  27. +#endif
  28. +
  29. /**
  30. * efi_free_all_buff_pages - free all previous allocated buffer pages
  31. * @cap_info: pointer to current instance of capsule_info structure
  32. @@ -31,7 +35,7 @@
  33. static void efi_free_all_buff_pages(struct capsule_info *cap_info)
  34. {
  35. while (cap_info->index > 0)
  36. - __free_page(cap_info->pages[--cap_info->index]);
  37. + __free_page(phys_to_page(cap_info->pages[--cap_info->index]));
  38. cap_info->index = NO_FURTHER_WRITE_ACTION;
  39. }
  40. @@ -161,12 +165,12 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
  41. goto failed;
  42. }
  43. - cap_info->pages[cap_info->index++] = page;
  44. + cap_info->pages[cap_info->index++] = page_to_phys(page);
  45. cap_info->page_bytes_remain = PAGE_SIZE;
  46. + } else {
  47. + page = phys_to_page(cap_info->pages[cap_info->index - 1]);
  48. }
  49. - page = cap_info->pages[cap_info->index - 1];
  50. -
  51. kbuff = kmap(page);
  52. if (!kbuff) {
  53. ret = -ENOMEM;
  54. diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
  55. index 6eedff45e6d7..57f85256feb2 100644
  56. --- a/drivers/firmware/efi/capsule.c
  57. +++ b/drivers/firmware/efi/capsule.c
  58. @@ -214,7 +214,7 @@ efi_capsule_update_locked(efi_capsule_header_t *capsule,
  59. *
  60. * Return 0 on success, a converted EFI status code on failure.
  61. */
  62. -int efi_capsule_update(efi_capsule_header_t *capsule, struct page **pages)
  63. +int efi_capsule_update(efi_capsule_header_t *capsule, phys_addr_t *pages)
  64. {
  65. u32 imagesize = capsule->imagesize;
  66. efi_guid_t guid = capsule->guid;
  67. @@ -253,10 +253,11 @@ int efi_capsule_update(efi_capsule_header_t *capsule, struct page **pages)
  68. }
  69. for (j = 0; j < SGLIST_PER_PAGE && count > 0; j++) {
  70. - u64 sz = min_t(u64, imagesize, PAGE_SIZE);
  71. + u64 sz = min_t(u64, imagesize,
  72. + PAGE_SIZE - (u64)*pages % PAGE_SIZE);
  73. sglist[j].length = sz;
  74. - sglist[j].data = page_to_phys(*pages++);
  75. + sglist[j].data = *pages++;
  76. imagesize -= sz;
  77. count--;
  78. diff --git a/include/linux/efi.h b/include/linux/efi.h
  79. index 99d3f5bb9070..3a67ce06f7f3 100644
  80. --- a/include/linux/efi.h
  81. +++ b/include/linux/efi.h
  82. @@ -135,7 +135,7 @@ struct capsule_info {
  83. long index;
  84. size_t count;
  85. size_t total_size;
  86. - struct page **pages;
  87. + phys_addr_t *pages;
  88. size_t page_bytes_remain;
  89. };
  90. @@ -1245,7 +1245,7 @@ extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
  91. size_t size, int *reset);
  92. extern int efi_capsule_update(efi_capsule_header_t *capsule,
  93. - struct page **pages);
  94. + phys_addr_t *pages);
  95. #ifdef CONFIG_EFI_RUNTIME_MAP
  96. int efi_runtime_map_init(struct kobject *);
  97. --
  98. 2.12.0