Main.c revision 2aa62f2bc9a9654687b377d9ca8a8c2c860a3852
1/** @file
2  Establish the program environment and the "main" entry point.
3
4  All of the global data in the gMD structure is initialized to 0, NULL, or
5  SIG_DFL; as appropriate.
6
7  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
8  This program and the accompanying materials are licensed and made available under
9  the terms and conditions of the BSD License that accompanies this distribution.
10  The full text of the license may be found at
11  http://opensource.org/licenses/bsd-license.php.
12
13  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15**/
16#include  <Uefi.h>
17#include  <Library/UefiLib.h>
18
19#include  <Library/ShellCEntryLib.h>
20#include  <Library/MemoryAllocationLib.h>
21#include  <Library/TimerLib.h>
22
23#include  <LibConfig.h>
24
25#include  <errno.h>
26#include  <stdio.h>
27#include  <string.h>
28#include  <MainData.h>
29
30extern int main( int, wchar_t**);
31extern int __sse2_available;
32
33struct  __MainData  *gMD;
34
35/* Worker function to keep GCC happy. */
36void __main()
37{
38  ;
39}
40
41INTN
42EFIAPI
43ShellAppMain (
44  IN UINTN Argc,
45  IN CHAR16 **Argv
46  )
47{
48  INTN   ExitVal;
49  INTN   i;
50  struct __filedes *mfd;
51  FILE  *fp;
52
53  ExitVal = (INTN)RETURN_SUCCESS;
54  gMD = AllocateZeroPool(sizeof(struct __MainData));
55  if( gMD == NULL ) {
56    ExitVal = (INTN)RETURN_OUT_OF_RESOURCES;
57  }
58  else {
59    /* Initialize data */
60    __sse2_available      = 0;
61    _fltused              = 1;
62    errno                 = 0;
63    EFIerrno              = 0;
64
65#ifdef NT32dvm
66    gMD->ClocksPerSecond  = 0;  // For NT32 only
67    gMD->AppStartTime     = 0;  // For NT32 only
68#else
69    gMD->ClocksPerSecond = (clock_t)GetPerformanceCounterProperties( NULL, NULL);
70    gMD->AppStartTime = (clock_t)GetPerformanceCounter();
71#endif  /* NT32 dvm */
72
73    // Initialize file descriptors
74    mfd = gMD->fdarray;
75    for(i = 0; i < (FOPEN_MAX); ++i) {
76      mfd[i].MyFD = (UINT16)i;
77    }
78
79    // Open stdin, stdout, stderr
80    fp = freopen("stdin:", "r", stdin);
81    if(fp != NULL) {
82      fp = freopen("stdout:", "w", stdout);
83      if(fp != NULL) {
84        fp = freopen("stderr:", "w", stderr);
85      }
86    }
87    if(fp == NULL) {
88      Print(L"ERROR Initializing Standard IO: %a.\n    %r\n",
89            strerror(errno), EFIerrno);
90    }
91
92    ExitVal = (INTN)main( (int)Argc, (wchar_t **)Argv);
93
94    if (gMD->cleanup != NULL) {
95      gMD->cleanup();
96    }
97  }
98  if(gMD != NULL) {
99    FreePool( gMD );
100  }
101  return ExitVal;
102}
103