From nobody Tue Feb 10 06:58:13 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1620721737; cv=none; d=zohomail.com; s=zohoarc; b=TgB6eXbr7mlYYS8CmDbJ+oZsRSGvXP/2B5ADRDs9Btt2V/aLauzqBZtmeMdYzeOMuzoAe4ODGeMlAQROGVKiFJ77Vrii1e/ROnal4a3qfsAA0SsNV4FqtYWw/skz8iLQZ4re1ap8ZRcIwZR+EgKpHOegTEGrI0nqy160GZNvqjU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1620721737; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=4Vw/VzC30kjnb1ykPijZA/QRPpGwSH0vKzTH0d4U67U=; b=VRwXIdPvDlNbYwmXN0n2aBj7H2MGVolLkhQcY3CNVrrn/buWSeprvCD0UpfTFzTWB6BSdLb3g2WogTcQWp8wl05ACiMiFzyOj0m+0vTmz81MFZ4rpJKJXsYbZUFWKEuavULl1i6Iv2Cpz2myVTL4BYqF9iq8Qe+afoMGF/4cpzI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1620721737344299.58197003597695; Tue, 11 May 2021 01:28:57 -0700 (PDT) Received: from localhost ([::1]:42348 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lgNlA-0007qp-9h for importer@patchew.org; Tue, 11 May 2021 04:28:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34780) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lgNX9-00021f-0c for qemu-devel@nongnu.org; Tue, 11 May 2021 04:14:27 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:37316) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lgNWp-0000ns-D2 for qemu-devel@nongnu.org; Tue, 11 May 2021 04:14:26 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-586-KfTasd_sPUK04JAsLczHuQ-1; Tue, 11 May 2021 04:14:04 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 01511800FF0 for ; Tue, 11 May 2021 08:14:04 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id C470D6E407 for ; Tue, 11 May 2021 08:14:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1620720846; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4Vw/VzC30kjnb1ykPijZA/QRPpGwSH0vKzTH0d4U67U=; b=KAvIY0iafpma437vTKwhCVCq9FYjucCOoVSuYFgFCOpQ2Mul/XYx8ix50fZkRj/pZtDjbF oPIJxl/h5GuoY81RBq1ai9L69kgz3H+LQ10W+5z1S5iB3E+WUe98mC+4tIWHDVytpLG85S jUj63hG0Oj8L9iGb6ZqyPz2PY0VgM1s= X-MC-Unique: KfTasd_sPUK04JAsLczHuQ-1 From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PULL 27/33] target/i386: allow customizing the next phase of the translation Date: Tue, 11 May 2021 04:13:44 -0400 Message-Id: <20210511081350.419428-28-pbonzini@redhat.com> In-Reply-To: <20210511081350.419428-1-pbonzini@redhat.com> References: <20210511081350.419428-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pbonzini@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.698, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 30 +++++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index 2b7baa0193..082ddbb911 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -260,7 +260,13 @@ static hwaddr get_hphys(CPUState *cs, hwaddr gphys, MM= UAccessType access_type, =20 #define PG_ERROR_OK (-1) =20 -static int mmu_translate(CPUState *cs, vaddr addr, +typedef hwaddr (*MMUTranslateFunc)(CPUState *cs, hwaddr gphys, MMUAccessTy= pe access_type, + int *prot); + +#define GET_HPHYS(cs, gpa, access_type, prot) \ + (get_hphys_func ? get_hphys_func(cs, gpa, access_type, prot) : gpa) + +static int mmu_translate(CPUState *cs, vaddr addr, MMUTranslateFunc get_hp= hys_func, uint64_t cr3, int is_write1, int mmu_idx, int pg_= mode, vaddr *xlat, int *page_size, int *prot) { @@ -296,7 +302,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, =20 /* test virtual address sign extension */ sext =3D la57 ? (int64_t)addr >> 56 : (int64_t)addr >> 47; - if (sext !=3D 0 && sext !=3D -1) { + if (get_hphys_func && sext !=3D 0 && sext !=3D -1) { env->error_code =3D 0; cs->exception_index =3D EXCP0D_GPF; return 1; @@ -305,7 +311,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, if (la57) { pml5e_addr =3D ((cr3 & ~0xfff) + (((addr >> 48) & 0x1ff) << 3)) & a20_mask; - pml5e_addr =3D get_hphys(cs, pml5e_addr, MMU_DATA_STORE, N= ULL); + pml5e_addr =3D GET_HPHYS(cs, pml5e_addr, MMU_DATA_STORE, N= ULL); pml5e =3D x86_ldq_phys(cs, pml5e_addr); if (!(pml5e & PG_PRESENT_MASK)) { goto do_fault; @@ -325,7 +331,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, =20 pml4e_addr =3D ((pml5e & PG_ADDRESS_MASK) + (((addr >> 39) & 0x1ff) << 3)) & a20_mask; - pml4e_addr =3D get_hphys(cs, pml4e_addr, MMU_DATA_STORE, false= ); + pml4e_addr =3D GET_HPHYS(cs, pml4e_addr, MMU_DATA_STORE, NULL); pml4e =3D x86_ldq_phys(cs, pml4e_addr); if (!(pml4e & PG_PRESENT_MASK)) { goto do_fault; @@ -340,7 +346,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, ptep &=3D pml4e ^ PG_NX_MASK; pdpe_addr =3D ((pml4e & PG_ADDRESS_MASK) + (((addr >> 30) & 0x= 1ff) << 3)) & a20_mask; - pdpe_addr =3D get_hphys(cs, pdpe_addr, MMU_DATA_STORE, NULL); + pdpe_addr =3D GET_HPHYS(cs, pdpe_addr, MMU_DATA_STORE, NULL); pdpe =3D x86_ldq_phys(cs, pdpe_addr); if (!(pdpe & PG_PRESENT_MASK)) { goto do_fault; @@ -366,7 +372,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, /* XXX: load them when cr3 is loaded ? */ pdpe_addr =3D ((cr3 & ~0x1f) + ((addr >> 27) & 0x18)) & a20_mask; - pdpe_addr =3D get_hphys(cs, pdpe_addr, MMU_DATA_STORE, false); + pdpe_addr =3D GET_HPHYS(cs, pdpe_addr, MMU_DATA_STORE, NULL); pdpe =3D x86_ldq_phys(cs, pdpe_addr); if (!(pdpe & PG_PRESENT_MASK)) { goto do_fault; @@ -380,7 +386,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, =20 pde_addr =3D ((pdpe & PG_ADDRESS_MASK) + (((addr >> 21) & 0x1ff) <= < 3)) & a20_mask; - pde_addr =3D get_hphys(cs, pde_addr, MMU_DATA_STORE, NULL); + pde_addr =3D GET_HPHYS(cs, pde_addr, MMU_DATA_STORE, NULL); pde =3D x86_ldq_phys(cs, pde_addr); if (!(pde & PG_PRESENT_MASK)) { goto do_fault; @@ -403,7 +409,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, } pte_addr =3D ((pde & PG_ADDRESS_MASK) + (((addr >> 12) & 0x1ff) <<= 3)) & a20_mask; - pte_addr =3D get_hphys(cs, pte_addr, MMU_DATA_STORE, NULL); + pte_addr =3D GET_HPHYS(cs, pte_addr, MMU_DATA_STORE, NULL); pte =3D x86_ldq_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; @@ -420,7 +426,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, /* page directory entry */ pde_addr =3D ((cr3 & ~0xfff) + ((addr >> 20) & 0xffc)) & a20_mask; - pde_addr =3D get_hphys(cs, pde_addr, MMU_DATA_STORE, NULL); + pde_addr =3D GET_HPHYS(cs, pde_addr, MMU_DATA_STORE, NULL); pde =3D x86_ldl_phys(cs, pde_addr); if (!(pde & PG_PRESENT_MASK)) { goto do_fault; @@ -448,7 +454,7 @@ static int mmu_translate(CPUState *cs, vaddr addr, /* page directory entry */ pte_addr =3D ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & a20_mask; - pte_addr =3D get_hphys(cs, pte_addr, MMU_DATA_STORE, NULL); + pte_addr =3D GET_HPHYS(cs, pte_addr, MMU_DATA_STORE, NULL); pte =3D x86_ldl_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; @@ -538,7 +544,7 @@ do_check_protect_pse36: /* align to page_size */ pte &=3D PG_ADDRESS_MASK & ~(*page_size - 1); page_offset =3D addr & (*page_size - 1); - *xlat =3D get_hphys(cs, pte + page_offset, is_write1, prot); + *xlat =3D GET_HPHYS(cs, pte + page_offset, is_write1, prot); return PG_ERROR_OK; =20 do_fault_rsvd: @@ -588,7 +594,7 @@ static int handle_mmu_fault(CPUState *cs, vaddr addr, i= nt size, page_size =3D 4096; } else { pg_mode =3D get_pg_mode(env); - error_code =3D mmu_translate(cs, addr, env->cr[3], is_write1, + error_code =3D mmu_translate(cs, addr, get_hphys, env->cr[3], is_w= rite1, mmu_idx, pg_mode, &paddr, &page_size, &prot); } --=20 2.26.2