Daniel O'Connor wrote:
On Sat, 26 Sep 2009, Alan Cox wrote:
John Baldwin wrote:
On Friday 25 September 2009 3:20:05 am Daniel O'Connor wrote:
On Thu, 24 Sep 2009, John Baldwin wrote:
Can you try this patch perhaps:

Index: sys/amd64/isa/isa_dma.c
=================================================================
== --- isa_dma.c        (revision 197430)
+++ isa_dma.c   (working copy)
This patch fixes the panic for me.

I haven't tried printing (don't have any device handy here).
I wonder if pmap_extract(kernel_pmap) doesn't work with direct map
addresses for some reason?  I kind of find that hard to believe
actually.  Alan, the original panic was in
pmap_extract(kernel_pmap, ...) calls in the isa_dma code.  My patch
that "fixes" the panic just changes them to pmap_kextract().
Is this problem occurring on an AMD processor?

Yes,
CPU: AMD Athlon(tm) II X2 240 Processor (2812.73-MHz K8-class CPU)
  Origin = "AuthenticAMD"  Id = 0x100f62  Stepping = 2
  
Features=0x178bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2,HTT>
  Features2=0x802009<SSE3,MON,CX16,POPCNT>
  AMD 
Features=0xee500800<SYSCALL,NX,MMX+,FFXSR,Page1GB,RDTSCP,LM,3DNow!+,3DNow!>
  AMD 
Features2=0x37ff<LAHF,CMP,SVM,ExtAPIC,CR8,ABM,SSE4A,MAS,Prefetch,OSVW,IBS,SKINIT,WDT>
  TSC: P-state invariant
real memory  = 4294967296 (4096 MB)
avail memory = 3974762496 (3790 MB)


Ok, now I can explain what is happening. The kernel is using 1GB pages to implement the direct map. Unfortunately, pmap_extract() doesn't know how to handle a 1GB page mapping. pmap_kextract() only works by an "accident" of its different implementation. In other words, it should not be relied upon to work either.

Please revert whatever patch John gave you and try the attached patch. It simply disables the use of 1GB page mapping by the direct map.

Regards,
Alan


Index: amd64/amd64/pmap.c
===================================================================
--- amd64/amd64/pmap.c  (revision 197425)
+++ amd64/amd64/pmap.c  (working copy)
@@ -442,7 +442,7 @@
        if (ndmpdp < 4)         /* Minimum 4GB of dirmap */
                ndmpdp = 4;
        DMPDPphys = allocpages(firstaddr, NDMPML4E);
-       if ((amd_feature & AMDID_PAGE1GB) == 0)
+       if (TRUE || (amd_feature & AMDID_PAGE1GB) == 0)
                DMPDphys = allocpages(firstaddr, ndmpdp);
        dmaplimit = (vm_paddr_t)ndmpdp << PDPSHIFT;
 
@@ -476,7 +476,7 @@
 
        /* Now set up the direct map space using either 2MB or 1GB pages */
        /* Preset PG_M and PG_A because demotion expects it */
-       if ((amd_feature & AMDID_PAGE1GB) == 0) {
+       if (TRUE || (amd_feature & AMDID_PAGE1GB) == 0) {
                for (i = 0; i < NPDEPG * ndmpdp; i++) {
                        ((pd_entry_t *)DMPDphys)[i] = (vm_paddr_t)i << PDRSHIFT;
                        ((pd_entry_t *)DMPDphys)[i] |= PG_RW | PG_V | PG_PS |
_______________________________________________
freebsd-stable@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "freebsd-stable-unsubscr...@freebsd.org"

Reply via email to