diff --git a/sys/dev/puc/puc.c b/sys/dev/puc/puc.c index 8eb80348aed..8866bb1c62e 100644 --- a/sys/dev/puc/puc.c +++ b/sys/dev/puc/puc.c @@ -316,8 +316,7 @@ puc_attach(device_t dev, const struct puc_device_description *desc) if (sc->barmuxed == 0) { rle->res = sc->sc_bar_mappings[bidx].res; } else { - rle->res = malloc(sizeof(struct resource), M_DEVBUF, - M_WAITOK | M_ZERO); + rle->res = rman_secret_puc_alloc_resource(M_WAITOK); if (rle->res == NULL) { free(pdev, M_DEVBUF); return (ENOMEM); @@ -352,7 +351,7 @@ puc_attach(device_t dev, const struct puc_device_description *desc) if (sc->barmuxed) { bus_space_unmap(rman_get_bustag(rle->res), rman_get_bushandle(rle->res), ressz); - free(rle->res, M_DEVBUF); + rman_secret_puc_free_resource(rle->res); free(pdev, M_DEVBUF); } continue; @@ -372,7 +371,7 @@ puc_attach(device_t dev, const struct puc_device_description *desc) if (sc->barmuxed) { bus_space_unmap(rman_get_bustag(rle->res), rman_get_bushandle(rle->res), ressz); - free(rle->res, M_DEVBUF); + rman_secret_puc_free_resource(rle->res); free(pdev, M_DEVBUF); } } diff --git a/sys/kern/subr_rman.c b/sys/kern/subr_rman.c index 75d3e420616..3083b0e98cd 100644 --- a/sys/kern/subr_rman.c +++ b/sys/kern/subr_rman.c @@ -98,6 +98,31 @@ int_alloc_resource(int malloc_flag) return (r); } +/* + * XXX: puc.c is a big hack. + * XXX: it should be rewritten to act like a bridge and offer + * XXX: its own resource manager. + * XXX: until somebody has time, help it out with these two functions + */ + +struct resource * +rman_secret_puc_alloc_resource(int malloc_flag) +{ + struct resource_i *r; + + r = int_alloc_resource(malloc_flag); + if (r) + return (&r->r_r); + return (NULL); +} + +void +rman_secret_puc_free_resource(struct resource *r) +{ + + free(r->__r_i, M_RMAN); +} + int rman_init(struct rman *rm) { diff --git a/sys/sys/rman.h b/sys/sys/rman.h index cc9e7dc9ef9..fc9e62dc48e 100644 --- a/sys/sys/rman.h +++ b/sys/sys/rman.h @@ -174,6 +174,15 @@ void rman_set_start(struct resource *_r, u_long _start); void rman_set_virtual(struct resource *_r, void *_v); extern struct rman_head rman_head; + +/* + * XXX: puc.c is a big hack. + * XXX: it should be rewritten to act like a bridge and offer + * XXX: its own resource manager. + * XXX: until somebody has time, help it out with these two functions + */ +struct resource *rman_secret_puc_alloc_resource(int malloc_flag); +void rman_secret_puc_free_resource(struct resource *r); #endif /* _KERNEL */ #endif /* !_SYS_RMAN_H_ */