筆記本所有pci設備如下:
[root@lenovo ~]# lspci
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:01.0 PCI bridge: Intel Corporation Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)
00:16.0 Communication controller: Intel Corporation 7 Series/C216 Chipset Family MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation 7 Series/C216 Chipset Family High Definition Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 7 Series/C216 Chipset Family PCI Express Root Port 1 (rev c4)
00:1c.1 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 2 (rev c4)
00:1c.3 PCI bridge: Intel Corporation 7 Series/C216 Chipset Family PCI Express Root Port 4 (rev c4)
00:1d.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation HM77 Express Chipset LPC Controller (rev 04)
00:1f.2 SATA controller: Intel Corporation 7 Series Chipset Family 6-port SATA Controller [AHCI mode] (rev 04)
00:1f.3 SMBus: Intel Corporation 7 Series/C216 Chipset Family SMBus Controller (rev 04)
01:00.0 3D controller: NVIDIA Corporation GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (rev a1)
03:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTS5229 PCI Express Card Reader (rev 01)
04:00.0 Network controller: Broadcom Inc. and subsidiaries BCM43142 802.11b/g/n (rev 01)
05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 07)
crash加入如下函數:
void
cmd_bus(void)
{
int centos = 0;
int all = 0;
if (args[1] != NULL && !strcmp(args[1], "all"))
all = 1;
struct new_utsname *uts;
uts = &kt->utsname;
if (strncmp(uts->release, "3.10.0", 6) == 0) {
centos = 1;
fprintf(fp, "%s\n", uts->release);
}
struct list_data devices, *ld;
char *name = "pci_bus_type";
int i, n, print = 1;
long pci_bus_type = symbol_value(name);
fprintf(fp, "pci_bus_type\n");
fprintf(fp, "bus_type %lx\n", pci_bus_type);
long p = read_pointer2(pci_bus_type, "bus_type", "p");
fprintf(fp, "subsys_private %lx\n", p);
long klist_devices = p + MEMBER_OFFSET("subsys_private", "klist_devices");
fprintf(fp, "klist %lx\n", klist_devices);
long k_list = klist_devices + MEMBER_OFFSET("klist", "k_list");
fprintf(fp, "list -H %lx\n", k_list);
int offset = MEMBER_OFFSET("pci_driver", "driver");
long iwl_pci_driver = symbol_exists("iwl_pci_driver") ?
symbol_value("iwl_pci_driver") : 0;
long iwl_device_driver = iwl_pci_driver + offset;
long mlx5_core_driver = symbol_exists("mlx5_core_driver") ?
symbol_value("mlx5_core_driver") : 0;
long mlx5_device_driver = mlx5_core_driver + offset;
ld = &devices;
BZERO(ld, sizeof(struct list_data));
ld->flags |= LIST_ALLOCATE;
ld->start = ld->end = k_list;
/*
* bus_add_device()
* klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);
*/
ld->list_head_offset = MEMBER_OFFSET("device_private", "knode_bus") +
+ MEMBER_OFFSET("klist_node", "n_node");
n = do_list(ld);
for (i = 1; i < n; i++) {
long private = ld->list_ptr[i];
long device = read_pointer2(private, "device_private", "device");
long pci_dev = device - MEMBER_OFFSET("pci_dev", "dev");
long driver_data;
if (centos == 0) {
driver_data = read_pointer2(device, "device", "driver_data");
} else {
p = read_pointer2(device, "device", "p");
driver_data = read_pointer2(p, "device_private", "driver_data");
}
long driver = read_pointer2(device, "device", "driver");
long kobj = device + MEMBER_OFFSET("device", "kobj");
long name = read_pointer2(kobj, "kobject", "name");
char buf[32];
if (all || driver == iwl_device_driver || driver == mlx5_device_driver) {
if (!all && print && driver == iwl_device_driver)
fprintf(fp, "\niwl_pci_driver:\npci_driver %lx\n",
iwl_pci_driver);
if (!all && print && driver == mlx5_device_driver)
fprintf(fp, "\nmlx5_core_driver:\npci_driver %lx\n",
mlx5_core_driver);
print = 0;
if (driver) {
long driver_name = read_pointer2(driver, "device_driver", "name");
long mod_name = read_pointer2(driver, "device_driver", "mod_name");
read_string(name, buf, 32);
fprintf(fp, "\nname:\t\t%s\n", buf);
read_string(driver_name, buf, 32);
fprintf(fp, "driver_name:\t%s\n", buf);
read_string(mod_name, buf, 32);
fprintf(fp, "mod_name:\t%s\n", buf);
fprintf(fp, "device_private %lx\n", private);
fprintf(fp, "device %lx\n", device);
fprintf(fp, "pci_dev %lx\n", pci_dev);
fprintf(fp, "device_driver %lx\n", driver);
fprintf(fp, "kobject %lx\n", kobj);
if (driver == iwl_device_driver)
fprintf(fp, "iwl_trans %lx\n", driver_data);
if (driver == mlx5_device_driver)
fprintf(fp, "mlx5_core_dev %lx\n", driver_data);
}
}
}
FREEBUF(ld->list_ptr);
}
輸出如下:
crash> bus all
pci_bus_type
bus_type ffffffffb80c48a0
subsys_private ffff895e84cf3200
klist ffff895e84cf32a0
list -H ffff895e84cf32a8
name: 0000:00:01.0
driver_name: pcieport
mod_name: pcieportdrv
device_private ffff895e84edccc0
device ffff895e84dbb0b0
pci_dev ffff895e84dbb000
device_driver ffffffffb80c53f0
kobject ffff895e84dbb0c0
name: 0000:00:02.0
driver_name: i915
mod_name: i915
device_private ffff895e84edce40
device ffff895e84dbc0b0
pci_dev ffff895e84dbc000
device_driver ffffffffc0a3b250
kobject ffff895e84dbc0c0
name: 0000:00:14.0
driver_name: xhci_hcd
mod_name: xhci_pci
device_private ffff895e84eee000
device ffff895e84dbd0b0
pci_dev ffff895e84dbd000
device_driver ffffffffb80e5bf0
kobject ffff895e84dbd0c0
name: 0000:00:16.0
driver_name: mei_me
mod_name: mei_me
device_private ffff895e84eee180
device ffff895e84dbe0b0
pci_dev ffff895e84dbe000
device_driver ffffffffc03f1070
kobject ffff895e84dbe0c0
name: 0000:00:1a.0
driver_name: ehci-pci
mod_name: ehci_pci
device_private ffff895e84eee240
device ffff895e84dbf0b0
pci_dev ffff895e84dbf000
device_driver ffffffffb80e3130
kobject ffff895e84dbf0c0
name: 0000:00:1b.0
driver_name: snd_hda_intel
mod_name: snd_hda_intel
device_private ffff895e84eee3c0
device ffff895e8612c0b0
pci_dev ffff895e8612c000
device_driver ffffffffc049b090
kobject ffff895e8612c0c0
name: 0000:00:1c.0
driver_name: pcieport
mod_name: pcieportdrv
device_private ffff895e84eee540
device ffff895e84f200b0
pci_dev ffff895e84f20000
device_driver ffffffffb80c53f0
kobject ffff895e84f200c0
name: 0000:00:1c.1
driver_name: pcieport
mod_name: pcieportdrv
device_private ffff895e84eee6c0
device ffff895e84f210b0
pci_dev ffff895e84f21000
device_driver ffffffffb80c53f0
kobject ffff895e84f210c0
name: 0000:00:1c.3
driver_name: pcieport
mod_name: pcieportdrv
device_private ffff895e84eee840
device ffff895e84f220b0
pci_dev ffff895e84f22000
device_driver ffffffffb80c53f0
kobject ffff895e84f220c0
name: 0000:00:1d.0
driver_name: ehci-pci
mod_name: ehci_pci
device_private ffff895e84eee9c0
device ffff895e84f230b0
pci_dev ffff895e84f23000
device_driver ffffffffb80e3130
kobject ffff895e84f230c0
name: 0000:00:1f.0
driver_name: lpc_ich
mod_name: lpc_ich
device_private ffff895e84eeeb40
device ffff895e84f240b0
pci_dev ffff895e84f24000
device_driver ffffffffc03aa070
kobject ffff895e84f240c0
name: 0000:00:1f.2
driver_name: ahci
mod_name: ahci
device_private ffff895e84eeecc0
device ffff895e84f250b0
pci_dev ffff895e84f25000
device_driver ffffffffc02db090
kobject ffff895e84f250c0
name: 0000:05:00.0
driver_name: r8169
mod_name: r8169
device_private ffff895e84f019c0
device ffff895e84f2a0b0
pci_dev ffff895e84f2a000
device_driver ffffffffc0252070
kobject ffff895e84f2a0c0
有了上面的信息就可以對.config有的放矢的精簡了。精簡後的config如下:
https://github.com/mishuang2017/sm/blob/master/config/config.thinkpad.edge
二十分鐘就build完了。所有模塊大概500M左右。