Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ jobs:
include:
- DOCKER_IMAGE: arm64v8/ubuntu:jammy
- DOCKER_IMAGE: arm64v8/ubuntu:noble
- DOCKER_IMAGE: arm32v5/debian:sid
- DOCKER_IMAGE: arm32v7/debian:sid
- DOCKER_IMAGE: arm64v8/debian:sid
fail-fast: false

Expand Down
13 changes: 9 additions & 4 deletions .travis.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,26 @@ function travis_time_start {
fi
TRAVIS_TIME_ID=$(head /dev/urandom | base64 | head -c 8)
TRAVIS_FOLD_NAME=$1
echo -e "\e[0Ktravis_fold:start:$TRAVIS_FOLD_NAME"
echo -e "\e[0Ktravis_time:start:$TRAVIS_TIME_ID"
echo -e "::group::$TRAVIS_FOLD_NAME"
# echo -e "\e[0Ktravis_fold:start:$TRAVIS_FOLD_NAME"
# echo -e "\e[0Ktravis_time:start:$TRAVIS_TIME_ID"
set -x # enable debug information
}
function travis_time_end {
set +x # disable debug information
_COLOR=${1:-32}
if [ "$_COLOR" -le 30 ]; then
_COLOR=31 # red
fi
if [ "$TRAVIS_OS_NAME" == "osx" ]; then
TRAVIS_END_TIME=$(( $(date +%s)*1000000000 ))
else
TRAVIS_END_TIME=$(date +%s%N)
fi
TIME_ELAPSED_SECONDS=$(( ($TRAVIS_END_TIME - $TRAVIS_START_TIME)/1000000000 ))
echo -e "travis_time:end:$TRAVIS_TIME_ID:start=$TRAVIS_START_TIME,finish=$TRAVIS_END_TIME,duration=$(($TRAVIS_END_TIME - $TRAVIS_START_TIME))\n\e[0K"
echo -e "travis_fold:end:$TRAVIS_FOLD_NAME"
echo -e "::endgroup::"
# echo -e "travis_time:end:$TRAVIS_TIME_ID:start=$TRAVIS_START_TIME,finish=$TRAVIS_END_TIME,duration=$(($TRAVIS_END_TIME - $TRAVIS_START_TIME))\n\e[0K"
# echo -e "travis_fold:end:$TRAVIS_FOLD_NAME"
echo -e "\e[0K\e[${_COLOR}mFunction $TRAVIS_FOLD_NAME takes $(( $TIME_ELAPSED_SECONDS / 60 )) min $(( $TIME_ELAPSED_SECONDS % 60 )) sec\e[0m"
}

Expand Down
2 changes: 1 addition & 1 deletion lisp/Makefile.LinuxARM
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ THREADDEP=mthread_posix.c
#THREADDEP=pthreads.c

# If you don't like optimization, comment out the next line.
OFLAGS=-O2
OFLAGS=-O2 -fno-omit-frame-pointer

# link-editor's default flags ?-rdynamic
SOFLAGS:= $(LDFLAGS) -shared -Xlinker -build-id
Expand Down
18 changes: 15 additions & 3 deletions lisp/c/eus.c
Original file line number Diff line number Diff line change
Expand Up @@ -776,11 +776,15 @@ static void initclasses()
/* 16 ---new for Solaris */
LDMODULE=basicclass("LOAD-MODULE",C_CODE, &ldmodulecp,
#if ARM // ARM uses entry2 in struct ldmodule in eus.h
4,"ENTRY2",
5,"ENTRY2",
#else
3,
#endif
"SYMBOL-TABLE","OBJECT-FILE", "HANDLE");
"SYMBOL-TABLE","OBJECT-FILE", "HANDLE"
#if ARM
,"HANDLE2"
#endif
);
C_LDMOD=speval(LDMODULE);
/*17*/
LABREF=basicclass("LABEL-REFERENCE",C_OBJECT,&labrefcp,4,
Expand Down Expand Up @@ -971,7 +975,15 @@ static void initfeatures()
/*system function module*/
sysmod=makemodule(ctx,0);
sysmod->c.ldmod.codevec=makeint(0);
sysmod->c.ldmod.handle=makeint((eusinteger_t)dlopen(0, RTLD_LAZY)>>2);
void *handle = dlopen(0, RTLD_LAZY);
sysmod->c.ldmod.handle=makeint((eusinteger_t)handle>>2);
#if ARM
#if (WORD_SIZE == 64)
sysmod->c.ldmod.handle2=makeint((eusinteger_t)handle&0x00000000ffffffff);
#else
sysmod->c.ldmod.handle2=makeint((eusinteger_t)handle&0x0000ffff);
#endif
#endif
sysobj=cons(ctx,sysmod, sysobj);
}

Expand Down
6 changes: 5 additions & 1 deletion lisp/c/eus.h
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,11 @@ struct ldmodule { /*foreign language object module*/
#endif
pointer symtab;
pointer objname;
pointer handle;}; /* dl's handle */
pointer handle;
#if ARM
pointer handle2; /* some archtecture did not set code on 4 byte alignment */
#endif
};

struct closure {
pointer codevec;
Expand Down
23 changes: 16 additions & 7 deletions lisp/c/eval.c
Original file line number Diff line number Diff line change
Expand Up @@ -1003,7 +1003,7 @@ extern int exec_function_f(void (*)(), int *, int *, int, int *);
"ldr r3, [r7, #60]\n\t" /* i */ \
/* https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/function-parameters-on-32-bit-arm */ \
"lsl r4, r3, #2\n\t" /* r4 = i * 2 */ \
"ldr r1, [r7, #80]\n\t" /* vargv[0] */ \
"ldr r1, [r7, #16]\n\t" /* vargv[0] */ \
"add r1, r1, r4\n\t" /* vargv[i] */ \
"add r2, sp, r4\n\t" /* stack[i] */ \
"ldr r0, [r1]\n\t" \
Expand Down Expand Up @@ -1050,41 +1050,45 @@ __asm__ (".align 4\n"
".global exec_function_i\n\t"
".type exec_function_i, %function\n"
"exec_function_i:\n\t"
"push {r7, lr}\n\t"
"push {r3, r4, r5, r6, r7, lr}\n\t"
"sub sp, sp, #136\n\t"
"add r7, sp, #64\n\t"
"str r0, [r7, #12]\n\t" // fc
"str r1, [r7, #8]\n\t" // iargv
"str r2, [r7, #4]\n\t" // fargv
"str r3, [r7]\n\t" // vcntr
"ldr r0, [r7, #96]\n\t" // get 5th argument (vargv)
"str r0, [r7, #16]\n\t" // store vargv to #16
exec_function_asm("FUNCI")
// retval
"adds r7, r7, #72\n\t"
"mov sp, r7\n\t"
"@ sp needed @\n\t"
"pop {r7, pc}\n\t"
"pop {r3, r4, r5, r6, r7, pc}\n\t"
".size exec_function_i, .-exec_function_i\n\t"
);

__asm__ (".align 4\n"
".global exec_function_f\n\t"
".type exec_function_f, %function\n"
"exec_function_f:\n\t"
"push {r7, lr}\n\t"
"push {r3, r4, r5, r6, r7, lr}\n\t"
"sub sp, sp, #136\n\t"
"add r7, sp, #64\n\t"
"str r0, [r7, #12]\n\t" // fc
"str r1, [r7, #8]\n\t" // iargv
"str r2, [r7, #4]\n\t" // fargv
"str r3, [r7]\n\t" // vcntr
"ldr r0, [r7, #96]\n\t" // get 5th argument (vargv)
"str r0, [r7, #16]\n\t" // store vargv to #16
exec_function_asm("FUNCF")
// retval
"vmov r0, s0 @ <retval>\n\t"
"vmov r1, s1 @ <retval>\n\t"
"adds r7, r7, #72\n\t"
"mov sp, r7\n\t"
"@ sp needed @\n\t"
"pop {r7, pc}\n\t"
"pop {r3, r4, r5, r6, r7, pc}\n\t"
".size exec_function_f, .-exec_function_f\n\t"
);

Expand Down Expand Up @@ -1119,8 +1123,13 @@ pointer args[];
double f;

if (code->c.fcode.entry2 != NIL) {
#if (WORD_SIZE == 64)
ifunc = (eusinteger_t (*)())((((eusinteger_t)ifunc)&0xffffffff00000000)
| (intval(code->c.fcode.entry2)&0x00000000ffffffff));
#else
ifunc = (eusinteger_t (*)())((((eusinteger_t)ifunc)&0xffff0000)
| (intval(code->c.fcode.entry2)&0x0000ffff));
#endif
/* R.Hanai 090726 */
}
while (iscons(paramtypes)) {
Expand Down Expand Up @@ -1306,13 +1315,13 @@ pointer args[];
if (resulttype==K_FLOAT || resulttype==K_FLOAT32) {
union {
eusfloat_t f;
#if __ARM_ARCH==4
#if __ARM_ARCH==4 || __ARM_ARCH==5
eusinteger_t i; // ARM 32bit armel
#else
eusfloat_t i; // Intel 32bit x86
#endif
} n;
#if __ARM_ARCH==4
#if __ARM_ARCH==4 || __ARM_ARCH==5
typedef eusinteger_t ifunc_ret_type;
#else
typedef double ifunc_ret_type;
Expand Down
3 changes: 3 additions & 0 deletions lisp/c/makes.c
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,9 @@ int size;
mod->c.ldmod.symtab=NIL;
mod->c.ldmod.objname=NIL;
mod->c.ldmod.handle=NIL;
#if ARM
mod->c.ldmod.handle2=NIL;
#endif
return(mod);}

pointer makeclosure(code,quote,f,e0,e1,e2)
Expand Down
29 changes: 22 additions & 7 deletions lisp/c/unixcall.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ pointer LOCALTIME(ctx,n,argv)
register context *ctx;
int n;
pointer argv[];
{ long clock;
{ time_t clock; /* sizoef time(0) is machine dependent and may differ from long */
struct tm *tms;
pointer timevec;
pointer *tv;
Expand Down Expand Up @@ -203,6 +203,9 @@ register pointer argv[];
#else
atp=asctime_r(tms,at,ASCTIME_STRLEN); /* asctime --> asctime_r */
#endif
if (atp == NULL) {
error(E_USER,(pointer)strerror(errno));
}
return(makestring(atp,strlen(atp)));}

#if !Solaris2
Expand All @@ -211,16 +214,28 @@ pointer GETRUSAGE(ctx,n,argv)
register context *ctx;
int n; pointer argv[];
{ register int who,i;
long rusage[18];
struct rusage usage;
eusfloat_t utime,stime;
register pointer r=NIL;
numunion nu;

ckarg(1); who=ckintval(argv[0]);
getrusage(who,(struct rusage *)rusage);
utime=rusage[0]+rusage[1]*1.0e-6;
stime=rusage[2]+rusage[3]*1.0e-6;
for (i=17; i>=4; i--) r=cons(ctx,makeint(rusage[i]),r);
getrusage(who,&usage);
utime=usage.ru_utime.tv_sec+usage.ru_utime.tv_usec*1.0e-6;
stime=usage.ru_stime.tv_sec+usage.ru_stime.tv_usec*1.0e-6;
r = cons(ctx, makeint(usage.ru_nivcsw), r); // 4
r = cons(ctx, makeint(usage.ru_nvcsw), r); // 5
r = cons(ctx, makeint(usage.ru_nsignals), r); // 6
r = cons(ctx, makeint(usage.ru_msgrcv), r); // 7
r = cons(ctx, makeint(usage.ru_msgsnd), r); // 8
r = cons(ctx, makeint(usage.ru_oublock), r); // 9
r = cons(ctx, makeint(usage.ru_inblock), r); // 10
r = cons(ctx, makeint(usage.ru_nswap), r); // 11
r = cons(ctx, makeint(usage.ru_majflt), r); // 12
r = cons(ctx, makeint(usage.ru_minflt), r); // 13
r = cons(ctx, makeint(usage.ru_isrss), r); // 14
r = cons(ctx, makeint(usage.ru_idrss), r); // 15
r = cons(ctx, makeint(usage.ru_ixrss), r); // 16
r = cons(ctx, makeint(usage.ru_maxrss), r); // 17
r=cons(ctx,makeflt(stime),r); r=cons(ctx,makeflt(utime),r);
/*(utime stime maxrss ixrss idrss isrss page-reclaims page-faults swap
inblock outblock msgsnd msgrcv nsignals
Expand Down
12 changes: 11 additions & 1 deletion lisp/xwindow/xforeign.c.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,17 @@ char *xentry;
dlhandle=(eusinteger_t)dlopen("libX11.dylib", RTLD_LAZY);
entry=(eusinteger_t)dlsym((void *)dlhandle, xentry);
#else
entry=(eusinteger_t)dlsym((void *)((eusinteger_t)(sysmod->c.ldmod.handle) & ~3), xentry);
eusinteger_t dlhandle = (eusinteger_t)(sysmod->c.ldmod.handle) & ~3;
#if ARM
if ( sysmod->c.ldmod.handle2 != NIL ) {
#if (WORD_SIZE == 64)
dlhandle = (dlhandle & 0xffffffff00000000) | (intval(sysmod->c.ldmod.handle2) & 0x00000000ffffffff);
#else
dlhandle = (dlhandle & 0xffff0000) | (intval(sysmod->c.ldmod.handle2) & 0x0000ffff);
#endif
}
#endif
entry=(eusinteger_t)dlsym((void *)(dlhandle), xentry);
#endif
if (entry){
xsym=intern(ctx,lname, len-1, xpkg);
Expand Down
8 changes: 8 additions & 0 deletions test/time.l
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@

)

(deftest test-asctime
;; asctime segfaults on arm32:sid
(unix::asctime (unix::localtime)) ;; check if asctime works
(assert (string=
(unix::asctime #(41 26 15 27 8 125 6 269 nil ("JST" "JST")))
(format nil "Sat Sep 27 15:26:41 2025~%")))
)

(eval-when (load eval)
(run-all-tests)
(exit))
Expand Down