| 1948 | } |
| 1949 | |
| 1950 | static int |
| 1951 | smap_sysctl_handler(SYSCTL_HANDLER_ARGS) |
| 1952 | { |
| 1953 | struct bios_smap *smapbase; |
| 1954 | struct bios_smap_xattr smap; |
| 1955 | caddr_t kmdp; |
| 1956 | uint32_t *smapattr; |
| 1957 | int count, error, i; |
| 1958 | |
| 1959 | /* Retrieve the system memory map from the loader. */ |
| 1960 | kmdp = preload_search_by_type("elf kernel"); |
| 1961 | if (kmdp == NULL) |
| 1962 | kmdp = preload_search_by_type("elf64 kernel"); |
| 1963 | smapbase = (struct bios_smap *)preload_search_info(kmdp, |
| 1964 | MODINFO_METADATA | MODINFOMD_SMAP); |
| 1965 | if (smapbase == NULL) |
| 1966 | return (0); |
| 1967 | smapattr = (uint32_t *)preload_search_info(kmdp, |
| 1968 | MODINFO_METADATA | MODINFOMD_SMAP_XATTR); |
| 1969 | count = *((uint32_t *)smapbase - 1) / sizeof(*smapbase); |
| 1970 | error = 0; |
| 1971 | for (i = 0; i < count; i++) { |
| 1972 | smap.base = smapbase[i].base; |
| 1973 | smap.length = smapbase[i].length; |
| 1974 | smap.type = smapbase[i].type; |
| 1975 | if (smapattr != NULL) |
| 1976 | smap.xattr = smapattr[i]; |
| 1977 | else |
| 1978 | smap.xattr = 0; |
| 1979 | error = SYSCTL_OUT(req, &smap, sizeof(smap)); |
| 1980 | } |
| 1981 | return (error); |
| 1982 | } |
| 1983 | SYSCTL_PROC(_machdep, OID_AUTO, smap, |
| 1984 | CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, |
| 1985 | smap_sysctl_handler, "S,bios_smap_xattr", |
nothing calls this directly
no test coverage detected