如何在QEMU虚拟机上修改x86汇编指令的实现

时间:2014-03-06 18:56:59

标签: assembly x86 qemu rdtsc

我想修改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 源代码的右侧部分?如果是,我所做的修改是否有错误?如果不是,我应该在源代码中查找哪里进行所需的修改?

1 个答案:

答案 0 :(得分:0)

嗯,事实上,我找到了另一个更可疑的地方:target-i386 / translate.c.A之后我在那里添加了一个printf并重新编译并安装它。我什么都没想要。所以我猜你有将您的工作降至VMM级别,即KVM源代码。