Hi, This little program:
#include <u.h> #include <libc.h> #define SEGBASE ((char *) 0x10001001) #define SEGSIZE 0x1000 void main(void) { segattach(0, "shared", SEGBASE, SEGSIZE); // Works fine (writing to 0x10001fff) *(char *) (SEGBASE + SEGSIZE - 2) = 'a'; // Suicide! (writing to 0x10002000) *(char *) (SEGBASE + SEGSIZE - 1) = 'a'; } However, segattach's manpage claims: "... and va+len is rounded up." Shouldn't the second page here be mapped? I propose this patch to /sys/src/9/port/segment.c:: --- segment.c.orig 2009-09-24 22:41:59.000000000 -0400 +++ segment.c 2009-09-24 22:38:25.000000000 -0400 @@ -641,6 +641,11 @@ int sno; Segment *s, *os; Physseg *ps; + ulong ova; + + ova = va; + va = va&~(BY2PG-1); + len += (ova - va); if(va != 0 && va >= USTKTOP) error(Ebadarg); This patch also prevents segattaching to the zero page, which I think was worth doing... Could people try this? Comments? Thanks, -- vs