diff options
-rw-r--r-- | sys/dev/pv/xen.c | 30 | ||||
-rw-r--r-- | sys/dev/pv/xenreg.h | 33 |
2 files changed, 18 insertions, 45 deletions
diff --git a/sys/dev/pv/xen.c b/sys/dev/pv/xen.c index 047c74c384a..ede837b4064 100644 --- a/sys/dev/pv/xen.c +++ b/sys/dev/pv/xen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xen.c,v 1.22 2016/01/05 13:47:28 mikeb Exp $ */ +/* $OpenBSD: xen.c,v 1.23 2016/01/05 18:03:59 mikeb Exp $ */ /* * Copyright (c) 2015 Mike Belopuhov @@ -790,11 +790,11 @@ xen_init_grant_tables(struct xen_softc *sc) return (-1); } - gsv.version = 2; + gsv.version = 1; ggv.dom = DOMID_SELF; if (xen_hypercall(sc, XC_GNTTAB, 3, GNTTABOP_set_version, &gsv, 1) || xen_hypercall(sc, XC_GNTTAB, 3, GNTTABOP_get_version, &ggv, 1) || - ggv.version != 2) { + ggv.version != 1) { printf("%s: failed to set grant tables API version\n", sc->sc_dev.dv_xname); return (-1); @@ -882,12 +882,12 @@ xen_grant_table_alloc(struct xen_softc *sc, grant_ref_t *ref) i = 0; if (ge->ge_reserved && i < ge->ge_reserved) continue; - if (ge->ge_table[i].hdr.flags != GTF_invalid && - ge->ge_table[i].full_page.frame != 0) + if (ge->ge_table[i].flags != GTF_invalid && + ge->ge_table[i].frame != 0) continue; *ref = ge->ge_start + i; /* XXX Mark as taken */ - ge->ge_table[i].full_page.frame = 0xffffffff; + ge->ge_table[i].frame = 0xffffffff; if ((ge->ge_next = i + 1) == GNTTAB_NEPG) ge->ge_next = ge->ge_reserved + 1; ge->ge_free--; @@ -911,11 +911,11 @@ xen_grant_table_free(struct xen_softc *sc, grant_ref_t ref) continue; ref -= ge->ge_start; mtx_enter(&ge->ge_mtx); - if (ge->ge_table[ref].hdr.flags != GTF_invalid) { + if (ge->ge_table[ref].flags != GTF_invalid) { mtx_leave(&ge->ge_mtx); return; } - ge->ge_table[ref].full_page.frame = 0; + ge->ge_table[ref].frame = 0; ge->ge_next = ref; ge->ge_free++; mtx_leave(&ge->ge_mtx); @@ -933,11 +933,10 @@ xen_grant_table_enter(struct xen_softc *sc, grant_ref_t ref, paddr_t pa, continue; ref -= ge->ge_start; mtx_enter(&ge->ge_mtx); - ge->ge_table[ref].full_page.frame = atop(pa); - ge->ge_table[ref].full_page.hdr.domid = 0; + ge->ge_table[ref].frame = atop(pa); + ge->ge_table[ref].domid = 0; membar_producer(); - ge->ge_table[ref].full_page.hdr.flags = - GTF_permit_access | flags; + ge->ge_table[ref].flags = GTF_permit_access | flags; mtx_leave(&ge->ge_mtx); return (0); } @@ -957,12 +956,11 @@ xen_grant_table_remove(struct xen_softc *sc, grant_ref_t ref) mtx_enter(&ge->ge_mtx); /* Invalidate the grant reference */ - ptr = (uint32_t *)&ge->ge_table[ref].hdr; - flags = (ge->ge_table[ref].hdr.flags & - ~(GTF_reading | GTF_writing)); + ptr = (uint32_t *)&ge->ge_table[ref]; + flags = (ge->ge_table[ref].flags & ~(GTF_reading | GTF_writing)); while (atomic_cas_uint(ptr, flags, 0) != flags) CPU_BUSY_CYCLE(); - ge->ge_table[ref].full_page.frame = 0xffffffff; + ge->ge_table[ref].frame = 0xffffffff; mtx_leave(&ge->ge_mtx); break; } diff --git a/sys/dev/pv/xenreg.h b/sys/dev/pv/xenreg.h index 5bdbbd709dd..edcaf9c20b7 100644 --- a/sys/dev/pv/xenreg.h +++ b/sys/dev/pv/xenreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: xenreg.h,v 1.6 2015/12/22 22:16:53 mikeb Exp $ */ +/* $OpenBSD: xenreg.h,v 1.7 2016/01/05 18:03:59 mikeb Exp $ */ /* * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -615,9 +615,6 @@ typedef uint32_t grant_ref_t; * GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN] * GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN] * GTF_PAT, GTF_PWT, GTF_PCD: (x86) cache attribute flags for the grant [GST] - * GTF_sub_page: Grant access to only a subrange of the page. @domid - * will only be allowed to copy from the grant, and not - * map it. [GST] */ #define GTF_readonly (1<<2) #define GTF_reading (1<<3) @@ -625,39 +622,17 @@ typedef uint32_t grant_ref_t; #define GTF_PWT (1<<5) #define GTF_PCD (1<<6) #define GTF_PAT (1<<7) -#define GTF_sub_page (1<<8) -struct grant_entry_header { +typedef struct grant_entry { uint16_t flags; domid_t domid; -}; - -typedef union grant_entry { - struct grant_entry_header hdr; - - /* - * This member is used for V1-style full page grants, where either: - * - * -- hdr.type is GTF_accept_transfer, or - * -- hdr.type is GTF_permit_access and GTF_sub_page is not set. - * - * In that case, the frame field has the same semantics as the - * field of the same name in the V1 entry structure. - */ - struct { - struct grant_entry_header hdr; - uint32_t pad0; - uint64_t frame; - } full_page; - - uint32_t __spacer[4]; /* Pad to a power of two */ -} grant_entry_t; + uint32_t frame; +} __packed grant_entry_t; /* Number of grant table entries per memory page */ #define GNTTAB_NEPG (PAGE_SIZE / sizeof(grant_entry_t)) #define GNTTABOP_query_size 6 -#define GNTTABOP_unmap_and_replace 7 #define GNTTABOP_set_version 8 #define GNTTABOP_get_version 10 |