Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/hyperv/utilities/hv_util.c
Show First 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | |||||
#include <dev/hyperv/include/vmbus.h> | #include <dev/hyperv/include/vmbus.h> | ||||
#include <dev/hyperv/utilities/hv_util.h> | #include <dev/hyperv/utilities/hv_util.h> | ||||
#include <dev/hyperv/utilities/vmbus_icreg.h> | #include <dev/hyperv/utilities/vmbus_icreg.h> | ||||
#include "vmbus_if.h" | #include "vmbus_if.h" | ||||
#define VMBUS_IC_BRSIZE (4 * PAGE_SIZE) | #define VMBUS_IC_BRSIZE (4 * PAGE_SIZE) | ||||
CTASSERT(sizeof(struct vmbus_icmsg_negotiate) < VMBUS_IC_BRSIZE); | #define VMBUS_IC_VERCNT 2 | ||||
#define VMBUS_IC_NEGOSZ \ | |||||
__offsetof(struct vmbus_icmsg_negotiate, ic_ver[VMBUS_IC_VERCNT]) | |||||
CTASSERT(VMBUS_IC_NEGOSZ < VMBUS_IC_BRSIZE); | |||||
int | int | ||||
vmbus_ic_negomsg(struct hv_util_sc *sc, void *data, int dlen) | vmbus_ic_negomsg(struct hv_util_sc *sc, void *data, int *dlen0) | ||||
{ | { | ||||
struct vmbus_icmsg_negotiate *nego; | struct vmbus_icmsg_negotiate *nego; | ||||
int cnt, major; | int cnt, major, dlen = *dlen0; | ||||
/* | /* | ||||
* Preliminary message size verification | * Preliminary message size verification | ||||
*/ | */ | ||||
if (dlen < sizeof(*nego)) { | if (dlen < sizeof(*nego)) { | ||||
device_printf(sc->ic_dev, "truncated ic negotiate, len %d\n", | device_printf(sc->ic_dev, "truncated ic negotiate, len %d\n", | ||||
dlen); | dlen); | ||||
return EINVAL; | return EINVAL; | ||||
Show All 16 Lines | vmbus_ic_negomsg(struct hv_util_sc *sc, void *data, int *dlen0) | ||||
/* One framework version */ | /* One framework version */ | ||||
nego->ic_fwver_cnt = 1; | nego->ic_fwver_cnt = 1; | ||||
nego->ic_ver[0] = VMBUS_IC_VERSION(major, 0); | nego->ic_ver[0] = VMBUS_IC_VERSION(major, 0); | ||||
/* One message version */ | /* One message version */ | ||||
nego->ic_msgver_cnt = 1; | nego->ic_msgver_cnt = 1; | ||||
nego->ic_ver[1] = VMBUS_IC_VERSION(major, 0); | nego->ic_ver[1] = VMBUS_IC_VERSION(major, 0); | ||||
/* Data contains two versions */ | /* Update data size */ | ||||
nego->ic_hdr.ic_dsize = __offsetof(struct vmbus_icmsg_negotiate, | nego->ic_hdr.ic_dsize = VMBUS_IC_NEGOSZ - | ||||
ic_ver[2]) - sizeof(struct vmbus_icmsg_hdr); | sizeof(struct vmbus_icmsg_hdr); | ||||
/* Update total size, if necessary */ | |||||
if (dlen < VMBUS_IC_NEGOSZ) | |||||
*dlen0 = VMBUS_IC_NEGOSZ; | |||||
return 0; | return 0; | ||||
} | } | ||||
int | int | ||||
vmbus_ic_probe(device_t dev, const struct vmbus_ic_desc descs[]) | vmbus_ic_probe(device_t dev, const struct vmbus_ic_desc descs[]) | ||||
{ | { | ||||
device_t bus = device_get_parent(dev); | device_t bus = device_get_parent(dev); | ||||
▲ Show 20 Lines • Show All 54 Lines • Show Last 20 Lines |