1 /**
2   @file
3   Display the runtime services table
4 
5   Copyright (c) 2011-2012, Intel Corporation
6   All rights reserved. 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 <WebServer.h>
17 #include <Library/UefiRuntimeServicesTableLib.h>
18 
19 /**
20   Respond with the runtime services table
21 
22   @param [in] SocketFD      The socket's file descriptor to add to the list.
23   @param [in] pPort         The WSDT_PORT structure address
24   @param [out] pbDone       Address to receive the request completion status
25 
26   @retval EFI_SUCCESS       The request was successfully processed
27 
28 **/
29 EFI_STATUS
RuntimeSservicesTablePage(IN int SocketFD,IN WSDT_PORT * pPort,OUT BOOLEAN * pbDone)30 RuntimeSservicesTablePage (
31   IN int SocketFD,
32   IN WSDT_PORT * pPort,
33   OUT BOOLEAN * pbDone
34   )
35 {
36   EFI_STATUS Status;
37 
38   DBG_ENTER ( );
39 
40   //
41   //  Send the runtime services page
42   //
43   for ( ; ; ) {
44     //
45     //  Send the page and table header
46     //
47     Status = TableHeader ( SocketFD, pPort, L"Runtime Services Table", gRT );
48     if ( EFI_ERROR ( Status )) {
49       break;
50     }
51 
52     ///
53     /// The table header for the EFI Runtime Services Table.
54     ///
55     Status = EfiTableHeader ( SocketFD,
56                               pPort,
57                               &gRT->Hdr );
58     if ( EFI_ERROR ( Status )) {
59       break;
60     }
61 
62     //
63     // Time Services
64     //
65     Status = RowPointer ( SocketFD,
66                           pPort,
67                           "GetTime",
68                           (VOID *)gRT->GetTime,
69                           NULL );
70     if ( EFI_ERROR ( Status )) {
71       break;
72     }
73     Status = RowPointer ( SocketFD,
74                           pPort,
75                           "SetTime",
76                           (VOID *)gRT->SetTime,
77                           NULL );
78     if ( EFI_ERROR ( Status )) {
79       break;
80     }
81     Status = RowPointer ( SocketFD,
82                           pPort,
83                           "GetWakeupTime",
84                           (VOID *)gRT->GetWakeupTime,
85                           NULL );
86     if ( EFI_ERROR ( Status )) {
87       break;
88     }
89     Status = RowPointer ( SocketFD,
90                           pPort,
91                           "SetWakeupTime",
92                           (VOID *)gRT->SetWakeupTime,
93                           NULL );
94     if ( EFI_ERROR ( Status )) {
95       break;
96     }
97 
98     //
99     // Virtual Memory Services
100     //
101     Status = RowPointer ( SocketFD,
102                           pPort,
103                           "SetVirtualAddressMap",
104                           (VOID *)gRT->SetVirtualAddressMap,
105                           NULL );
106     if ( EFI_ERROR ( Status )) {
107       break;
108     }
109     Status = RowPointer ( SocketFD,
110                           pPort,
111                           "ConvertPointer",
112                           (VOID *)gRT->ConvertPointer,
113                           NULL );
114     if ( EFI_ERROR ( Status )) {
115       break;
116     }
117 
118     //
119     // Variable Services
120     //
121     Status = RowPointer ( SocketFD,
122                           pPort,
123                           "GetVariable",
124                           (VOID *)gRT->GetVariable,
125                           NULL );
126     if ( EFI_ERROR ( Status )) {
127       break;
128     }
129     Status = RowPointer ( SocketFD,
130                           pPort,
131                           "GetNextVariableName",
132                           (VOID *)gRT->GetNextVariableName,
133                           NULL );
134     if ( EFI_ERROR ( Status )) {
135       break;
136     }
137     Status = RowPointer ( SocketFD,
138                           pPort,
139                           "SetVariable",
140                           (VOID *)gRT->SetVariable,
141                           NULL );
142     if ( EFI_ERROR ( Status )) {
143       break;
144     }
145 
146     //
147     // Miscellaneous Services
148     //
149     Status = RowPointer ( SocketFD,
150                           pPort,
151                           "GetNextHighNonotonicCount",
152                           (VOID *)gRT->GetNextHighMonotonicCount,
153                           NULL );
154     if ( EFI_ERROR ( Status )) {
155       break;
156     }
157     Status = RowPointer ( SocketFD,
158                           pPort,
159                           "ResetSystem",
160                           (VOID *)gRT->ResetSystem,
161                           NULL );
162     if ( EFI_ERROR ( Status )) {
163       break;
164     }
165 
166     //
167     //  Determine if the structures supports 2.0 services
168     //
169     if ( 2 <= ( gRT->Hdr.Revision >> 16 )) {
170       //
171       // UEFI 2.0 Capsule Services
172       //
173       Status = RowPointer ( SocketFD,
174                             pPort,
175                             "UpdateCapsule",
176                             (VOID *)gRT->UpdateCapsule,
177                             NULL );
178       if ( EFI_ERROR ( Status )) {
179         break;
180       }
181       Status = RowPointer ( SocketFD,
182                             pPort,
183                             "QueryCapsuleCapabilities",
184                             (VOID *)gRT->QueryCapsuleCapabilities,
185                             NULL );
186       if ( EFI_ERROR ( Status )) {
187         break;
188       }
189 
190       //
191       // Miscellaneous UEFI 2.0 Service
192       //
193       Status = RowPointer ( SocketFD,
194                             pPort,
195                             "QueryVariableInfo",
196                             (VOID *)gRT->QueryVariableInfo,
197                             NULL );
198       if ( EFI_ERROR ( Status )) {
199         break;
200       }
201     }
202 
203     //
204     //  Build the table trailer
205     //
206     Status = TableTrailer ( SocketFD,
207                             pPort,
208                             pbDone );
209     break;
210   }
211 
212   //
213   //  Return the operation status
214   //
215   DBG_EXIT_STATUS ( Status );
216   return Status;
217 }
218