int vmm_rtcdev_sync_wallclock(struct vmm_rtcdev *rdev) { int rc; struct vmm_timezone tz, utc_tz; struct vmm_timeval tv; struct vmm_rtc_time tm; if (!rdev) { return VMM_EFAIL; } if ((rc = vmm_rtcdev_get_time(rdev, &tm))) { return rc; } if ((rc = vmm_wallclock_get_timezone(&tz))) { return rc; } utc_tz.tz_minuteswest = 0; utc_tz.tz_dsttime = 0; tv.tv_sec = vmm_wallclock_mktime(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); tv.tv_nsec = 0; if ((rc = vmm_wallclock_set_timeofday(&tv, &utc_tz))) { return rc; } if ((rc = vmm_wallclock_set_timezone(&tz))) { return rc; } return VMM_OK; }
int cmd_rtcdev_get_time(struct vmm_chardev *cdev, const char * name) { int rc; struct vmm_rtc_time tm; struct vmm_rtcdev * rtc = vmm_rtcdev_find(name); if (!rtc) { vmm_cprintf(cdev, "Error: cannot find rtc %s\n", name); return VMM_EFAIL; } rc = vmm_rtcdev_get_time(rtc, &tm); if (rc) { vmm_cprintf(cdev, "Error: get_time failed for rtc %s\n", name); return rc; } switch (tm.tm_wday) { case 0: vmm_cprintf(cdev, "%s ", "Sun"); break; case 1: vmm_cprintf(cdev, "%s ", "Mon"); break; case 2: vmm_cprintf(cdev, "%s ", "Tue"); break; case 3: vmm_cprintf(cdev, "%s ", "Wed"); break; case 4: vmm_cprintf(cdev, "%s ", "Thu"); break; case 5: vmm_cprintf(cdev, "%s ", "Fri"); break; case 6: vmm_cprintf(cdev, "%s ", "Sat"); break; default: vmm_cprintf(cdev, "Error: Invalid day of week\n"); }; switch (tm.tm_mon) { case 0: vmm_cprintf(cdev, "%s ", "Jan"); break; case 1: vmm_cprintf(cdev, "%s ", "Feb"); break; case 2: vmm_cprintf(cdev, "%s ", "Mar"); break; case 3: vmm_cprintf(cdev, "%s ", "Apr"); break; case 4: vmm_cprintf(cdev, "%s ", "May"); break; case 5: vmm_cprintf(cdev, "%s ", "Jun"); break; case 6: vmm_cprintf(cdev, "%s ", "Jul"); break; case 7: vmm_cprintf(cdev, "%s ", "Aug"); break; case 8: vmm_cprintf(cdev, "%s ", "Sep"); break; case 9: vmm_cprintf(cdev, "%s ", "Oct"); break; case 10: vmm_cprintf(cdev, "%s ", "Nov"); break; case 11: vmm_cprintf(cdev, "%s ", "Dec"); break; default: vmm_cprintf(cdev, "Error: Invalid month\n"); }; vmm_cprintf(cdev, "%2d %d:%d:%d UTC %d", tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year + 1900); vmm_cprintf(cdev, "\n"); return VMM_OK; }