hyperv/vmbus: Move IDT vector to vmbus_softc
Prepare to get rid of the hv_setup_arg. MFC after: 1 week Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D6449
This commit is contained in:
parent
fc43db2e9e
commit
b48bf88aec
@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/hyperv/include/hyperv_busdma.h>
|
||||
#include <dev/hyperv/vmbus/hv_vmbus_priv.h>
|
||||
#include <dev/hyperv/vmbus/hyperv_reg.h>
|
||||
#include <dev/hyperv/vmbus/vmbus_var.h>
|
||||
|
||||
#define HV_NANOSECONDS_PER_SEC 1000000000L
|
||||
|
||||
@ -220,8 +221,8 @@ hv_vmbus_signal_event(void *con_id)
|
||||
*/
|
||||
void
|
||||
hv_vmbus_synic_init(void *arg)
|
||||
|
||||
{
|
||||
struct vmbus_softc *sc = vmbus_get_softc();
|
||||
int cpu;
|
||||
uint64_t hv_vcpu_index;
|
||||
hv_vmbus_synic_simp simp;
|
||||
@ -266,7 +267,7 @@ hv_vmbus_synic_init(void *arg)
|
||||
|
||||
/*HV_SHARED_SINT_IDT_VECTOR + 0x20; */
|
||||
shared_sint.as_uint64_t = 0;
|
||||
shared_sint.u.vector = setup_args->vector;
|
||||
shared_sint.u.vector = sc->vmbus_idtvec;
|
||||
shared_sint.u.masked = FALSE;
|
||||
shared_sint.u.auto_eoi = TRUE;
|
||||
|
||||
|
@ -385,25 +385,18 @@ vmbus_bus_init(void)
|
||||
sc = vmbus_get_softc();
|
||||
|
||||
/*
|
||||
* Find a free IDT slot for vmbus callback.
|
||||
* Find a free IDT vector for vmbus messages/events.
|
||||
*/
|
||||
hv_vmbus_g_context.hv_cb_vector = lapic_ipi_alloc(IDTVEC(hv_vmbus_callback));
|
||||
if (hv_vmbus_g_context.hv_cb_vector < 0) {
|
||||
if(bootverbose)
|
||||
printf("Error VMBUS: Cannot find free IDT slot for "
|
||||
"vmbus callback!\n");
|
||||
sc->vmbus_idtvec = lapic_ipi_alloc(IDTVEC(hv_vmbus_callback));
|
||||
if (sc->vmbus_idtvec < 0) {
|
||||
device_printf(sc->vmbus_dev, "cannot find free IDT vector\n");
|
||||
ret = ENXIO;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if(bootverbose)
|
||||
printf("VMBUS: vmbus callback vector %d\n",
|
||||
hv_vmbus_g_context.hv_cb_vector);
|
||||
|
||||
/*
|
||||
* Notify the hypervisor of our vector.
|
||||
*/
|
||||
setup_args.vector = hv_vmbus_g_context.hv_cb_vector;
|
||||
if(bootverbose) {
|
||||
device_printf(sc->vmbus_dev, "vmbus IDT vector %d\n",
|
||||
sc->vmbus_idtvec);
|
||||
}
|
||||
|
||||
CPU_FOREACH(j) {
|
||||
snprintf(buf, sizeof(buf), "cpu%d:hyperv", j);
|
||||
@ -493,7 +486,7 @@ vmbus_bus_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
lapic_ipi_free(hv_vmbus_g_context.hv_cb_vector);
|
||||
lapic_ipi_free(sc->vmbus_idtvec);
|
||||
|
||||
cleanup:
|
||||
return (ret);
|
||||
@ -553,6 +546,7 @@ vmbus_sysinit(void *arg __unused)
|
||||
static int
|
||||
vmbus_detach(device_t dev)
|
||||
{
|
||||
struct vmbus_softc *sc = device_get_softc(dev);
|
||||
int i;
|
||||
|
||||
hv_vmbus_release_unattached_channels();
|
||||
@ -573,7 +567,7 @@ vmbus_detach(device_t dev)
|
||||
}
|
||||
}
|
||||
|
||||
lapic_ipi_free(hv_vmbus_g_context.hv_cb_vector);
|
||||
lapic_ipi_free(sc->vmbus_idtvec);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
@ -216,11 +216,6 @@ typedef struct {
|
||||
struct taskqueue *hv_event_queue[MAXCPU];
|
||||
struct taskqueue *hv_msg_tq[MAXCPU];
|
||||
struct task hv_msg_task[MAXCPU];
|
||||
/*
|
||||
* Host use this vector to interrupt guest for vmbus channel
|
||||
* event and msg.
|
||||
*/
|
||||
int hv_cb_vector;
|
||||
} hv_vmbus_context;
|
||||
|
||||
/*
|
||||
@ -763,7 +758,6 @@ void hv_et_intr(struct trapframe*);
|
||||
void vmbus_scan(void);
|
||||
|
||||
typedef struct {
|
||||
unsigned int vector;
|
||||
void *page_buffers[2 * MAXCPU];
|
||||
} hv_setup_args;
|
||||
|
||||
|
@ -39,6 +39,7 @@ struct vmbus_softc {
|
||||
void (*vmbus_event_proc)(struct vmbus_softc *, int);
|
||||
struct vmbus_pcpu_data vmbus_pcpu[MAXCPU];
|
||||
device_t vmbus_dev;
|
||||
int vmbus_idtvec;
|
||||
};
|
||||
|
||||
extern struct vmbus_softc *vmbus_sc;
|
||||
|
Loading…
Reference in New Issue
Block a user