[Vm-dev] Compiling Cog on FreeBSD

Frank Shearar frank.shearar at gmail.com
Fri Jan 11 11:29:30 UTC 2013


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 at 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 at 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 at 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 at 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
>


More information about the Vm-dev mailing list