{
keyhandler_t *h;
unsigned char key = keypress_key;
- console_start_log_everything();
+ console_start_sync();
if ( (h = key_table[key].u.handler) != NULL )
(*h)(key);
- console_end_log_everything();
+ console_end_sync();
}
static DECLARE_TASKLET(keypress_tasklet, keypress_action, 0);
if ( !in_irq() || (key_table[key].flags & KEYHANDLER_IRQ_CALLBACK) )
{
- console_start_log_everything();
+ console_start_sync();
if ( (h = key_table[key].u.irq_handler) != NULL )
(*h)(key, regs);
- console_end_log_everything();
+ console_end_sync();
}
else
{
{
unsigned int cpu;
- /* We want to get everything out that we possibly can. */
- console_start_sync();
-
printk("'%c' pressed -> dumping registers\n", key);
/* Get local execution state out immediately, in case we get stuck. */
}
printk("\n");
-
- console_end_sync();
}
static void dump_dom0_registers(unsigned char key)
return 0;
}
-void console_start_log_everything(void)
-{
- atomic_inc(&print_everything);
-}
-
-void console_end_log_everything(void)
-{
- atomic_dec(&print_everything);
-}
-
void console_force_unlock(void)
{
spin_lock_init(&console_lock);
void console_start_sync(void)
{
- console_start_log_everything();
+ atomic_inc(&print_everything);
serial_start_sync(sercon_handle);
}
void console_end_sync(void)
{
serial_end_sync(sercon_handle);
- console_end_log_everything();
+ atomic_dec(&print_everything);
}
void console_putc(char c)
*
* Framework for serial device drivers.
*
- * Copyright (c) 2003-2005, K A Fraser
+ * Copyright (c) 2003-2008, K A Fraser
*/
#include <xen/config.h>
if ( (port->txbuf != NULL) && !port->sync )
{
/* Interrupt-driven (asynchronous) transmitter. */
-#ifdef SERIAL_NEVER_DROP_CHARS
+
+ if ( port->tx_quench )
+ {
+ /* Buffer filled and we are dropping characters. */
+ if ( (port->txbufp - port->txbufc) > (serial_txbufsz / 2) )
+ return;
+ port->tx_quench = 0;
+ }
+
if ( (port->txbufp - port->txbufc) == serial_txbufsz )
{
+#ifdef SERIAL_NEVER_DROP_CHARS
/* Buffer is full: we spin waiting for space to appear. */
int i;
while ( !port->driver->tx_empty(port) )
port->driver->putc(
port, port->txbuf[mask_serial_txbuf_idx(port->txbufc++)]);
port->txbuf[mask_serial_txbuf_idx(port->txbufp++)] = c;
+#else
+ /* Buffer is full: drop characters until buffer is half empty. */
+ port->tx_quench = 1;
+#endif
return;
}
-#endif
+
if ( ((port->txbufp - port->txbufc) == 0) &&
port->driver->tx_empty(port) )
{
void console_start_sync(void);
void console_end_sync(void);
-void console_start_log_everything(void);
-void console_end_log_everything(void);
-
/*
* Steal output from the console. Returns +ve identifier, else -ve error.
* Takes the handle of the serial line to steal, and steal callback function.
*
* Framework for serial device drivers.
*
- * Copyright (c) 2003-2005, K A Fraser
+ * Copyright (c) 2003-2008, K A Fraser
*/
#ifndef __XEN_SERIAL_H__
/* Transmit data buffer (interrupt-driven uart). */
char *txbuf;
unsigned int txbufp, txbufc;
+ bool_t tx_quench;
/* Force synchronous transmit. */
int sync;
/* Receiver callback functions (asynchronous receivers). */