diff mbox

[2/5] pseries: Add spapr_rtc_read() helper function

Message ID 1418690628-20652-3-git-send-email-david@gibson.dropbear.id.au
State New
Headers show

Commit Message

David Gibson Dec. 16, 2014, 12:43 a.m. UTC
The virtual RTC time is used in two places in the pseries machine.  First
is in the RTAS get-time-of-day function which returns the RTC time to the
guest.  Second is in the spapr events code which is used to timestamp
event messages from the hypervisor to the guest.

Currently both call qemu_get_timedate() directly, but we want to change
that so we can properly handle the various -rtc options.  In preparation,
create a helper function to return the virtual RTC time.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_events.c  |  2 +-
 hw/ppc/spapr_rtc.c     | 12 ++++++++++--
 include/hw/ppc/spapr.h |  1 +
 3 files changed, 12 insertions(+), 3 deletions(-)

Comments

Alexander Graf Dec. 16, 2014, 1:01 a.m. UTC | #1
On 16.12.14 01:43, David Gibson wrote:
> The virtual RTC time is used in two places in the pseries machine.  First
> is in the RTAS get-time-of-day function which returns the RTC time to the
> guest.  Second is in the spapr events code which is used to timestamp
> event messages from the hypervisor to the guest.
> 
> Currently both call qemu_get_timedate() directly, but we want to change
> that so we can properly handle the various -rtc options.  In preparation,
> create a helper function to return the virtual RTC time.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>  hw/ppc/spapr_events.c  |  2 +-
>  hw/ppc/spapr_rtc.c     | 12 ++++++++++--
>  include/hw/ppc/spapr.h |  1 +
>  3 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
> index 1b6157d..80c0266 100644
> --- a/hw/ppc/spapr_events.c
> +++ b/hw/ppc/spapr_events.c
> @@ -246,7 +246,7 @@ static void spapr_powerdown_req(Notifier *n, void *opaque)
>      maina->hdr.section_id = cpu_to_be16(RTAS_LOG_V6_SECTION_ID_MAINA);
>      maina->hdr.section_length = cpu_to_be16(sizeof(*maina));
>      /* FIXME: section version, subtype and creator id? */
> -    qemu_get_timedate(&tm, spapr->rtc_offset);
> +    spapr_rtc_read(spapr, &tm, NULL);
>      year = tm.tm_year + 1900;
>      maina->creation_date = cpu_to_be32((to_bcd(year / 100) << 24)
>                                         | (to_bcd(year % 100) << 16)
> diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
> index e290ac0..9ccefbc 100644
> --- a/hw/ppc/spapr_rtc.c
> +++ b/hw/ppc/spapr_rtc.c
> @@ -29,19 +29,27 @@
>  #include "hw/ppc/spapr.h"
>  #include "qapi-event.h"
>  
> +void spapr_rtc_read(sPAPREnvironment *spapr, struct tm *tm, uint32_t *ns)
> +{
> +    qemu_get_timedate(tm, spapr->rtc_offset);
> +    if (ns)

checkpatch? ;)


Alex
David Gibson Dec. 16, 2014, 1:25 a.m. UTC | #2
On Tue, Dec 16, 2014 at 02:01:29AM +0100, Alexander Graf wrote:
> 
> 
> On 16.12.14 01:43, David Gibson wrote:
> > The virtual RTC time is used in two places in the pseries machine.  First
> > is in the RTAS get-time-of-day function which returns the RTC time to the
> > guest.  Second is in the spapr events code which is used to timestamp
> > event messages from the hypervisor to the guest.
> > 
> > Currently both call qemu_get_timedate() directly, but we want to change
> > that so we can properly handle the various -rtc options.  In preparation,
> > create a helper function to return the virtual RTC time.
> > 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > ---
> >  hw/ppc/spapr_events.c  |  2 +-
> >  hw/ppc/spapr_rtc.c     | 12 ++++++++++--
> >  include/hw/ppc/spapr.h |  1 +
> >  3 files changed, 12 insertions(+), 3 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
> > index 1b6157d..80c0266 100644
> > --- a/hw/ppc/spapr_events.c
> > +++ b/hw/ppc/spapr_events.c
> > @@ -246,7 +246,7 @@ static void spapr_powerdown_req(Notifier *n, void *opaque)
> >      maina->hdr.section_id = cpu_to_be16(RTAS_LOG_V6_SECTION_ID_MAINA);
> >      maina->hdr.section_length = cpu_to_be16(sizeof(*maina));
> >      /* FIXME: section version, subtype and creator id? */
> > -    qemu_get_timedate(&tm, spapr->rtc_offset);
> > +    spapr_rtc_read(spapr, &tm, NULL);
> >      year = tm.tm_year + 1900;
> >      maina->creation_date = cpu_to_be32((to_bcd(year / 100) << 24)
> >                                         | (to_bcd(year % 100) << 16)
> > diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
> > index e290ac0..9ccefbc 100644
> > --- a/hw/ppc/spapr_rtc.c
> > +++ b/hw/ppc/spapr_rtc.c
> > @@ -29,19 +29,27 @@
> >  #include "hw/ppc/spapr.h"
> >  #include "qapi-event.h"
> >  
> > +void spapr_rtc_read(sPAPREnvironment *spapr, struct tm *tm, uint32_t *ns)
> > +{
> > +    qemu_get_timedate(tm, spapr->rtc_offset);
> > +    if (ns)
> 
> checkpatch? ;)

Sod.  It's been too long since I was doing much upstream work :).
diff mbox

Patch

diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
index 1b6157d..80c0266 100644
--- a/hw/ppc/spapr_events.c
+++ b/hw/ppc/spapr_events.c
@@ -246,7 +246,7 @@  static void spapr_powerdown_req(Notifier *n, void *opaque)
     maina->hdr.section_id = cpu_to_be16(RTAS_LOG_V6_SECTION_ID_MAINA);
     maina->hdr.section_length = cpu_to_be16(sizeof(*maina));
     /* FIXME: section version, subtype and creator id? */
-    qemu_get_timedate(&tm, spapr->rtc_offset);
+    spapr_rtc_read(spapr, &tm, NULL);
     year = tm.tm_year + 1900;
     maina->creation_date = cpu_to_be32((to_bcd(year / 100) << 24)
                                        | (to_bcd(year % 100) << 16)
diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
index e290ac0..9ccefbc 100644
--- a/hw/ppc/spapr_rtc.c
+++ b/hw/ppc/spapr_rtc.c
@@ -29,19 +29,27 @@ 
 #include "hw/ppc/spapr.h"
 #include "qapi-event.h"
 
+void spapr_rtc_read(sPAPREnvironment *spapr, struct tm *tm, uint32_t *ns)
+{
+    qemu_get_timedate(tm, spapr->rtc_offset);
+    if (ns)
+        *ns = 0; /* we don't do nanoseconds, yet */
+}
+
 static void rtas_get_time_of_day(PowerPCCPU *cpu, sPAPREnvironment *spapr,
                                  uint32_t token, uint32_t nargs,
                                  target_ulong args,
                                  uint32_t nret, target_ulong rets)
 {
     struct tm tm;
+    uint32_t ns;
 
     if (nret != 8) {
         rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
         return;
     }
 
-    qemu_get_timedate(&tm, spapr->rtc_offset);
+    spapr_rtc_read(spapr, &tm, &ns);
 
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
     rtas_st(rets, 1, tm.tm_year + 1900);
@@ -50,7 +58,7 @@  static void rtas_get_time_of_day(PowerPCCPU *cpu, sPAPREnvironment *spapr,
     rtas_st(rets, 4, tm.tm_hour);
     rtas_st(rets, 5, tm.tm_min);
     rtas_st(rets, 6, tm.tm_sec);
-    rtas_st(rets, 7, 0); /* we don't do nanoseconds */
+    rtas_st(rets, 7, ns);
 }
 
 static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPREnvironment *spapr,
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 9a468bc..80fafa9 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -480,5 +480,6 @@  int spapr_dma_dt(void *fdt, int node_off, const char *propname,
 int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname,
                       sPAPRTCETable *tcet);
 void spapr_rtc_init(void);
+void spapr_rtc_read(sPAPREnvironment *spapr, struct tm *tm, uint32_t *ns);
 
 #endif /* !defined (__HW_SPAPR_H__) */