Skip to content

Commit

Permalink
pseries: Add spapr_rtc_read() helper function
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Alexander Graf <agraf@suse.de>
  • Loading branch information
dgibson authored and agraf committed Mar 9, 2015
1 parent bbade20 commit e5dad1d
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 3 deletions.
2 changes: 1 addition & 1 deletion hw/ppc/spapr_events.c
Expand Up @@ -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)
Expand Down
13 changes: 11 additions & 2 deletions hw/ppc/spapr_rtc.c
Expand Up @@ -29,19 +29,28 @@
#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 ((nargs != 0) || (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);
Expand All @@ -50,7 +59,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,
Expand Down
1 change: 1 addition & 0 deletions include/hw/ppc/spapr.h
Expand Up @@ -481,5 +481,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__) */

0 comments on commit e5dad1d

Please sign in to comment.