Skip to content

Commit 1c76a5c

Browse files
authored
Merge pull request #534 from k-okada/fix_arm32
add armhf/armel test,
2 parents 41e3cd3 + 5f0630a commit 1c76a5c

File tree

10 files changed

+92
-24
lines changed

10 files changed

+92
-24
lines changed

.github/workflows/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ jobs:
9393
include:
9494
- DOCKER_IMAGE: arm64v8/ubuntu:jammy
9595
- DOCKER_IMAGE: arm64v8/ubuntu:noble
96+
- DOCKER_IMAGE: arm32v5/debian:sid
97+
- DOCKER_IMAGE: arm32v7/debian:sid
9698
- DOCKER_IMAGE: arm64v8/debian:sid
9799
fail-fast: false
98100

.travis.sh

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,26 @@ function travis_time_start {
1111
fi
1212
TRAVIS_TIME_ID=$(head /dev/urandom | base64 | head -c 8)
1313
TRAVIS_FOLD_NAME=$1
14-
echo -e "\e[0Ktravis_fold:start:$TRAVIS_FOLD_NAME"
15-
echo -e "\e[0Ktravis_time:start:$TRAVIS_TIME_ID"
14+
echo -e "::group::$TRAVIS_FOLD_NAME"
15+
# echo -e "\e[0Ktravis_fold:start:$TRAVIS_FOLD_NAME"
16+
# echo -e "\e[0Ktravis_time:start:$TRAVIS_TIME_ID"
1617
set -x # enable debug information
1718
}
1819
function travis_time_end {
1920
set +x # disable debug information
2021
_COLOR=${1:-32}
22+
if [ "$_COLOR" -le 30 ]; then
23+
_COLOR=31 # red
24+
fi
2125
if [ "$TRAVIS_OS_NAME" == "osx" ]; then
2226
TRAVIS_END_TIME=$(( $(date +%s)*1000000000 ))
2327
else
2428
TRAVIS_END_TIME=$(date +%s%N)
2529
fi
2630
TIME_ELAPSED_SECONDS=$(( ($TRAVIS_END_TIME - $TRAVIS_START_TIME)/1000000000 ))
27-
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"
28-
echo -e "travis_fold:end:$TRAVIS_FOLD_NAME"
31+
echo -e "::endgroup::"
32+
# 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"
33+
# echo -e "travis_fold:end:$TRAVIS_FOLD_NAME"
2934
echo -e "\e[0K\e[${_COLOR}mFunction $TRAVIS_FOLD_NAME takes $(( $TIME_ELAPSED_SECONDS / 60 )) min $(( $TIME_ELAPSED_SECONDS % 60 )) sec\e[0m"
3035
}
3136

lisp/Makefile.LinuxARM

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ THREADDEP=mthread_posix.c
106106
#THREADDEP=pthreads.c
107107

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

111111
# link-editor's default flags ?-rdynamic
112112
SOFLAGS:= $(LDFLAGS) -shared -Xlinker -build-id

lisp/c/eus.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -776,11 +776,15 @@ static void initclasses()
776776
/* 16 ---new for Solaris */
777777
LDMODULE=basicclass("LOAD-MODULE",C_CODE, &ldmodulecp,
778778
#if ARM // ARM uses entry2 in struct ldmodule in eus.h
779-
4,"ENTRY2",
779+
5,"ENTRY2",
780780
#else
781781
3,
782782
#endif
783-
"SYMBOL-TABLE","OBJECT-FILE", "HANDLE");
783+
"SYMBOL-TABLE","OBJECT-FILE", "HANDLE"
784+
#if ARM
785+
,"HANDLE2"
786+
#endif
787+
);
784788
C_LDMOD=speval(LDMODULE);
785789
/*17*/
786790
LABREF=basicclass("LABEL-REFERENCE",C_OBJECT,&labrefcp,4,
@@ -971,7 +975,15 @@ static void initfeatures()
971975
/*system function module*/
972976
sysmod=makemodule(ctx,0);
973977
sysmod->c.ldmod.codevec=makeint(0);
974-
sysmod->c.ldmod.handle=makeint((eusinteger_t)dlopen(0, RTLD_LAZY)>>2);
978+
void *handle = dlopen(0, RTLD_LAZY);
979+
sysmod->c.ldmod.handle=makeint((eusinteger_t)handle>>2);
980+
#if ARM
981+
#if (WORD_SIZE == 64)
982+
sysmod->c.ldmod.handle2=makeint((eusinteger_t)handle&0x00000000ffffffff);
983+
#else
984+
sysmod->c.ldmod.handle2=makeint((eusinteger_t)handle&0x0000ffff);
985+
#endif
986+
#endif
975987
sysobj=cons(ctx,sysmod, sysobj);
976988
}
977989

lisp/c/eus.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,11 @@ struct ldmodule { /*foreign language object module*/
256256
#endif
257257
pointer symtab;
258258
pointer objname;
259-
pointer handle;}; /* dl's handle */
259+
pointer handle;
260+
#if ARM
261+
pointer handle2; /* some archtecture did not set code on 4 byte alignment */
262+
#endif
263+
};
260264

261265
struct closure {
262266
pointer codevec;

lisp/c/eval.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,7 +1003,7 @@ extern int exec_function_f(void (*)(), int *, int *, int, int *);
10031003
"ldr r3, [r7, #60]\n\t" /* i */ \
10041004
/* https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/function-parameters-on-32-bit-arm */ \
10051005
"lsl r4, r3, #2\n\t" /* r4 = i * 2 */ \
1006-
"ldr r1, [r7, #80]\n\t" /* vargv[0] */ \
1006+
"ldr r1, [r7, #16]\n\t" /* vargv[0] */ \
10071007
"add r1, r1, r4\n\t" /* vargv[i] */ \
10081008
"add r2, sp, r4\n\t" /* stack[i] */ \
10091009
"ldr r0, [r1]\n\t" \
@@ -1050,41 +1050,45 @@ __asm__ (".align 4\n"
10501050
".global exec_function_i\n\t"
10511051
".type exec_function_i, %function\n"
10521052
"exec_function_i:\n\t"
1053-
"push {r7, lr}\n\t"
1053+
"push {r3, r4, r5, r6, r7, lr}\n\t"
10541054
"sub sp, sp, #136\n\t"
10551055
"add r7, sp, #64\n\t"
10561056
"str r0, [r7, #12]\n\t" // fc
10571057
"str r1, [r7, #8]\n\t" // iargv
10581058
"str r2, [r7, #4]\n\t" // fargv
10591059
"str r3, [r7]\n\t" // vcntr
1060+
"ldr r0, [r7, #96]\n\t" // get 5th argument (vargv)
1061+
"str r0, [r7, #16]\n\t" // store vargv to #16
10601062
exec_function_asm("FUNCI")
10611063
// retval
10621064
"adds r7, r7, #72\n\t"
10631065
"mov sp, r7\n\t"
10641066
"@ sp needed @\n\t"
1065-
"pop {r7, pc}\n\t"
1067+
"pop {r3, r4, r5, r6, r7, pc}\n\t"
10661068
".size exec_function_i, .-exec_function_i\n\t"
10671069
);
10681070

10691071
__asm__ (".align 4\n"
10701072
".global exec_function_f\n\t"
10711073
".type exec_function_f, %function\n"
10721074
"exec_function_f:\n\t"
1073-
"push {r7, lr}\n\t"
1075+
"push {r3, r4, r5, r6, r7, lr}\n\t"
10741076
"sub sp, sp, #136\n\t"
10751077
"add r7, sp, #64\n\t"
10761078
"str r0, [r7, #12]\n\t" // fc
10771079
"str r1, [r7, #8]\n\t" // iargv
10781080
"str r2, [r7, #4]\n\t" // fargv
10791081
"str r3, [r7]\n\t" // vcntr
1082+
"ldr r0, [r7, #96]\n\t" // get 5th argument (vargv)
1083+
"str r0, [r7, #16]\n\t" // store vargv to #16
10801084
exec_function_asm("FUNCF")
10811085
// retval
10821086
"vmov r0, s0 @ <retval>\n\t"
10831087
"vmov r1, s1 @ <retval>\n\t"
10841088
"adds r7, r7, #72\n\t"
10851089
"mov sp, r7\n\t"
10861090
"@ sp needed @\n\t"
1087-
"pop {r7, pc}\n\t"
1091+
"pop {r3, r4, r5, r6, r7, pc}\n\t"
10881092
".size exec_function_f, .-exec_function_f\n\t"
10891093
);
10901094

@@ -1119,8 +1123,13 @@ pointer args[];
11191123
double f;
11201124

11211125
if (code->c.fcode.entry2 != NIL) {
1126+
#if (WORD_SIZE == 64)
11221127
ifunc = (eusinteger_t (*)())((((eusinteger_t)ifunc)&0xffffffff00000000)
11231128
| (intval(code->c.fcode.entry2)&0x00000000ffffffff));
1129+
#else
1130+
ifunc = (eusinteger_t (*)())((((eusinteger_t)ifunc)&0xffff0000)
1131+
| (intval(code->c.fcode.entry2)&0x0000ffff));
1132+
#endif
11241133
/* R.Hanai 090726 */
11251134
}
11261135
while (iscons(paramtypes)) {
@@ -1306,13 +1315,13 @@ pointer args[];
13061315
if (resulttype==K_FLOAT || resulttype==K_FLOAT32) {
13071316
union {
13081317
eusfloat_t f;
1309-
#if __ARM_ARCH==4
1318+
#if __ARM_ARCH==4 || __ARM_ARCH==5
13101319
eusinteger_t i; // ARM 32bit armel
13111320
#else
13121321
eusfloat_t i; // Intel 32bit x86
13131322
#endif
13141323
} n;
1315-
#if __ARM_ARCH==4
1324+
#if __ARM_ARCH==4 || __ARM_ARCH==5
13161325
typedef eusinteger_t ifunc_ret_type;
13171326
#else
13181327
typedef double ifunc_ret_type;

lisp/c/makes.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,9 @@ int size;
501501
mod->c.ldmod.symtab=NIL;
502502
mod->c.ldmod.objname=NIL;
503503
mod->c.ldmod.handle=NIL;
504+
#if ARM
505+
mod->c.ldmod.handle2=NIL;
506+
#endif
504507
return(mod);}
505508

506509
pointer makeclosure(code,quote,f,e0,e1,e2)

lisp/c/unixcall.c

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ pointer LOCALTIME(ctx,n,argv)
132132
register context *ctx;
133133
int n;
134134
pointer argv[];
135-
{ long clock;
135+
{ time_t clock; /* sizoef time(0) is machine dependent and may differ from long */
136136
struct tm *tms;
137137
pointer timevec;
138138
pointer *tv;
@@ -203,6 +203,9 @@ register pointer argv[];
203203
#else
204204
atp=asctime_r(tms,at,ASCTIME_STRLEN); /* asctime --> asctime_r */
205205
#endif
206+
if (atp == NULL) {
207+
error(E_USER,(pointer)strerror(errno));
208+
}
206209
return(makestring(atp,strlen(atp)));}
207210

208211
#if !Solaris2
@@ -211,16 +214,28 @@ pointer GETRUSAGE(ctx,n,argv)
211214
register context *ctx;
212215
int n; pointer argv[];
213216
{ register int who,i;
214-
long rusage[18];
217+
struct rusage usage;
215218
eusfloat_t utime,stime;
216219
register pointer r=NIL;
217220
numunion nu;
218-
219221
ckarg(1); who=ckintval(argv[0]);
220-
getrusage(who,(struct rusage *)rusage);
221-
utime=rusage[0]+rusage[1]*1.0e-6;
222-
stime=rusage[2]+rusage[3]*1.0e-6;
223-
for (i=17; i>=4; i--) r=cons(ctx,makeint(rusage[i]),r);
222+
getrusage(who,&usage);
223+
utime=usage.ru_utime.tv_sec+usage.ru_utime.tv_usec*1.0e-6;
224+
stime=usage.ru_stime.tv_sec+usage.ru_stime.tv_usec*1.0e-6;
225+
r = cons(ctx, makeint(usage.ru_nivcsw), r); // 4
226+
r = cons(ctx, makeint(usage.ru_nvcsw), r); // 5
227+
r = cons(ctx, makeint(usage.ru_nsignals), r); // 6
228+
r = cons(ctx, makeint(usage.ru_msgrcv), r); // 7
229+
r = cons(ctx, makeint(usage.ru_msgsnd), r); // 8
230+
r = cons(ctx, makeint(usage.ru_oublock), r); // 9
231+
r = cons(ctx, makeint(usage.ru_inblock), r); // 10
232+
r = cons(ctx, makeint(usage.ru_nswap), r); // 11
233+
r = cons(ctx, makeint(usage.ru_majflt), r); // 12
234+
r = cons(ctx, makeint(usage.ru_minflt), r); // 13
235+
r = cons(ctx, makeint(usage.ru_isrss), r); // 14
236+
r = cons(ctx, makeint(usage.ru_idrss), r); // 15
237+
r = cons(ctx, makeint(usage.ru_ixrss), r); // 16
238+
r = cons(ctx, makeint(usage.ru_maxrss), r); // 17
224239
r=cons(ctx,makeflt(stime),r); r=cons(ctx,makeflt(utime),r);
225240
/*(utime stime maxrss ixrss idrss isrss page-reclaims page-faults swap
226241
inblock outblock msgsnd msgrcv nsignals

lisp/xwindow/xforeign.c.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,17 @@ char *xentry;
433433
dlhandle=(eusinteger_t)dlopen("libX11.dylib", RTLD_LAZY);
434434
entry=(eusinteger_t)dlsym((void *)dlhandle, xentry);
435435
#else
436-
entry=(eusinteger_t)dlsym((void *)((eusinteger_t)(sysmod->c.ldmod.handle) & ~3), xentry);
436+
eusinteger_t dlhandle = (eusinteger_t)(sysmod->c.ldmod.handle) & ~3;
437+
#if ARM
438+
if ( sysmod->c.ldmod.handle2 != NIL ) {
439+
#if (WORD_SIZE == 64)
440+
dlhandle = (dlhandle & 0xffffffff00000000) | (intval(sysmod->c.ldmod.handle2) & 0x00000000ffffffff);
441+
#else
442+
dlhandle = (dlhandle & 0xffff0000) | (intval(sysmod->c.ldmod.handle2) & 0x0000ffff);
443+
#endif
444+
}
445+
#endif
446+
entry=(eusinteger_t)dlsym((void *)(dlhandle), xentry);
437447
#endif
438448
if (entry){
439449
xsym=intern(ctx,lname, len-1, xpkg);

test/time.l

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@
6262

6363
)
6464

65+
(deftest test-asctime
66+
;; asctime segfaults on arm32:sid
67+
(unix::asctime (unix::localtime)) ;; check if asctime works
68+
(assert (string=
69+
(unix::asctime #(41 26 15 27 8 125 6 269 nil ("JST" "JST")))
70+
(format nil "Sat Sep 27 15:26:41 2025~%")))
71+
)
72+
6573
(eval-when (load eval)
6674
(run-all-tests)
6775
(exit))

0 commit comments

Comments
 (0)