Author: grehan
Date: Fri Jan 25 22:43:20 2013
New Revision: 245920
URL: http://svnweb.freebsd.org/changeset/base/245920

Log:
  Improve correctness of rtc register implementation.
  
  Submitted by: tycho nightingale at pluribusnetworks com

Modified:
  head/usr.sbin/bhyve/rtc.c

Modified: head/usr.sbin/bhyve/rtc.c
==============================================================================
--- head/usr.sbin/bhyve/rtc.c   Fri Jan 25 22:16:35 2013        (r245919)
+++ head/usr.sbin/bhyve/rtc.c   Fri Jan 25 22:43:20 2013        (r245920)
@@ -118,12 +118,16 @@ static int
 rtc_addr_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
                 uint32_t *eax, void *arg)
 {
-       assert(in == 0);
-
        if (bytes != 1)
                return (-1);
 
-       switch (*eax) {
+       if (in) {
+               /* straight read of this register will return 0xFF */
+               *eax = 0xff;
+               return (0);
+       }
+
+       switch (*eax & 0x7f) {
        case RTC_SEC:
        case RTC_MIN:
        case RTC_HRS:
@@ -144,7 +148,7 @@ rtc_addr_handler(struct vmctx *ctx, int 
                return (-1);
        }
 
-       addr = *eax;
+       addr = *eax & 0x7f;
        return (0);
 }
 
@@ -219,6 +223,9 @@ rtc_data_handler(struct vmctx *ctx, int 
                case RTC_STATUSA:
                        *eax = status_a;
                        return (0);
+               case RTC_STATUSB:
+                       *eax = status_b;
+                       return (0);
                case RTC_INTR:
                        *eax = 0;
                        return (0);
@@ -249,6 +256,9 @@ rtc_data_handler(struct vmctx *ctx, int 
                        return (-1);
                status_b = *eax;
                break;
+       case RTC_STATUSD:
+               /* ignore write */
+               break;
        case RTC_RSTCODE:
                rstcode = *eax;
                break;
@@ -270,5 +280,5 @@ rtc_data_handler(struct vmctx *ctx, int 
        return (0);
 }
 
-INOUT_PORT(rtc, IO_RTC, IOPORT_F_OUT, rtc_addr_handler);
+INOUT_PORT(rtc, IO_RTC, IOPORT_F_INOUT, rtc_addr_handler);
 INOUT_PORT(rtc, IO_RTC + 1, IOPORT_F_INOUT, rtc_data_handler);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to