Zsim-tlb: bug

bug

zsim-tlb simulate in icarus0

1
2
pinbin: build/opt/zsim.cpp:816: LEVEL_BASE::VOID VdsoCallPoint(LEVEL_VM::THREADID): Assertion `vdsoPatchData[tid].level' failed.
Pin app terminated abnormally due to signal 6.

locate error

1
2
3
4
5
6
VOID VdsoCallPoint(THREADID tid) {
//level=0,invalid
assert(vdsoPatchData[tid].level);
vdsoPatchData[tid].level++;
// info("vDSO internal callpoint, now level %d", vdsoPatchData[tid].level); //common
}
  • vDSO (virtual dynamic shared object) is a kernel machanism for exporting a carefully set kernel space routines (eg. not secret api, gettid() and gettimeofday()) to user
    spapce to eliminate the performance penalty of user-kernel mode switch according to wiki. vDSO
  • You can use some __vdso_getcpu() C library, and kernel will auto move it to user-space
  • vDSO overcome vsyscall(first linux-kernel machanism to accelerate syscall) drawback.
  • In zsim, vDSO have only four function enum VdsoFunc {VF_CLOCK_GETTIME, VF_GETTIMEOFDAY, VF_TIME, VF_GETCPU};

vDSO simulate part

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Instrumentation function, called for EVERY instruction
VOID VdsoInstrument(INS ins) {
ADDRINT insAddr = INS_Address(ins); //get ins addr
if (unlikely(insAddr >= vdsoStart && insAddr < vdsoEnd)) {
//INS is vdso syscall
if (vdsoEntryMap.find(insAddr) != vdsoEntryMap.end()) {
VdsoFunc func = vdsoEntryMap[insAddr];
//call VdsoEntryPoint function
//argv are: tid ,func(IARG_UINT32),arg0(LEVEL_BASE::REG_RDI),arg1(LEVEL_BASE::REG_RSI)
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR) VdsoEntryPoint, IARG_THREAD_ID, IARG_UINT32, (uint32_t)func, IARG_REG_VALUE, LEVEL_BASE::REG_RDI, IARG_REG_VALUE, LEVEL_BASE::REG_RSI, IARG_END);
} else if (INS_IsCall(ins)) { //call instruction
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR) VdsoCallPoint, IARG_THREAD_ID, IARG_END);
} else if (INS_IsRet(ins)) { //Ret instruction
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR) VdsoRetPoint, IARG_THREAD_ID, IARG_REG_REFERENCE, LEVEL_BASE::REG_RAX /* return val */, IARG_END);
}
}

//Warn on the first vsyscall code translation
if (unlikely(insAddr >= vsyscallStart && insAddr < vsyscallEnd && !vsyscallWarned)) {
warn("Instrumenting vsyscall page code --- this process executes vsyscalls, which zsim does not virtualize!");
vsyscallWarned = true;
}
}

INS_Address is from pin-kit, but INS_InsertCall is pin api.

try:

.level is just show the level of nested vsyscall. I think comment the assert which trigerd when callfunc before entryfunc is just fun.

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

Author

Shaojie Tan

Posted on

2023-09-05

Updated on

2025-01-30

Licensed under