From: Keir Fraser Date: Thu, 16 Apr 2009 10:52:08 +0000 (+0100) Subject: cpuidle: Fix PV RTC I/O port access hook X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13976 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=5f4f4697d5b159b712727fb8cbc327187b0f22a8;p=xen.git cpuidle: Fix PV RTC I/O port access hook Call hook before writing to I/O ports. Only hook single-byte writes. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index cbc0d012a0..98555a42d4 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -1564,11 +1564,11 @@ static void guest_io_write( { switch ( bytes ) { case 1: + if ( ((port == 0x70) || (port == 0x71)) && pv_rtc_handler ) + pv_rtc_handler(port, (uint8_t)data); outb((uint8_t)data, port); if ( pv_post_outb_hook ) pv_post_outb_hook(port, (uint8_t)data); - if ( ((port == 0x71) || (port == 0x70)) && pv_rtc_handler ) - pv_rtc_handler(port, (uint8_t)data); break; case 2: outw((uint16_t)data, port); @@ -1937,11 +1937,13 @@ static int emulate_privileged_op(struct cpu_user_regs *regs) goto fail; if ( admin_io_okay(port, op_bytes, v, regs) ) { + if ( (op_bytes == 1) && + ((port == 0x71) || (port == 0x70)) && + pv_rtc_handler ) + pv_rtc_handler(port, regs->eax); io_emul(regs); if ( (op_bytes == 1) && pv_post_outb_hook ) pv_post_outb_hook(port, regs->eax); - if ( ((port == 0x71) || (port == 0x70)) && pv_rtc_handler ) - pv_rtc_handler(port, regs->eax); } else {