* [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga @ 2013-03-14 15:05 Lei Li 2013-03-14 15:05 ` [Qemu-devel] [PATCH 1/2] qga: add windows implementation for guest-get-time Lei Li ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Lei Li @ 2013-03-14 15:05 UTC (permalink / raw) To: qemu-devel; +Cc: aliguori, mdroth, Lei Li This patch series attempts to add Windows implementation for qemu-ga commands guest-get-time and guest-set-time. The previous thread about the interfaces introduced and the POSIX-specific command implementation has already been accepted, the reference link: http://article.gmane.org/gmane.comp.emulators.qemu/198472 Notes: Now It was tested on Windows XP SP3 and Windows 7. Please comment! Thanks. Changes since v5: - Fix the error check for GetSystemTime() from Michael. - Other fixups from Michael. Changes since v4: - Error handel improvement from Michael. - Do the math explicitly for the time convert of FILETIME suggested by Michael. Changes since v3: - Reorder the acquire_privilege to avoid a possible leak of privileges suggested by Eric. Changes since v2: - Overflow check improvement for time_ns from Eric. Changes since v1: - Make the macro for the offset between windows baseline and Unix Epoch more readable from Eric. - Overflow check for filetime pointed by Eric. Lei Li (2): qga: add windows implementation for guest-get-time qga: add windows implementation for guest-set-time ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 1/2] qga: add windows implementation for guest-get-time 2013-03-14 15:05 [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga Lei Li @ 2013-03-14 15:05 ` Lei Li 2013-03-14 21:36 ` mdroth 2013-03-14 15:05 ` [Qemu-devel] [PATCH 2/2] qga: add windows implementation for guest-set-time Lei Li 2013-03-14 21:41 ` [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga mdroth 2 siblings, 1 reply; 6+ messages in thread From: Lei Li @ 2013-03-14 15:05 UTC (permalink / raw) To: qemu-devel; +Cc: aliguori, mdroth, Lei Li Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com> --- qga/commands-win32.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/qga/commands-win32.c b/qga/commands-win32.c index 7e8ecb3..b395bd5 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -22,6 +22,12 @@ #define SHTDN_REASON_FLAG_PLANNED 0x80000000 #endif +/* multiple of 100 nanoseconds elapsed between windows baseline + (1/1/1601) and Unix Epoch (1/1/1970), accounting for leap years */ +#define W32_FT_OFFSET (10000000ULL * 60 * 60 * 24 * \ + (365 * (1970 - 1601) + \ + (1970 - 1601) / 4 - 3)) + static void acquire_privilege(const char *name, Error **err) { HANDLE token; @@ -108,6 +114,29 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err) } } +int64_t qmp_guest_get_time(Error **errp) +{ + SYSTEMTIME ts = {0}; + int64_t time_ns; + FILETIME tf; + + GetSystemTime(&ts); + if (ts.wYear < 1601 || ts.wYear > 30827) { + error_setg(errp, "Failed to get time"); + return -1; + } + + if (!SystemTimeToFileTime(&ts, &tf)) { + error_setg_errno(errp, errno, "Failed to convert system time"); + return -1; + } + + time_ns = ((((int64_t)tf.dwHighDateTime << 32) | tf.dwLowDateTime) + - W32_FT_OFFSET) * 100; + + return time_ns; +} + int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode, Error **err) { error_set(err, QERR_UNSUPPORTED); -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] qga: add windows implementation for guest-get-time 2013-03-14 15:05 ` [Qemu-devel] [PATCH 1/2] qga: add windows implementation for guest-get-time Lei Li @ 2013-03-14 21:36 ` mdroth 0 siblings, 0 replies; 6+ messages in thread From: mdroth @ 2013-03-14 21:36 UTC (permalink / raw) To: Lei Li; +Cc: aliguori, qemu-devel On Thu, Mar 14, 2013 at 11:05:52PM +0800, Lei Li wrote: > Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com> > --- > qga/commands-win32.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/qga/commands-win32.c b/qga/commands-win32.c > index 7e8ecb3..b395bd5 100644 > --- a/qga/commands-win32.c > +++ b/qga/commands-win32.c > @@ -22,6 +22,12 @@ > #define SHTDN_REASON_FLAG_PLANNED 0x80000000 > #endif > > +/* multiple of 100 nanoseconds elapsed between windows baseline > + (1/1/1601) and Unix Epoch (1/1/1970), accounting for leap years */ > +#define W32_FT_OFFSET (10000000ULL * 60 * 60 * 24 * \ > + (365 * (1970 - 1601) + \ > + (1970 - 1601) / 4 - 3)) > + > static void acquire_privilege(const char *name, Error **err) > { > HANDLE token; > @@ -108,6 +114,29 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err) > } > } > > +int64_t qmp_guest_get_time(Error **errp) > +{ > + SYSTEMTIME ts = {0}; > + int64_t time_ns; > + FILETIME tf; > + > + GetSystemTime(&ts); > + if (ts.wYear < 1601 || ts.wYear > 30827) { > + error_setg(errp, "Failed to get time"); > + return -1; > + } > + > + if (!SystemTimeToFileTime(&ts, &tf)) { > + error_setg_errno(errp, errno, "Failed to convert system time"); I missed this is well, SystemTimeToFileTime() doesn't set errno, but if this is the only change needed I can fix this up in my tree. > + return -1; > + } > + > + time_ns = ((((int64_t)tf.dwHighDateTime << 32) | tf.dwLowDateTime) > + - W32_FT_OFFSET) * 100; > + > + return time_ns; > +} > + > int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode, Error **err) > { > error_set(err, QERR_UNSUPPORTED); > -- > 1.7.11.7 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 2/2] qga: add windows implementation for guest-set-time 2013-03-14 15:05 [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga Lei Li 2013-03-14 15:05 ` [Qemu-devel] [PATCH 1/2] qga: add windows implementation for guest-get-time Lei Li @ 2013-03-14 15:05 ` Lei Li 2013-03-14 21:41 ` [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga mdroth 2 siblings, 0 replies; 6+ messages in thread From: Lei Li @ 2013-03-14 15:05 UTC (permalink / raw) To: qemu-devel; +Cc: aliguori, mdroth, Lei Li Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com> --- qga/commands-win32.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/qga/commands-win32.c b/qga/commands-win32.c index b395bd5..cc8d890 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -137,6 +137,38 @@ int64_t qmp_guest_get_time(Error **errp) return time_ns; } +void qmp_guest_set_time(int64_t time_ns, Error **errp) +{ + SYSTEMTIME ts; + FILETIME tf; + LONGLONG time; + + if (time_ns < 0 || time_ns / 100 > INT64_MAX - W32_FT_OFFSET) { + error_setg(errp, "Time %" PRId64 "is invalid", time_ns); + return; + } + + time = time_ns / 100 + W32_FT_OFFSET; + + tf.dwLowDateTime = (DWORD) time; + tf.dwHighDateTime = (DWORD) (time >> 32); + + if (!FileTimeToSystemTime(&tf, &ts)) { + error_setg(errp, "Failed to convert system time"); + return; + } + + acquire_privilege(SE_SYSTEMTIME_NAME, errp); + if (error_is_set(errp)) { + return; + } + + if (!SetSystemTime(&ts)) { + error_setg(errp, "Failed to set time to guest: %d", (int)GetLastError()); + return; + } +} + int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode, Error **err) { error_set(err, QERR_UNSUPPORTED); -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga 2013-03-14 15:05 [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga Lei Li 2013-03-14 15:05 ` [Qemu-devel] [PATCH 1/2] qga: add windows implementation for guest-get-time Lei Li 2013-03-14 15:05 ` [Qemu-devel] [PATCH 2/2] qga: add windows implementation for guest-set-time Lei Li @ 2013-03-14 21:41 ` mdroth 2013-03-15 3:04 ` Lei Li 2 siblings, 1 reply; 6+ messages in thread From: mdroth @ 2013-03-14 21:41 UTC (permalink / raw) To: Lei Li; +Cc: aliguori, qemu-devel On Thu, Mar 14, 2013 at 11:05:51PM +0800, Lei Li wrote: > This patch series attempts to add Windows implementation > for qemu-ga commands guest-get-time and guest-set-time. > > The previous thread about the interfaces introduced and > the POSIX-specific command implementation has already > been accepted, the reference link: > > http://article.gmane.org/gmane.comp.emulators.qemu/198472 > > Notes: > Now It was tested on Windows XP SP3 and Windows 7. > Please comment! Series looks good other than comment in patch 1. I can fix this in tree or you can send another version. Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com> > > Thanks. > > Changes since v5: > - Fix the error check for GetSystemTime() from Michael. > - Other fixups from Michael. > > Changes since v4: > - Error handel improvement from Michael. > - Do the math explicitly for the time convert of FILETIME > suggested by Michael. > > Changes since v3: > - Reorder the acquire_privilege to avoid a possible > leak of privileges suggested by Eric. > > Changes since v2: > - Overflow check improvement for time_ns from Eric. > > Changes since v1: > - Make the macro for the offset between windows baseline > and Unix Epoch more readable from Eric. > - Overflow check for filetime pointed by Eric. > > Lei Li (2): > qga: add windows implementation for guest-get-time > qga: add windows implementation for guest-set-time > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga 2013-03-14 21:41 ` [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga mdroth @ 2013-03-15 3:04 ` Lei Li 0 siblings, 0 replies; 6+ messages in thread From: Lei Li @ 2013-03-15 3:04 UTC (permalink / raw) To: mdroth; +Cc: aliguori, qemu-devel On 03/15/2013 05:41 AM, mdroth wrote: > On Thu, Mar 14, 2013 at 11:05:51PM +0800, Lei Li wrote: >> This patch series attempts to add Windows implementation >> for qemu-ga commands guest-get-time and guest-set-time. >> >> The previous thread about the interfaces introduced and >> the POSIX-specific command implementation has already >> been accepted, the reference link: >> >> http://article.gmane.org/gmane.comp.emulators.qemu/198472 >> >> Notes: >> Now It was tested on Windows XP SP3 and Windows 7. >> Please comment! > Series looks good other than comment in patch 1. I can fix this in tree > or you can send another version. I am very sorry for this, I should check the rest of it... :-( Sure, I will submit new version with this fixed. Thanks for your time! > > Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com> > >> Thanks. >> >> Changes since v5: >> - Fix the error check for GetSystemTime() from Michael. >> - Other fixups from Michael. >> >> Changes since v4: >> - Error handel improvement from Michael. >> - Do the math explicitly for the time convert of FILETIME >> suggested by Michael. >> >> Changes since v3: >> - Reorder the acquire_privilege to avoid a possible >> leak of privileges suggested by Eric. >> >> Changes since v2: >> - Overflow check improvement for time_ns from Eric. >> >> Changes since v1: >> - Make the macro for the offset between windows baseline >> and Unix Epoch more readable from Eric. >> - Overflow check for filetime pointed by Eric. >> >> Lei Li (2): >> qga: add windows implementation for guest-get-time >> qga: add windows implementation for guest-set-time >> -- Lei ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-03-15 3:05 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-03-14 15:05 [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga Lei Li 2013-03-14 15:05 ` [Qemu-devel] [PATCH 1/2] qga: add windows implementation for guest-get-time Lei Li 2013-03-14 21:36 ` mdroth 2013-03-14 15:05 ` [Qemu-devel] [PATCH 2/2] qga: add windows implementation for guest-set-time Lei Li 2013-03-14 21:41 ` [Qemu-devel] [PATCH 0/2 v6] Add Windows support for time resync by qemu-ga mdroth 2013-03-15 3:04 ` Lei Li
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).