View | Details | Raw Unified | Return to bug 267028 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/kern/kern_linker.c (+56 lines)
Lines 1475-1480 sys_kldsym(struct thread *td, struct kldsym_args *uap) Link Here
1475
	return (error);
1475
	return (error);
1476
}
1476
}
1477
1477
1478
#define MODLIST_NEWMOD_HIST_SLOTS 256
1479
static volatile char const* modlist_newmod_lookup_name=         NULL;                      // NULL: No problem found.
1480
static volatile int         modlist_newmod_hist_pos=            MODLIST_NEWMOD_HIST_SLOTS; // First update will wrap to 0 first.
1481
static volatile int         modlist_newmod_tqe_next_changed_at= MODLIST_NEWMOD_HIST_SLOTS; // I.E.: No such found.
1482
static modlist_t   modlist_newmod_tqe_next_newvalue=   NULL;                      // NULL: No such found.
1483
static struct modlist_newmod_hist_type {
1484
	modlist_t     modAddr;
1485
	linker_file_t containerAddr;
1486
	char const*   modnameAddr;
1487
	int           version;
1488
} modlist_newmod_hist[MODLIST_NEWMOD_HIST_SLOTS];
1489
1478
/*
1490
/*
1479
 * Preloaded module support
1491
 * Preloaded module support
1480
 */
1492
 */
Lines 1484-1489 modlist_lookup(const char *name, int ver) Link Here
1484
{
1496
{
1485
	modlist_t mod;
1497
	modlist_t mod;
1486
1498
1499
	if (modlist_newmod_hist_pos<MODLIST_NEWMOD_HIST_SLOTS)
1500
	{
1501
		int modlist_newmod_rescan_start_at = 0;
1502
		if (16 <= modlist_newmod_hist_pos) modlist_newmod_rescan_start_at= modlist_newmod_hist_pos-16;
1503
		for (int scan_pos= modlist_newmod_rescan_start_at; scan_pos<modlist_newmod_hist_pos; ++scan_pos)
1504
			if(modlist_newmod_hist[scan_pos].modAddr->link.tqe_next != modlist_newmod_hist[scan_pos+1].modAddr)
1505
			{
1506
				modlist_newmod_lookup_name=         name;
1507
				modlist_newmod_tqe_next_changed_at= scan_pos;
1508
				modlist_newmod_tqe_next_newvalue=   modlist_newmod_hist[scan_pos].modAddr->link.tqe_next;
1509
				panic("modlist_lookup: a prior tqe_next changed!");
1510
			}
1511
	}
1512
1487
	TAILQ_FOREACH(mod, &found_modules, link) {
1513
	TAILQ_FOREACH(mod, &found_modules, link) {
1488
		if (strcmp(mod->name, name) == 0 &&
1514
		if (strcmp(mod->name, name) == 0 &&
1489
		    (ver == 0 || mod->version == ver))
1515
		    (ver == 0 || mod->version == ver))
Lines 1521-1532 modlist_newmodule(const char *modname, int version, linker_file_t container) Link Here
1521
	modlist_t mod;
1547
	modlist_t mod;
1522
1548
1523
	mod = malloc(sizeof(struct modlist), M_LINKER, M_NOWAIT | M_ZERO);
1549
	mod = malloc(sizeof(struct modlist), M_LINKER, M_NOWAIT | M_ZERO);
1550
1551
	++modlist_newmod_hist_pos;
1552
	if (MODLIST_NEWMOD_HIST_SLOTS<=modlist_newmod_hist_pos) modlist_newmod_hist_pos= 0;
1553
#undef MODLIST_NEWMOD_HIST_SLOTS
1554
	modlist_newmod_hist[modlist_newmod_hist_pos].modAddr=       mod;
1555
	modlist_newmod_hist[modlist_newmod_hist_pos].containerAddr= container;
1556
	modlist_newmod_hist[modlist_newmod_hist_pos].modnameAddr=   modname;
1557
	modlist_newmod_hist[modlist_newmod_hist_pos].version=       version;
1558
1524
	if (mod == NULL)
1559
	if (mod == NULL)
1525
		panic("no memory for module list");
1560
		panic("no memory for module list");
1561
1562
	if (mod < (modlist_t)0xfffff80000000100)
1563
		panic("modlist_newmodule: mod < (modlist_t)PHYS_TO_DMAP(0x100)");
1564
1526
	mod->container = container;
1565
	mod->container = container;
1527
	mod->name = modname;
1566
	mod->name = modname;
1528
	mod->version = version;
1567
	mod->version = version;
1529
	TAILQ_INSERT_TAIL(&found_modules, mod, link);
1568
	TAILQ_INSERT_TAIL(&found_modules, mod, link);
1569
1570
	if (  0 < modlist_newmod_hist_pos
1571
           && modlist_newmod_hist[modlist_newmod_hist_pos-1].modAddr->link.tqe_next != mod
1572
	   )
1573
		panic("modlist_newmodule: prior node's tqe_next has bad value.");
1574
1575
	if (  strcmp(modlist_newmod_hist[modlist_newmod_hist_pos-1].modnameAddr,"amdgpu_raven_mec_bin_fw")==0
1576
	   || strcmp(modlist_newmod_hist[modlist_newmod_hist_pos-1].modnameAddr,"amdgpu_raven_me_bin_fw")==0
1577
	   || strcmp(modlist_newmod_hist[modlist_newmod_hist_pos-1].modnameAddr,"amdgpu_raven_mec2_bin_fw")==0
1578
           )
1579
		db_hwatchpoint_cmd
1580
			( (db_expr_t)(void*)&modlist_newmod_hist[modlist_newmod_hist_pos-1].modAddr->link.tqe_next
1581
			, true
1582
			, 8
1583
			, NULL
1584
			);
1585
1530
	return (mod);
1586
	return (mod);
1531
}
1587
}

Return to bug 267028