FreePages.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * Copyright (C) 2013 Jerry Hoemann <jerry.hoemann@hp.com>
  3. *
  4. * Application to allocate memory at EFI. Syntax of command
  5. * mimics the EFI Boot Service "FreePages."
  6. *
  7. * See UEFI spec 2.3, Section 6.2.
  8. *
  9. Example freeing a 5 page BS_Code setment at address: 0000000020000000 (hex)
  10. FS1:\> memmap
  11. Type Start End #pages Attributes
  12. BS_Code 0000000000000000-0000000000000FFF 0000000000000001 000000000000000F
  13. Available 0000000000001000-000000000008DFFF 000000000000008D 000000000000000F
  14. Reserved 000000000008E000-000000000008FFFF 0000000000000002 000000000000000F
  15. Available 0000000000090000-000000000009FFFF 0000000000000010 000000000000000F
  16. Available 0000000000100000-000000000FFFFFFF 000000000000FF00 000000000000000F
  17. BS_Code 0000000010000000-0000000010061FFF 0000000000000062 000000000000000F
  18. Available 0000000010062000-000000001FFFFFFF 000000000000FF9E 000000000000000F
  19. BS_Code 0000000020000000-0000000020004FFF 0000000000000005 000000000000000F
  20. Available 0000000020005000-000000005DDFFFFF 000000000003DDFB 000000000000000F
  21. BS_Data 000000005DE00000-000000005DFFFFFF 0000000000000200 000000000000000F
  22. Available 000000005E000000-000000006DE7CFFF 000000000000FE7D 000000000000000F
  23. ACPI_NVS 000000006DE7D000-000000006EE7CFFF 0000000000001000 000000000000000F
  24. BS_Data 000000006EE7D000-00000000709FBFFF 0000000000001B7F 000000000000000F
  25. Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F
  26. FS1:\> FreePages 0000000020000000 5
  27. FreePages: __PhysAddr__ __PgCnt__
  28. __PhysAddr__ 0... 3FFFFFFFFFFF
  29. __PgCnt__ [0..F000000]
  30. All numbers hex w/ no leading 0x
  31. FreePages(20000000,5)
  32. FS1:\> memmap
  33. Type Start End #pages Attributes
  34. BS_Code 0000000000000000-0000000000000FFF 0000000000000001 000000000000000F
  35. Available 0000000000001000-000000000008DFFF 000000000000008D 000000000000000F
  36. Reserved 000000000008E000-000000000008FFFF 0000000000000002 000000000000000F
  37. Available 0000000000090000-000000000009FFFF 0000000000000010 000000000000000F
  38. Available 0000000000100000-000000000FFFFFFF 000000000000FF00 000000000000000F
  39. BS_Code 0000000010000000-0000000010061FFF 0000000000000062 000000000000000F
  40. Available 0000000010062000-000000005DDFFFFF 000000000004DD9E 000000000000000F
  41. BS_Data 000000005DE00000-000000005DFFFFFF 0000000000000200 000000000000000F
  42. Available 000000005E000000-000000006DE7CFFF 000000000000FE7D 000000000000000F
  43. ACPI_NVS 000000006DE7D000-000000006EE7CFFF 0000000000001000 000000000000000F
  44. BS_Data 000000006EE7D000-00000000709FBFFF 0000000000001B7F 000000000000000F
  45. Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F
  46. */
  47. #include <efi.h>
  48. #include <efilib.h>
  49. /*
  50. * FreePages: __PhysAddr__ __PgCnt__
  51. *
  52. */
  53. #define MAX_NUM_PAGES 0x000000000F000000
  54. #define MAX_ADDR ((1ULL << 46) - 1)
  55. #ifdef DEBUG
  56. #undef DEBUG
  57. #endif
  58. #define DEBUG 0
  59. EFI_STATUS
  60. efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
  61. {
  62. EFI_STATUS efi_status;
  63. CHAR16 **argv;
  64. INTN argc = 0;
  65. #if DEBUG
  66. INTN c = 0;
  67. #endif
  68. INTN err = 0;
  69. INTN PgCnt = -1;
  70. EFI_PHYSICAL_ADDRESS PhysAddr = 0;
  71. InitializeLib(image, systab);
  72. Print(L"FreePages: __PhysAddr__ __PgCnt__\n");
  73. Print(L"__PhysAddr__ 0... %llx\n", MAX_ADDR);
  74. Print(L"__PgCnt__ [0..%lx]\n", MAX_NUM_PAGES);
  75. Print(L"All numbers hex w/ no leading 0x\n");
  76. Print(L"\n");
  77. #if DEBUG
  78. Print(L"Now parse argc/argv\n");
  79. #endif
  80. argc = GetShellArgcArgv(image, &argv);
  81. #if DEBUG
  82. Print(L"argc = %d\n", argc);
  83. #endif
  84. #if DEBUG
  85. for (c = 0; c < argc; c++ ) {
  86. Print(L"argv[%d] = <%s>\n", c, argv[c]);
  87. }
  88. #endif
  89. if (argc != 3) {
  90. Print(L"Invalid argument count\n");
  91. return EFI_SUCCESS;
  92. }
  93. PhysAddr = xtoi(argv[1]);
  94. PgCnt = xtoi(argv[2]);
  95. if ( (PgCnt < 0) || (PgCnt > MAX_NUM_PAGES) ) {
  96. Print(L"Inavlid PgCnt\n");
  97. err++;
  98. }
  99. if ( PhysAddr > MAX_ADDR ) {
  100. Print(L"Inavlid Address\n");
  101. err++;
  102. }
  103. if ( err ) {
  104. return EFI_SUCCESS;
  105. }
  106. Print(L"FreePages(%lx,%d)\n", PhysAddr, PgCnt);
  107. efi_status = uefi_call_wrapper(BS->FreePages, 2, PhysAddr, PgCnt);
  108. if ( EFI_ERROR(efi_status) ) {
  109. Print(L"Free Pages Failed: %d\n", efi_status);
  110. return efi_status;
  111. }
  112. return EFI_SUCCESS;
  113. }