From nobody Mon May 6 21:42:50 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.zoho.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; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149002121887777.53646687343041; Mon, 20 Mar 2017 07:46:58 -0700 (PDT) Received: from localhost ([::1]:33399 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cpyaH-0003ZS-1u for importer@patchew.org; Mon, 20 Mar 2017 10:46:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50288) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cpyZS-0003Y0-Sc for qemu-devel@nongnu.org; Mon, 20 Mar 2017 10:46:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cpyZP-0006fJ-L8 for qemu-devel@nongnu.org; Mon, 20 Mar 2017 10:46:06 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:36797) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cpyZP-0006eu-7r for qemu-devel@nongnu.org; Mon, 20 Mar 2017 10:46:03 -0400 Received: by mail-wm0-x243.google.com with SMTP id x124so15010012wmf.3 for ; Mon, 20 Mar 2017 07:46:02 -0700 (PDT) Received: from 640k.lan (94-39-135-166.adsl-ull.clienti.tiscali.it. [94.39.135.166]) by smtp.gmail.com with ESMTPSA id p185sm13751346wme.20.2017.03.20.07.46.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 Mar 2017 07:46:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=glDkOfr51VNryQGxN6NrNtJ1yomRf+VErQTCXrW62t4=; b=oPEkm/OJRiPvzGRPNs7z/6pRNJrbEoljhqICk7qy8CfeffvgqWpA9hYD9fsko42TQA doEV0JbtvnfGqsdyLiJrnzFQXTIP0ZHJgBexcU97as7YkZVVXx/XG785glN/SQ181GqW d1WI04EBWAZ5TJl+KGw5Xrv7UF+iXebs7aN+1c240XEAx7UQk3yXlu4T0kkaH0cNIc9u H0gzDlSGhrvXq4t81JlWmuT/IvLP+gTyaZuCJXnNwy88miIg2UZKUR+EeHsxbfb0nzAe N+Itmn1HjQnmaqUQs8bjdjAFMsTg7oJx1yOJThqnL5rJPDRGPAfj+EGmHFINRG5yNqlU rh6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=glDkOfr51VNryQGxN6NrNtJ1yomRf+VErQTCXrW62t4=; b=JghIG7VeAy02wWKcYf7mMXG6p5GdojlxHW45CB7eT9fYZBH8dy5FQeHzbdroSzlUZj cWNwUwyCMPe0c2jB/mwmwSkvi2lz954K4w4T7X7/2D33cJCEU94RN0HWZ1UeZsrE/fPM +Yob1KN9WAu5NQrk2Fk6Bgr7fUS274CzZ7W0hm2wXpgAany3f5NwMJhvEt/6ucjalkbK NHXLzxoWRcbATkANrMq3EUpBwTp5cvHzzy5RSeywtuj+z0f43FhzYsMCD3E3JVFq4CrF HuxLb1Cv1D+fdlZc7qbq5qSeW6NKV38z3ZtuTQfm2gA4iedPYtmjSYhIBzfQBIOQEm1o zi0g== X-Gm-Message-State: AFeK/H3G3dvhSfA/3O/WdFWYsCq/svQGCUlhSJN89cyqSbjKTMja0RPVGp+Y1pUx7olekQ== X-Received: by 10.28.154.7 with SMTP id c7mr11158087wme.119.1490021161889; Mon, 20 Mar 2017 07:46:01 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Mon, 20 Mar 2017 15:45:58 +0100 Message-Id: <1490021158-4469-1-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::243 Subject: [Qemu-devel] [PATCH v2] hmp: gpa2hva and gpa2hpa hostaddr command 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: dgilbert@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" These commands are useful when testing machine-check passthrough. gpa2hva is useful to inject a MADV_HWPOISON madvise from gdb, while gpa2hpa is useful to inject an error with the mce-inject kernel module. Signed-off-by: Paolo Bonzini Reviewed-by: Dr. David Alan Gilbert --- hmp-commands.hx | 32 ++++++++++++++++++ monitor.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 133 insertions(+) diff --git a/hmp-commands.hx b/hmp-commands.hx index 8819281..0aca984 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -526,6 +526,38 @@ Dump 80 16 bit values at the start of the video memory. ETEXI =20 { + .name =3D "gpa2hva", + .args_type =3D "addr:l", + .params =3D "addr", + .help =3D "print the host virtual address corresponding to a= guest physical address", + .cmd =3D hmp_gpa2hva, + }, + +STEXI +@item gpa2hva @var{addr} +@findex gpa2hva +Print the host virtual address at which the guest's physical address @var{= addr} +is mapped. +ETEXI + +#ifdef CONFIG_LINUX + { + .name =3D "gpa2hpa", + .args_type =3D "addr:l", + .params =3D "addr", + .help =3D "print the host physical address corresponding to = a guest physical address", + .cmd =3D hmp_gpa2hpa, + }, +#endif + +STEXI +@item gpa2hpa @var{addr} +@findex gpa2hpa +Print the host physical address at which the guest's physical address @var= {addr} +is mapped. +ETEXI + + { .name =3D "p|print", .args_type =3D "fmt:/,val:l", .params =3D "/fmt expr", diff --git a/monitor.c b/monitor.c index be282ec..216a97a 100644 --- a/monitor.c +++ b/monitor.c @@ -1421,6 +1421,107 @@ static void hmp_physical_memory_dump(Monitor *mon, = const QDict *qdict) memory_dump(mon, count, format, size, addr, 1); } =20 +static void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, Error **errp) +{ + MemoryRegionSection mrs =3D memory_region_find(get_system_memory(), + addr, 1); + + if (!mrs.mr) { + error_setg(errp, "No memory is mapped at address 0x%" HWADDR_PRIx,= addr); + return NULL; + } + + if (!memory_region_is_ram(mrs.mr) && !memory_region_is_romd(mrs.mr)) { + error_setg(errp, "Memory at address 0x%" HWADDR_PRIx "is not RAM",= addr); + memory_region_unref(mrs.mr); + return NULL; + } + + *p_mr =3D mrs.mr; + return qemu_map_ram_ptr(mrs.mr->ram_block, mrs.offset_within_region); +} + +static void hmp_gpa2hva(Monitor *mon, const QDict *qdict) +{ + hwaddr addr =3D qdict_get_int(qdict, "addr"); + Error *local_err =3D NULL; + MemoryRegion *mr; + void *ptr; + + ptr =3D gpa2hva(&mr, addr, &local_err); + if (local_err) { + error_report_err(local_err); + return; + } + + monitor_printf(mon, "Host virtual address for 0x%" HWADDR_PRIx + " (%s) is %p\n", + addr, mr->name, ptr); + + memory_region_unref(mr); +} + +#ifdef CONFIG_LINUX +static uint64_t vtop(void *ptr, Error **errp) +{ + uint64_t pinfo; + uint64_t ret =3D -1; + uintptr_t addr =3D (uintptr_t) ptr; + uintptr_t pagesize =3D getpagesize(); + off_t offset =3D addr / pagesize * sizeof(pinfo); + int fd; + + fd =3D open("/proc/self/pagemap", O_RDONLY); + if (fd =3D=3D -1) { + error_setg_errno(errp, errno, "Cannot open /proc/self/pagemap"); + return -1; + } + + /* Force copy-on-write if necessary. */ + atomic_add((uint8_t *)ptr, 0); + + if (pread(fd, &pinfo, sizeof(pinfo), offset) !=3D sizeof(pinfo)) { + error_setg_errno(errp, errno, "Cannot read pagemap"); + goto out; + } + if ((pinfo & (1ull << 63)) =3D=3D 0) { + error_setg(errp, "Page not present"); + goto out; + } + ret =3D ((pinfo & 0x007fffffffffffffull) * pagesize) | (addr & (pagesi= ze - 1)); + +out: + close(fd); + return ret; +} + +static void hmp_gpa2hpa(Monitor *mon, const QDict *qdict) +{ + hwaddr addr =3D qdict_get_int(qdict, "addr"); + Error *local_err =3D NULL; + MemoryRegion *mr; + void *ptr; + uint64_t physaddr; + + ptr =3D gpa2hva(&mr, addr, &local_err); + if (local_err) { + error_report_err(local_err); + return; + } + + physaddr =3D vtop(ptr, &local_err); + if (local_err) { + error_report_err(local_err); + } else { + monitor_printf(mon, "Host physical address for 0x%" HWADDR_PRIx + " (%s) is 0x%" PRIx64 "\n", + addr, mr->name, (uint64_t) physaddr); + } + + memory_region_unref(mr); +} +#endif + static void do_print(Monitor *mon, const QDict *qdict) { int format =3D qdict_get_int(qdict, "format"); --=20 1.8.3.1