ReactOS  0.4.15-dev-1392-g3014417
headless.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Boot Loader
3  * LICENSE: BSD - See COPYING.ARM in the top level directory
4  * FILE: boot/freeldr/freeldr/windows/headless.c
5  * PURPOSE: Provides support for Windows Emergency Management Services
6  * PROGRAMMERS: ReactOS Portable Systems Group
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include <freeldr.h>
12 #include <cportlib/cportlib.h>
13 
14 /* Note: Move these to some smbios.h header */
15 #define SYSID_TYPE_UUID "_UUID_"
16 #define SYSID_UUID_DATA_SIZE 16
17 #include <pshpack1.h>
18 typedef struct _SYSID_UUID_ENTRY
19 {
20  UCHAR Type[6];
25 #include <poppack.h>
26 
27 /* GLOBALS ********************************************************************/
28 
33 
35 {
36  {NULL, 0, TRUE},
37  {NULL, 0, TRUE},
38  {NULL, 0, TRUE},
39  {NULL, 0, TRUE}
40 };
41 
42 /* FUNCTIONS ******************************************************************/
43 
44 VOID
46 {
47  PSYSID_UUID_ENTRY CurrentAddress;
48 
49  CurrentAddress = (PSYSID_UUID_ENTRY)0xE0000;
50  while (CurrentAddress < (PSYSID_UUID_ENTRY)0x100000)
51  {
52  if (RtlCompareMemory(&CurrentAddress->Type, SYSID_TYPE_UUID, 6) == 6)
53  {
54  RtlCopyMemory(SystemGuid, &CurrentAddress->UUID, SYSID_UUID_DATA_SIZE);
55  return;
56  }
57  CurrentAddress = (PSYSID_UUID_ENTRY)((ULONG_PTR)CurrentAddress + 1);
58  }
59 
61 }
62 
63 BOOLEAN
66  IN PUCHAR PortAddress,
67  IN BOOLEAN TerminalConnected,
68  OUT PULONG PortId)
69 {
70 #if defined(SARCH_PC98)
71  /* Set default baud rate */
72  if (BaudRate == 0) BaudRate = 9600;
73 
74  /* Check if port or address given */
75  if (PortNumber)
76  {
77  /* Pick correct address for port */
78  if (!PortAddress)
79  {
80  if (PortNumber == 1)
81  {
82  PortAddress = (PUCHAR)0x30;
83  }
84  else
85  {
86  PortAddress = (PUCHAR)0x238;
87  PortNumber = 2;
88  }
89  }
90  }
91  else
92  {
93  /* Pick correct port for address */
94  PortAddress = (PUCHAR)0x30;
95  if (CpDoesPortExist(PortAddress))
96  {
97  PortNumber = 1;
98  }
99  else
100  {
101  PortAddress = (PUCHAR)0x238;
102  if (!CpDoesPortExist(PortAddress))
103  return FALSE;
104 
105  PortNumber = 2;
106  }
107  }
108 #else
109  /* Set default baud rate */
110  if (BaudRate == 0) BaudRate = 19200;
111 
112  /* Check if port or address given */
113  if (PortNumber)
114  {
115  /* Pick correct address for port */
116  if (!PortAddress)
117  {
118  switch (PortNumber)
119  {
120  case 1:
121  PortAddress = (PUCHAR)0x3F8;
122  break;
123 
124  case 2:
125  PortAddress = (PUCHAR)0x2F8;
126  break;
127 
128  case 3:
129  PortAddress = (PUCHAR)0x3E8;
130  break;
131 
132  default:
133  PortNumber = 4;
134  PortAddress = (PUCHAR)0x2E8;
135  }
136  }
137  }
138  else
139  {
140  /* Pick correct port for address */
141  PortAddress = (PUCHAR)0x2F8;
142  if (CpDoesPortExist(PortAddress))
143  {
144  PortNumber = 2;
145  }
146  else
147  {
148  PortAddress = (PUCHAR)0x3F8;
149  if (!CpDoesPortExist(PortAddress)) return FALSE;
150  PortNumber = 1;
151  }
152  }
153 #endif
154 
155  /* Not yet supported */
157 
158  /* Check if port exists */
159  if ((CpDoesPortExist(PortAddress)) || (CpDoesPortExist(PortAddress)))
160  {
161  /* Initialize port for first time, or re-initialize if specified */
162  if (((TerminalConnected) && (Port[PortNumber - 1].Address)) ||
163  !(Port[PortNumber - 1].Address))
164  {
165  /* Initialize the port, return it */
166  CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate);
167  *PortId = PortNumber - 1;
168  return TRUE;
169  }
170  }
171 
172  return FALSE;
173 }
174 
175 VOID
177  IN UCHAR Byte)
178 {
179  CpPutByte(&Port[PortId], Byte);
180 }
181 
182 BOOLEAN
184  OUT PUCHAR Byte)
185 {
186  return CpGetByte(&Port[PortId], Byte, TRUE, FALSE) == CP_GET_SUCCESS;
187 }
188 
189 BOOLEAN
191 {
192  UCHAR Dummy;
193 
194  return CpGetByte(&Port[PortId], &Dummy, FALSE, TRUE) == CP_GET_SUCCESS;
195 }
196 
197 VOID
199  IN BOOLEAN Enable)
200 {
201  CpEnableFifo(Port[PortId].Address, Enable);
202 }
203 
204 VOID
206 {
207  ULONG PortNumber, BaudRate;
208  PUCHAR PortAddress;
209  PCHAR AnsiReset = "\x1B[m";
210  ULONG i;
211 
215 
216 #if defined(SARCH_PC98)
217  /* Pick a port address */
218  if (PortNumber)
219  {
220  if (!PortAddress)
221  {
222  if (PortNumber == 2)
224  else
226  }
227  }
228  else
229  {
230  /* No number, so no EMS */
232  return;
233  }
234 #else
235  /* Pick a port address */
236  if (PortNumber)
237  {
238  if (!PortAddress)
239  {
240  switch (PortNumber)
241  {
242  case 2:
244  break;
245 
246  case 3:
248  break;
249 
250  case 4:
252  break;
253 
254  default:
256  break;
257  }
258  }
259  }
260  else
261  {
262  /* No number, so no EMS */
264  return;
265  }
266 #endif
267 
268  /* Call arch code to initialize the port */
271  BaudRate,
272  PortNumber,
273  PortAddress,
276 
278  {
279  /* Port seems usable, set it up and get the BIOS GUID */
281 
283 
284  /* Calculate delay in us based on the baud, assume 9600 if none given */
285  if (!BaudRate)
286  {
287  BaudRate = 9600;
289  }
290 
291  WinLdrTerminalDelay = (10 * 1000 * 1000) / (BaudRate / 10) / 6;
292 
293  /* Sent an ANSI reset sequence to get the terminal up and running */
294  for (i = 0; i < strlen(AnsiReset); i++)
295  {
298  }
299  }
300 }
301 
302 VOID
304 {
305  PCHAR Settings, RedirectPort;
306 
307  /* Start fresh */
310 
311  /* Use a direction port if one was given, or use ACPI to detect one instead */
312  Settings = strstr(BootOptions, "/redirect=");
313  if (Settings)
314  {
315  RedirectPort = strstr(Settings, "com");
316  if (RedirectPort)
317  {
318  RedirectPort += sizeof("com") - 1;
320  LoaderRedirectionInformation.TerminalType = 1; // HeadlessSerialPort
321  }
322  else
323  {
324  RedirectPort = strstr(Settings, "usebiossettings");
325  if (RedirectPort)
326  {
327  UiDrawStatusText("ACPI SRT Table Not Supported...");
328  return;
329  }
330  else
331  {
334  {
336  }
337  }
338  }
339  }
340 
341  /* Use a direction baudrate if one was given */
342  Settings = strstr(BootOptions, "/redirectbaudrate=");
343  if (Settings)
344  {
345  if (strstr(Settings, "115200"))
346  {
348  }
349  else if (strstr(Settings, "57600"))
350  {
352  }
353  else if (strstr(Settings, "19200"))
354  {
356  }
357  else
358  {
360  }
361  }
362 
363  /* Enable headless support if parameters were found */
365  {
367  {
369  }
370 
372  }
373 }
374 
375 /* EOF */
signed char * PCHAR
Definition: retypes.h:7
CPPORT Port[4]
Definition: headless.c:34
#define IN
Definition: typedefs.h:39
UCHAR Type[6]
Definition: headless.c:20
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
VOID StallExecutionProcessor(ULONG Microseconds)
Definition: pchw.c:60
ULONG WinLdrTerminalDeviceId
Definition: headless.c:31
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define TRUE
Definition: types.h:120
VOID WinLdrSetupEms(IN PCSTR BootOptions)
Definition: headless.c:303
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
unsigned char * PUCHAR
Definition: retypes.h:3
HEADLESS_LOADER_BLOCK LoaderRedirectionInformation
Definition: headless.c:29
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:140
ULONG WinLdrTerminalDelay
Definition: headless.c:32
UCHAR Checksum
Definition: headless.c:21
struct _SYSID_UUID_ENTRY SYSID_UUID_ENTRY
#define SYSID_TYPE_UUID
Definition: headless.c:15
UCHAR UUID[SYSID_UUID_DATA_SIZE]
Definition: headless.c:23
uint32_t ULONG_PTR
Definition: typedefs.h:65
VOID WinLdrPortPutByte(IN ULONG PortId, IN UCHAR Byte)
Definition: headless.c:176
USHORT NTAPI CpGetByte(IN PCPPORT Port, OUT PUCHAR Byte, IN BOOLEAN Wait, IN BOOLEAN Poll)
Definition: cport.c:256
VOID WinLdrInitializeHeadlessPort(VOID)
Definition: headless.c:205
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Settings
Definition: wdfdevice.h:2592
BOOLEAN NTAPI CpDoesPortExist(IN PUCHAR Address)
Definition: cport.c:227
PUCHAR PortAddress
Definition: arc.h:312
#define FALSE
Definition: types.h:117
ULONG PortNumber
Definition: storport.c:18
USHORT Length
Definition: headless.c:22
unsigned char BOOLEAN
static WCHAR Address[46]
Definition: ping.c:68
UCHAR TerminalType
Definition: arc.h:321
BOOLEAN WinLdrPortInitialize(IN ULONG BaudRate, IN ULONG PortNumber, IN PUCHAR PortAddress, IN BOOLEAN TerminalConnected, OUT PULONG PortId)
Definition: headless.c:64
#define PCI_INVALID_VENDORID
Definition: iotypes.h:3580
#define ASSERT(a)
Definition: mode.c:45
VOID NTAPI CpEnableFifo(IN PUCHAR Address, IN BOOLEAN Enable)
Definition: cport.c:54
Type
Definition: Type.h:6
VOID NTAPI CpPutByte(IN PCPPORT Port, IN UCHAR Byte)
Definition: cport.c:306
USHORT PciDeviceId
Definition: arc.h:313
unsigned char UCHAR
Definition: xmlstorage.h:181
VOID UiDrawStatusText(PCSTR StatusText)
Definition: ui.c:249
BOOLEAN WinLdrPortPollOnly(IN ULONG PortId)
Definition: headless.c:190
BOOLEAN WinLdrTerminalConnected
Definition: headless.c:30
NTSTATUS NTAPI CpInitialize(IN PCPPORT Port, IN PUCHAR Address, IN ULONG BaudRate)
Definition: cport.c:88
VOID WinLdrEnableFifo(IN ULONG PortId, IN BOOLEAN Enable)
Definition: headless.c:198
VOID WinLdrLoadGUID(OUT PGUID SystemGuid)
Definition: headless.c:45
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned short USHORT
Definition: pedump.c:61
unsigned int * PULONG
Definition: retypes.h:1
#define NULL
Definition: types.h:112
#define CP_GET_SUCCESS
Definition: cportlib.h:18
#define SYSID_UUID_DATA_SIZE
Definition: headless.c:16
unsigned char Byte
Definition: zlib.h:37
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
#define OUT
Definition: typedefs.h:40
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
struct _SYSID_UUID_ENTRY * PSYSID_UUID_ENTRY
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
const char * PCSTR
Definition: typedefs.h:52
Definition: headless.c:18
BOOLEAN WinLdrPortGetByte(IN ULONG PortId, OUT PUCHAR Byte)
Definition: headless.c:183
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
UCHAR IsMMIODevice
Definition: arc.h:320