VirtualBox

Changeset 70042 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Dec 9, 2017 12:37:58 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119580
Message:

VBoxGuest-netbsd.c: attach wsmouse(4) as a child to provide mouse
integration. That makes X work without "vboxmouse" driver, using
stock "ws" driver instead.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-netbsd.c

    r70011 r70042  
    5555#include <dev/pci/pcidevs.h>
    5656
     57#include <dev/wscons/wsconsio.h>
     58#include <dev/wscons/wsmousevar.h>
     59#include <dev/wscons/tpcalibvar.h>
     60
    5761#ifdef PVM
    5862#  undef PVM
     
    100104    /** Controller features, limits and status. */
    101105    u_int              vboxguest_state;
     106
     107    device_t sc_wsmousedev;
     108    VMMDevReqMouseStatus *sc_vmmmousereq;
     109    PVBOXGUESTSESSION sc_session;
     110    struct tpcalib_softc sc_tpcalib;
    102111} vboxguest_softc;
    103112
     
    120129static int VBoxGuestNetBSDMatch(device_t parent, cfdata_t match, void *aux);
    121130static void VBoxGuestNetBSDAttach(device_t parent, device_t self, void *aux);
     131static void VBoxGuestNetBSDWsmAttach(vboxguest_softc *sc);
    122132static int VBoxGuestNetBSDDetach(device_t self, int flags);
    123133
     
    137147static int VBoxGuestNetBSDIOCtlSlow(struct vboxguest_session *session, u_long command, void *data);
    138148static int VBoxGuestNetBSDPoll(struct file *fp, int events);
     149
     150/*
     151 * wsmouse(4) accessops
     152 */
     153static int VBoxGuestNetBSDWsmEnable(void *cookie);
     154static void VBoxGuestNetBSDWsmDisable(void *cookie);
     155static int VBoxGuestNetBSDWsmIOCtl(void *cookie, u_long cmd, void *data, int flag, struct lwp *l);
     156
     157static int VBoxGuestNetBSDSetMouseStatus(vboxguest_softc *sc, uint32_t fStatus);
    139158
    140159
     
    174193};
    175194
     195
     196const struct wsmouse_accessops vboxguest_wsm_accessops = {
     197    VBoxGuestNetBSDWsmEnable,
     198    VBoxGuestNetBSDWsmIOCtl,
     199    VBoxGuestNetBSDWsmDisable,
     200};
     201
     202
     203static struct wsmouse_calibcoords vboxguest_wsm_default_calib = {
     204    .minx = VMMDEV_MOUSE_RANGE_MIN,
     205    .miny = VMMDEV_MOUSE_RANGE_MIN,
     206    .maxx = VMMDEV_MOUSE_RANGE_MAX,
     207    .maxy = VMMDEV_MOUSE_RANGE_MAX,
     208    .samplelen = WSMOUSE_CALIBCOORDS_RESET,
     209};
     210
    176211/** Device extention & session data association structure. */
    177212static VBOXGUESTDEVEXT      g_DevExt;
     213
     214static vboxguest_softc     *g_SC;
     215
    178216/** Reference counter */
    179217static volatile uint32_t    cUsers;
     
    189227{
    190228    const struct pci_attach_args *pa = aux;
     229
     230    if (RT_UNLIKELY(g_SC != NULL)) /* should not happen */
     231        return 0;
    191232
    192233    if (   PCI_VENDOR(pa->pa_id) == VMMDEV_VENDORID
     
    210251    bus_dma_segment_t seg;
    211252    int ioh_valid, memh_valid;
     253
     254    KASSERT(g_SC == NULL);
    212255
    213256    cUsers = 0;
     
    271314                {
    272315                    vboxguest->vboxguest_state |= VBOXGUEST_STATE_INITOK;
     316                    VBoxGuestNetBSDWsmAttach(vboxguest);
     317
     318                    g_SC = vboxguest;
    273319                    return;
    274320                }
     
    339385
    340386
     387/*
     388 * Optionally attach wsmouse(4) device as a child.
     389 */
     390static void VBoxGuestNetBSDWsmAttach(vboxguest_softc *sc)
     391{
     392    struct wsmousedev_attach_args am = { &vboxguest_wsm_accessops, sc };
     393
     394    PVBOXGUESTSESSION session = NULL;
     395    VMMDevReqMouseStatus *req = NULL;
     396    int rc;
     397
     398    rc = VGDrvCommonCreateKernelSession(&g_DevExt, &session);
     399    if (RT_FAILURE(rc))
     400        goto fail;
     401
     402    rc = VbglR0GRAlloc((VMMDevRequestHeader **)&req, sizeof(*req),
     403                       VMMDevReq_GetMouseStatus);
     404    if (RT_FAILURE(rc))
     405        goto fail;
     406
     407    sc->sc_wsmousedev = config_found_ia(sc->sc_dev, "wsmousedev", &am, wsmousedevprint);
     408    if (sc->sc_wsmousedev == NULL)
     409        goto fail;
     410
     411    sc->sc_session = session;
     412    sc->sc_vmmmousereq = req;
     413
     414    tpcalib_init(&sc->sc_tpcalib);
     415    tpcalib_ioctl(&sc->sc_tpcalib, WSMOUSEIO_SCALIBCOORDS,
     416                  &vboxguest_wsm_default_calib, 0, 0);
     417    return;
     418
     419  fail:
     420    if (session != NULL)
     421        VGDrvCommonCloseSession(&g_DevExt, session);
     422    if (req != NULL)
     423        VbglR0GRFree((VMMDevRequestHeader *)req);
     424}
     425
     426
    341427static int VBoxGuestNetBSDDetach(device_t self, int flags)
    342428{
     
    355441     * Reverse what we did in VBoxGuestNetBSDAttach.
    356442     */
     443    if (vboxguest->sc_vmmmousereq != NULL)
     444        VbglR0GRFree((VMMDevRequestHeader *)vboxguest->sc_vmmmousereq);
    357445
    358446    VBoxGuestNetBSDRemoveIRQ(vboxguest);
     
    365453    RTR0Term();
    366454
    367     return 0;
     455    return config_detach_children(self, flags);
    368456}
    369457
     
    406494void VGDrvNativeISRMousePollEvent(PVBOXGUESTDEVEXT pDevExt)
    407495{
     496    vboxguest_softc *sc = g_SC;
     497
    408498    LogFlow((DEVICE_NAME ": %s\n", __func__));
    409499
     
    412502     */
    413503    selnotify(&g_SelInfo, 0, 0);
     504
     505    if (sc->sc_vmmmousereq != NULL) {
     506        int x, y;
     507        int rc;
     508
     509        sc->sc_vmmmousereq->mouseFeatures = 0;
     510        sc->sc_vmmmousereq->pointerXPos = 0;
     511        sc->sc_vmmmousereq->pointerYPos = 0;
     512
     513        rc = VbglR0GRPerform(&sc->sc_vmmmousereq->header);
     514        if (RT_FAILURE(rc))
     515            return;
     516
     517        tpcalib_trans(&sc->sc_tpcalib,
     518                      sc->sc_vmmmousereq->pointerXPos,
     519                      sc->sc_vmmmousereq->pointerYPos,
     520                      &x, &y);
     521
     522        wsmouse_input(sc->sc_wsmousedev,
     523                      0,    /* buttons */
     524                      x, y,
     525                      0, 0, /* z, w */
     526                      WSMOUSE_INPUT_ABSOLUTE_X | WSMOUSE_INPUT_ABSOLUTE_Y);
     527    }
     528}
     529
     530
     531static int VBoxGuestNetBSDSetMouseStatus(vboxguest_softc *sc, uint32_t fStatus)
     532{
     533    VBGLIOCSETMOUSESTATUS Req;
     534    int rc;
     535
     536    VBGLREQHDR_INIT(&Req.Hdr, SET_MOUSE_STATUS);
     537    Req.u.In.fStatus = fStatus;
     538    rc = VGDrvCommonIoCtl(VBGL_IOCTL_SET_MOUSE_STATUS,
     539                          &g_DevExt,
     540                          sc->sc_session,
     541                          &Req.Hdr, sizeof(Req));
     542    if (RT_SUCCESS(rc))
     543        rc = Req.Hdr.rc;
     544
     545    return rc;
     546}
     547
     548
     549static int
     550VBoxGuestNetBSDWsmEnable(void *cookie)
     551{
     552    vboxguest_softc *sc = cookie;
     553    int rc;
     554
     555    rc = VBoxGuestNetBSDSetMouseStatus(sc, VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE
     556                                         | VMMDEV_MOUSE_NEW_PROTOCOL);
     557    if (RT_FAILURE(rc))
     558        return RTErrConvertToErrno(rc);
     559
     560    return 0;
     561}
     562
     563
     564static void
     565VBoxGuestNetBSDWsmDisable(void *cookie)
     566{
     567    vboxguest_softc *sc = cookie;
     568    VBoxGuestNetBSDSetMouseStatus(sc, 0);
     569}
     570
     571
     572static int
     573VBoxGuestNetBSDWsmIOCtl(void *cookie, u_long cmd, void *data, int flag, struct lwp *l)
     574{
     575    vboxguest_softc *sc = cookie;
     576
     577    switch (cmd) {
     578    case WSMOUSEIO_GTYPE:
     579        *(u_int *)data = WSMOUSE_TYPE_TPANEL;
     580        break;
     581
     582    case WSMOUSEIO_SCALIBCOORDS:
     583    case WSMOUSEIO_GCALIBCOORDS:
     584        return tpcalib_ioctl(&sc->sc_tpcalib, cmd, data, flag, l);
     585
     586    default:
     587        return EPASSTHROUGH;
     588    }
     589    return 0;
    414590}
    415591
     
    693869MODULE(MODULE_CLASS_DRIVER, vboxguest, "pci");
    694870
    695 CFDRIVER_DECL(vboxguest, DV_DULL, NULL);
     871static const struct cfiattrdata wsmousedevcf_iattrdata = {
     872    "wsmousedev", 1, {
     873        { "mux", "0", 0 },
     874    }
     875};
     876
     877/* device vboxguest: wsmousedev */
     878static const struct cfiattrdata * const vboxguest_attrs[] = { &wsmousedevcf_iattrdata, NULL };
     879CFDRIVER_DECL(vboxguest, DV_DULL, vboxguest_attrs);
    696880
    697881static struct cfdriver * const cfdriver_ioconf_vboxguest[] = {
     
    699883};
    700884
    701 static int loc[2] = { -1, -1 };
    702 
    703 static const struct cfparent pspec = {
     885
     886static const struct cfparent vboxguest_pspec = {
    704887    "pci", "pci", DVUNIT_ANY
    705888};
    706 
    707 /*  vboxguest0 at pci? dev ? function ? */
     889static int vboxguest_loc[] = { -1, -1 };
     890
     891
     892static const struct cfparent wsmousedev_pspec = {
     893    "wsmousedev", "vboxguest", DVUNIT_ANY
     894};
     895static int wsmousedev_loc[] = { 0 };
     896
     897
    708898static struct cfdata cfdata_ioconf_vboxguest[] = {
     899    /*  vboxguest0 at pci? dev ? function ? */
    709900    {
    710901        .cf_name = "vboxguest",
     
    712903        .cf_unit = 0,           /* Only unit 0 is ever used  */
    713904        .cf_fstate = FSTATE_NOTFOUND,
    714         .cf_loc = loc,
     905        .cf_loc = vboxguest_loc,
    715906        .cf_flags = 0,
    716         .cf_pspec = &pspec,
     907        .cf_pspec = &vboxguest_pspec,
    717908    },
     909
     910    /* wsmouse* at vboxguest? */
     911    { "wsmouse", "wsmouse", 0, FSTATE_STAR, wsmousedev_loc, 0, &wsmousedev_pspec },
     912
    718913    { NULL, NULL, 0, 0, NULL, 0, NULL }
    719914};
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette