Hi Frank,
from configure's output can you tell if does mprotect work? If not, could you write a test program to test mprotect? I expect something like the attached is appropriate. Let me know.
On Fri, Jan 11, 2013 at 3:29 AM, Frank Shearar frank.shearar@gmail.comwrote:
OK, the -E version of the source looks like this:
void sqMakeMemoryExecutableFromTo(unsigned long startAddr, unsigned long endAddr) { unsigned long firstPage = ((startAddr)&pageMask); if (mprotect((void *)firstPage, endAddr - firstPage + 1, PROT_READ | PROT_WRITE | PROT_EXEC) < 0) perror("mprotect(x,y,PROT_READ | PROT_WRITE | PROT_EXEC)"); }
but now I see no definition for pageMask! grepping just shows this:
$ grep pageMask foo.i unsigned long firstPage = ((startAddr)&pageMask); unsigned long firstPage = ((startAddr)&pageMask);
which is the problem. So I think I don't HAVE_MMAP defined. And if I look very carefully at configure's output, I see this:
checking for working mmap... Segmentation fault no
frank
On 10 January 2013 23:59, Eliot Miranda eliot.miranda@gmail.com wrote:
Hi Frank,
preprocess it using -P or -E and see what you get. i.e. run the
compiler with all the same flags (except -c and/or -o) but suppling either -E or -P (if -P pipe the result into foo.i). Then you can see what source the compiler is actually compiling. Then grep for pageMask in the result. Let's see what mangling is actually happening.
HTH
On Thu, Jan 10, 2013 at 2:21 PM, Frank Shearar frank.shearar@gmail.com
wrote:
I didn't express myself properly. pageMask occurs in a #define (line 293), but its definition is on line 100. But what confuses me is that since it's outside the function definition, it should surely be visible in the function. But the error I get says that on line 298, "error: 'pageMask' undeclared (first use in this function)".
frank
On 10 January 2013 21:43, Eliot Miranda eliot.miranda@gmail.com
wrote:
Hi Frank,
where's the #define of pageMask? There shouldn't be one
pageMask is an unsigned int. i.e.
McStalker.oscogvm$ grep -n pageMask platforms/unix/vm/* platforms/unix/vm/sqUnixMemory.c:100:static unsigned int pageMask = 0; platforms/unix/vm/sqUnixMemory.c:102:#define valign(x) ((x) &
pageMask)
platforms/unix/vm/sqUnixMemory.c:123: pageMask= ~(pageSize - 1); platforms/unix/vm/sqUnixMemory.c:125: DPRINTF(("uxAllocateMemory:
pageSize 0x%x (%d), mask 0x%x\n", pageSize, pageSize, pageMask));
platforms/unix/vm/sqUnixMemory.c:178: assert(0 == (newDelta &
~pageMask));
platforms/unix/vm/sqUnixMemory.c:179: assert(0 == (newSize &
~pageMask));
platforms/unix/vm/sqUnixMemory.c:196: assert(0 == (heapSize &
~pageMask));
platforms/unix/vm/sqUnixMemory.c:213: assert(0 == (newDelta &
~pageMask));
platforms/unix/vm/sqUnixMemory.c:214: assert(0 == (newSize &
~pageMask));
platforms/unix/vm/sqUnixMemory.c:231: assert(0 == (heapSize &
~pageMask));
platforms/unix/vm/sqUnixMemory.c:293:# define
roundDownToPageBoundary(v) ((v)&pageMask)
platforms/unix/vm/sqUnixMemory.c:294:# define
roundUpToPageBoundary(v) (((v)+pageSize-1)&pageMask)
On Thu, Jan 10, 2013 at 1:40 PM, Frank Shearar <
frank.shearar@gmail.com> wrote:
First, thanks Eliot for fixing up the UUID plugin.
With that fixed, the next error I get when compiling (32 bit) on FreeBSD is this:
sqUnixMemory.c
/usr/home/jenkins/workspace/CogVM-FreeBSD/target/Squeak-vm-unix-4.6.0-Cog-2664-unofficial-src/platforms/unix/vm/sqUnixMemory.c:
In function 'sqMakeMemoryExecutableFromTo':
/usr/home/jenkins/workspace/CogVM-FreeBSD/target/Squeak-vm-unix-4.6.0-Cog-2664-unofficial-src/platforms/unix/vm/sqUnixMemory.c:298:
error: 'pageMask' undeclared (first use in this function)
The line number looks a bit wrong, because pageMask is in a #define
on
line 293. (Ah, it's because line 298 uses the #define.) At any rate, the relevant function + context looks like this:
#if COGVM # define roundDownToPageBoundary(v) ((v)&pageMask) # define roundUpToPageBoundary(v) (((v)+pageSize-1)&pageMask) void sqMakeMemoryExecutableFromTo(unsigned long startAddr, unsigned long
endAddr)
{ unsigned long firstPage = roundDownToPageBoundary(startAddr); if (mprotect((void *)firstPage, endAddr - firstPage + 1, PROT_READ | PROT_WRITE | PROT_EXEC)
< 0)
perror("mprotect(x,y,PROT_READ | PROT_WRITE |
PROT_EXEC)");
}
void sqMakeMemoryNotExecutableFromTo(unsigned long startAddr, unsigned
long endAddr)
{ unsigned long firstPage = roundDownToPageBoundary(startAddr); if (mprotect((void *)firstPage, endAddr - firstPage + 1, PROT_READ | PROT_WRITE) < 0) perror("mprotect(x,y,PROT_READ | PROT_WRITE)"); } #endif /* COGVM */
A bit confusing, given that pageMask is declared on line 100, as whatever C calls a top level form. A global?
What can I do to make things work?
The full ouput's viewable here:
http://squeakci.org/job/CogVM-FreeBSD/13/console
frank
-- best, Eliot
-- best, Eliot