summaryrefslogtreecommitdiff
path: root/arch/x86_64.c
diff options
context:
space:
mode:
authorPetr Tesarik <ptesarik@suse.cz>2012-10-31 17:51:17 +0900
committerAtsushi Kumagai <kumagai-atsushi@mxc.nes.nec.co.jp>2012-11-16 11:06:50 +0900
commit3ae13b44e3fffb429f0fb26e25e320dc5550c5d6 (patch)
tree6455a4fcb7922f6f574272c5cafca8f60db876cb /arch/x86_64.c
parent064fbc1bc9627d2b129d0d4dc21e3490cd43fc88 (diff)
[PATCH v3 6/9] Fix domain pickled_id computation for xen-3.4+.
Originally, Xen stored the 32-bit address of the domain structure in struct page_info. On x86-64, the physical address was stored, but since all heap objects were allocated in the 1:1 mapping which started at 0xffff830000000000, the end result was the same as if we simply chopped off the high bits (actual implementation in makedumpfile). Then, during the development of Xen-3.4, this logic was changed several times for x86-64: changeset 39517e863cc8 widened the _domain field to 64 bits and stored the virtual address of struct domain instead of physical address changeset beba88f6f90d removed the pickle/unpickle macros changeset 0858f961c77a changed _domain back from unsigned long to u32, *and* stores the MFN of struct domain instead All the above changes went into Xen-3.4, and the relation between a domain address and the contents of the _domain field hasn't changed since then. That means, when the MADDR space was compressed in Xen-4.0, the type of the _domain field was changed to _pdx_t, which was specifically invented to preserve its calculation from the struct domain address. To sum it up: 1. For all Xen versions before Xen-3.4, the _domain field contains the address of struct domain (with high bits chopped for x86-64). 2. For all Xen versions starting with Xen-3.4, the _domain field can be computed from struct domain address as: (addr - DIRECTMAP_VIRT_START) >> PAGE_SHIFT Signed-off-by: Petr Tesarik <ptesarik@suse.cz>
Diffstat (limited to 'arch/x86_64.c')
-rw-r--r--arch/x86_64.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/arch/x86_64.c b/arch/x86_64.c
index 6e26724..1f0f829 100644
--- a/arch/x86_64.c
+++ b/arch/x86_64.c
@@ -410,12 +410,26 @@ int get_xen_info_x86_64(void)
{
int i;
- /*
- * pickled_id == domain addr for x86_64
- */
- for (i = 0; i < info->num_domain; i++) {
- info->domain_list[i].pickled_id =
- info->domain_list[i].domain_addr;
+ if (info->xen_crash_info.com &&
+ (info->xen_crash_info.com->xen_major_version >= 4 ||
+ (info->xen_crash_info.com->xen_major_version == 3 &&
+ info->xen_crash_info.com->xen_minor_version >= 4))) {
+ /*
+ * cf. changeset 0858f961c77a
+ */
+ for (i = 0; i < info->num_domain; i++) {
+ info->domain_list[i].pickled_id =
+ (info->domain_list[i].domain_addr -
+ DIRECTMAP_VIRT_START) >> PAGESHIFT();
+ }
+ } else {
+ /*
+ * pickled_id == domain addr for x86_64
+ */
+ for (i = 0; i < info->num_domain; i++) {
+ info->domain_list[i].pickled_id =
+ info->domain_list[i].domain_addr;
+ }
}
return TRUE;