After Alex's fix,I modify Luajit 2.0.2 as following and luajit works like a charm.
So there also a patch to luajit is required? --- lj_arch.h.ori 2014-02-15 15:31:02.455765000 +0000 +++ lj_arch.h 2014-02-15 15:31:39.595775000 +0000 @@ -67,7 +67,7 @@ #elif defined(__MACH__) && defined(__APPLE__) #define LUAJIT_OS LUAJIT_OS_OSX #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ - defined(__NetBSD__) || defined(__OpenBSD__) + defined(__NetBSD__) || defined(__OpenBSD__)|| defined(__DragonFly__) #define LUAJIT_OS LUAJIT_OS_BSD #elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__) #define LUAJIT_OS LUAJIT_OS_POSIX --- lj_alloc.c.ori 2014-02-15 15:31:12.435768000 +0000 +++ lj_alloc.c 2014-02-15 17:38:22.007803000 +0000 @@ -188,7 +188,7 @@ return ptr; } -#elif LJ_TARGET_OSX || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__sun__) +#elif LJ_TARGET_OSX || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__sun__)|| defined(__DragonFly__) /* OSX and FreeBSD mmap() use a naive first-fit linear search. ** That's perfect for us. Except that -pagezero_size must be set for OSX, @@ -197,6 +197,8 @@ */ #if LJ_TARGET_OSX #define MMAP_REGION_START ((uintptr_t)0x10000) +#elif defined(__DragonFly__) +#define MMAP_REGION_START ((uintptr_t)0x10000) #else #define MMAP_REGION_START ((uintptr_t)0x10000000) #endif 2014-02-15 17:39 GMT+08:00 lhmwzy <[email protected]>: > I modify Luajit 2.0.2 as following and luajit works like a charm. > > --- lj_arch.h.ori 2014-02-15 15:31:02.455765000 +0000 > +++ lj_arch.h 2014-02-15 15:31:39.595775000 +0000 > > @@ -67,7 +67,7 @@ > #elif defined(__MACH__) && defined(__APPLE__) > #define LUAJIT_OS LUAJIT_OS_OSX > #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ > - defined(__NetBSD__) || defined(__OpenBSD__) > + defined(__NetBSD__) || defined(__OpenBSD__)|| defined(__DragonFly__) > #define LUAJIT_OS LUAJIT_OS_BSD > #elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__) > #define LUAJIT_OS LUAJIT_OS_POSIX > > > -#elif LJ_TARGET_OSX || defined(__FreeBSD__) || > defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__sun__) > +#elif LJ_TARGET_OSX || defined(__FreeBSD__) || > defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__sun__)|| > defined(__DragonFly__) > > > /* OSX and FreeBSD mmap() use a naive first-fit linear search. > ** That's perfect for us. Except that -pagezero_size must be set for OSX, > @@ -197,6 +197,8 @@ > */ > #if LJ_TARGET_OSX > #define MMAP_REGION_START ((uintptr_t)0x10000) > +#elif defined(__DragonFly__) > +#define MMAP_REGION_START ((uintptr_t)0x10000) > #else > #define MMAP_REGION_START ((uintptr_t)0x10000000) > #endif > > > > 2014-02-15 15:36 GMT+08:00 lhmwzy <[email protected]>: > > The John Marino'patch was following: >> >> >> --- lj_arch.h.org 2014-02-14 16:32:03.125932000 +0000 >> +++ lj_arch.h 2014-02-14 16:32:34.725951000 +0000 >> >> >> @@ -67,7 +67,7 @@ >> #elif defined(__MACH__) && defined(__APPLE__) >> #define LUAJIT_OS LUAJIT_OS_OSX >> #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ >> - defined(__NetBSD__) || defined(__OpenBSD__) >> + defined(__NetBSD__) || defined(__OpenBSD__)|| defined(__DragonFly__) >> >> #define LUAJIT_OS LUAJIT_OS_BSD >> #elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__) >> #define LUAJIT_OS LUAJIT_OS_POSIX >> >> --- lj_alloc.c.org 2014-02-14 16:33:19.015979000 +0000 >> +++ lj_alloc.c 2014-02-14 16:32:50.225961000 +0000 >> @@ -188,6 +188,33 @@ >> return ptr; >> } >> >> +#elif defined(__DragonFly__) >> + >> +#define MMAP_REGION_START ((uintptr_t)0x1000) >> +#define MMAP_REGION_END ((uintptr_t)0x80000000) >> + >> +static LJ_AINLINE void *CALL_MMAP(size_t size) >> +{ >> + int olderr = errno; >> + /* Hint for next allocation. Doesn't need to be thread-safe. */ >> + static uintptr_t alloc_hint = MMAP_REGION_START; >> + int retry = 0; >> + for (;;) { >> + void *p = mmap((void *)alloc_hint, size, MMAP_PROT, MMAP_FLAGS, -1, 0); >> + if ((uintptr_t)p >= 0 && (uintptr_t)p + size < MMAP_REGION_END) { >> + alloc_hint = (uintptr_t)p + size; >> + errno = olderr; >> + return p; >> + } >> + if (p != CMFAIL) munmap(p, size); >> + if (retry) break; >> + retry = 1; >> + alloc_hint += 0x100000; >> + } >> + errno = olderr; >> + return CMFAIL; >> +} >> + >> >> >> 2014-02-15 15:34 GMT+08:00 lhmwzy <[email protected]>: >> >> Here is the modify >>> >>> --- lj_arch.h 2014-02-15 15:31:39.595775000 +0000 >>> +++ lj_arch.h.ori 2014-02-15 15:31:02.455765000 +0000 >>> @@ -67,7 +67,7 @@ >>> #elif defined(__MACH__) && defined(__APPLE__) >>> #define LUAJIT_OS LUAJIT_OS_OSX >>> #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ >>> - defined(__NetBSD__) || defined(__OpenBSD__)|| >>> defined(__DragonFly__) >>> + defined(__NetBSD__) || defined(__OpenBSD__) >>> #define LUAJIT_OS LUAJIT_OS_BSD >>> #elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__) >>> #define LUAJIT_OS LUAJIT_OS_POSIX >>> >>> --- lj_alloc.c 2014-02-15 15:32:47.735793000 +0000 >>> +++ lj_alloc.c.ori 2014-02-15 15:31:12.435768000 +0000 >>> @@ -188,7 +188,7 @@ >>> return ptr; >>> } >>> >>> -#elif LJ_TARGET_OSX || defined(__FreeBSD__) || >>> defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__sun__)|| >>> defined(__DragonFly__) >>> +#elif LJ_TARGET_OSX || defined(__FreeBSD__) || >>> defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__sun__) >>> >>> /* OSX and FreeBSD mmap() use a naive first-fit linear search. >>> ** That's perfect for us. Except that -pagezero_size must be set for >>> OSX, >>> @@ -202,7 +202,7 @@ >>> #endif >>> #define MMAP_REGION_END ((uintptr_t)0x80000000) >>> >>> -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)|| >>> defined(__DragonFly__) >>> +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) >>> #include <sys/resource.h> >>> #endif >>> >>> @@ -212,7 +212,7 @@ >>> /* Hint for next allocation. Doesn't need to be thread-safe. */ >>> static uintptr_t alloc_hint = MMAP_REGION_START; >>> int retry = 0; >>> -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)|| >>> defined(__DragonFly__) >>> +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) >>> static int rlimit_modified = 0; >>> if (LJ_UNLIKELY(rlimit_modified == 0)) { >>> struct rlimit rlim; >>> >>> When make completed,run luajit >>> ./luajit >>> ./luajit: cannot create state: not enough memory >>> >>> kdump result: >>> kdump >>> 2424 ktrace RET ktrace 0 >>> 2424 ktrace CALL execve(0x7ffffffffb97,0x7ffffffff948,0x7ffffffff958) >>> 2424 ktrace NAMI "./luajit" >>> 2424 ktrace NAMI "/usr/libexec/ld-elf.so.2" >>> 2424 luajit RET execve 0 >>> 2424 luajit CALL >>> __sysctl(0x7fffffffefe0,0x2,0x800897b60,0x7fffffffefd8,0,0) >>> 2424 luajit RET __sysctl 0 >>> 2424 luajit CALL >>> mmap(0,0x8000,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,0xffffffff,0,0) >>> 2424 luajit RET mmap 6901760/0x695000 >>> 2424 luajit CALL issetugid >>> 2424 luajit RET issetugid 0 >>> 2424 luajit CALL lstat(0x80069a000,0x7fffffffeef0) >>> 2424 luajit NAMI "/etc" >>> 2424 luajit RET lstat 0 >>> 2424 luajit CALL lstat(0x80069a000,0x7fffffffeef0) >>> 2424 luajit NAMI "/etc/libmap.conf" >>> 2424 luajit RET lstat -1 errno 2 No such file or directory >>> 2424 luajit CALL open(0x80069a000,O_CLOEXEC,<unused>0) >>> 2424 luajit NAMI "/etc/libmap.conf" >>> 2424 luajit RET open -1 errno 2 No such file or directory >>> 2424 luajit CALL access(0x80069a000,F_OK) >>> 2424 luajit NAMI "/usr/lib/gcc47/libm.so.4" >>> 2424 luajit RET access -1 errno 2 No such file or directory >>> 2424 luajit CALL open(0x80068c906,O_CLOEXEC,<unused>0x8) >>> 2424 luajit NAMI "/var/run/ld-elf.so.hints" >>> 2424 luajit RET open 3 >>> 2424 luajit CALL read(0x3,0x7fffffffed60,0x80) >>> 2424 luajit GIO fd 3 read 128 bytes >>> >>> "Ehnt\^A\0\0\0\M^@\0\0\0>\0\0\0\0\0\0\0=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ >>> \0\0\0\0\0\0\0" >>> 2424 luajit RET read 128/0x80 >>> 2424 luajit CALL lseek(0x3,0,0x80,SEEK_SET) >>> 2424 luajit RET lseek 128/0x80 >>> 2424 luajit CALL read(0x3,0x800697180,0x3e) >>> 2424 luajit GIO fd 3 read 62 bytes >>> "/usr/lib:/usr/lib/compat:/usr/local/lib:/usr/local/lib/event2\0" >>> 2424 luajit RET read 62/0x3e >>> 2424 luajit CALL close(0x3) >>> 2424 luajit RET close 0 >>> 2424 luajit CALL access(0x80069a000,F_OK) >>> 2424 luajit NAMI "/usr/lib/libm.so.4" >>> 2424 luajit RET access 0 >>> 2424 luajit CALL open(0x800699040,O_CLOEXEC,<unused>0x8) >>> 2424 luajit NAMI "/usr/lib/libm.so.4" >>> 2424 luajit RET open 3 >>> 2424 luajit CALL fstat(0x3,0x7fffffffef70) >>> 2424 luajit RET fstat 0 >>> 2424 luajit CALL mmap(0,0x1000,PROT_READ,MAP_PRIVATE,0x3,0,0) >>> 2424 luajit RET mmap 6934528/0x69d000 >>> 2424 luajit CALL >>> mmap(0,0x22a000,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,0xffffffff,0,0) >>> 2424 luajit RET mmap 9027584/0x89c000 >>> 2424 luajit CALL >>> mmap(0x80089c000,0x2a000,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE,0x3,0,0) >>> 2424 luajit RET mmap 9027584/0x89c000 >>> 2424 luajit CALL >>> mmap(0x800ac5000,0x1000,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,0x3,0,0x29000) >>> 2424 luajit RET mmap 11292672/0xac5000 >>> 2424 luajit CALL munmap(0x80069d000,0x1000) >>> 2424 luajit RET munmap 0 >>> 2424 luajit CALL close(0x3) >>> 2424 luajit RET close 0 >>> 2424 luajit CALL access(0x80069a000,F_OK) >>> 2424 luajit NAMI "/usr/lib/gcc47/libc.so.8" >>> 2424 luajit RET access -1 errno 2 No such file or directory >>> 2424 luajit CALL access(0x80069a000,F_OK) >>> 2424 luajit NAMI "/usr/lib/libc.so.8" >>> 2424 luajit RET access 0 >>> 2424 luajit CALL open(0x800699080,O_CLOEXEC,<unused>0x8) >>> 2424 luajit NAMI "/usr/lib/libc.so.8" >>> 2424 luajit RET open 3 >>> 2424 luajit CALL fstat(0x3,0x7fffffffef70) >>> 2424 luajit RET fstat 0 >>> 2424 luajit CALL mmap(0,0x1000,PROT_READ,MAP_PRIVATE,0x3,0,0) >>> 2424 luajit RET mmap 6934528/0x69d000 >>> 2424 luajit CALL >>> mmap(0,0x34e000,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,0xffffffff,0,0) >>> 2424 luajit RET mmap 11296768/0xac6000 >>> 2424 luajit CALL >>> mmap(0x800ac6000,0x123000,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE,0x3,0,0) >>> 2424 luajit RET mmap 11296768/0xac6000 >>> 2424 luajit CALL >>> mmap(0x800de9000,0xc000,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,0x3,0,0x123000) >>> 2424 luajit RET mmap 14585856/0xde9000 >>> 2424 luajit CALL >>> mmap(0x800df5000,0x1f000,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,0xffffffff,0,0) >>> 2424 luajit RET mmap 14635008/0xdf5000 >>> 2424 luajit CALL munmap(0x80069d000,0x1000) >>> 2424 luajit RET munmap 0 >>> 2424 luajit CALL close(0x3) >>> 2424 luajit RET close 0 >>> 2424 luajit CALL >>> mmap(0,0x19000,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,0xffffffff,0x800000000,0) >>> 2424 luajit RET mmap 6934528/0x69d000 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff880) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL set_tls_area(0,0x7ffffffff960,0x10) >>> 2424 luajit RET set_tls_area 0 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff8b0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL issetugid >>> 2424 luajit RET issetugid 0 >>> 2424 luajit CALL >>> open(0x800bbf388,O_RDONLY,<unused>0xfffffffffffffff7) >>> 2424 luajit NAMI "/dev/urandom" >>> 2424 luajit RET open 3 >>> 2424 luajit CALL read(0x3,0x800df5ea0,0x40) >>> 2424 luajit GIO fd 3 read 64 bytes >>> >>> "Sk\M-X\M-vH\M-s\r\M-y\b1C?\M^JeWt\M-Sq\M-L,\M-w:P\M-*\^U\M^Q$\M-uV/\M^@\M-+q\M-\\M^Z\^]\M^W?\\_1\M-d^\M-S\^C\^R\ >>> f\M-3[\M-%\M^OE\^R\M-h\M-T\M-A\M-NBm+\M-kX\M^Ym" >>> 2424 luajit RET read 64/0x40 >>> 2424 luajit CALL close(0x3) >>> 2424 luajit RET close 0 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff870) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff870) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff870) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL setrlimit(RLIMIT_DATA,0x7ffffffff910) >>> 2424 luajit RET setrlimit 0 >>> 2424 luajit CALL >>> mmap(0x10000000,0x20000,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,0xffffffff,0,0) >>> 2424 luajit RET mmap 7036928/0x6b6000 >>> 2424 luajit CALL munmap(0x8006b6000,0x20000) >>> 2424 luajit RET munmap 0 >>> 2424 luajit CALL >>> mmap(0x10000000,0x20000,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,0xffffffff,0,0) >>> 2424 luajit RET mmap 7036928/0x6b6000 >>> 2424 luajit CALL munmap(0x8006b6000,0x20000) >>> 2424 luajit RET munmap 0 >>> 2424 luajit CALL write(0x2,0x7ffffffff230,0xa) >>> 2424 luajit GIO fd 2 wrote 10 bytes >>> "./luajit: " >>> 2424 luajit RET write 10/0xa >>> 2424 luajit CALL write(0x2,0x7ffffffff230,0x27) >>> 2424 luajit GIO fd 2 wrote 39 bytes >>> "cannot create state: not enough memory >>> " >>> 2424 luajit RET write 39/0x27 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff820) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff7c0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff7c0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_BLOCK,0x800897a10,0x7ffffffff7c0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL sigprocmask(SIG_SETMASK,0x800897a30,0) >>> 2424 luajit RET sigprocmask 0 >>> 2424 luajit CALL exit(0x1) >>> >>> >>> >>> >>> 2014-02-15 15:26 GMT+08:00 Alex Hornung <[email protected]>: >>> >>> On 15/02/14 07:24, lhmwzy wrote: >>>> >>>> I make buildworld and make kernel after your fix >>>> But the luajit won't work unless use John Marino'patch >>>> >>>> What does 'doesn't work' mean? You still need to add a || >>>> defined(__DragonFly__) if you don't use marino's patch. That should then >>>> build and work fine. >>>> >>>> Cheers, >>>> Alex >>>> >>>> >>>> >>>> >>>> 2014-02-15 15:21 GMT+08:00 Alex Hornung <[email protected]>: >>>> >>>>> >>>>> On 15/02/14 02:07, lhmwzy wrote: >>>>> >>>>> To use this fix >>>>> buildworld or buildkernel is needed? >>>>> >>>>> >>>>> You need to rebuild the kernel for this to work. >>>>> >>>>> >>>>> >>>>> >>>>> 2014-02-15 4:59 GMT+08:00 Alex Hornung <[email protected]> >>>>> : >>>>> >>>>>> >>>>>> commit d9c783bb278bae8373395931126396bb6d6cdd71 >>>>>> Author: Alex Hornung <[email protected]> >>>>>> Date: Fri Feb 14 20:57:16 2014 +0000 >>>>>> >>>>>> mmap - honour hint address (properly) even if randomization is on >>>>>> >>>>>> Summary of changes: >>>>>> sys/vm/vm_map.c | 5 +---- >>>>>> 1 file changed, 1 insertion(+), 4 deletions(-) >>>>>> >>>>>> >>>>>> http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/d9c783bb278bae8373395931126396bb6d6cdd71 >>>>>> >>>>>> >>>>>> -- >>>>>> DragonFly BSD source repository >>>>>> >>>>> >>>>> >>>>> >>>> >>>> >>> >> >
