Какая польза от% c во встроенной сборке x86_64? - PullRequest
2 голосов
/ 25 августа 2010

Я читаю исходный код KVM и сталкиваюсь со встроенной сборкой x86_64. В каком коде в следующем коде используется "% c"? Это новая функция встроенной сборки x86_64? Любые ссылки на новые функции встроенной сборки x86_64 в gcc?

Большое спасибо

    /* Check if vmlaunch of vmresume is needed */
    "cmp $0, %1 \n\t"
    /* Load guest registers.  Don't clobber flags. */
#ifdef CONFIG_X86_64
    "mov %c[cr2](%3), %%rax \n\t"
    "mov %%rax, %%cr2 \n\t"
    "mov %c[rax](%3), %%rax \n\t"
    "mov %c[rbx](%3), %%rbx \n\t"
    "mov %c[rdx](%3), %%rdx \n\t"

Ответы [ 2 ]

4 голосов
/ 25 августа 2010

Вы можете увидеть, как это работает, в конце оператора asm:

      : : "c"(vmx), "d"((unsigned long)HOST_RSP),
    [launched]"i"(offsetof(struct vcpu_vmx, launched)),
    [fail]"i"(offsetof(struct vcpu_vmx, fail)),
    [rax]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_RAX])),
    [rbx]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_RBX])),

%3 (это %0 в моем исходном дереве) является ссылкой на локальную переменную vmx, а %c[rax], %c[cr2] и т. Д. Являются смещениями целочисленной константы соответствующих значений в struct vcpu_vmx, что vmx указывает на (%c означает «постоянный»).

Итак, строка:

mov %c[cr2](%0), %%rax

перемещает содержимое vmx->vcpu.arch.cr2 в %rax.

0 голосов
/ 25 августа 2010

Это операнд . В основном позволяет связать переменную C с регистром. Должно быть допустимо и для 32-битной системы, но, вероятно, здесь есть какая-то специфическая причина для использования ее только для 64-битной версии.

...