230 realsize = ksyms_snapshot(ksyms_bcopy, hptr, size);
231 if (realsize <= size)
232 break;
233 size = realsize;
234 size = ksyms_buflist_alloc(&hdr, size);
235 if (size == 0)
236 return (ENOMEM);
237 hptr = (void *)&hdr;
238 }
239
240 addr = ksyms_mapin(&hdr, realsize);
241 ksyms_buflist_free(&hdr);
242 if (addr == NULL)
243 return (EOVERFLOW);
244
245 /*
246 * Reserve a clone entry. Note that we don't use clone 0
247 * since that's the "real" minor number.
248 */
249 for (clone = 1; clone < nksyms_clones; clone++) {
250 if (casptr(&ksyms_clones[clone].ksyms_base, 0, addr) == 0) {
251 ksyms_clones[clone].ksyms_size = realsize;
252 *devp = makedevice(getemajor(*devp), clone);
253 (void) ddi_prop_update_int(*devp, ksyms_devi,
254 "size", realsize);
255 modunload_disable();
256 return (0);
257 }
258 }
259 cmn_err(CE_NOTE, "ksyms: too many open references");
260 (void) as_unmap(curproc->p_as, addr, roundup(realsize, PAGESIZE));
261 return (ENXIO);
262 }
263
264 /* ARGSUSED */
265 static int
266 ksyms_close(dev_t dev, int flag, int otyp, struct cred *cred)
267 {
268 minor_t clone = getminor(dev);
269
270 (void) as_unmap(curproc->p_as, ksyms_clones[clone].ksyms_base,
|
230 realsize = ksyms_snapshot(ksyms_bcopy, hptr, size);
231 if (realsize <= size)
232 break;
233 size = realsize;
234 size = ksyms_buflist_alloc(&hdr, size);
235 if (size == 0)
236 return (ENOMEM);
237 hptr = (void *)&hdr;
238 }
239
240 addr = ksyms_mapin(&hdr, realsize);
241 ksyms_buflist_free(&hdr);
242 if (addr == NULL)
243 return (EOVERFLOW);
244
245 /*
246 * Reserve a clone entry. Note that we don't use clone 0
247 * since that's the "real" minor number.
248 */
249 for (clone = 1; clone < nksyms_clones; clone++) {
250 if (atomic_cas_ptr(&ksyms_clones[clone].ksyms_base, 0, addr) ==
251 0) {
252 ksyms_clones[clone].ksyms_size = realsize;
253 *devp = makedevice(getemajor(*devp), clone);
254 (void) ddi_prop_update_int(*devp, ksyms_devi,
255 "size", realsize);
256 modunload_disable();
257 return (0);
258 }
259 }
260 cmn_err(CE_NOTE, "ksyms: too many open references");
261 (void) as_unmap(curproc->p_as, addr, roundup(realsize, PAGESIZE));
262 return (ENXIO);
263 }
264
265 /* ARGSUSED */
266 static int
267 ksyms_close(dev_t dev, int flag, int otyp, struct cred *cred)
268 {
269 minor_t clone = getminor(dev);
270
271 (void) as_unmap(curproc->p_as, ksyms_clones[clone].ksyms_base,
|