}
#define TIME_VALUES_UP_TO_DATE \
- (shadow_time_version == HYPERVISOR_shared_info->time_version2)
+ ({ rmb(); (shadow_time_version == HYPERVISOR_shared_info->time_version2); })
/*
unsigned long ticks = 0;
long sec_diff;
+ retry:
__get_time_values_from_xen();
if ( (delta = (s64)(shadow_system_time + __get_time_delta_usecs() * 1000 -
processed_system_time)) < 0 )
{
+ if (!TIME_VALUES_UP_TO_DATE)
+ goto retry;
printk("Timer ISR: Time went backwards: %lld\n", delta);
return;
}
}
#define TIME_VALUES_UP_TO_DATE \
- (shadow_time_version == HYPERVISOR_shared_info->time_version2)
+ ({ rmb(); (shadow_time_version == HYPERVISOR_shared_info->time_version2); })
/*
* This version of gettimeofday has microsecond resolution
s64 delta, nsec;
long sec_diff, wtm_nsec;
+ retry:
__get_time_values_from_xen();
delta = (s64)(shadow_system_time +
(cur_timer->get_offset() * NSEC_PER_USEC) -
processed_system_time);
if (delta < 0) {
+ if (!TIME_VALUES_UP_TO_DATE)
+ goto retry;
printk("Timer ISR: Time went backwards: %lld\n", delta);
return;
}
static inline void __serial_putc(uart_t *uart, int handle, unsigned char c)
{
+ unsigned long flags;
+ int space;
+
if ( (c == '\n') && (handle & SERHND_COOKED) )
__serial_putc(uart, handle, '\r');
else if ( handle & SERHND_LO )
c &= 0x7f;
- while ( !(inb(uart->io_base + LSR) & LSR_THRE) )
- barrier();
-
- outb(c, uart->io_base + THR);
+ do {
+ spin_lock_irqsave(&uart->lock, flags);
+ if ( (space = (inb(uart->io_base + LSR) & LSR_THRE)) )
+ outb(c, uart->io_base + THR);
+ spin_unlock_irqrestore(&uart->lock, flags);
+ }
+ while ( !space );
}
#define PARSE_ERR(_f, _a...) \
void serial_putc(int handle, unsigned char c)
{
uart_t *uart = &com[handle & SERHND_IDX];
- unsigned long flags;
if ( handle == -1 )
return;
- spin_lock_irqsave(&uart->lock, flags);
-
__serial_putc(uart, handle, c);
-
- spin_unlock_irqrestore(&uart->lock, flags);
}
void serial_puts(int handle, const unsigned char *s)
{
uart_t *uart = &com[handle & SERHND_IDX];
- unsigned long flags;
if ( handle == -1 )
return;
- spin_lock_irqsave(&uart->lock, flags);
-
while ( *s != '\0' )
__serial_putc(uart, handle, *s++);
-
- spin_unlock_irqrestore(&uart->lock, flags);
}
/* Returns TRUE if given character (*pc) matches the serial handle. */