0

PMC1レジスタに書き込みたいので、RCXを188に設定したいです。

WRMSR 命令を使用するために使用するコードは最後に添付されています。問題は、eax および ecx 値 (64 ビット) をマクロに渡すことですが、%rcx レジスタは常に eax 値に設定されます。

#define RTXEN_WRITE_MSR(eax, ecx)     __asm__ __volatile__(\
                                "movq %0, %%rax\n\t"\
                                "xorq %%rdx, %%rdx\n\t"\
                                "xorq %%rcx, %%rcx\n\t"\
                                "movq %1, %%rcx\n\t"\
                                "wrmsr"\
                                :\
                                :"r" (eax), "r" (ecx)\
                                :\
                                )


uint64_t eax = 0x14f2e
uint64_t edx = 0x188

printk("eax:%#018lx, edx:%#018lx\n", eax, edx);
RTXEN_WRITE_MSR(eax, ecx);

RTXEN_WRITE_MSR(eax, ecx) が実行されると、カーネル パニックが発生します。登録情報は以下の通りです。

(XEN) CPU:    1
(XEN) RIP:    e008:[<ffff82c4c02166b1>] setread_perf_counter+0x251/0x4c0
(XEN) RFLAGS: 0000000000010046   CONTEXT: hypervisor
(XEN) rax: 0000000000014f2e   rbx: ffff8308558f7718   **rcx: 0000000000014f2e**
(XEN) rdx: 0000000000000000   rsi: 000000000000000a   rdi: ffff82c4c0270640
(XEN) rbp: 0000000000000001   rsp: ffff83086bec7cd8   r8:  0000000000000004
(XEN) r9:  0000000000000004   r10: 0000000000000004   r11: 0000000000000400
(XEN) r12: 0000000000014f2e   r13: 0000000200000000   r14: ffff83086bec7dd8
(XEN) r15: 00000000000000fb   cr0: 000000008005003b   cr4: 00000000001426f0
(XEN) cr3: 000000008ce6a000   cr2: ffff880115ca32a0
(XEN) ds: 002b   es: 002b   fs: 0000   gs: 0000   ss: e010   cs: e008

私のコードのどこが間違っているかを教えてくれる人はいますか?

4

1 に答える 1

1

コンパイラに引数を正しいレジスタにすぐに渡させることができることを知っていますか?

asm volatile (
    "wrmsr"
    :
    : "a" ((uint32_t)eax)
    , "c" ((uint32_t)ecx)
    , "d" ((uint32_t)0)
);

uint32_tコンパイラが 32 ビット レジスタ バリアント ( eaxecx、 ) を使用することを保証するための型キャストedx

Intel レジスタの制約修飾子は、http: //gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraintsで見つけることができます。

余談ですが、asm でレジスタを使用している場合は、そうしていることをコンパイラに伝える必要があります。使用するすべてのレジスターと、コンパイラーが知らないレジスターを、3 番目のコロンの後に clobber レジスター リストに入れる必要があります。

于 2014-01-31T14:33:06.210 に答える