2020-08-06 22:13:34 +08:00
|
|
|
# vmbus.c
|
vmbus: vmbus implementation
Add the VMBus infrastructure -- bus, devices, root bridge, vmbus state
machine, vmbus channel interactions, etc.
VMBus is a collection of technologies. At its lowest layer, it's a message
passing and signaling mechanism, allowing efficient passing of messages to and
from guest VMs. A layer higher, it's a mechanism for defining channels of
communication, where each channel is tagged with a type (which implies a
protocol) and a instance ID. A layer higher than that, it's a bus driver,
serving as the basis of device enumeration within a VM, where a channel can
optionally be exposed as a paravirtual device. When a server-side (paravirtual
back-end) component wishes to offer a channel to a guest VM, it does so by
specifying a channel type, a mode, and an instance ID. VMBus then exposes this
in the guest.
More information about VMBus can be found in the file
vmbuskernelmodeclientlibapi.h in Microsoft's WDK.
TODO:
- split into smaller palatable pieces
- more comments
- check and handle corner cases
Kudos to Evgeny Yakovlev (formerly eyakovlev@virtuozzo.com) and Andrey
Smetatin (formerly asmetanin@virtuozzo.com) for research and
prototyping.
Signed-off-by: Roman Kagan <rkagan@virtuozzo.com>
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Signed-off-by: Jon Doron <arilou@gmail.com>
Message-Id: <20200424123444.3481728-4-arilou@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2020-04-24 20:34:41 +08:00
|
|
|
vmbus_recv_message(uint32_t type, uint32_t size) "type %d size %d"
|
|
|
|
vmbus_signal_event(void) ""
|
|
|
|
vmbus_channel_notify_guest(uint32_t chan_id) "channel #%d"
|
|
|
|
vmbus_post_msg(uint32_t type, uint32_t size) "type %d size %d"
|
|
|
|
vmbus_msg_cb(int status) "message status %d"
|
|
|
|
vmbus_process_incoming_message(uint32_t message_type) "type %d"
|
|
|
|
vmbus_initiate_contact(uint16_t major, uint16_t minor, uint32_t vcpu, uint64_t monitor_page1, uint64_t monitor_page2, uint64_t interrupt_page) "version %d.%d target vp %d mon pages 0x%"PRIx64",0x%"PRIx64" int page 0x%"PRIx64
|
|
|
|
vmbus_send_offer(uint32_t chan_id, void *dev) "channel #%d dev %p"
|
|
|
|
vmbus_terminate_offers(void) ""
|
|
|
|
vmbus_gpadl_header(uint32_t gpadl_id, uint16_t num_gfns) "gpadl #%d gfns %d"
|
|
|
|
vmbus_gpadl_body(uint32_t gpadl_id) "gpadl #%d"
|
|
|
|
vmbus_gpadl_created(uint32_t gpadl_id) "gpadl #%d"
|
|
|
|
vmbus_gpadl_teardown(uint32_t gpadl_id) "gpadl #%d"
|
|
|
|
vmbus_gpadl_torndown(uint32_t gpadl_id) "gpadl #%d"
|
|
|
|
vmbus_open_channel(uint32_t chan_id, uint32_t gpadl_id, uint32_t target_vp) "channel #%d gpadl #%d target vp %d"
|
|
|
|
vmbus_channel_open(uint32_t chan_id, uint32_t status) "channel #%d status %d"
|
|
|
|
vmbus_close_channel(uint32_t chan_id) "channel #%d"
|