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