Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}