|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH V2 1/8] xen/mem_event: Cleanup of mem_event structures
>>> On 22.01.15 at 16:34, <tamas.lengyel@xxxxxxxxxxxx> wrote:
> On Thu, Jan 22, 2015 at 4:00 PM, Jan Beulich <JBeulich@xxxxxxxx> wrote:
>>>>> On 18.01.15 at 16:17, <tamas.lengyel@xxxxxxxxxxxx> wrote:
>>> --- a/xen/include/public/mem_event.h
>>> +++ b/xen/include/public/mem_event.h
>>> @@ -27,9 +27,15 @@
>>> #ifndef _XEN_PUBLIC_MEM_EVENT_H
>>> #define _XEN_PUBLIC_MEM_EVENT_H
>>>
>>> +#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
>>> +#error "vm event operations are intended for use only by Xen or node
>>> control tools"
>>> +#endif
>>> +
>>> #include "xen.h"
>>> #include "io/ring.h"
>>>
>>> +#define MEM_EVENT_INTERFACE_VERSION 0x00000001
>>
>> This doesn't appear to be used anywhere, and hence isn't useful to
>> add here.
>
> It is intended to be used to establish an API version for backwards
> compatibility. We don't have any backwards compatibility checks at
> this point, but this will change as soon as we extend this interface
> as things go forward in the future.
But without the caller passing you the version of the ABI it uses,
how do you want to do such compatibility handling?
>>> @@ -48,16 +54,27 @@
>>> */
>>> #define MEM_EVENT_FLAG_EMULATE_NOWRITE (1 << 6)
>>>
>>> -/* Reasons for the memory event request */
>>> -#define MEM_EVENT_REASON_UNKNOWN 0 /* typical reason */
>>> -#define MEM_EVENT_REASON_VIOLATION 1 /* access violation, GFN is
>>> address */
>>> -#define MEM_EVENT_REASON_CR0 2 /* CR0 was hit: gfn is new CR0
>>> value, gla is previous */
>>> -#define MEM_EVENT_REASON_CR3 3 /* CR3 was hit: gfn is new CR3
>>> value, gla is previous */
>>> -#define MEM_EVENT_REASON_CR4 4 /* CR4 was hit: gfn is new CR4
>>> value, gla is previous */
>>> -#define MEM_EVENT_REASON_INT3 5 /* int3 was hit: gla/gfn are RIP
>>> */
>>> -#define MEM_EVENT_REASON_SINGLESTEP 6 /* single step was invoked:
>>> gla/gfn are RIP */
>>> -#define MEM_EVENT_REASON_MSR 7 /* MSR was hit: gfn is MSR value,
>>> gla is MSR address;
>>> - does NOT honour
> HVMPME_onchangeonly */
>>> +/* Reasons for the vm event request */
>>> +/* Default case */
>>> +#define MEM_EVENT_REASON_UNKNOWN 0
>>> +/* Memory access violation */
>>> +#define MEM_EVENT_REASON_MEM_ACCESS_VIOLATION 1
>>> +/* Memory sharing event */
>>> +#define MEM_EVENT_REASON_MEM_SHARING 2
>>> +/* Memory paging event */
>>> +#define MEM_EVENT_REASON_MEM_PAGING 3
>>> +/* CR0 was updated */
>>> +#define MEM_EVENT_REASON_CR0 4
>>> +/* CR3 was updated */
>>> +#define MEM_EVENT_REASON_CR3 5
>>> +/* CR4 was updated */
>>> +#define MEM_EVENT_REASON_CR4 6
>>> +/* Debug operation executed (int3) */
>>> +#define MEM_EVENT_REASON_INT3 7
>>> +/* Single-step (MTF) */
>>> +#define MEM_EVENT_REASON_SINGLESTEP 8
>>> +/* An MSR was updated. Does NOT honour HVMPME_onchangeonly */
>>> +#define MEM_EVENT_REASON_MSR 9
>>
>> I see you rename these a second time in patch 5 - can't this renaming
>> be reduced to just one?
>
> I didn't rename anything here, just updated the comments.
Afaics MEM_EVENT_REASON_VIOLATION became
MEM_EVENT_REASON_MEM_ACCESS_VIOLATION,
MEM_EVENT_REASON_MEM_{SHARING,PAGING} got
introduced, and many other got renumbered. And from a
trivial perspective - if what you said was true, the diff could
have retained every other line (as you then would have to
insert further blanks either).
>>> @@ -97,16 +114,16 @@ struct mem_event_regs_x86 {
>>> uint32_t _pad;
>>> };
>>>
>>> -typedef struct mem_event_st {
>>> - uint32_t flags;
>>> - uint32_t vcpu_id;
>>> +struct mem_event_regs {
>>> + union {
>>> + struct mem_event_regs_x86 x86;
>>> + };
>>> +};
>>
>> No non-standard (C89) features in public headers please.
>
> Elaborate please? I have this union as we will likely have ARM
> registers as well soon. I guess it can wait and be introduced when the
> ARM side catches up.
But the union has no field name.
>>> +struct mem_event_mem_access_data {
>>> uint64_t gfn;
>>> uint64_t offset;
>>> uint64_t gla; /* if gla_valid */
>>> -
>>> - uint32_t p2mt;
>>> -
>>> uint16_t access_r:1;
>>> uint16_t access_w:1;
>>> uint16_t access_x:1;
>>
>> I also wonder how well thought through the use of bit fields here is.
>
> It saves some space on the ring. Maybe a uint8_t is enough.
The same can be achieved with a flags field and a set of constants.
>>> +struct mem_event_int3_data {
>>> + uint64_t gfn;
>>> + uint64_t gla;
>>> +};
>>> +
>>> +struct mem_event_singlestep_data {
>>> + uint64_t gfn;
>>> + uint64_t gla;
>>> +};
>>
>> I may lack some understanding of the interfaces here, but what do
>> gfn and gla have to do with int3 and single-step events?
>
> These contained auxiliary info about the instruction triggering the
> event. It is somewhat superseded at this point by the automatic
> filling of the x86 registers struct, however, the gfn is not included
> in that struct so it can still be useful.
>
> Also, how
>> architecture-neutral is int3 really?!
>
> These aren't architecture neutral by any means. However, we likely are
> going to have SMC events on the ARM as well, which won't be
> architecture neutral either. I don't see a way around it. But why
> would this interface have to be architecture neutral? IMHO a comment
> saying these are features only for Intel/AMD/ARM would be sufficient.
> We already do checks for the architecture when the user attempts to
> enable these features to see if it actually supported on the hardware
> or not.
For the one at hand - why can't it be named software_breakpoint
or some such?
>>> +struct mem_event_msr_data {
>>> + uint64_t msr;
>>
>> Maybe better uint32_t with another such typed padding slot following?
>
> Not sure I follow. Could you elaborate what the issue is?
Architecturally there are no MSRs > 0xffffffff.
>>> +typedef struct mem_event_st {
>>> + uint32_t flags;
>>> + uint32_t vcpu_id;
>>> + uint32_t reason;
>>> +
>>> + union {
>>> + struct mem_event_paging_data mem_paging_event;
>>> + struct mem_event_sharing_data mem_sharing_event;
>>> + struct mem_event_mem_access_data mem_access_event;
>>> + struct mem_event_cr_data cr_event;
>>> + struct mem_event_int3_data int3_event;
>>> + struct mem_event_singlestep_data singlestep_event;
>>> + struct mem_event_msr_data msr_event;
>>> + };
>>>
>>> - uint16_t reason;
>>> - struct mem_event_regs_x86 x86_regs;
>>> + struct mem_event_regs regs;
>>> } mem_event_request_t, mem_event_response_t;
>>
>> This structure's layout now differs between 32- and 64-bit, which I'm
>> sure you want to avoid.
>
> Any suggestions? Make the struct(s) packed?
No, add explicit padding.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |