diff -r 1e3977e029fd tools/ioemu/hw/mc146818rtc.c --- a/tools/ioemu/hw/mc146818rtc.c Mon May 08 19:21:41 2006 +0100 +++ b/tools/ioemu/hw/mc146818rtc.c Wed May 10 15:33:56 2006 -0400 @@ -178,10 +178,27 @@ static inline int from_bcd(RTCState *s, } } +static void send_timeoffset_msg(time_t delta) +{ + +/* This routine is used to inform another entity that the + base time offset has changed. For instance, if you + were using xenstore, you might want to write to the store + at this point. Or, you might use some other method. + Whatever you might chose, here's a hook point to implement it. + + One item of note is that this delta is in addition to + any existing offset you might be already using. */ + + return; +} + static void rtc_set_time(RTCState *s) { struct tm *tm = &s->current_tm; - + time_t before, after; + + before = mktime(tm); tm->tm_sec = from_bcd(s, s->cmos_data[RTC_SECONDS]); tm->tm_min = from_bcd(s, s->cmos_data[RTC_MINUTES]); tm->tm_hour = from_bcd(s, s->cmos_data[RTC_HOURS] & 0x7f); @@ -193,6 +210,12 @@ static void rtc_set_time(RTCState *s) tm->tm_mday = from_bcd(s, s->cmos_data[RTC_DAY_OF_MONTH]); tm->tm_mon = from_bcd(s, s->cmos_data[RTC_MONTH]) - 1; tm->tm_year = from_bcd(s, s->cmos_data[RTC_YEAR]) + 100; + + /* Compute, and send, the additional time delta + We could compute the total time delta, but this is + sufficient, and simple. */ + after = mktime(tm); + send_timeoffset_msg(after-before); } static void rtc_copy_date(RTCState *s) diff -r 1e3977e029fd tools/ioemu/hw/pc.c --- a/tools/ioemu/hw/pc.c Mon May 08 19:21:41 2006 +0100 +++ b/tools/ioemu/hw/pc.c Wed May 10 15:33:56 2006 -0400 @@ -118,7 +118,7 @@ static void cmos_init_hd(int type_ofs, i } /* hd_table must contain 4 block drivers */ -static void cmos_init(uint64_t ram_size, int boot_device, BlockDriverState **hd_table) +static void cmos_init(uint64_t ram_size, int boot_device, BlockDriverState **hd_table, time_t timeoffset) { RTCState *s = rtc_state; int val; @@ -129,6 +129,7 @@ static void cmos_init(uint64_t ram_size, /* set the CMOS date */ time(&ti); + ti += timeoffset; if (rtc_utc) tm = gmtime(&ti); else @@ -379,7 +380,7 @@ void pc_init(uint64_t ram_size, int vga_ void pc_init(uint64_t ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename) + const char *initrd_filename, time_t timeoffset) { char buf[1024]; int ret, linux_boot, initrd_size, i, nb_nics1; @@ -573,7 +574,7 @@ void pc_init(uint64_t ram_size, int vga_ floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table); - cmos_init(ram_size, boot_device, bs_table); + cmos_init(ram_size, boot_device, bs_table, timeoffset); /* must be done after all PCI devices are instanciated */ /* XXX: should be done in the Bochs BIOS */ diff -r 1e3977e029fd tools/ioemu/vl.c --- a/tools/ioemu/vl.c Mon May 08 19:21:41 2006 +0100 +++ b/tools/ioemu/vl.c Wed May 10 15:33:56 2006 -0400 @@ -155,6 +155,7 @@ void *vtop_table; void *vtop_table; unsigned long toptab; unsigned long vgaram_pages; +time_t timeoffset = 0; /***********************************************************/ /* x86 ISA bus support */ @@ -2255,9 +2256,10 @@ void help(void) "-s wait gdb connection to port %d\n" "-p port ioreq port for xen\n" "-d domain domain that we're serving\n" - "-domain-namn domain name that we're serving\n" + "-domain-name domain name that we're serving\n" "-hdachs c,h,s force hard disk 0 geometry (usually qemu can guess it)\n" "-L path set the directory for the BIOS and VGA BIOS\n" + "-timeoffset time offset (in seconds) from local time (Xen)\n" #ifdef USE_CODE_COPY "-no-code-copy disable code copy acceleration\n" #endif @@ -2355,6 +2357,7 @@ enum { QEMU_OPTION_monitor, QEMU_OPTION_domainname, QEMU_OPTION_serial, + QEMU_OPTION_timeoffset, QEMU_OPTION_loadvm, QEMU_OPTION_full_screen, QEMU_OPTION_vgaacc, @@ -2428,6 +2431,7 @@ const QEMUOption qemu_options[] = { { "std-vga", 0, QEMU_OPTION_std_vga }, { "monitor", 1, QEMU_OPTION_monitor }, { "domain-name", 1, QEMU_OPTION_domainname }, + { "timeoffset", HAS_ARG, QEMU_OPTION_timeoffset }, { "serial", 1, QEMU_OPTION_serial }, { "loadvm", HAS_ARG, QEMU_OPTION_loadvm }, { "full-screen", 0, QEMU_OPTION_full_screen }, @@ -3058,7 +3062,10 @@ int main(int argc, char **argv) case QEMU_OPTION_domainname: strncat(domain_name, optarg, sizeof(domain_name) - 20); break; - + case QEMU_OPTION_timeoffset: + timeoffset = strtol(optarg, NULL, 0); + break; + } } } @@ -3396,7 +3403,7 @@ int main(int argc, char **argv) #if defined(TARGET_I386) pc_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, - kernel_filename, kernel_cmdline, initrd_filename); + kernel_filename, kernel_cmdline, initrd_filename, timeoffset); #elif defined(TARGET_PPC) ppc_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, diff -r 1e3977e029fd tools/ioemu/vl.h --- a/tools/ioemu/vl.h Mon May 08 19:21:41 2006 +0100 +++ b/tools/ioemu/vl.h Wed May 10 15:33:56 2006 -0400 @@ -663,7 +663,7 @@ void pc_init(uint64_t ram_size, int vga_ void pc_init(uint64_t ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename); + const char *initrd_filename, time_t timeoffset); /* ppc.c */ void ppc_init (int ram_size, int vga_ram_size, int boot_device,