summaryrefslogtreecommitdiff
path: root/SamsungPlatformPkg/Apps/TestApps/MiscellaneousServicesTest/MiscellaneousServicesTest.c
blob: ac97c5e44d6c83a41df1a05240b143ddcbba817a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/** @file MiscellaneousTest.c

  Samsung S.LSI MiscellaneousServices application

  Copyright (c) 2012-2013, Samsung Electronics Inc. All rights reserved.
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

/*=============================================================================
                              EDIT HISTORY

 DateTime: 2012/01/31
 Author: Jang Young Gun : yg1004.jang@samsung.com

 when       who     what, where, why
 --------   ---     -----------------------------------------------------------
 01/31/12   yg.jang Initial revision

=============================================================================*/

#include <Uefi.h>
#include <Library/PcdLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>

EFI_EVENT HelloTimerEvent;

VOID
EFIAPI print_hello( void )
{
  UINT32 Index;

  Index = 0;

  //
  // Three PCD type (FeatureFlag, UINT32 and String) are used as the sample.
  //
  if (FeaturePcdGet (PcdHelloWorldPrintEnable)) {
	for (Index = 0; Index < PcdGet32 (PcdHelloWorldPrintTimes); Index ++) {
	  //
	  // Use UefiLib Print API to print string to UEFI console
	  //
	Print ((CHAR16*)PcdGetPtr (PcdHelloWorldPrintString));
    }
  }
}

/**
  The user Entry Point for Application. The user code starts with this function
  as the real entry point for the application.

  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
  @param[in] SystemTable    A pointer to the EFI System Table.

  @retval EFI_SUCCESS       The entry point is executed successfully.
  @retval other             Some error occurs when executing this entry point.

**/
EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  UINTN EventIndex;
  EFI_STATUS  Status;
  UINT64 BSCounter;
  UINT64 BSCounterNext;
  UINT32 RTCounter;
  UINT32 RTCounterNext;

  do{
    print_hello();

    //
    // Create the timer event to implement a timer
    //
    Status = gBS->CreateEvent (
                    EVT_TIMER,
                    TPL_NOTIFY,
                    NULL,
                    NULL,
                    &HelloTimerEvent
                    );
    if(EFI_ERROR (Status)) {
      break;
    }

    // Set timer for 1 second
    AsciiPrint("Registering Timer Event: 1 second relative timer\n");
    gBS->SetTimer(HelloTimerEvent, TimerRelative, 10000000);
    AsciiPrint("Waiting for 1 second\n");
    gBS->WaitForEvent(1, &HelloTimerEvent, &EventIndex);
    AsciiPrint("1 second timer event signaled\n");

    // Test Stall
    AsciiPrint("Stalling for 2 seconds\n");
    gBS->Stall(2000000);
    AsciiPrint("2 second stall complete\n");

    // Testing GetNextMonotonicCount
    gBS->GetNextMonotonicCount(&BSCounter);
    AsciiPrint("Current Monotonic Counter Value: 0x%llx\n", BSCounter);
    gBS->GetNextMonotonicCount(&BSCounterNext);
    AsciiPrint("Next Monotonic Counter Value: 0x%llx\n", BSCounterNext);
    if (BSCounter != (BSCounterNext-1))
    {
      Status = EFI_UNSUPPORTED;
      break;
    }
    else
    {
      AsciiPrint("Monotonic Counter Test Case Passed\n");
    }

    // Testing GetNextHighMonotonicCount
    gRT->GetNextHighMonotonicCount(&RTCounter);
    AsciiPrint("Current High Monotonic Counter Value: 0x%x\n", RTCounter);
    gRT->GetNextHighMonotonicCount(&RTCounterNext);
    AsciiPrint("Next High Monotonic Counter Value: 0x%x\n", RTCounterNext);
    if (RTCounter != (RTCounterNext-1))
    {
      Status = EFI_UNSUPPORTED;
      break;
    }
    else
    {
      AsciiPrint("High Monotonic Counter Test Case Passed\n");
    }
  }while (0);

  return Status;
}