This implements a SerialPortLib instance that wires up to the
PV console ring used by domU guests. Also imports the required
upstream Xen io/console.h header.
Contributed-under: TianoCore Contribution Agreement 1.0
Reviewed-by: Stefano Stabellini stefano.stabell...@eu.citrix.com
Signed-off-by: Ard Biesheuvel ard.biesheu...@linaro.org
---
OvmfPkg/Include/IndustryStandard/Xen/io/console.h | 51 +++
.../XenConsoleSerialPortLib.c | 156 +
.../XenConsoleSerialPortLib.inf| 35 +
3 files changed, 242 insertions(+)
create mode 100644 OvmfPkg/Include/IndustryStandard/Xen/io/console.h
create mode 100644
OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.c
create mode 100644
OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.inf
diff --git a/OvmfPkg/Include/IndustryStandard/Xen/io/console.h
b/OvmfPkg/Include/IndustryStandard/Xen/io/console.h
new file mode 100644
index ..f1caa9765bcf
--- /dev/null
+++ b/OvmfPkg/Include/IndustryStandard/Xen/io/console.h
@@ -0,0 +1,51 @@
+/**
+ * console.h
+ *
+ * Console I/O interface for Xen guest OSes.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the Software), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright (c) 2005, Keir Fraser
+ */
+
+#ifndef __XEN_PUBLIC_IO_CONSOLE_H__
+#define __XEN_PUBLIC_IO_CONSOLE_H__
+
+typedef UINT32 XENCONS_RING_IDX;
+
+#define MASK_XENCONS_IDX(idx, ring) ((idx) (sizeof(ring)-1))
+
+struct xencons_interface {
+char in[1024];
+char out[2048];
+XENCONS_RING_IDX in_cons, in_prod;
+XENCONS_RING_IDX out_cons, out_prod;
+};
+
+#endif /* __XEN_PUBLIC_IO_CONSOLE_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: BSD
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.c
b/OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.c
new file mode 100644
index ..98022354cf31
--- /dev/null
+++ b/OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.c
@@ -0,0 +1,156 @@
+/** @file
+ Xen console SerialPortLib instance
+
+ Copyright (c) 2015, Linaro Ltd. All rights reserved.BR
+
+ 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.
+
+**/
+
+#include Base.h
+#include Uefi/UefiBaseType.h
+
+#include Library/BaseLib.h
+#include Library/SerialPortLib.h
+#include Library/XenHypercallLib.h
+
+#include IndustryStandard/Xen/io/console.h
+#include IndustryStandard/Xen/hvm/params.h
+#include IndustryStandard/Xen/event_channel.h
+
+//
+// The code below expects these global variables to be mutable, even in the
case
+// that we have been incorporated into SEC or PEIM phase modules (which is
+// allowed by our INF description). While this is a dangerous assumption to
make
+// in general, it is actually fine for the Xen domU (guest) environment that
+// this module is intended for, as UEFI always executes from DRAM in that case.
+//
+STATIC evtchn_send_t mXenConsoleEventChain;
+STATIC struct xencons_interface *mXenConsoleInterface;
+
+RETURN_STATUS
+EFIAPI
+SerialPortInitialize (
+ VOID
+ )
+{
+ if (!mXenConsoleInterface) {
+mXenConsoleEventChain.port = (UINT32)XenHypercallHvmGetParam
(HVM_PARAM_CONSOLE_EVTCHN);
+mXenConsoleInterface = (struct xencons_interface *)(UINTN)
+ (XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_PFN) EFI_PAGE_SHIFT);
+
+//
+// No point in ASSERT'ing here as we won't be seeing the output
+//
+ }
+ return RETURN_SUCCESS;