Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F106145111
D6916.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D6916.diff
View Options
Index: head/sys/dev/hyperv/include/hyperv.h
===================================================================
--- head/sys/dev/hyperv/include/hyperv.h
+++ head/sys/dev/hyperv/include/hyperv.h
@@ -55,6 +55,7 @@
#include <amd64/include/xen/synch_bitops.h>
#include <amd64/include/atomic.h>
+#include <dev/hyperv/include/hyperv_busdma.h>
typedef uint8_t hv_bool_uint8_t;
@@ -528,20 +529,6 @@
} __packed hv_vmbus_connection_id;
-/*
- * Definition of the hv_vmbus_signal_event hypercall input structure
- */
-typedef struct {
- hv_vmbus_connection_id connection_id;
- uint16_t flag_number;
- uint16_t rsvd_z;
-} __packed hv_vmbus_input_signal_event;
-
-typedef struct {
- uint64_t align8;
- hv_vmbus_input_signal_event event;
-} __packed hv_vmbus_input_signal_event_buffer;
-
typedef struct hv_vmbus_channel {
TAILQ_ENTRY(hv_vmbus_channel) list_entry;
struct hv_device* device;
@@ -589,14 +576,8 @@
boolean_t is_dedicated_interrupt;
- /*
- * Used as an input param for HV_CALL_SIGNAL_EVENT hypercall.
- */
- hv_vmbus_input_signal_event_buffer signal_event_buffer;
- /*
- * 8-bytes aligned of the buffer above
- */
- hv_vmbus_input_signal_event *signal_event_param;
+ struct hypercall_sigevt_in *ch_sigevt;
+ struct hyperv_dma ch_sigevt_dma;
/*
* From Win8, this field specifies the target virtual process
Index: head/sys/dev/hyperv/include/hyperv_busdma.h
===================================================================
--- head/sys/dev/hyperv/include/hyperv_busdma.h
+++ head/sys/dev/hyperv/include/hyperv_busdma.h
@@ -29,6 +29,10 @@
#ifndef _HYPERV_BUSDMA_H_
#define _HYPERV_BUSDMA_H_
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <machine/bus.h>
+
struct hyperv_dma {
bus_addr_t hv_paddr;
bus_dma_tag_t hv_dtag;
Index: head/sys/dev/hyperv/vmbus/hv_channel.c
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel.c
+++ head/sys/dev/hyperv/vmbus/hv_channel.c
@@ -46,6 +46,7 @@
#include <vm/pmap.h>
#include <dev/hyperv/vmbus/hv_vmbus_priv.h>
+#include <dev/hyperv/vmbus/hyperv_var.h>
#include <dev/hyperv/vmbus/vmbus_reg.h>
#include <dev/hyperv/vmbus/vmbus_var.h>
@@ -72,7 +73,7 @@
(uint32_t *)&monitor_page->
trigger_group[channel->monitor_group].u.pending);
} else {
- hv_vmbus_set_event(channel);
+ hypercall_signal_event(channel->ch_sigevt_dma.hv_paddr);
}
}
Index: head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
@@ -32,6 +32,7 @@
#include <sys/mbuf.h>
#include <sys/mutex.h>
+#include <dev/hyperv/include/hyperv_busdma.h>
#include <dev/hyperv/vmbus/hv_vmbus_priv.h>
#include <dev/hyperv/vmbus/vmbus_reg.h>
#include <dev/hyperv/vmbus/vmbus_var.h>
@@ -327,23 +328,23 @@
*/
new_channel->batched_reading = TRUE;
- new_channel->signal_event_param =
- (hv_vmbus_input_signal_event *)
- (HV_ALIGN_UP((unsigned long)
- &new_channel->signal_event_buffer,
- HV_HYPERCALL_PARAM_ALIGN));
-
- new_channel->signal_event_param->connection_id.as_uint32_t = 0;
- new_channel->signal_event_param->connection_id.u.id =
- HV_VMBUS_EVENT_CONNECTION_ID;
- new_channel->signal_event_param->flag_number = 0;
- new_channel->signal_event_param->rsvd_z = 0;
+ new_channel->ch_sigevt = hyperv_dmamem_alloc(
+ bus_get_dma_tag(sc->vmbus_dev),
+ HYPERCALL_SIGEVTIN_ALIGN, 0, sizeof(struct hypercall_sigevt_in),
+ &new_channel->ch_sigevt_dma, BUS_DMA_WAITOK | BUS_DMA_ZERO);
+ if (new_channel->ch_sigevt == NULL) {
+ device_printf(sc->vmbus_dev, "sigevt alloc failed\n");
+ /* XXX */
+ mtx_destroy(&new_channel->sc_lock);
+ free(new_channel, M_DEVBUF);
+ return;
+ }
+ new_channel->ch_sigevt->hc_connid = VMBUS_CONNID_EVENT;
if (hv_vmbus_protocal_version != HV_VMBUS_VERSION_WS2008) {
new_channel->is_dedicated_interrupt =
(offer->is_dedicated_interrupt != 0);
- new_channel->signal_event_param->connection_id.u.id =
- offer->connection_id;
+ new_channel->ch_sigevt->hc_connid = offer->connection_id;
}
memcpy(&new_channel->offer_msg, offer,
Index: head/sys/dev/hyperv/vmbus/hv_connection.c
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_connection.c
+++ head/sys/dev/hyperv/vmbus/hv_connection.c
@@ -158,16 +158,6 @@
}
}
-/**
- * Send an event notification to the parent
- */
-int
-hv_vmbus_set_event(hv_vmbus_channel *channel)
-{
-
- return hv_vmbus_signal_event(channel->signal_event_param);
-}
-
void
vmbus_on_channel_open(const struct hv_vmbus_channel *chan)
{
Index: head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
@@ -363,6 +363,5 @@
*/
int hv_vmbus_connect(struct vmbus_softc *);
int hv_vmbus_disconnect(void);
-int hv_vmbus_set_event(hv_vmbus_channel *channel);
#endif /* __HYPERV_PRIV_H__ */
Index: head/sys/dev/hyperv/vmbus/hyperv.c
===================================================================
--- head/sys/dev/hyperv/vmbus/hyperv.c
+++ head/sys/dev/hyperv/vmbus/hyperv.c
@@ -125,6 +125,13 @@
HYPERCALL_POST_MESSAGE, msg_paddr, 0);
}
+uint64_t
+hypercall_signal_event(bus_addr_t sigevt_paddr)
+{
+ return hypercall_md(hypercall_context.hc_addr,
+ HYPERCALL_SIGNAL_EVENT, sigevt_paddr, 0);
+}
+
/**
* @brief Signal an event on the specified connection using the hypervisor
* event IPC. (This involves a hypercall.)
Index: head/sys/dev/hyperv/vmbus/hyperv_reg.h
===================================================================
--- head/sys/dev/hyperv/vmbus/hyperv_reg.h
+++ head/sys/dev/hyperv/vmbus/hyperv_reg.h
@@ -148,6 +148,7 @@
* Hypercall input values
*/
#define HYPERCALL_POST_MESSAGE 0x005c
+#define HYPERCALL_SIGNAL_EVENT 0x005d
/*
* Hypercall input parameters
@@ -169,4 +170,15 @@
} __packed;
CTASSERT(sizeof(struct hypercall_postmsg_in) == HYPERCALL_POSTMSGIN_SIZE);
+/*
+ * HYPERCALL_SIGNAL_EVENT
+ */
+#define HYPERCALL_SIGEVTIN_ALIGN 8
+
+struct hypercall_sigevt_in {
+ uint32_t hc_connid;
+ uint16_t hc_evtflag_ofs;
+ uint16_t hc_rsvd;
+} __packed;
+
#endif /* !_HYPERV_REG_H_ */
Index: head/sys/dev/hyperv/vmbus/hyperv_var.h
===================================================================
--- head/sys/dev/hyperv/vmbus/hyperv_var.h
+++ head/sys/dev/hyperv/vmbus/hyperv_var.h
@@ -39,5 +39,6 @@
extern u_int hyperv_recommends;
uint64_t hypercall_post_message(bus_addr_t msg_paddr);
+uint64_t hypercall_signal_event(bus_addr_t sigevt_paddr);
#endif /* !_HYPERV_VAR_H_ */
Index: head/sys/dev/hyperv/vmbus/vmbus.c
===================================================================
--- head/sys/dev/hyperv/vmbus/vmbus.c
+++ head/sys/dev/hyperv/vmbus/vmbus.c
@@ -69,12 +69,6 @@
#include <contrib/dev/acpica/include/acpi.h>
#include "acpi_if.h"
-/*
- * NOTE: DO NOT CHANGE THESE
- */
-#define VMBUS_CONNID_MESSAGE 1
-#define VMBUS_CONNID_EVENT 2
-
struct vmbus_msghc {
struct hypercall_postmsg_in *mh_inprm;
struct hypercall_postmsg_in mh_inprm_save;
Index: head/sys/dev/hyperv/vmbus/vmbus_var.h
===================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_var.h
+++ head/sys/dev/hyperv/vmbus/vmbus_var.h
@@ -46,6 +46,12 @@
*/
#define VMBUS_SINT_TIMER 4
+/*
+ * NOTE: DO NOT CHANGE THESE
+ */
+#define VMBUS_CONNID_MESSAGE 1
+#define VMBUS_CONNID_EVENT 2
+
struct vmbus_pcpu_data {
u_long *intr_cnt; /* Hyper-V interrupt counter */
struct vmbus_message *message; /* shared messages */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Dec 27, 3:36 AM (10 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15610801
Default Alt Text
D6916.diff (7 KB)
Attached To
Mode
D6916: hyperv/vmbus: Busdma-fy Hypercall signal event input parameter.
Attached
Detach File
Event Timeline
Log In to Comment