On Fri Mar 18 06:32:08 EDT 2011, al...@pbrane.org wrote:
> I've read through the MMU code more than
> a few times and never noticed this.  Who
> reads past tmpunmap anyways? ;)
> 
>   Anthony
> 
> diff -c /sys/src/9/pc/mmu.c /tmp/mmu.c
> /sys/src/9/pc/mmu.c:934,940 - /tmp/mmu.c:934,940
>   void*
>   kaddr(ulong pa)
>   {
> -     if(pa > (ulong)-KZERO)
> +     if(pa >= (ulong)-KZERO)
>               panic("kaddr: pa=%#.8lux", pa);
>       return (void*)(pa+KZERO);
>   }

of course, this would allow one to KADDR(-KZERO).
and get 0.  good call.  cf.  cankaddr().

unfortunately, xalloc() is not playing along.  if you have
a kernel that's using a full -KZERO, then your kernel
will panic in xinit() when it tries to set m->klimit to
KADDR(m->base+n*BY2PG), since m->base+n*BY2PG =
-KZERO.

perhaps the correct fix is to store the Confmem
range as [a,b] not [a, b). so

../port/devproc.c:754:                  if(cm->kbase <= offset && offset <= 
cm->klimit-1){
../port/devproc.c:755:                          if(offset+n >= cm->klimit-1)
../port/devproc.c:756:                                  n = cm->klimit - offset;
../port/xalloc.c:75:                            m->klimit = 
(ulong)KADDR(m->base+n*BY2PG);

would be

../port/devproc.c:753:                  if(cm->kbase <= offset && offset <= 
cm->klimit){
../port/devproc.c:754:                          if(offset+n >= cm->klimit)
../port/devproc.c:755:                                  n = cm->klimit - offset 
+ 1;
../port/xalloc.c:72:                    m->klimit = 
(ulong)KADDR(m->base+n*BY2PG-1);

there's even a comment you can remove
                        /* klimit-1 because klimit might be zero! */

- erik

Reply via email to