операции с памятью qemu

Я намерен использовать Qemu для создания трассировки памяти для выполнения гостевой операционной системы x86.

Согласно вики-странице tcg, Qemu использует несколько помощников для загрузки/сохранения в целевую (гостевую) память. Этот список инструкций tcg_gen_qemu_ld8s/u, tcg_gen_qemu_ld16s/u, tcg_gen_qemu_ld32s/u, tcg_gen_qemu_ld64. (У нас есть аналогичный набор инструкций магазина). Я перехватываю все вызовы вышеуказанных функций в файле target-i386/translate.c

Тем не менее, мне все еще не хватает загрузки/сохранения определенных инструкций, таких как

cmp ecx, [r12+0x4]
mov r10b, [r13+0x0]
mov byte [rax+0xf0000], 0x0
mov byte [rax+rdx], 0x0

Вопросы :

  1. Может кто-нибудь указать на другие точки загрузки/сохранения (прямые или косвенные), которые мне не хватает??
  2. Предоставляет ли qemu единую функцию точки входа для доступа к гостевой памяти (например, guest_read()), которую можно использовать для отслеживания всех загрузок из гостевой памяти???
  3. Может кто-нибудь указать на хорошую документацию, где я могу понять, как qemu поддерживает состояние гостевой памяти??

Извините, друзья, за вводящие в заблуждение инструкции в предыдущем письме.

cmp ecx, [r12+0x4]
mov r10b, [r13+0x0]
mov byte [rax+0xf0000], 0x0
mov byte [rax+rdx], 0x0

Кажется, что все приведенные выше инструкции покрываются помощниками tcg_gen_ld/st.

Но теперь я наткнулся на другую проблему:
Я изначально думал, что все взаимодействия с гостевой памятью происходят через вспомогательные инструкции в файле translate.c. Однако я обнаружил, что вспомогательные функции для некоторых инструкций, таких как cmpxcgh8b и cmpxchg16b, на самом деле обращаются к гостевой памяти.

Итак, означает ли это, что существует более одной точки входа для чтения гостевой памяти. Может кто-нибудь объяснить, как инструкции ldq и stq переводятся для доступа к гостевой памяти??


person prathmesh.kallurkar    schedule 12.08.2012    source источник


Ответы (1)


Другие функции, загружающие данные, называются cpu_ld*_data и cpu_st*_data или cpu_ld*_data_ra и cpu_st*_data_ra. Версия _ra имеет дополнительный аргумент, который является адресом вызывающей стороны в сгенерированном коде. Он используется для вычисления адреса сбойной инструкции в случае, если загрузка или сохранение генерируют ошибку страницы.

Например, поиск cmpxchg8b дает

target/i386/mem_helper.c:void helper_cmpxchg8b(CPUX86State *env, target_ulong a0)

и внутри этой функции:

uintptr_t ra = GETPC();
...
oldv = cpu_ldq_data_ra(env, a0, ra);
newv = (cmpv == oldv ? newv : oldv);
/* always do the store */
cpu_stq_data_ra(env, a0, newv, ra);
person Paolo Bonzini    schedule 11.04.2017