Commit ba41e52541 for qemu.org
commit ba41e525413906473ed004b3a45f565783f3533f
Author: Mohamed Mediouni <mohamed@unpredictable.fr>
Date: Wed Mar 25 00:00:16 2026 +0100
target/i386: emulate: follow priv_check_exempt
Follow priv_check_exempt flag argument for
x86_write_mem_priv/x86_read_mem_priv.
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
Link: https://lore.kernel.org/r/20260324230016.80914-3-mohamed@unpredictable.fr
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/target/i386/emulate/x86_mmu.c b/target/i386/emulate/x86_mmu.c
index 1aa373f5b3..c69ae96acb 100644
--- a/target/i386/emulate/x86_mmu.c
+++ b/target/i386/emulate/x86_mmu.c
@@ -263,14 +263,19 @@ static MMUTranslateResult x86_write_mem_ex(CPUState *cpu, void *data, target_ulo
CPUX86State *env = &x86_cpu->env;
MMUTranslateResult translate_res = MMU_TRANSLATE_SUCCESS;
+ MMUTranslateFlags translate_flags = MMU_TRANSLATE_VALIDATE_WRITE;
MemTxResult mem_tx_res;
uint64_t gpa;
+ if (priv_check_exempt) {
+ translate_flags |= MMU_TRANSLATE_PRIV_CHECKS_EXEMPT;
+ }
+
while (bytes > 0) {
/* copy page */
int copy = MIN(bytes, 0x1000 - (gva & 0xfff));
- translate_res = mmu_gva_to_gpa(cpu, gva, &gpa, MMU_TRANSLATE_VALIDATE_WRITE);
+ translate_res = mmu_gva_to_gpa(cpu, gva, &gpa, translate_flags);
if (translate_res) {
int error_code = translate_res_to_error_code(translate_res, true, is_user(cpu));
env->cr[2] = gva;
@@ -311,14 +316,19 @@ static MMUTranslateResult x86_read_mem_ex(CPUState *cpu, void *data, target_ulon
CPUX86State *env = &x86_cpu->env;
MMUTranslateResult translate_res = MMU_TRANSLATE_SUCCESS;
+ MMUTranslateFlags translate_flags = 0;
MemTxResult mem_tx_res;
uint64_t gpa;
+ if (priv_check_exempt) {
+ translate_flags |= MMU_TRANSLATE_PRIV_CHECKS_EXEMPT;
+ }
+
while (bytes > 0) {
/* copy page */
int copy = MIN(bytes, 0x1000 - (gva & 0xfff));
- translate_res = mmu_gva_to_gpa(cpu, gva, &gpa, 0);
+ translate_res = mmu_gva_to_gpa(cpu, gva, &gpa, translate_flags);
if (translate_res) {
int error_code = translate_res_to_error_code(translate_res, false, is_user(cpu));
env->cr[2] = gva;