efi_image_region.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2020, Heinrich Schuchardt <xypron.glpk@gmx.de>
  4. */
  5. #include <common.h>
  6. #include <efi_loader.h>
  7. #include <test/lib.h>
  8. #include <test/test.h>
  9. #include <test/ut.h>
  10. #define UT_REG_CAPACITY 6
  11. static int lib_test_efi_image_region_add(struct unit_test_state *uts)
  12. {
  13. struct efi_image_regions *regs;
  14. regs = calloc(sizeof(*regs) +
  15. sizeof(struct image_region) * UT_REG_CAPACITY, 1);
  16. ut_assert(regs);
  17. regs->max = UT_REG_CAPACITY;
  18. ut_asserteq(0, regs->num);
  19. ut_asserteq_64(EFI_INVALID_PARAMETER,
  20. efi_image_region_add(regs, (void *)0x4000,
  21. (void *)0x3000, 1));
  22. ut_asserteq(0, regs->num);
  23. ut_asserteq_64(EFI_SUCCESS,
  24. efi_image_region_add(regs, (void *)0x3100,
  25. (void *)0x4000, 1));
  26. ut_asserteq(1, regs->num);
  27. ut_asserteq_64(EFI_SUCCESS,
  28. efi_image_region_add(regs, (void *)0x2000,
  29. (void *)0x3100, 1));
  30. ut_asserteq(2, regs->num);
  31. ut_asserteq_64(EFI_SUCCESS,
  32. efi_image_region_add(regs, (void *)0x1000,
  33. (void *)0x1f00, 1));
  34. ut_asserteq(3, regs->num);
  35. ut_asserteq_64(EFI_SUCCESS,
  36. efi_image_region_add(regs, (void *)0x4000,
  37. (void *)0x4e00, 1));
  38. ut_asserteq(4, regs->num);
  39. ut_asserteq_64(EFI_SUCCESS,
  40. efi_image_region_add(regs, (void *)0x1f00,
  41. (void *)0x2001, 1));
  42. ut_asserteq(5, regs->num);
  43. ut_asserteq_ptr((void *)0x3100, regs->reg[0].data);
  44. ut_asserteq(0x0f00, regs->reg[0].size);
  45. ut_asserteq_ptr((void *)0x2000, regs->reg[1].data);
  46. ut_asserteq(0x1100, regs->reg[1].size);
  47. ut_asserteq_ptr((void *)0x1000, regs->reg[2].data);
  48. ut_asserteq(0x0f00, regs->reg[2].size);
  49. ut_asserteq_ptr((void *)0x4000, regs->reg[3].data);
  50. ut_asserteq(0x0e00, regs->reg[3].size);
  51. ut_asserteq_ptr((void *)0x1f00, regs->reg[4].data);
  52. ut_asserteq(0x0101, regs->reg[4].size);
  53. free(regs);
  54. return 0;
  55. }
  56. LIB_TEST(lib_test_efi_image_region_add, 0);
  57. static int lib_test_efi_image_region_sort(struct unit_test_state *uts)
  58. {
  59. struct efi_image_regions *regs;
  60. regs = calloc(sizeof(*regs) +
  61. sizeof(struct image_region) * UT_REG_CAPACITY, 1);
  62. ut_assert(regs);
  63. regs->max = UT_REG_CAPACITY;
  64. ut_asserteq(0, regs->num);
  65. ut_asserteq_64(EFI_INVALID_PARAMETER,
  66. efi_image_region_add(regs, (void *)0x4000,
  67. (void *)0x3000, 0));
  68. ut_asserteq(0, regs->num);
  69. ut_asserteq_64(EFI_SUCCESS,
  70. efi_image_region_add(regs, (void *)0x3100,
  71. (void *)0x4000, 0));
  72. ut_asserteq(1, regs->num);
  73. ut_asserteq_64(EFI_SUCCESS,
  74. efi_image_region_add(regs, (void *)0x2000,
  75. (void *)0x3100, 0));
  76. ut_asserteq(2, regs->num);
  77. ut_asserteq_64(EFI_SUCCESS,
  78. efi_image_region_add(regs, (void *)0x1000,
  79. (void *)0x1f00, 0));
  80. ut_asserteq(3, regs->num);
  81. ut_asserteq_64(EFI_SUCCESS,
  82. efi_image_region_add(regs, (void *)0x4000,
  83. (void *)0x4e00, 0));
  84. ut_asserteq(4, regs->num);
  85. ut_asserteq_64(EFI_INVALID_PARAMETER,
  86. efi_image_region_add(regs, (void *)0x1f00,
  87. (void *)0x2001, 0));
  88. ut_asserteq(4, regs->num);
  89. ut_asserteq_64(EFI_INVALID_PARAMETER,
  90. efi_image_region_add(regs, (void *)0x10ff,
  91. (void *)0x11ff, 0));
  92. ut_asserteq(4, regs->num);
  93. ut_asserteq_64(EFI_INVALID_PARAMETER,
  94. efi_image_region_add(regs, (void *)0x0000,
  95. (void *)0x6000, 0));
  96. ut_asserteq(4, regs->num);
  97. ut_asserteq_64(EFI_INVALID_PARAMETER,
  98. efi_image_region_add(regs, (void *)0x3100,
  99. (void *)0x0e00, 0));
  100. ut_asserteq(4, regs->num);
  101. ut_asserteq_64(EFI_INVALID_PARAMETER,
  102. efi_image_region_add(regs, (void *)0x3200,
  103. (void *)0x0e00, 0));
  104. ut_asserteq(4, regs->num);
  105. ut_asserteq_64(EFI_INVALID_PARAMETER,
  106. efi_image_region_add(regs, (void *)0x3200,
  107. (void *)0x0d00, 0));
  108. ut_asserteq(4, regs->num);
  109. ut_asserteq_64(EFI_SUCCESS,
  110. efi_image_region_add(regs, (void *)0x1f00,
  111. (void *)0x2000, 0));
  112. ut_asserteq(5, regs->num);
  113. ut_asserteq_64(EFI_SUCCESS,
  114. efi_image_region_add(regs, (void *)0x4000,
  115. (void *)0x4000, 0));
  116. ut_asserteq(6, regs->num);
  117. ut_asserteq_64(EFI_OUT_OF_RESOURCES,
  118. efi_image_region_add(regs, (void *)0x6000,
  119. (void *)0x0100, 0));
  120. ut_asserteq(6, regs->num);
  121. ut_asserteq_ptr((void *)0x1000, regs->reg[0].data);
  122. ut_asserteq(0x0f00, regs->reg[0].size);
  123. ut_asserteq_ptr((void *)0x1f00, regs->reg[1].data);
  124. ut_asserteq(0x0100, regs->reg[1].size);
  125. ut_asserteq_ptr((void *)0x2000, regs->reg[2].data);
  126. ut_asserteq(0x1100, regs->reg[2].size);
  127. ut_asserteq_ptr((void *)0x3100, regs->reg[3].data);
  128. ut_asserteq(0x0f00, regs->reg[3].size);
  129. ut_asserteq_ptr((void *)0x4000, regs->reg[4].data);
  130. ut_asserteq(0x0000, regs->reg[4].size);
  131. ut_asserteq_ptr((void *)0x4000, regs->reg[5].data);
  132. ut_asserteq(0x0e00, regs->reg[5].size);
  133. free(regs);
  134. return 0;
  135. }
  136. LIB_TEST(lib_test_efi_image_region_sort, 0);