logcom.cpp revision 0013b984212f7f0b741f4121be352249fc7e487b
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * innotek Portable Runtime - Logging to Serial Port.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Copyright (C) 2006-2007 innotek GmbH
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * This file is part of VirtualBox Open Source Edition (OSE), as
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * available from http://www.virtualbox.org. This file is free software;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * you can redistribute it and/or modify it under the terms of the GNU
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * General Public License (GPL) as published by the Free Software
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Foundation, in version 2 as it comes in the "COPYING" file of the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * The contents of this file may alternatively be used under the terms
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * of the Common Development and Distribution License Version 1.0
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * VirtualBox OSE distribution, in which case the provisions of the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * CDDL are applicable instead of those of the GPL.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * You may elect to license modified versions of this file under the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * terms and conditions of either the GPL or the CDDL or both.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*******************************************************************************
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Defined Constants And Macros *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan*******************************************************************************/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/** Comport to log to (COM2).
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * This is also defined in VBox/nasm.mac. */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan//#define UART_BASE 0x2f8 /* COM2 */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*******************************************************************************
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Header Files *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan*******************************************************************************/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*******************************************************************************
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan* Internal Functions *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan*******************************************************************************/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic DECLCALLBACK(size_t) rtLogComOutput(void *pv, const char *pachChars, size_t cbChars);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Prints a formatted string to the serial port used for logging.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @returns Number of bytes written.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param pszFormat Format string.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param ... Optional arguments specified in the format string.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki RajagopalanRTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Prints a formatted string to the serial port used for logging.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @returns Number of bytes written.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param pszFormat Format string.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param args Optional arguments specified in the format string.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki RajagopalanRTDECL(size_t) RTLogComPrintfV(const char *pszFormat, va_list args)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return RTLogFormatV(rtLogComOutput, NULL, pszFormat, args);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Callback for RTLogFormatV which writes to the com port.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * See PFNLOGOUTPUT() for details.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic DECLCALLBACK(size_t) rtLogComOutput(void *pv, const char *pachChars, size_t cbChars)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Write log buffer to COM port.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param pach Pointer to the buffer to write.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * @param cb Number of bytes to write.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki RajagopalanRTDECL(void) RTLogWriteCom(const char *pach, size_t cb)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (pu8 = (const uint8_t *)pach; cb-- > 0; pu8++)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /* expand \n -> \r\n */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /* Check if port is ready. */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan register unsigned cMaxWait = ~0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } while (!(u8 & 0x20) && u8 != 0xff && cMaxWait);