DragonFlyBSD Kernel Audit
DF-1044 / run.log
← back to finding ↓ download raw
=== 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 ===