-
-
Notifications
You must be signed in to change notification settings - Fork 410
Open
Description
Hi,
Testcase: test/hotspot/jtreg/vmTestbase/nsk/stress/jni/gclocker/libgcl001.cpp
Thanks for #1362 there is an opportunity to create libbox64.so for host (LoongArch64) Java to emulated guest libX64.so. And libbox64.so chose memExist to check the address whether belongs to host or guest, for example, 0x3f0b051d4d belongs to guest, then libbox64.so emulated via RunFunctionWithEmu. But it reproduced memExist wrongly check the guest address to host for multi-threading testcase:
#0 memExist (addr=270616506368) at /home/zhaixiang/repo/libbox64/src/custommem.c:1982
#1 0x000000ff85e6c29c in DynaRun (emu=emu@entry=0xff8c1b79d0) at /home/zhaixiang/repo/libbox64/src/dynarec/dynarec.c:239
#2 0x000000ff85e6c400 in DynaCall (emu=emu@entry=0xff8c1b79d0, addr=<optimized out>) at /home/zhaixiang/repo/libbox64/src/dynarec/dynarec.c:123
#3 0x000000ff85ea35b4 in RunFunctionWithEmu (emu=emu@entry=0xff8c1b79d0, QuitOnLongJump=QuitOnLongJump@entry=0, fnc=fnc@entry=270616506368, nargs=nargs@entry=3) at /home/zhaixiang/repo/libbox64/src/tools/callback.c:374
#4 0x000000ff85e6ef44 in RunElfInit (h=0xff8c224040, emu=emu@entry=0xff8c1b79d0) at /home/zhaixiang/repo/libbox64/src/elfs/elfloader.c:1206
#5 0x000000ff85e6f000 in RunElfInit (emu=0xff8c1b79d0, h=<optimized out>) at /home/zhaixiang/repo/libbox64/src/elfs/elfloader.c:1177
#6 RunDeferredElfInit (emu=0xff8c1b79d0) at /home/zhaixiang/repo/libbox64/src/elfs/elfloader.c:1253
#7 0x000000ff865572b8 in my_dlopen (emu=0xff8c1b79d0, filename=filename@entry=0xff8c0058b0, flag=flag@entry=1) at /home/zhaixiang/repo/libbox64/src/wrapped/wrappedlibdl.c:251
...
(gdb) p/x addr
$1 = 0x3f02003000
(gdb) info threads
Id Target Id Frame
1 Thread 0xfff7da4710 (LWP 19634) "java" 0x000000fff7db56f8 in __GI___pthread_timedjoin_ex (threadid=1099350323680, thread_return=thread_return@entry=0xffffff1648, abstime=abstime@entry=0x0, block=block@entry=true) at pthread_join_common.c:89
2 Thread 0xfff662b1e0 (LWP 19744) "java" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff002fb78) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
3 Thread 0xfff5a731e0 (LWP 19753) "GC Thread#0" futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xfff004b428) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
4 Thread 0xfff586f1e0 (LWP 19754) "G1 Main Marker" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff7d749e8 <mutex_init()::G1CGC_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
5 Thread 0xfff566b1e0 (LWP 19755) "G1 Conc#0" futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xfff004fcd8) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
6 Thread 0xfff50571e0 (LWP 19756) "G1 Refi..ontrol" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff0070828) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
7 Thread 0xfff4e531e0 (LWP 19757) "G1 Refi..kers#0" futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xfff0071518) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
8 Thread 0xfff4c4f1e0 (LWP 19758) "G1 Service" futex_reltimed_wait_cancelable (private=0, reltime=0xfff4c4e748, expected=0, futex_word=0xfff0072b48) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
11 Thread 0xfff48131e0 (LWP 19761) "VM Peri..Thread" futex_reltimed_wait_cancelable (private=0, reltime=0xfff4812728, expected=0, futex_word=0xfff7d735c8 <mutex_init()::PeriodicTask_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
12 Thread 0xfff4a171e0 (LWP 19762) "VM Thread" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff7d724b8 <mutex_init()::VMOperation_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
13 Thread 0xfff44eb1e0 (LWP 19763) "Referen..andler" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff7d72608 <mutex_init()::Heap_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
14 Thread 0xfff42e71e0 (LWP 19764) "Finalizer" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff00a3b78) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
15 Thread 0xffd82af1e0 (LWP 19765) "Signal ..atcher" futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xfff7d7a600 <sig_semaphore>) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
16 Thread 0xffc9a1b1e0 (LWP 19766) "Service Thread" futex_reltimed_wait_cancelable (private=0, reltime=0xffc9a1a668, expected=0, futex_word=0xfff7d743c8 <mutex_init()::Service_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
17 Thread 0xffc98171e0 (LWP 19767) "Monitor..Thread" futex_reltimed_wait_cancelable (private=0, reltime=0xffc9816638, expected=0, futex_word=0xfff7d74438 <mutex_init()::MonitorDeflation_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
18 Thread 0xffc96131e0 (LWP 19768) "C2 Comp..hread0" futex_reltimed_wait_cancelable (private=0, reltime=0xffc9612528, expected=0, futex_word=0xfff7d73b0c <mutex_init()::MethodCompileQueue_lock_storage+92>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
19 Thread 0xffc940f1e0 (LWP 19769) "C1 Comp..hread0" futex_reltimed_wait_cancelable (private=0, reltime=0xffc940e528, expected=0, futex_word=0xfff7d73b0c <mutex_init()::MethodCompileQueue_lock_storage+92>) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
20 Thread 0xffc920b1e0 (LWP 19770) "Notific..Thread" futex_wait_cancelable (private=0, expected=0, futex_word=0xfff7d74358 <mutex_init()::Notification_lock_storage+88>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
21 Thread 0xffc90071e0 (LWP 19771) "Common-Cleaner" futex_reltimed_wait_cancelable (private=0, reltime=0xffc9005e38, expected=0, futex_word=0xfff00e2f78) at ../sysdeps/unix/sysv/linux/futex-internal.h:142
* 22 Thread 0xffc8e031e0 (LWP 19772) "MainThread" memExist (addr=270616506368) at /home/zhaixiang/repo/libbox64/src/custommem.c:1982
How about?
diff --git a/src/custommem.c b/src/custommem.c
index a35e2822e..56fd88b6e 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -2829,7 +2829,10 @@ int getMmapped(uintptr_t addr)
int memExist(uintptr_t addr)
{
- return rb_get(mapallmem, addr);
+ LOCK_PROT_FAST();
+ int ret = rb_get(mapallmem, addr);
+ UNLOCK_PROT_FAST();
+ return ret;
}
#define LOWEST (void*)0x10000
Thanks,
Leslie Zhai
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels