On 04/06/14(Wed) 17:02, Stefan Sperling wrote:
> On Wed, Jun 04, 2014 at 09:51:08AM -0400, Eduardo Lopes wrote:
> > Hi,
> >
> > With this snapshot, the same steps yeld a kernel trap:
> >
> > uvm_fault(0xfffffe8135047b68, 0x0, 0, 1) -> e
> > kernel: page fault trap, code=0
> > Stopped at pms_enable_alps+0xbd: movl 0(%r12),%eax
> >
> > ddb trace:
> >
> > pms_enable_alps() at pms_enable_alps+0xbd
> > pms_protocol_lookup() at pms_protocol_lookup+0x34
> > pms_change_state() at pms_change_state+0x106
> > wsmouseopen() at wsmouseopen+0xbf
> > spec_open() at spec_open+0x213
> > VOP_OPEN() at VOP_OPEN+0x3f
> > vn_open() at vn_open+0x16f
> > doopenat() at doopenat+0x132
> > syscall() at syscall+0x297
> > --- syscall (number 5) ---
> > end trace frame: 0x0, count: -9
> > 0x343ce1f5d0a:
>
> Try disabling wsmoused as a workaround.
> There is a known bug, perhaps related:
> http://marc.info/?l=openbsd-misc&m=137811690307634&w=2
> I tried tracking this down once but didn't get very far.
Could you try the diff below and tell me if it fixes your problem?
Index: pms.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pckbc/pms.c,v
retrieving revision 1.52
diff -u -p -r1.52 pms.c
--- pms.c 12 Jul 2014 18:48:52 -0000 1.52
+++ pms.c 24 Jul 2014 08:09:04 -0000
@@ -26,6 +26,7 @@
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/rwlock.h>
#include <sys/device.h>
#include <sys/ioctl.h>
#include <sys/malloc.h>
@@ -148,6 +149,8 @@ struct pms_softc { /* driver status inf
#define PMS_STATE_ENABLED 1
#define PMS_STATE_SUSPENDED 2
+ struct rwlock sc_state_lock;
+
int sc_dev_enable;
#define PMS_DEV_IGNORE 0x00
#define PMS_DEV_PRIMARY 0x01
@@ -662,6 +665,8 @@ pmsattach(struct device *parent, struct
a.accessops = &pms_accessops;
a.accesscookie = sc;
+ rw_init(&sc->sc_state_lock, "pmsst");
+
/*
* Attach the wsmouse, saving a handle to it.
* Note that we don't need to check this pointer against NULL
@@ -762,8 +767,13 @@ int
pms_enable(void *v)
{
struct pms_softc *sc = v;
+ int rv;
- return pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_PRIMARY);
+ rw_enter_write(&sc->sc_state_lock);
+ rv = pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_PRIMARY);
+ rw_exit_write(&sc->sc_state_lock);
+
+ return (rv);
}
void
@@ -771,7 +781,9 @@ pms_disable(void *v)
{
struct pms_softc *sc = v;
+ rw_enter_write(&sc->sc_state_lock);
pms_change_state(sc, PMS_STATE_DISABLED, PMS_DEV_PRIMARY);
+ rw_exit_write(&sc->sc_state_lock);
}
int
@@ -789,8 +801,13 @@ int
pms_sec_enable(void *v)
{
struct pms_softc *sc = v;
+ int rv;
+
+ rw_enter_write(&sc->sc_state_lock);
+ rv = pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_SECONDARY);
+ rw_exit_write(&sc->sc_state_lock);
- return (pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_SECONDARY));
+ return (rv);
}
void
@@ -798,7 +815,9 @@ pms_sec_disable(void *v)
{
struct pms_softc *sc = v;
+ rw_enter_write(&sc->sc_state_lock);
pms_change_state(sc, PMS_STATE_DISABLED, PMS_DEV_SECONDARY);
+ rw_exit_write(&sc->sc_state_lock);
}
int