qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 2/2] qemu-timer: move timeBeginPeriod/timeEndPer


From: Jacob Kroon
Subject: Re: [Qemu-devel] [PATCH 2/2] qemu-timer: move timeBeginPeriod/timeEndPeriod to os-win32
Date: Thu, 21 Feb 2013 00:49:54 +0100

On Wed, Feb 20, 2013 at 9:46 PM, Jacob Kroon <address@hidden> wrote:
> Paolo,
>
> Just a heads up, I tried the patched qemu (1+2+3) on my laptop at
> home, which is running Windows 7 64-bit. I'm seeing qemu "lockups"
> appearing randomly.. Will try to debug it.
> On the other hand, plain vanilla 1.4.0 in Windows 7 seems to run fine
> with my VxWorks image..

So the problem seems to be related to wether I pass --enable-debug to
qemu configure script.
With debug enabled it runs fine in Windows 7 aswell. If I leave it out
I get what appears to be a lockup
a couple of seconds into the guest boot process. Best I could do for
now was to attach to the process
with gdb and get a backtrace:

(gdb) bt
#0  0x76fc000d in ntdll!LdrFindResource_U ()
   from /cygdrive/c/Windows/SysWOW64/ntdll.dll
#1  0x7704f896 in ntdll!RtlQueryTimeZoneInformation ()
   from /cygdrive/c/Windows/SysWOW64/ntdll.dll
#2  0x6ce2c99b in ?? ()
#3  0x00000000 in ?? ()

> On Wed, Feb 20, 2013 at 2:43 PM, Paolo Bonzini <address@hidden> wrote:
>> These are needed for any of the Win32 alarm timer implementations.
>> They are not tied to mmtimer exclusively.
>>
>> Jacob tested this patch with both mmtimer and Win32 timers.
>>
>> Cc: address@hidden
>> Tested-by: Jacob Kroon <address@hidden>
>> Signed-off-by: Paolo Bonzini <address@hidden>
>> ---
>>         Jacob, this is the same as "patch 1" you tested.
>>
>>  os-win32.c   | 10 ++++++++++
>>  qemu-timer.c | 26 ++++++--------------------
>>  2 files changed, 16 insertions(+), 20 deletions(-)
>>
>> diff --git a/os-win32.c b/os-win32.c
>> index 3d43604..a0740ef 100644
>> --- a/os-win32.c
>> +++ b/os-win32.c
>> @@ -23,6 +23,7 @@
>>   * THE SOFTWARE.
>>   */
>>  #include <windows.h>
>> +#include <mmsystem.h>
>>  #include <unistd.h>
>>  #include <fcntl.h>
>>  #include <signal.h>
>> @@ -67,9 +67,19 @@ static BOOL WINAPI qemu_ctrl_handler(DWORD type)
>>      return TRUE;
>>  }
>>
>> +static TIMECAPS mm_tc;
>> +
>> +static void os_undo_timer_resolution(void)
>> +{
>> +    timeEndPeriod(mm_tc.wPeriodMin);
>> +}
>> +
>>  void os_setup_early_signal_handling(void)
>>  {
>>      SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
>> +    timeGetDevCaps(&mm_tc, sizeof(mm_tc));
>> +    timeBeginPeriod(mm_tc.wPeriodMin);
>> +    atexit(os_undo_timer_resolution);
>>  }
>>
>>  /* Look for support files in the same directory as the executable.  */
>> diff --git a/qemu-timer.c b/qemu-timer.c
>> index 8fb5c75..50109a1 100644
>> --- a/qemu-timer.c
>> +++ b/qemu-timer.c
>> @@ -623,29 +622,15 @@ static void CALLBACK mm_alarm_handler(UINT uTimerID, 
>> UINT uMsg,
>>
>>  static int mm_start_timer(struct qemu_alarm_timer *t)
>>  {
>>      timeGetDevCaps(&mm_tc, sizeof(mm_tc));
>> -
>> -    timeBeginPeriod(mm_tc.wPeriodMin);
>> -
>> -    mm_timer = timeSetEvent(mm_tc.wPeriodMin,   /* interval (ms) */
>> -                            mm_tc.wPeriodMin,   /* resolution */
>> -                            mm_alarm_handler,   /* function */
>> -                            (DWORD_PTR)t,       /* parameter */
>> -                            TIME_ONESHOT | TIME_CALLBACK_FUNCTION);
>> -
>> -    if (!mm_timer) {
>> -        fprintf(stderr, "Failed to initialize win32 alarm timer\n");
>> -        timeEndPeriod(mm_tc.wPeriodMin);
>> -        return -1;
>> -    }
>> -
>>      return 0;
>>  }
>>
>>  static void mm_stop_timer(struct qemu_alarm_timer *t)
>>  {
>> -    timeKillEvent(mm_timer);
>> -    timeEndPeriod(mm_tc.wPeriodMin);
>> +    if (mm_timer) {
>> +        timeKillEvent(mm_timer);
>> +    }
>>  }
>>
>>  static void mm_rearm_timer(struct qemu_alarm_timer *t, int64_t delta)
>> @@ -657,7 +641,9 @@ static void mm_rearm_timer(struct qemu_alarm_timer *t, 
>> int64_t delta)
>>          nearest_delta_ms = mm_tc.wPeriodMax;
>>      }
>>
>> -    timeKillEvent(mm_timer);
>> +    if (mm_timer) {
>> +        timeKillEvent(mm_timer);
>> +    }
>>      mm_timer = timeSetEvent((UINT)nearest_delta_ms,
>>                              mm_tc.wPeriodMin,
>>                              mm_alarm_handler,
>> --
>> 1.8.1.2
>>
>
>
>
> --
>   -- Jacob



reply via email to

[Prev in Thread] Current Thread [Next in Thread]