--- /dev/null
+/** @file\r
+ Basic serial IO abstaction for GDB\r
+\r
+ Copyright (c) 2008-2009, Apple Inc. All rights reserved.\r
+ \r
+ All rights reserved. This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+#include <Library/GdbSerialLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/IoLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#include <Protocol/DebugPort.h>\r
+\r
+\r
+EFI_DEBUGPORT_PROTOCOL *gDebugPort = NULL;\r
+UINTN gTimeOut = 0;\r
+\r
+/**\r
+ The constructor function initializes the UART.\r
+ \r
+ @param ImageHandle The firmware allocated handle for the EFI image.\r
+ @param SystemTable A pointer to the EFI System Table.\r
+ \r
+ @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+GdbSerialLibDebugPortConstructor (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ \r
+ Status = gBS->LocateProtocol (&gEfiDebugPortProtocolGuid, NULL, (VOID **)&gDebugPort);\r
+ if (!EFI_ERROR (Status)) {\r
+ gTimeOut = PcdGet32 (PcdGdbMaxPacketRetryCount);\r
+ gDebugPort->Reset (gDebugPort);\r
+ }\r
+ \r
+ return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Sets the baud rate, receive FIFO depth, transmit/receice time out, parity, \r
+ data buts, and stop bits on a serial device. This call is optional as the serial\r
+ port will be set up with defaults base on PCD values.\r
+\r
+ @param BaudRate The requested baud rate. A BaudRate value of 0 will use the the\r
+ device's default interface speed.\r
+ @param Parity The type of parity to use on this serial device. A Parity value of\r
+ DefaultParity will use the device's default parity value.\r
+ @param DataBits The number of data bits to use on the serial device. A DataBits\r
+ vaule of 0 will use the device's default data bit setting.\r
+ @param StopBits The number of stop bits to use on this serial device. A StopBits\r
+ value of DefaultStopBits will use the device's default number of\r
+ stop bits.\r
+\r
+ @retval EFI_SUCCESS The device was configured.\r
+ @retval EFI_DEVICE_ERROR The serial device could not be coonfigured.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+GdbSerialInit (\r
+ IN UINT64 BaudRate, \r
+ IN UINT8 Parity, \r
+ IN UINT8 DataBits, \r
+ IN UINT8 StopBits \r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ \r
+ Status = gDebugPort->Reset (gDebugPort);\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Check to see if a character is available from GDB. Do not read the character as that is\r
+ done via GdbGetChar().\r
+\r
+ @return TRUE - Character availible\r
+ @return FALSE - Character not availible\r
+ \r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+GdbIsCharAvailable (\r
+ VOID\r
+ ) \r
+{\r
+ EFI_STATUS Status;\r
+ \r
+ Status = gDebugPort->Poll (gDebugPort);\r
+ \r
+ return (Status == EFI_SUCCESS ? TRUE : FALSE);\r
+}\r
+\r
+\r
+/**\r
+ Get a character from GDB. This function must be able to run in interrupt context.\r
+\r
+ @return A character from GDB\r
+ \r
+**/\r
+CHAR8\r
+EFIAPI\r
+GdbGetChar (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ CHAR8 Char;\r
+ UINTN BufferSize;\r
+ \r
+ do {\r
+ BufferSize = sizeof (Char);\r
+ Status = gDebugPort->Read (gDebugPort, gTimeOut, &BufferSize, &Char);\r
+ } while (EFI_ERROR (Status) || BufferSize != sizeof (Char));\r
+ \r
+ return Char;\r
+}\r
+\r
+\r
+/**\r
+ Send a character to GDB. This function must be able to run in interrupt context.\r
+\r
+\r
+ @param Char Send a character to GDB\r
+\r
+**/\r
+\r
+VOID\r
+EFIAPI\r
+GdbPutChar (\r
+ IN CHAR8 Char\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN BufferSize;\r
+ \r
+ do {\r
+ BufferSize = sizeof (Char);\r
+ Status = gDebugPort->Write (gDebugPort, gTimeOut, &BufferSize, &Char);\r
+ } while (EFI_ERROR (Status) || BufferSize != sizeof (Char));\r
+ \r
+ return;\r
+}\r
+\r
+/**\r
+ Send an ASCII string to GDB. This function must be able to run in interrupt context.\r
+\r
+\r
+ @param String Send a string to GDB\r
+\r
+**/\r
+\r
+VOID\r
+GdbPutString (\r
+ IN CHAR8 *String\r
+ )\r
+{\r
+ // We could performance enhance this function by calling gDebugPort->Write ()\r
+ while (*String != '\0') {\r
+ GdbPutChar (*String);\r
+ String++;\r
+ }\r
+}\r
+\r
+\r
+\r
+\r