Hi Daniel, > Please describe it in terms of a QAPI definition, as that's what we're > striving for with all QEMU public interfaces. Once the QAPI design is > agreed, then the -object mapping is trivial, as -object's JSON format > supports arbitrary QAPI structures. Thank you for your guidance! I rethought and and modified my previous proposal: Let me show the command examples firstly: * Add a single event: (x86) -object kvm-pmu-event,id=e0,action=allow,format=x86-default,\ select=0x3c,umask=0x00 (arm or general) -object kvm-pmu-event,id=e1,action=deny,\ format=raw,code=0x01 * Add a counter bitmap: (x86) -object kvm-pmu-counter,id=cnt,action=allow,type=x86-fixed,\ bitmap=0xffff0000 * Add an event list (must use Json syntax format): (x86) -object '{"qom-type":"kvm-pmu-event-list","id"="filter0","action"="allow","format"="x86-default","events=[{"select"=0x3c,"umask"=0x00},{"select"=0x2e,"umask"=0x4f}]' (arm) -object '{"qom-type":"kvm-pmu-event-list","id"="filter1","action"="allow","format"="raw","events"=[{"code"=0x01},{"code"=0x02}]' The specific JSON definitions are as follows (IIUC, this is "in terms of a QAPI definition", right? ;-)): * Define PMU event and counter bitmap with JSON format: - basic filter action: { 'enum': 'KVMPMUFilterAction', 'prefix': 'KVM_PMU_FILTER_ACTION', 'data': ['deny', 'allow' ] } - PMU counter: { 'enum': 'KVMPMUCounterType', 'prefix': 'KVM_PMU_COUNTER_TYPE', 'data': [ 'x86-fixed' ] } { 'struct': 'KVMPMUX86FixedCounter', 'data': { 'bitmap': 'uint32' } } - PMU events (total 3 formats): # 3 encoding formats: "raw" is compatible with shaoqin's ARM format as # well as the x86 raw format, and could support other architectures in # the future. { 'enum': 'KVMPMUEventEncodeFmt', 'prefix': 'KVM_PMU_EVENT_ENCODE_FMT', 'data': ['raw', 'x86-default', 'x86-masked-entry' ] } # A general format. { 'struct': 'KVMPMURawEvent', 'data': { 'code': 'uint64' } } # x86-specific { 'struct': 'KVMPMUX86DefalutEvent', 'data': { 'select': 'uint16', 'umask': 'uint16' } } # another x86 specific { 'struct': 'KVMPMUX86MaskedEntry', 'data': { 'select': 'uint16', 'match': 'uint8', 'mask': 'uint8', 'exclude': 'bool' } } # And their list wrappers: { 'struct': 'KVMPMURawEventList', 'data': { 'events': ['KVMPMURawEvent'] } } { 'struct': 'KVMPMUX86DefalutEventList', 'data': { 'events': ['KVMPMUX86DefalutEvent'] } } { 'struct': 'KVMPMUX86MaskedEntryList', 'data': { 'events': ['KVMPMUX86MaskedEntryList'] } } Based on the above basic structs, we could provide 3 new more qom-types: - 'kvm-pmu-counter': 'KVMPMUFilterCounter' # This is a single object option to configure PMU counter # bitmap filter. { 'union': 'KVMPMUFilterCounter', 'base': { 'action': 'KVMPMUFilterAction', 'type': 'KVMPMUCounterType' }, 'discriminator': 'type', 'data': { 'x86-fixed': 'KVMPMUX86FixedCounter' } } - 'kvm-pmu-counter': 'KVMPMUFilterCounter' # This option is used to configure a single PMU event for # PMU filter. { 'union': 'KVMPMUFilterEvent', 'base': { 'action': 'KVMPMUFilterAction', 'format': 'KVMPMUEventEncodeFmt' }, 'discriminator': 'format', 'data': { 'raw': 'KVMPMURawEvent', 'x86-default': 'KVMPMUX86DefalutEvent', 'x86-masked-entry': 'KVMPMUX86MaskedEntry' } } - 'kvm-pmu-event-list': 'KVMPMUFilterEventList' # Used to configure multiple events. { 'union': 'KVMPMUFilterEventList', 'base': { 'action': 'KVMPMUFilterAction', 'format': 'KVMPMUEventEncodeFmt' }, 'discriminator': 'format', 'data': { 'raw': 'KVMPMURawEventList', 'x86-default': 'KVMPMUX86DefalutEventList', 'x86-masked-entry': 'KVMPMUX86MaskedEntryList' } } Compared to Shaoqin's original format, kvm-pmu-event-list is not able to enumerate events continuously (similar to 0x00-0x30 before), and now user must enumerate events one by one individually. What do you think about the above 3 new commands? Thanks and Best Regards, Zhao