From nobody Sat May 4 03:43:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529224926144923.2879020798877; Sun, 17 Jun 2018 01:42:06 -0700 (PDT) Received: from localhost ([::1]:54350 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fUTG0-0001LN-2W for importer@patchew.org; Sun, 17 Jun 2018 04:41:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49874) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fUTFB-00014k-NI for qemu-devel@nongnu.org; Sun, 17 Jun 2018 04:41:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fUTF8-0003si-Ii for qemu-devel@nongnu.org; Sun, 17 Jun 2018 04:41:05 -0400 Received: from mail-it0-x241.google.com ([2607:f8b0:4001:c0b::241]:35487) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fUTF8-0003rg-BP for qemu-devel@nongnu.org; Sun, 17 Jun 2018 04:41:02 -0400 Received: by mail-it0-x241.google.com with SMTP id a3-v6so8182814itd.0 for ; Sun, 17 Jun 2018 01:41:02 -0700 (PDT) Received: from localhost.localdomain (23-91-237-192.cpe.distributel.net. [23.91.237.192]) by smtp.gmail.com with ESMTPSA id j12-v6sm3058362itb.26.2018.06.17.01.41.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 17 Jun 2018 01:41:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=fHgsdo2Pf+zmm2EraFIDabjeiy2U342zlEqDBNdraRM=; b=Z1ir0Z4v2CQLxtSkkdPiDapcVh05VhdjvEfVHos75lrMJXf9IhTaYXhXa4kNHMfTtF 5M/7P8QD5rDPVAptkuOuPwCTiklKFTNhwAwINmB7WVus1/ucAvkfUPsiePIz2dmW6Pm3 ijLdRcqaq3VruPJvBruoeCpGyl0xLYvpgfioMOtlrH2i8lIqCaoPTH2XzZLeYL15tOkZ q52ork8TYjDyAGgXd6x9clm3YiMuc5Kf+LTY6E8PRXp0kYrRDsmbDmpDP7NhQ8YHtJcB xqB373B1rvzdBPzVRNfFr5n1oPoUlz+U8PYqsHbp/7K8NIW8XK8zRI+Hc9k4nMTXAbnx bbiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=fHgsdo2Pf+zmm2EraFIDabjeiy2U342zlEqDBNdraRM=; b=CV2Ya+o4c/qLaF+jazMnsl+qqx4NmjIqwE7vAU8KxqnaiC6+sX5sMNbt1LyP8bCqQO MoPvMENiT0cDnfB2d5Nsn/YcMAAsPi8Ex9dCE7cW6EDNtQSUIMNk27ghVXxCFVAHNJOA iKTDuviWglXKho1qh6tKQVXMGHDb23wYXCDyB8uEFk/ZFDRpZafaY6t2PF3IIXEXe1BU niQZE2yfDnuK+UUWubAZv3Xg4Wq1lVeIjsVwDr9KXNlRyFECXjXyHLQylvpBOLw0olAo 2Y4HzEtp6UHQnzVOBO4RQ5BraSxHGYFn29+h37ds5vN0xZpft654/iTVsXBU++2NAevH qZqQ== X-Gm-Message-State: APt69E3zWV51Rg2pNSRqoEAon3uWg8eLtcgKNg0+J5EWNUm3nSTD1xCi ATqlq6VPc+PjnaoZVihNBjBDOTem X-Google-Smtp-Source: ADUXVKIUXUZUBoEQLbn7qWsCCvhL0kFxYII7qrJ4bRndOURlg9NbbRysMvZ/OgarHytw7iYuIYnGKA== X-Received: by 2002:a02:8d29:: with SMTP id h38-v6mr6451515jak.30.1529224861259; Sun, 17 Jun 2018 01:41:01 -0700 (PDT) From: Doug Gale To: qemu-devel@nongnu.org Date: Sun, 17 Jun 2018 04:40:25 -0400 Message-Id: <20180617084025.29198-1-doug16k@gmail.com> X-Mailer: git-send-email 2.17.1 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4001:c0b::241 Subject: [Qemu-devel] [PATCH] i386/monitor.c: make addresses canonical for "info mem" and "info tlb" X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Doug Gale , Eduardo Habkost , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Correct the output of the "info mem" and "info tlb" monitor commands to correctly show canonical addresses. In 48-bit addressing mode, the upper 16 bits of linear addresses are equal to bit 47. In 57-bit addressing mode (LA57), the upper 7 bits of linear addresses are equal to bit 56. Signed-off-by: Doug Gale --- target/i386/monitor.c | 76 +++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/target/i386/monitor.c b/target/i386/monitor.c index a890b3c2ab..99c97a63e2 100644 --- a/target/i386/monitor.c +++ b/target/i386/monitor.c @@ -35,21 +35,28 @@ #include "sev_i386.h" #include "qapi/qapi-commands-misc.h" =20 - -static void print_pte(Monitor *mon, CPUArchState *env, hwaddr addr, - hwaddr pte, hwaddr mask) +/* Perform linear address sign extension */ +static hwaddr addr_canonical(CPUArchState *env, hwaddr addr) { #ifdef TARGET_X86_64 if (env->cr[4] & CR4_LA57_MASK) { if (addr & (1ULL << 56)) { - addr |=3D -1LL << 57; + addr |=3D (hwaddr)-(1LL << 57); } } else { if (addr & (1ULL << 47)) { - addr |=3D -1LL << 48; + addr |=3D (hwaddr)-(1LL << 48); } } #endif + return addr; +} + +static void print_pte(Monitor *mon, CPUArchState *env, hwaddr addr, + hwaddr pte, hwaddr mask) +{ + addr =3D addr_canonical(env, addr); + monitor_printf(mon, TARGET_FMT_plx ": " TARGET_FMT_plx " %c%c%c%c%c%c%c%c%c\n", addr, @@ -243,8 +250,8 @@ void hmp_info_tlb(Monitor *mon, const QDict *qdict) } } =20 -static void mem_print(Monitor *mon, hwaddr *pstart, - int *plast_prot, +static void mem_print(Monitor *mon, CPUArchState *env, + hwaddr *pstart, int *plast_prot, hwaddr end, int prot) { int prot1; @@ -253,7 +260,9 @@ static void mem_print(Monitor *mon, hwaddr *pstart, if (*pstart !=3D -1) { monitor_printf(mon, TARGET_FMT_plx "-" TARGET_FMT_plx " " TARGET_FMT_plx " %c%c%c\n", - *pstart, end, end - *pstart, + addr_canonical(env, *pstart), + addr_canonical(env, end), + addr_canonical(env, end - *pstart), prot1 & PG_USER_MASK ? 'u' : '-', 'r', prot1 & PG_RW_MASK ? 'w' : '-'); @@ -283,7 +292,7 @@ static void mem_info_32(Monitor *mon, CPUArchState *env) if (pde & PG_PRESENT_MASK) { if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) { prot =3D pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MAS= K); - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } else { for(l2 =3D 0; l2 < 1024; l2++) { cpu_physical_memory_read((pde & ~0xfff) + l2 * 4, &pte= , 4); @@ -295,16 +304,16 @@ static void mem_info_32(Monitor *mon, CPUArchState *e= nv) } else { prot =3D 0; } - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } } } else { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } } /* Flush last range */ - mem_print(mon, &start, &last_prot, (hwaddr)1 << 32, 0); + mem_print(mon, env, &start, &last_prot, (hwaddr)1 << 32, 0); } =20 static void mem_info_pae32(Monitor *mon, CPUArchState *env) @@ -332,7 +341,7 @@ static void mem_info_pae32(Monitor *mon, CPUArchState *= env) if (pde & PG_PSE_MASK) { prot =3D pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK); - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } else { pt_addr =3D pde & 0x3fffffffff000ULL; for (l3 =3D 0; l3 < 512; l3++) { @@ -345,21 +354,21 @@ static void mem_info_pae32(Monitor *mon, CPUArchState= *env) } else { prot =3D 0; } - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, p= rot); } } } else { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } } } else { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } } /* Flush last range */ - mem_print(mon, &start, &last_prot, (hwaddr)1 << 32, 0); + mem_print(mon, env, &start, &last_prot, (hwaddr)1 << 32, 0); } =20 =20 @@ -389,7 +398,7 @@ static void mem_info_la48(Monitor *mon, CPUArchState *e= nv) prot =3D pdpe & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK); prot &=3D pml4e; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } else { pd_addr =3D pdpe & 0x3fffffffff000ULL; for (l3 =3D 0; l3 < 512; l3++) { @@ -401,7 +410,8 @@ static void mem_info_la48(Monitor *mon, CPUArchState *e= nv) prot =3D pde & (PG_USER_MASK | PG_RW_M= ASK | PG_PRESENT_MASK); prot &=3D pml4e & pdpe; - mem_print(mon, &start, &last_prot, end= , prot); + mem_print(mon, env, &start, + &last_prot, end, prot); } else { pt_addr =3D pde & 0x3fffffffff000ULL; for (l4 =3D 0; l4 < 512; l4++) { @@ -418,27 +428,29 @@ static void mem_info_la48(Monitor *mon, CPUArchState = *env) } else { prot =3D 0; } - mem_print(mon, &start, &last_prot,= end, prot); + mem_print(mon, env, &start, + &last_prot, end, prot); } } } else { prot =3D 0; - mem_print(mon, &start, &last_prot, end, pr= ot); + mem_print(mon, env, &start, + &last_prot, end, prot); } } } } else { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } } } else { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } } /* Flush last range */ - mem_print(mon, &start, &last_prot, (hwaddr)1 << 48, 0); + mem_print(mon, env, &start, &last_prot, (hwaddr)1 << 48, 0); } =20 static void mem_info_la57(Monitor *mon, CPUArchState *env) @@ -457,7 +469,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *e= nv) end =3D l0 << 48; if (!(pml5e & PG_PRESENT_MASK)) { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); continue; } =20 @@ -468,7 +480,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *e= nv) end =3D (l0 << 48) + (l1 << 39); if (!(pml4e & PG_PRESENT_MASK)) { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); continue; } =20 @@ -479,7 +491,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *e= nv) end =3D (l0 << 48) + (l1 << 39) + (l2 << 30); if (pdpe & PG_PRESENT_MASK) { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); continue; } =20 @@ -487,7 +499,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *e= nv) prot =3D pdpe & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK); prot &=3D pml5e & pml4e; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); continue; } =20 @@ -498,7 +510,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *e= nv) end =3D (l0 << 48) + (l1 << 39) + (l2 << 30) + (l3 << = 21); if (pde & PG_PRESENT_MASK) { prot =3D 0; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); continue; } =20 @@ -506,7 +518,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *e= nv) prot =3D pde & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK); prot &=3D pml5e & pml4e & pdpe; - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); continue; } =20 @@ -523,14 +535,14 @@ static void mem_info_la57(Monitor *mon, CPUArchState = *env) } else { prot =3D 0; } - mem_print(mon, &start, &last_prot, end, prot); + mem_print(mon, env, &start, &last_prot, end, prot); } } } } } /* Flush last range */ - mem_print(mon, &start, &last_prot, (hwaddr)1 << 57, 0); + mem_print(mon, env, &start, &last_prot, (hwaddr)1 << 57, 0); } #endif /* TARGET_X86_64 */ =20 --=20 2.17.1