--- /sys/src/9k/k10/archk10.c +++ /sys/src/9k/k10/archk10.c @@ -373,3 +373,16 @@ millidelay(int millisecs) for(t = r + m->cpumhz*1000ull*millisecs; r < t; r = rdtsc()) pause(); } + +int +isdmaok(void *a, usize len, int range) +{ + uintmem pa; + + if(!iskaddr(a) || (char*)a < etext) + return 0; + pa = mmuphysaddr(PTR2UINT(a)); + if(pa == 0 || pa == ~(uintmem)0) + return 0; + return range > 32 || pa+len <= 0xFFFFFFFFULL; +} --- /sys/src/9k/port/devaoe.c +++ /sys/src/9k/port/devaoe.c @@ -1171,7 +1171,7 @@ rw(Aoedev *d, int write, uchar *db, long len, uvlong off) if(off + len > d->bsize) len = d->bsize - off; copy = 0; - if(iskaddr(db)){ + if(isdmaok(db, len, 32)){ srb = srbkalloc(db, len); copy = 1; }else