EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { UINTN Argc; CHAR16 **Argv; BOOLEAN Quiet; UINTN RangeStart; UINTN RangeLength; EFI_STATUS Status; GET_OPT_CONTEXT GetOptContext; RANGE_CHECK_CONTEXT RangeCheck; Status = GetShellArgcArgv(ImageHandle, &Argc, &Argv); if (Status != EFI_SUCCESS || Argc < 1) { Print(L"This program requires Microsoft Windows.\n" "Just kidding...only the UEFI Shell!\n"); return EFI_ABORTED; } Quiet = FALSE; INIT_GET_OPT_CONTEXT(&GetOptContext); while ((Status = GetOpt(Argc, Argv, NULL, &GetOptContext)) == EFI_SUCCESS) { switch (GetOptContext.Opt) { case L'q': Quiet = TRUE; break; default: Print(L"Unknown option '%c'\n", GetOptContext.Opt); return Usage(Argv[0]); } } if (Argc - GetOptContext.OptIndex < 2) { return Usage(Argv[0]); } RangeStart = StrHexToUintn(Argv[GetOptContext.OptIndex + 0]); RangeLength = StrHexToUintn(Argv[GetOptContext.OptIndex + 1]); if (RangeLength == 0 || (RangeStart + RangeLength) < RangeStart) { Print(L"Invalid range passed\n"); return EFI_INVALID_PARAMETER; } Status = InitRangeCheckContext(TRUE, !Quiet, &RangeCheck); if (EFI_ERROR(Status)) { Print(L"Couldn't initialize range checking: %r\n", Status); return Status; } Status = RangeIsMapped(&RangeCheck, RangeStart, RangeLength); if (!Quiet) { if (Status == EFI_SUCCESS) { Print(L"0x%lx-0x%lx is in the memory map\n", RangeStart, RangeLength - 1 + RangeStart); } else if (Status != EFI_NOT_FOUND) { Print(L"Error: %r\n", Status); } } CleanRangeCheckContext(&RangeCheck); return Status; }
EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS efi_status; CHAR16 **argv; INTN argc = 0; #if DEBUG INTN c = 0; #endif INTN err = 0; INTN PgCnt = -1; EFI_PHYSICAL_ADDRESS PhysAddr = 0; InitializeLib(image, systab); Print(L"FreePages: __PhysAddr__ __PgCnt__\n"); Print(L"__PhysAddr__ 0... %llx\n", MAX_ADDR); Print(L"__PgCnt__ [0..%lx]\n", MAX_NUM_PAGES); Print(L"All numbers hex w/ no leading 0x\n"); Print(L"\n"); #if DEBUG Print(L"Now parse argc/argv\n"); #endif argc = GetShellArgcArgv(image, &argv); #if DEBUG Print(L"argc = %d\n", argc); #endif #if DEBUG for (c = 0; c < argc; c++ ) { Print(L"argv[%d] = <%s>\n", c, argv[c]); } #endif if (argc != 3) { Print(L"Invalid argument count\n"); return EFI_SUCCESS; } PhysAddr = xtoi(argv[1]); PgCnt = xtoi(argv[2]); if ( (PgCnt < 0) || (PgCnt > MAX_NUM_PAGES) ) { Print(L"Inavlid PgCnt\n"); err++; } if ( PhysAddr > MAX_ADDR ) { Print(L"Inavlid Address\n"); err++; } if ( err ) { return EFI_SUCCESS; } Print(L"FreePages(%lx,%d)\n", PhysAddr, PgCnt); efi_status = uefi_call_wrapper(BS->FreePages, 2, PhysAddr, PgCnt); if ( EFI_ERROR(efi_status) ) { Print(L"Free Pages Failed: %d\n", efi_status); return efi_status; } return EFI_SUCCESS; }