Hi, I was trying to use mprotect(PROT_NONE) to help debug a problem, and it seems that mprotect() isn't actually doing anything with my 2.6.14 linux-mips kernel on an au1550. Attached is a simple test program that segfaults as expected on x86 (2.6.12), but does not segfault on mips (2.6.14). I can both read and write PROT_NONE memory without problem, which should result in a segfault. Originally, I was trying to mprotect() a mmaped GFP_DMA region which wasn't working and then I tried a simpler test that also wasn't working. Shouldn't mprotect() work? Could I be missing a config option, or is this just broken? Thanks, Clem Taylor
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <sys/mman.h> #include <string.h> #include <errno.h> int main ( int argc, char *argv [ ] ) { int size = 65536, i, ret; unsigned char *buffer; buffer = memalign ( size, size ); if ( buffer == NULL ) { fprintf ( stderr, "memalign() failed.\n" ); return 1; } fprintf ( stderr, "buffer=%p size=%d\n", buffer, size ); /* write and read buffer */ memset ( buffer, 0xAA, size ); for ( i = 0; i < 2; i++ ) fprintf ( stderr, "buffer [ %d ] = 0x%02X\n", i, buffer [ i ] ); /* disable reading and writing */ ret = mprotect ( buffer, size, PROT_NONE ); if ( ret != 0 ) { fprintf ( stderr, "mprotect(%p,%d,PROT_NONE) failed: %s\n", buffer, size, strerror ( errno ) ); return 1; } /* write and read buffer, should segfault */ memset ( buffer, 0x55, size ); for ( i = 0; i < 2; i++ ) fprintf ( stderr, "buffer [ %d ] = 0x%02X\n", i, buffer [ i ] ); return 0; }