From: Ed White <edmund.h.white@intel.com>
To: "Lengyel, Tamas" <tlengyel@novetta.com>
Cc: Ravi Sahita <ravi.sahita@intel.com>,
Wei Liu <wei.liu2@citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
Xen-devel <xen-devel@lists.xen.org>,
Jan Beulich <jbeulich@suse.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [PATCH v2 08/12] x86/altp2m: alternate p2m memory events.
Date: Wed, 24 Jun 2015 11:02:34 -0700 [thread overview]
Message-ID: <558AF0BA.4080505@intel.com> (raw)
In-Reply-To: <CAD33N+7g+J_J+Fb4HLg+2Q4grv=ET4ENqg448tT9UL5U1cqy-A@mail.gmail.com>
On 06/24/2015 09:01 AM, Lengyel, Tamas wrote:
> On Mon, Jun 22, 2015 at 2:56 PM, Ed White <edmund.h.white@intel.com> wrote:
>
>> Add a flag to indicate that a memory event occurred in an alternate p2m
>> and a field containing the p2m index. Allow the response to switch to
>> a different p2m using the same flag and field.
>>
>> Modify p2m_access_check() to handle alternate p2m's.
>>
>> Signed-off-by: Ed White <edmund.h.white@intel.com>
>> ---
>> xen/arch/x86/mm/p2m.c | 20 +++++++++++++++++++-
>> xen/include/asm-arm/p2m.h | 7 +++++++
>> xen/include/asm-x86/p2m.h | 4 ++++
>> xen/include/public/vm_event.h | 13 ++++++++++++-
>> xen/include/xen/mem_access.h | 1 +
>> 5 files changed, 43 insertions(+), 2 deletions(-)
>>
>> diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
>> index 87b4b75..389360a 100644
>> --- a/xen/arch/x86/mm/p2m.c
>> +++ b/xen/arch/x86/mm/p2m.c
>> @@ -1516,6 +1516,13 @@ void p2m_mem_access_emulate_check(struct vcpu *v,
>> }
>> }
>>
>> +void p2m_mem_access_altp2m_check(struct vcpu *v, const
>> vm_event_response_t *rsp)
>> +{
>> + if ( (rsp->flags & MEM_ACCESS_ALTERNATE_P2M) &&
>> + altp2mhvm_active(v->domain) )
>> + p2m_switch_vcpu_altp2m_by_id(v, rsp->u.mem_access.altp2m_idx);
>> +}
>>
>
> The function should be renamed p2m_altp2m_check as it is not really
> required to use mem_access at all to be able use altp2m. See my comment
> below.
>
>
>> +
>> bool_t p2m_mem_access_check(paddr_t gpa, unsigned long gla,
>> struct npfec npfec,
>> vm_event_request_t **req_ptr)
>> @@ -1523,7 +1530,7 @@ bool_t p2m_mem_access_check(paddr_t gpa, unsigned
>> long gla,
>> struct vcpu *v = current;
>> unsigned long gfn = gpa >> PAGE_SHIFT;
>> struct domain *d = v->domain;
>> - struct p2m_domain* p2m = p2m_get_hostp2m(d);
>> + struct p2m_domain *p2m = NULL;
>> mfn_t mfn;
>> p2m_type_t p2mt;
>> p2m_access_t p2ma;
>> @@ -1531,6 +1538,11 @@ bool_t p2m_mem_access_check(paddr_t gpa, unsigned
>> long gla,
>> int rc;
>> unsigned long eip = guest_cpu_user_regs()->eip;
>>
>> + if ( altp2mhvm_active(d) )
>> + p2m = p2m_get_altp2m(v);
>> + if ( !p2m )
>> + p2m = p2m_get_hostp2m(d);
>> +
>> /* First, handle rx2rw conversion automatically.
>> * These calls to p2m->set_entry() must succeed: we have the gfn
>> * locked and just did a successful get_entry(). */
>> @@ -1637,6 +1649,12 @@ bool_t p2m_mem_access_check(paddr_t gpa, unsigned
>> long gla,
>> req->vcpu_id = v->vcpu_id;
>>
>> p2m_vm_event_fill_regs(req);
>> +
>> + if ( altp2mhvm_active(v->domain) )
>> + {
>> + req->flags |= MEM_ACCESS_ALTERNATE_P2M;
>> + req->u.mem_access.altp2m_idx = vcpu_altp2mhvm(v).p2midx;
>> + }
>> }
>>
>> /* Pause the current VCPU */
>> diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
>> index 63748ef..b31dd6f 100644
>> --- a/xen/include/asm-arm/p2m.h
>> +++ b/xen/include/asm-arm/p2m.h
>> @@ -109,6 +109,13 @@ void p2m_mem_access_emulate_check(struct vcpu *v,
>> /* Not supported on ARM. */
>> }
>>
>> +static inline
>> +void p2m_mem_access_altp2m_check(struct vcpu *v,
>> + const mem_event_response_t *rsp)
>> +{
>> + /* Not supported on ARM. */
>> +}
>> +
>> #define p2m_is_foreign(_t) ((_t) == p2m_map_foreign)
>> #define p2m_is_ram(_t) ((_t) == p2m_ram_rw || (_t) == p2m_ram_ro)
>>
>> diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
>> index 16fd523..d84da33 100644
>> --- a/xen/include/asm-x86/p2m.h
>> +++ b/xen/include/asm-x86/p2m.h
>> @@ -762,6 +762,10 @@ bool_t p2m_find_altp2m_by_eptp(struct domain *d,
>> uint64_t eptp, unsigned long *i
>> /* Switch alternate p2m for a single vcpu */
>> bool_t p2m_switch_vcpu_altp2m_by_id(struct vcpu *v, uint16_t idx);
>>
>> +/* Check to see if vcpu should be switched to a different p2m. */
>> +void p2m_mem_access_altp2m_check(struct vcpu *v,
>> + const vm_event_response_t *rsp);
>> +
>> /*
>> * p2m type to IOMMU flags
>> */
>> diff --git a/xen/include/public/vm_event.h b/xen/include/public/vm_event.h
>> index 577e971..b492f65 100644
>> --- a/xen/include/public/vm_event.h
>> +++ b/xen/include/public/vm_event.h
>> @@ -149,13 +149,24 @@ struct vm_event_regs_x86 {
>> * potentially having side effects (like memory mapped or port I/O)
>> disabled.
>> */
>> #define MEM_ACCESS_EMULATE_NOWRITE (1 << 7)
>> +/*
>> + * This flag can be set in a request or a response
>> + *
>> + * On a request, indicates that the event occurred in the alternate p2m
>> specified by
>> + * the altp2m_idx request field.
>> + *
>> + * On a response, indicates that the VCPU should resume in the alternate
>> p2m specified
>> + * by the altp2m_idx response field if possible.
>> + */
>> +#define MEM_ACCESS_ALTERNATE_P2M (1 << 8)
>>
>
> This definition should be renamed VM_EVENT_FLAG_ALTERNATE_P2M and moved to
> the appropriate location. It should also be checked for all events, not
> just for mem_access, similar to how VM_EVENT_FLAG_VCPU_PAUSED is checked
> for, as we might want to switch views in response to a variety of events.
> Right now I worked around this be specifying the response to a singlestep
> event as if it was a response to a mem_access one, but that's very hackish.
Good points. I'll do as you suggest.
Ed
next prev parent reply other threads:[~2015-06-24 18:02 UTC|newest]
Thread overview: 116+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-22 18:56 [PATCH v2 00/12] Alternate p2m: support multiple copies of host p2m Ed White
2015-06-22 18:56 ` [PATCH v2 01/12] VMX: VMFUNC and #VE definitions and detection Ed White
2015-06-24 8:45 ` Andrew Cooper
2015-06-22 18:56 ` [PATCH v2 02/12] VMX: implement suppress #VE Ed White
2015-06-24 9:35 ` Andrew Cooper
2015-06-29 14:20 ` George Dunlap
2015-06-29 14:31 ` Andrew Cooper
2015-06-29 15:03 ` George Dunlap
2015-06-29 16:21 ` Sahita, Ravi
2015-06-29 16:21 ` Ed White
2015-06-22 18:56 ` [PATCH v2 03/12] x86/HVM: Hardware alternate p2m support detection Ed White
2015-06-24 9:44 ` Andrew Cooper
2015-06-24 10:07 ` Jan Beulich
2015-06-22 18:56 ` [PATCH v2 04/12] x86/altp2m: basic data structures and support routines Ed White
2015-06-24 10:06 ` Andrew Cooper
2015-06-24 10:23 ` Jan Beulich
2015-06-24 17:20 ` Ed White
2015-06-24 10:29 ` Andrew Cooper
2015-06-24 11:14 ` Andrew Cooper
2015-06-26 21:17 ` Ed White
2015-06-27 19:25 ` Ed White
2015-06-29 13:00 ` Andrew Cooper
2015-06-29 16:23 ` Ed White
2015-06-24 14:44 ` Jan Beulich
2015-06-22 18:56 ` [PATCH v2 05/12] VMX/altp2m: add code to support EPTP switching and #VE Ed White
2015-06-24 11:59 ` Andrew Cooper
2015-06-24 17:31 ` Ed White
2015-06-24 17:40 ` Andrew Cooper
2015-06-22 18:56 ` [PATCH v2 06/12] VMX: add VMFUNC leaf 0 (EPTP switching) to emulator Ed White
2015-06-24 12:47 ` Andrew Cooper
2015-06-24 20:29 ` Ed White
2015-06-25 8:26 ` Jan Beulich
2015-06-24 14:26 ` Jan Beulich
2015-06-22 18:56 ` [PATCH v2 07/12] x86/altp2m: add control of suppress_ve Ed White
2015-06-24 13:05 ` Andrew Cooper
2015-06-24 14:38 ` Jan Beulich
2015-06-24 17:53 ` Ed White
2015-06-25 8:12 ` Jan Beulich
2015-06-25 16:36 ` Ed White
2015-06-26 6:04 ` Jan Beulich
2015-06-26 16:27 ` Ed White
2015-07-06 17:12 ` George Dunlap
2015-07-06 17:35 ` Ed White
2015-07-06 18:29 ` George Dunlap
2015-07-06 18:43 ` Ed White
2015-07-07 10:10 ` George Dunlap
2015-07-07 16:24 ` Ed White
2015-07-07 17:33 ` George Dunlap
2015-07-07 17:38 ` Sahita, Ravi
2015-07-08 7:24 ` Jan Beulich
2015-07-08 10:12 ` Tim Deegan
2015-07-08 12:51 ` George Dunlap
2015-07-08 7:23 ` Jan Beulich
2015-07-07 8:04 ` Jan Beulich
2015-06-22 18:56 ` [PATCH v2 08/12] x86/altp2m: alternate p2m memory events Ed White
2015-06-24 13:09 ` Andrew Cooper
2015-06-24 16:01 ` Lengyel, Tamas
2015-06-24 18:02 ` Ed White [this message]
2015-06-22 18:56 ` [PATCH v2 09/12] x86/altp2m: add remaining support routines Ed White
2015-06-23 18:15 ` Lengyel, Tamas
2015-06-23 18:52 ` Ed White
2015-06-23 19:35 ` Lengyel, Tamas
2015-06-24 13:46 ` Andrew Cooper
2015-06-24 17:47 ` Ed White
2015-06-24 18:19 ` Andrew Cooper
2015-06-26 16:30 ` Ed White
2015-06-29 13:03 ` Andrew Cooper
2015-06-29 16:24 ` Ed White
2015-06-24 16:15 ` Lengyel, Tamas
2015-06-24 18:06 ` Ed White
2015-06-25 8:52 ` Ian Campbell
2015-06-25 16:27 ` Ed White
2015-06-25 12:44 ` Lengyel, Tamas
2015-06-25 13:40 ` Razvan Cojocaru
2015-06-25 16:48 ` Ed White
2015-06-25 17:39 ` Sahita, Ravi
2015-06-25 18:22 ` Razvan Cojocaru
2015-06-25 18:23 ` Lengyel, Tamas
2015-06-25 20:46 ` Ed White
2015-06-25 22:45 ` Lengyel, Tamas
2015-06-25 23:10 ` Ed White
2015-06-25 2:44 ` Lengyel, Tamas
2015-06-25 16:31 ` Ed White
2015-06-25 17:42 ` Lengyel, Tamas
2015-06-25 20:27 ` Ed White
2015-06-25 21:33 ` Lengyel, Tamas
2015-06-22 18:56 ` [PATCH v2 10/12] x86/altp2m: define and implement alternate p2m HVMOP types Ed White
2015-06-24 13:58 ` Andrew Cooper
2015-06-24 14:53 ` Jan Beulich
2015-06-22 18:56 ` [PATCH v2 11/12] x86/altp2m: Add altp2mhvm HVM domain parameter Ed White
2015-06-24 14:06 ` Andrew Cooper
2015-06-24 14:59 ` Jan Beulich
2015-06-24 17:57 ` Ed White
2015-06-24 18:08 ` Andrew Cooper
2015-06-25 8:34 ` Jan Beulich
2015-06-25 8:33 ` Jan Beulich
2015-06-22 18:56 ` [PATCH v2 12/12] x86/altp2m: XSM hooks for altp2m HVM ops Ed White
2015-06-26 19:24 ` Daniel De Graaf
2015-06-26 19:35 ` Ed White
2015-06-29 17:52 ` Daniel De Graaf
2015-06-29 17:55 ` Sahita, Ravi
2015-06-23 21:27 ` [PATCH v2 00/12] Alternate p2m: support multiple copies of host p2m Lengyel, Tamas
2015-06-23 22:25 ` Ed White
2015-06-24 5:39 ` Razvan Cojocaru
2015-06-24 13:32 ` Lengyel, Tamas
2015-06-24 13:37 ` Razvan Cojocaru
2015-06-24 16:43 ` Ed White
2015-06-24 21:34 ` Lengyel, Tamas
2015-06-24 22:02 ` Ed White
2015-06-24 22:45 ` Lengyel, Tamas
2015-06-24 22:55 ` Ed White
2015-06-25 9:00 ` Andrew Cooper
2015-06-25 16:38 ` Ed White
2015-06-25 17:29 ` Lengyel, Tamas
2015-06-25 20:34 ` Ed White
2015-06-24 14:10 ` Andrew Cooper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=558AF0BA.4080505@intel.com \
--to=edmund.h.white@intel.com \
--cc=andrew.cooper3@citrix.com \
--cc=dgdegra@tycho.nsa.gov \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=ravi.sahita@intel.com \
--cc=tim@xen.org \
--cc=tlengyel@novetta.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.