我想修改rdtsc
汇编指令的实现,即我想在基本级别修改调用rdtsc
汇编指令时会发生什么。
我正在使用 Intel Core2 Duo 处理器上运行的 QEMU虚拟机。 指令集架构为i686
。
要找到处理rdtsc
来电的 QEMU 源代码部分,我在整个源代码上做了grep
,并找到了函数helper_rdtsc()
in文件target-i386/misc_helper.c
是关键嫌疑人。所以我在这个文件中做了以下修改:
.
.
/* modification start at header inclusion */
#include <stdio.h>
#include <inttypes.h>
static const uint64_t myconst = 81926483;
/* modification end at header inclusion */
.
.
void helper_rdtsc(CPUX86State *env)
{
uint64_t val;
if ((env->cr[4] & CR4_TSD_MASK) && ((env->hflags & HF_CPL_MASK) != 0)) {
raise_exception(env, EXCP0D_GPF);
}
cpu_svm_check_intercept_param(env, SVM_EXIT_RDTSC, 0);
val = cpu_get_tsc(env) + env->tsc_offset;
/* modification start within helper_rdtsc() */
val = val % myconst;
printf("rdtsc return = %" PRIu64 "//printed from source code\n", val);
/* modification end within helper_rdtsc() */
env->regs[R_EAX] = (uint32_t)(val);
env->regs[R_EDX] = (uint32_t)(val >> 32);
}
然后我从这个修改后的源代码中编译了 QEMU ,将 Ubuntu 12.04 挂载为Guest-OS,并运行了一个访问{{C
的测试rdtsc
代码1}}通过以下函数:
int64_t myrdtsc(void)
{
int64_t tick;
asm volatile("rdtsc" : "=A" (tick));
return tick;
}
当然,在执行此测试代码时,我希望通过tick
返回的值小于myconst
。我还期望将rdtsc return = <somevalue> //printed from source code
语句打印为rdtsc
调用的一部分。然而,没有一件事发生。
我是否修改了 QEMU 源代码的右侧部分?如果是,我所做的修改是否有错误?如果不是,我应该在源代码中查找哪里进行所需的修改?
答案 0 :(得分:0)
嗯,事实上,我找到了另一个更可疑的地方:target-i386 / translate.c.A之后我在那里添加了一个printf并重新编译并安装它。我什么都没想要。所以我猜你有将您的工作降至VMM级别,即KVM源代码。