diff options
author | dfr <dfr@FreeBSD.org> | 1999-05-14 09:13:43 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1999-05-14 09:13:43 +0000 |
commit | 31a93d7badb7cdb6ebdade2dd9407d424ad888c0 (patch) | |
tree | 55de983ba29fa8e218e64da7268356dea76eb32f | |
parent | dadd91f60975a77f24b56f7ee8025e21c863e7a2 (diff) | |
download | FreeBSD-src-31a93d7badb7cdb6ebdade2dd9407d424ad888c0.zip FreeBSD-src-31a93d7badb7cdb6ebdade2dd9407d424ad888c0.tar.gz |
Adjust method dispatch to ensure that default methods are called properly.
-rw-r--r-- | sys/kern/subr_bus.c | 9 | ||||
-rw-r--r-- | sys/sys/bus_private.h | 18 |
2 files changed, 18 insertions, 9 deletions
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 8224b4a..bdfead6 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: subr_bus.c,v 1.20 1999/05/08 21:59:35 dfr Exp $ + * $Id: subr_bus.c,v 1.21 1999/05/10 17:06:14 dfr Exp $ */ #include <sys/param.h> @@ -93,6 +93,7 @@ static void device_unregister_oids(device_t dev); /* * Method table handling */ +static int error_method(void); static int next_method_offset = 1; LIST_HEAD(methodlist, method) methods; @@ -114,6 +115,12 @@ register_method(struct device_op_desc *desc) return; } + /* + * Make sure that desc->deflt is always valid to simplify dispatch. + */ + if (!desc->deflt) + desc->deflt = error_method; + for (m = LIST_FIRST(&methods); m; m = LIST_NEXT(m, link)) { if (!strcmp(m->name, desc->name)) { desc->offset = m->offset; diff --git a/sys/sys/bus_private.h b/sys/sys/bus_private.h index cbc2872..770ff6b 100644 --- a/sys/sys/bus_private.h +++ b/sys/sys/bus_private.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bus_private.h,v 1.6 1999/04/16 21:22:54 peter Exp $ + * $Id: bus_private.h,v 1.7 1999/05/10 17:06:11 dfr Exp $ */ #ifndef _SYS_BUS_PRIVATE_H_ @@ -93,15 +93,17 @@ struct device_ops { */ #define DEVOPDESC(OP) (&OP##_##desc) -#define DEVOPOFF(OPS, OP) \ - ((DEVOPDESC(OP)->offset >= OPS->maxoffset \ - || !OPS->methods[DEVOPDESC(OP)->offset]) \ - ? 0 : DEVOPDESC(OP)->offset) - #define DEVOPS(DEV) (DEV->ops) -#define DEVOPMETH(DEV, OP) (DEVOPS(DEV)->methods[DEVOPOFF(DEVOPS(DEV), OP)]) +#define DEVOPMETH(DEV, OP) \ + ((DEVOPDESC(OP)->offset >= DEVOPS(DEV)->maxoffset) \ + ? DEVOPDESC(OP)->deflt \ + : DEVOPS(DEV)->methods[DEVOPDESC(OP)->offset]) + #define DRVOPS(DRV) ((struct device_ops *)DRV->ops) -#define DRVOPMETH(DRV, OP) (DRVOPS(DRV)->methods[DEVOPOFF(DRVOPS(DRV), OP)]) +#define DRVOPMETH(DRV, OP) \ + ((DEVOPDESC(OP)->offset >= DRVOPS(DRV)->maxoffset) \ + ? DEVOPDESC(OP)->deflt \ + : DRVOPS(DRV)->methods[DEVOPDESC(OP)->offset]) /* * Implementation of device. |