|
|
|
|
|
|
|
|
|
|
xen-devel
[Xen-devel] SOLVED - Infinte loop in RtlPrefetchMemoryNonTemporal underW
I fixed this with the following entry in my config:
cpuid =
['0x80000005:ecx=xxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkk,edx=xxxxxxxxxxxxxxxxxx
xxxxxxkkkkkkkk']
This passes through the physical host value of the relevant cache
information cpuid function to the DomU.
Is there any reason why we wouldn't want to do this? I think I'm working
around what is actually a bug. Intel CPU's seem to keep cache
information in another cpuid function so maybe it is only (some?) AMD
cpu's affected?
As per the email below, under some circumstances (eg when I give Windows
a pre-checksum-verified packet) it makes a call to a function called
RtlPrefetchMemoryNonTemporal which uses the cache line size as a
decrement in a loop. Xen is setting the cache line size to zero (at
least for AMD processors) causing that loop to never terminate.
James
> -----Original Message-----
> From: James Harper
> Sent: Saturday, 22 November 2008 23:00
> To: James Harper; xen-devel@xxxxxxxxxxxxxxxxxxx
> Subject: RE: [Xen-devel] Infinte loop in RtlPrefetchMemoryNonTemporal
> underWindows
>
> > I have been trying to track down a problem that occurs when my GPLPV
> > drivers give Windows a packet with the
NdisPacketTcpChecksumSucceeded
> > flag set. The problem is that the machine locks hard.
> >
> > After some tedious work with the debugger, I have found that Windows
> > makes a call to a routine called RtlPrefetchMemoryNonTemporal, which
> > looks like this:
> >
> > 8088e579 mov eax,dword ptr [nt!KePrefetchNTAGranularity 8088e57e
> > 0f184100 prefetchnta [ecx]
> > 8088e582 add ecx,eax
> > 8088e584 sub edx,eax
> > 8088e586 ja nt!RtlPrefetchMemoryNonTemporal+0x6 (8088e57e)
> > 8088e588 ret
> >
> > Unfortunately it appears that the value at
nt!KePrefetchNTAGranularity
> > is 0, hence the infinite loop.
> >
>
> A bit more debugging shows that RtlPrefectMemoryNonTemporal starts out
> life like this:
>
> nt!RtlPrefetchMemoryNonTemporal:
> 8088e578 ret
> 8088e579 mov eax,dword ptr [nt!KePrefetchNTAGranularity 8088e57e
> 0f184100 prefetchnta [ecx]
> 8088e582 add ecx,eax
> 8088e584 sub edx,eax
> 8088e586 ja nt!RtlPrefetchMemoryNonTemporal+0x6 (8088e57e)
> 8088e588 ret
>
> But then for some reason becomes:
>
> nt!RtlPrefetchMemoryNonTemporal:
> 8088e578 nop
> 8088e579 mov eax,dword ptr [nt!KePrefetchNTAGranularity 8088e57e
> 0f184100 prefetchnta [ecx]
> 8088e582 add ecx,eax
> 8088e584 sub edx,eax
> 8088e586 ja nt!RtlPrefetchMemoryNonTemporal+0x6 (8088e57e)
> 8088e588 ret
>
> The difference being that the initial ret becomes a nop...
>
> This is getting stranger and stranger.
>
> James
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|