| 2633 | } |
| 2634 | |
| 2635 | static int |
| 2636 | smap_sysctl_handler(SYSCTL_HANDLER_ARGS) |
| 2637 | { |
| 2638 | struct bios_smap *smapbase; |
| 2639 | struct bios_smap_xattr smap; |
| 2640 | caddr_t kmdp; |
| 2641 | uint32_t *smapattr; |
| 2642 | int count, error, i; |
| 2643 | |
| 2644 | /* Retrieve the system memory map from the loader. */ |
| 2645 | kmdp = preload_search_by_type("elf kernel"); |
| 2646 | if (kmdp == NULL) |
| 2647 | kmdp = preload_search_by_type("elf32 kernel"); |
| 2648 | smapbase = (struct bios_smap *)preload_search_info(kmdp, |
| 2649 | MODINFO_METADATA | MODINFOMD_SMAP); |
| 2650 | if (smapbase == NULL) |
| 2651 | return (0); |
| 2652 | smapattr = (uint32_t *)preload_search_info(kmdp, |
| 2653 | MODINFO_METADATA | MODINFOMD_SMAP_XATTR); |
| 2654 | count = *((u_int32_t *)smapbase - 1) / sizeof(*smapbase); |
| 2655 | error = 0; |
| 2656 | for (i = 0; i < count; i++) { |
| 2657 | smap.base = smapbase[i].base; |
| 2658 | smap.length = smapbase[i].length; |
| 2659 | smap.type = smapbase[i].type; |
| 2660 | if (smapattr != NULL) |
| 2661 | smap.xattr = smapattr[i]; |
| 2662 | else |
| 2663 | smap.xattr = 0; |
| 2664 | error = SYSCTL_OUT(req, &smap, sizeof(smap)); |
| 2665 | } |
| 2666 | return (error); |
| 2667 | } |
| 2668 | SYSCTL_PROC(_machdep, OID_AUTO, smap, |
| 2669 | CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, |
| 2670 | smap_sysctl_handler, "S,bios_smap_xattr", |
nothing calls this directly
no test coverage detected