1/** @file
2  Main file for Ver shell level 3 function.
3
4  (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
5  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
6  This program and the accompanying materials
7  are licensed and made available under the terms and conditions of the BSD License
8  which accompanies this distribution.  The full text of the license may be found at
9  http://opensource.org/licenses/bsd-license.php
10
11  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14**/
15
16#include "UefiShellLevel3CommandsLib.h"
17
18#include <Library/ShellLib.h>
19
20STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
21  {L"-s", TypeFlag},
22  {L"-terse", TypeFlag},
23  {L"-t", TypeFlag},
24  {L"-_pa", TypeFlag},
25  {NULL, TypeMax}
26  };
27
28/**
29  Function for 'ver' command.
30
31  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
32  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
33**/
34SHELL_STATUS
35EFIAPI
36ShellCommandRunVer (
37  IN EFI_HANDLE        ImageHandle,
38  IN EFI_SYSTEM_TABLE  *SystemTable
39  )
40{
41  EFI_STATUS          Status;
42  LIST_ENTRY          *Package;
43  CHAR16              *ProblemParam;
44  SHELL_STATUS        ShellStatus;
45  UINT8               Level;
46
47  Level = PcdGet8(PcdShellSupportLevel);
48  ProblemParam        = NULL;
49  ShellStatus         = SHELL_SUCCESS;
50
51  //
52  // initialize the shell lib (we must be in non-auto-init...)
53  //
54  Status = ShellInitialize();
55  ASSERT_EFI_ERROR(Status);
56
57  Status = CommandInit();
58  ASSERT_EFI_ERROR(Status);
59
60  //
61  // parse the command line
62  //
63  Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
64  if (EFI_ERROR(Status)) {
65    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
66      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"ver", ProblemParam);
67      FreePool(ProblemParam);
68      ShellStatus = SHELL_INVALID_PARAMETER;
69    } else {
70      ASSERT(FALSE);
71    }
72  } else {
73    //
74    // check for "-?"
75    //
76    if (ShellCommandLineGetFlag(Package, L"-?")) {
77      ASSERT(FALSE);
78    }
79    if (ShellCommandLineGetRawValue(Package, 1) != NULL) {
80      //
81      // we have too many parameters
82      //
83      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"ver");
84      ShellStatus = SHELL_INVALID_PARAMETER;
85    } else {
86      if (ShellCommandLineGetFlag(Package, L"-s")) {
87        ShellPrintHiiEx (
88          0,
89          gST->ConOut->Mode->CursorRow,
90          NULL,
91          STRING_TOKEN (STR_VER_OUTPUT_SIMPLE),
92          gShellLevel3HiiHandle,
93          gEfiShellProtocol->MajorVersion,
94          gEfiShellProtocol->MinorVersion
95         );
96      } else {
97        ShellPrintHiiEx (
98          0,
99          gST->ConOut->Mode->CursorRow,
100          NULL,
101          STRING_TOKEN (STR_VER_OUTPUT_SHELL),
102          gShellLevel3HiiHandle,
103          SupportLevel[Level],
104          gEfiShellProtocol->MajorVersion,
105          gEfiShellProtocol->MinorVersion
106         );
107        if (!ShellCommandLineGetFlag(Package, L"-terse") && !ShellCommandLineGetFlag(Package, L"-t")){
108          ShellPrintHiiEx(
109            -1,
110            -1,
111            NULL,
112            STRING_TOKEN (STR_VER_OUTPUT_SUPPLIER),
113            gShellLevel3HiiHandle,
114            (CHAR16 *) PcdGetPtr (PcdShellSupplier)
115           );
116
117
118          ShellPrintHiiEx (
119            -1,
120            -1,
121            NULL,
122            STRING_TOKEN (STR_VER_OUTPUT_UEFI),
123            gShellLevel3HiiHandle,
124            (gST->Hdr.Revision&0xffff0000)>>16,
125            (gST->Hdr.Revision&0x0000ffff),
126            gST->FirmwareVendor,
127            gST->FirmwareRevision
128           );
129        }
130      }
131      //
132      // implementation specific support for displaying processor architecture
133      //
134      if (ShellCommandLineGetFlag(Package, L"-_pa")) {
135        ShellPrintEx(-1, -1, L"%d\r\n", sizeof(UINTN)==sizeof(UINT64)?64:32);
136      }
137    }
138
139    //
140    // free the command line package
141    //
142    ShellCommandLineFreeVarList (Package);
143  }
144
145  return (ShellStatus);
146}
147
148