1a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey/** @file
2a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Main file for GetMtc shell level 3 function.
3a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
4c011b6c9e2baf57fc0557117e9875ceb3dca55a3Tapan Shah  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5cbcccd2c9d93a35884c344a3feaa773338675dfflgao  Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved. <BR>
6a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  This program and the accompanying materials
7a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  are licensed and made available under the terms and conditions of the BSD License
8a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  which accompanies this distribution.  The full text of the license may be found at
9a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  http://opensource.org/licenses/bsd-license.php
10a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
11a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
14a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey**/
15a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
16a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey#include "UefiShellLevel3CommandsLib.h"
17a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
18a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey#include <Library/ShellLib.h>
19a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
20a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey/**
21a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Function for 'getmtc' command.
22a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
23a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
24a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
25a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey**/
26a405b86d274d32b92f69842bfb9a1ab143128f57jcarseySHELL_STATUS
27a405b86d274d32b92f69842bfb9a1ab143128f57jcarseyEFIAPI
28a405b86d274d32b92f69842bfb9a1ab143128f57jcarseyShellCommandRunGetMtc (
29a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  IN EFI_HANDLE        ImageHandle,
30a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  IN EFI_SYSTEM_TABLE  *SystemTable
31a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  )
32a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey{
33a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  EFI_STATUS          Status;
34a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  LIST_ENTRY          *Package;
35a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  CHAR16              *ProblemParam;
36a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  SHELL_STATUS        ShellStatus;
37a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  UINT64              Mtc;
38a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
39a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  ProblemParam        = NULL;
40a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  ShellStatus         = SHELL_SUCCESS;
41a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
42a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  //
43a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  // initialize the shell lib (we must be in non-auto-init...)
44a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  //
45a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Status = ShellInitialize();
46a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  ASSERT_EFI_ERROR(Status);
47a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
48a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  //
49a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  // parse the command line
50a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  //
51a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
52a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  if (EFI_ERROR(Status)) {
53a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
54e54a10bbcaa3e2ee3d8e3ee2e7763a59f0e4d216Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"getmtc", ProblemParam);
55a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      FreePool(ProblemParam);
56a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
57a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    } else {
58a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      ASSERT(FALSE);
59a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    }
60a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  } else {
61a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    //
62a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    // check for "-?"
63a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    //
64a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    if (ShellCommandLineGetFlag(Package, L"-?")) {
65a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      ASSERT(FALSE);
66a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    } else if (ShellCommandLineGetRawValue(Package, 1) != NULL) {
67e54a10bbcaa3e2ee3d8e3ee2e7763a59f0e4d216Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"getmtc");
68a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
69a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    } else {
70a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      //
71a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      // Get the monotonic counter count
72a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      //
73a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      Status = gBS->GetNextMonotonicCount(&Mtc);
74cbcccd2c9d93a35884c344a3feaa773338675dfflgao      if (Status == EFI_DEVICE_ERROR) {
75cbcccd2c9d93a35884c344a3feaa773338675dfflgao        ShellStatus = SHELL_DEVICE_ERROR;
76cbcccd2c9d93a35884c344a3feaa773338675dfflgao      } else if (Status == EFI_SECURITY_VIOLATION) {
77cbcccd2c9d93a35884c344a3feaa773338675dfflgao        ShellStatus = SHELL_SECURITY_VIOLATION;
78cbcccd2c9d93a35884c344a3feaa773338675dfflgao      } else if (EFI_ERROR(Status)) {
79cbcccd2c9d93a35884c344a3feaa773338675dfflgao        ShellStatus = SHELL_DEVICE_ERROR;
80a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      }
81a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
82a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      //
83a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      // print it...
84a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      //
85a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      if (ShellStatus == SHELL_SUCCESS) {
86a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GET_MTC_OUTPUT), gShellLevel3HiiHandle, Mtc);
87a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      }
88a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    }
89a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    //
90a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    // free the command line package
91a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    //
92a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    ShellCommandLineFreeVarList (Package);
93a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  }
94a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
95a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  return (ShellStatus);
96a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey}
97a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
98