DF-1044 / run.log
=== DF-1044 source verification ===
File: /home/maxx/dfbsd/dfbsd/sys/platform/vkernel64/platform/busdma_machdep.c
--- DEFECT (a): panic stub in add_map_callback (#else branch of #ifdef notyet) ---
[line 1202-1217]
static void
add_map_callback(bus_dmamap_t map)
{
#ifdef notyet
/* XXX callbacklist is not MPSAFE */
crit_enter();
get_mplock();
STAILQ_INSERT_TAIL(&bounce_map_callbacklist, map, links);
busdma_swi_pending = 1;
setsoftvm();
rel_mplock();
crit_exit();
#else
panic("%s uncoded", __func__);
#endif
}
--- DEFECT (c): transposition at return_bounce_pages line 1120 ---
[line 1094-1121, focus line 1120]
static void
return_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map)
{
struct bounce_zone *bz = dmat->bounce_zone;
int reserved = map->pagesreserved;
bus_dmamap_t wait_map;
map->pagesreserved = 0;
map->pagesneeded = 0;
if (reserved == 0)
return;
BZ_LOCK(bz);
bz->free_bpages += reserved;
KKASSERT(bz->free_bpages <= bz->total_bpages);
KKASSERT(bz->reserved_bpages >= reserved);
bz->reserved_bpages -= reserved;
wait_map = get_map_waiting(dmat);
BZ_UNLOCK(bz);
if (wait_map != NULL)
add_map_callback(map);
}
--- COMPARE: free_bounce_page does it CORRECTLY (local map = get_map_waiting) ---
[line 1156-1181, focus lines 1175-1180]
static void
free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)
{
struct bounce_zone *bz = dmat->bounce_zone;
bus_dmamap_t map;
bpage->datavaddr = 0;
bpage->datacount = 0;
BZ_LOCK(bz);
STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links);
bz->free_bpages++;
KKASSERT(bz->free_bpages <= bz->total_bpages);
KKASSERT(bz->active_bpages > 0);
bz->active_bpages--;
map = get_map_waiting(dmat);
BZ_UNLOCK(bz);
if (map != NULL)
add_map_callback(map);
}
--- DEFECT (b): busdma_swi is #ifdef notyet and is NEVER called anywhere in vkernel64 ---
[line 1219-1234]
#ifdef notyet
void
busdma_swi(void)
{
bus_dmamap_t map;
crit_enter();
while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) {
STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links);
crit_exit();
bus_dmamap_load(map->dmat, map, map->buf, map->buflen,
map->callback, map->callback_arg, /*flags*/0);
crit_enter();
}
crit_exit();
}
[grep: busdma_swi callers in vkernel64 (expect only the definition)]
/home/maxx/dfbsd/dfbsd/sys/platform/vkernel64/platform/busdma_machdep.c:1221:busdma_swi(void)
[compare pc64 sibling: pc64 wires busdma_swi from swi_vm]
384: if (busdma_swi_pending != 0)
385: busdma_swi();
=== verification complete: both defects present in source ===