* Delete a preload record by name. */
| 208 | * Delete a preload record by name. |
| 209 | */ |
| 210 | void |
| 211 | preload_delete_name(const char *name) |
| 212 | { |
| 213 | caddr_t addr, curp; |
| 214 | uint32_t *hdr, sz; |
| 215 | int next; |
| 216 | int clearing; |
| 217 | |
| 218 | addr = 0; |
| 219 | sz = 0; |
| 220 | |
| 221 | if (preload_metadata != NULL) { |
| 222 | clearing = 0; |
| 223 | curp = preload_metadata; |
| 224 | for (;;) { |
| 225 | hdr = (uint32_t *)curp; |
| 226 | if (hdr[0] == MODINFO_NAME || (hdr[0] == 0 && hdr[1] == 0)) { |
| 227 | /* Free memory used to store the file. */ |
| 228 | if (addr != 0 && sz != 0) |
| 229 | kmem_bootstrap_free((vm_offset_t)addr, sz); |
| 230 | addr = 0; |
| 231 | sz = 0; |
| 232 | |
| 233 | if (hdr[0] == 0) |
| 234 | break; |
| 235 | if (!strcmp(name, curp + sizeof(uint32_t) * 2)) |
| 236 | clearing = 1; /* got it, start clearing */ |
| 237 | else if (clearing) { |
| 238 | clearing = 0; /* at next one now.. better stop */ |
| 239 | } |
| 240 | } |
| 241 | if (clearing) { |
| 242 | if (hdr[0] == MODINFO_ADDR) |
| 243 | addr = *(caddr_t *)(curp + sizeof(uint32_t) * 2); |
| 244 | else if (hdr[0] == MODINFO_SIZE) |
| 245 | sz = *(uint32_t *)(curp + sizeof(uint32_t) * 2); |
| 246 | hdr[0] = MODINFO_EMPTY; |
| 247 | } |
| 248 | |
| 249 | /* skip to next field */ |
| 250 | next = sizeof(uint32_t) * 2 + hdr[1]; |
| 251 | next = roundup(next, sizeof(u_long)); |
| 252 | curp += next; |
| 253 | } |
| 254 | } |
| 255 | } |
| 256 | |
| 257 | void * |
| 258 | preload_fetch_addr(caddr_t mod) |
no test coverage detected