|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC] DOMCTL_memattrs_op : a new DOMCTL to play with stage-2 page attributes
On Sat, 1 Jul 2017, Zhongze Liu wrote:
> ********************************************************************************
> DOMCTL_memattrs_op : a new DOMCTL to play with stage-2 page attributes
>
> Zhongze Liu
> <blackskygg@xxxxxxxxx>
>
> ********************************************************************************
> Motivation and Description
> ~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> During the dicussion about the proposal "allow setting up shared memory areas
> between VMs from xl config file" (see [1]), it's getting clear that when we
> setup shared memory areas for VM communications from xl config file, we would
> appreciate the ability to control the permissions and some attributes of the
> shared memory pages: in the simplest the cases, regular cacheable RAM with
> read
^ of
> write permissions will be enough (For ARM, it would be p2m_ram_rw and
> MATTR_MEM,
> LPAE_SH_INNER). But there are also complicated cases where we might need
> deeper
> control over the permissions, cacheability and shareability of the shared RAM
> pages to meet some extra requirements (see [2]). And this could be done via
> playing with the stage-2 page tables, on both x86 and ARM.
>
> So there comes to the need for a DOMCTL that can set the permissions and
> attributes (currently, only cacheability and shareability is in the plan) of a
> given RAM page in the stage-2 page talbes. The only related work can be seen
> so
^ tables
> far is DOMCTL_pin_mem_cacheattr (see [3]), which is for controlling the
> cacheability of pages and is x86 HVM only. There seems to be no arch-neutral
> DOMCTL interfaces that can meet our requirements.
>
> That's why we need a new arch-neutral DOMCTL, which is tentatively called
> DOMCTL_mem_attrs_op in this proposal and would enable us to control the access
> permissions, cacheability and shareability (ARM only) attributes of RAM pages.
>
> ********************************************************************************
> Interface Specification
> ~~~~~~~~~~~~~~~~~~~~~~~
>
> A current draft of the interface looks like this:
>
> /*
> * Set access permissions, cacheability and shareability (ARM only) of a
> * continuos range of normal memory (RAM) in the stage-2 page table.
> */
> /* XEN_DOMCTL_memattrs_op */
>
> /* set chacheability and shareability */
^ cacheability
> #define XEN_DOMCTL_MEMATTRS_OP_SET_CACHEATTRS 1
> /* set access permissions */
> #define XEN_DOMCTL_MEMATTRS_OP_SET_PERMISSIONS 2
> /* get chacheability and shareability */
^ cacheability
> #define XEN_DOMCTL_MEMATTRS_OP_GET_CACHEATTRS 1
> /* get access permissions */
> #define XEN_DOMCTL_MEMATTRS_OP_GET_PERMISSIONS 2
>
> /* flags for XEN_DOMCTL_MEMATTRS_OP_SET_CACHEATTRS */
> /* chacheability flags, the values happen to be the same with those in
^ cacheability
> * x86 PAT. (See [4])
> */
> /* uncacheable */
> #define XEN_DOMCTL_MEMATTRS_UC 0x00U
> /* write combine, x86 only */
> #define XEN_DOMCTL_MEMATTRS_CACHE_WC 0x01U
> /* write through */
> #define XEN_DOMCTL_MEMATTRS_CACHE_WT 0x04U
> /* write protect, x86 only */
> #define XEN_DOMCTL_MEMATTRS_CACHE_WP 0x05U
> /* write back */
> #define XEN_DOMCTL_MEMATTRS_CACHE_WB 0x06U
> /* strong uncacheable, x86 only*/
> #define XEN_DOMCTL_MEMATTRS_SUC 0x07U
On the ARM side, we are missing BUFFERABLE and WRITEALLOC. I don't know
how they map to these tags, which comes from the x86 world. Maybe we
should just add them separately as ARM only, like:
/* bufferable, ARM only */
#define XEN_DOMCTL_MEMATTRS_BUFFERABLE 0x08U
/* write alloc, ARM only */
#define XEN_DOMCTL_MEMATTRS_CACHE_WA 0x09U
Theoretically, we could say XEN_DOMCTL_MEMATTRS_UC means "BUFFERABLE" on
ARM and XEN_DOMCTL_MEMATTRS_SUC means "UNCACHED", because that's
actually what they correspond to I think. However using x86 names for
ARM caching attributes is very confusing and error prone. So I would
prefer introducing separate tags for ARM and x86. However, reusing
XEN_DOMCTL_MEMATTRS_UC, XEN_DOMCTL_MEMATTRS_CACHE_WT and
XEN_DOMCTL_MEMATTRS_CACHE_WB as Zhongze did in this proposal would be OK
for me.
Julien, what do you think?
> /* shareability flags (See [5]), arm only, the value is taken from
> * asm-arm/page.h, but live in the second 8-bit.
> */
> #define XEN_DOMCTL_MEMATTRS_SHAREABILITY_SHIFT 8
> #define XEN_DOMCTL_MEMATTRS_SH_NON_SHAREABLE (LPAE_SH_NON_SHAREABLE<<8)
> #define XEN_DOMCTL_MEMATTRS_SH_UNPREDICTALE (LPAE_SH_UNPREDICTALE<<8)
We don't need UNPREDICTALE as a possible value :-)
> #define XEN_DOMCTL_MEMATTRS_SH_OUTER (LPAE_SH_OUTER<<8)
> #define XEN_DOMCTL_MEMATTRS_SH_INNER (LPAE_SH_INNER<<8)
>
> /* flags for XEN_DOMCTL_MEMATTRS_OP_SET_PERMISSIONS */
> #define XEN_DOMCTL_MEMATTRS_ACCESS_N 0x00U
> #define XEN_DOMCTL_MEMATTRS_ACCESS_R (0x01U<<0)
> #define XEN_DOMCTL_MEMATTRS_ACCESS_W (0x01U<<1)
> #define XEN_DOMCTL_MEMATTRS_ACCESS_X (0x01U<<2)
> #define XEN_DOMCTL_MEMATTRS_ACCESS_RW \
> (XEN_DOMCTL_MEMATTRS_ACCESS_R|XEN_DOMCTL_MEMATTRS_ACCESS_W)
> #define XEN_DOMCTL_MEMATTRS_ACCESS_RX \
> (XEN_DOMCTL_MEMATTRS_ACCESS_R|XEN_DOMCTL_MEMATTRS_ACCESS_X)
> #define XEN_DOMCTL_MEMATTRS_ACCESS_WX \
> (XEN_DOMCTL_MEMATTRS_ACCESS_W|XEN_DOMCTL_MEMATTRS_ACCESS_X)
> #define XEN_DOMCTL_MEMATTRS_ACCESS_RWX \
> (XEN_DOMCTL_MEMATTRS_ACCESS_RW|XEN_DOMCTL_MEMATTRS_ACCESS_X)
>
> struct xen_domctl_memattrs_op {
> int op; /* IN XEN_DOMCTL_MEMATTRS_OP_* */
uint32_t: we only use explicitly sized integers in hypercalls
> xen_pfn_t first_gfn; /* IN first page in range */
> uint32_t nr_gfns; /* IN number of pages in range */
>
> XEN_GUEST_HANDLE(uint32_t) attrs; /* IN/OUT per-page attrs */
XEN_GUEST_HANDLE is used for pointers in struct (typically for arrays).
In this case, I don't think we need a pointer, we could just have a
single uint32_t to specify the permissions and attributes for all the
pages in the range.
> XEN_GUEST_HANDLE(int) errs; /* OUT Per gfn error code */
I am not sure we need a pointer for the errors either. We could have a
single integer to express the error number and the page that caused it.
> }
>
>
> Notes
> ~~~~~
> Since neither x86 nor arm support all the cache/share flags above, the
> function will return an err if the one or more flags given by the caller are
> not supported.
>
>
> ********************************************************************************
> References
> ~~~~~~~~~~
> [1] [RFC]Proposal to allow setting up shared memory areas between VMs
> from xl config file
> v2: https://lists.xen.org/archives/html/xen-devel/2017-06/msg02256.html
> v1: https://lists.xen.org/archives/html/xen-devel/2017-05/msg01288.html
> [2] https://lists.xen.org/archives/html/xen-devel/2017-06/msg02918.html
> [3]
> http://xenbits.xen.org/hg/staging/xen-unstable.hg/file/fe6c71e5586b/xen/include/public/domctl.h#l621
> [4] Intel® 64 and IA-32 Architectures Software Developer’s Manual,
> Volume 3, 11.3
> [5] ARM® Architecture Reference Manual - ARMv8, for ARMv8-A
> architecture profile(Issue B.a), B2.7.1
> _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |