⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file2alias.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Looks like: pcmcia:mNcNfNfnNpfnNvaNvbNvcNvdN. */static int do_pcmcia_entry(const char *filename,			   struct pcmcia_device_id *id, char *alias){	unsigned int i;	id->match_flags = TO_NATIVE(id->match_flags);	id->manf_id = TO_NATIVE(id->manf_id);	id->card_id = TO_NATIVE(id->card_id);	id->func_id = TO_NATIVE(id->func_id);	id->function = TO_NATIVE(id->function);	id->device_no = TO_NATIVE(id->device_no);	for (i=0; i<4; i++) {		id->prod_id_hash[i] = TO_NATIVE(id->prod_id_hash[i]);       }       strcpy(alias, "pcmcia:");       ADD(alias, "m", id->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID,	   id->manf_id);       ADD(alias, "c", id->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID,	   id->card_id);       ADD(alias, "f", id->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID,	   id->func_id);       ADD(alias, "fn", id->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION,	   id->function);       ADD(alias, "pfn", id->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO,	   id->device_no);       ADD(alias, "pa", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1, id->prod_id_hash[0]);       ADD(alias, "pb", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2, id->prod_id_hash[1]);       ADD(alias, "pc", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3, id->prod_id_hash[2]);       ADD(alias, "pd", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4, id->prod_id_hash[3]);       return 1;}static int do_of_entry (const char *filename, struct of_device_id *of, char *alias){    int len;    char *tmp;    len = sprintf (alias, "of:N%sT%s",                    of->name[0] ? of->name : "*",                    of->type[0] ? of->type : "*");    if (of->compatible[0])        sprintf (&alias[len], "%sC%s",                     of->type[0] ? "*" : "",                     of->compatible);    /* Replace all whitespace with underscores */    for (tmp = alias; tmp && *tmp; tmp++)        if (isspace (*tmp))            *tmp = '_';    return 1;}static int do_vio_entry(const char *filename, struct vio_device_id *vio,		char *alias){	char *tmp;	sprintf(alias, "vio:T%sS%s", vio->type[0] ? vio->type : "*",			vio->compat[0] ? vio->compat : "*");	/* Replace all whitespace with underscores */	for (tmp = alias; tmp && *tmp; tmp++)		if (isspace (*tmp))			*tmp = '_';	return 1;}#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))static void do_input(char *alias,		     kernel_ulong_t *arr, unsigned int min, unsigned int max){	unsigned int i;	for (i = min; i < max; i++)		if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG)))			sprintf(alias + strlen(alias), "%X,*", i);}/* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */static int do_input_entry(const char *filename, struct input_device_id *id,			  char *alias){	sprintf(alias, "input:");	ADD(alias, "b", id->flags & INPUT_DEVICE_ID_MATCH_BUS, id->bustype);	ADD(alias, "v", id->flags & INPUT_DEVICE_ID_MATCH_VENDOR, id->vendor);	ADD(alias, "p", id->flags & INPUT_DEVICE_ID_MATCH_PRODUCT, id->product);	ADD(alias, "e", id->flags & INPUT_DEVICE_ID_MATCH_VERSION, id->version);	sprintf(alias + strlen(alias), "-e*");	if (id->flags & INPUT_DEVICE_ID_MATCH_EVBIT)		do_input(alias, id->evbit, 0, INPUT_DEVICE_ID_EV_MAX);	sprintf(alias + strlen(alias), "k*");	if (id->flags & INPUT_DEVICE_ID_MATCH_KEYBIT)		do_input(alias, id->keybit,			 INPUT_DEVICE_ID_KEY_MIN_INTERESTING,			 INPUT_DEVICE_ID_KEY_MAX);	sprintf(alias + strlen(alias), "r*");	if (id->flags & INPUT_DEVICE_ID_MATCH_RELBIT)		do_input(alias, id->relbit, 0, INPUT_DEVICE_ID_REL_MAX);	sprintf(alias + strlen(alias), "a*");	if (id->flags & INPUT_DEVICE_ID_MATCH_ABSBIT)		do_input(alias, id->absbit, 0, INPUT_DEVICE_ID_ABS_MAX);	sprintf(alias + strlen(alias), "m*");	if (id->flags & INPUT_DEVICE_ID_MATCH_MSCIT)		do_input(alias, id->mscbit, 0, INPUT_DEVICE_ID_MSC_MAX);	sprintf(alias + strlen(alias), "l*");	if (id->flags & INPUT_DEVICE_ID_MATCH_LEDBIT)		do_input(alias, id->ledbit, 0, INPUT_DEVICE_ID_LED_MAX);	sprintf(alias + strlen(alias), "s*");	if (id->flags & INPUT_DEVICE_ID_MATCH_SNDBIT)		do_input(alias, id->sndbit, 0, INPUT_DEVICE_ID_SND_MAX);	sprintf(alias + strlen(alias), "f*");	if (id->flags & INPUT_DEVICE_ID_MATCH_FFBIT)		do_input(alias, id->ffbit, 0, INPUT_DEVICE_ID_FF_MAX);	sprintf(alias + strlen(alias), "w*");	if (id->flags & INPUT_DEVICE_ID_MATCH_SWBIT)		do_input(alias, id->swbit, 0, INPUT_DEVICE_ID_SW_MAX);	return 1;}static int do_eisa_entry(const char *filename, struct eisa_device_id *eisa,		char *alias){	if (eisa->sig[0])		sprintf(alias, EISA_DEVICE_MODALIAS_FMT "*", eisa->sig);	return 1;}/* Looks like: parisc:tNhvNrevNsvN */static int do_parisc_entry(const char *filename, struct parisc_device_id *id,		char *alias){	id->hw_type = TO_NATIVE(id->hw_type);	id->hversion = TO_NATIVE(id->hversion);	id->hversion_rev = TO_NATIVE(id->hversion_rev);	id->sversion = TO_NATIVE(id->sversion);	strcpy(alias, "parisc:");	ADD(alias, "t", id->hw_type != PA_HWTYPE_ANY_ID, id->hw_type);	ADD(alias, "hv", id->hversion != PA_HVERSION_ANY_ID, id->hversion);	ADD(alias, "rev", id->hversion_rev != PA_HVERSION_REV_ANY_ID, id->hversion_rev);	ADD(alias, "sv", id->sversion != PA_SVERSION_ANY_ID, id->sversion);	return 1;}/* Looks like: sdio:cNvNdN. */static int do_sdio_entry(const char *filename,			struct sdio_device_id *id, char *alias){	id->class = TO_NATIVE(id->class);	id->vendor = TO_NATIVE(id->vendor);	id->device = TO_NATIVE(id->device);	strcpy(alias, "sdio:");	ADD(alias, "c", id->class != (__u8)SDIO_ANY_ID, id->class);	ADD(alias, "v", id->vendor != (__u16)SDIO_ANY_ID, id->vendor);	ADD(alias, "d", id->device != (__u16)SDIO_ANY_ID, id->device);	return 1;}/* Looks like: ssb:vNidNrevN. */static int do_ssb_entry(const char *filename,			struct ssb_device_id *id, char *alias){	id->vendor = TO_NATIVE(id->vendor);	id->coreid = TO_NATIVE(id->coreid);	id->revision = TO_NATIVE(id->revision);	strcpy(alias, "ssb:");	ADD(alias, "v", id->vendor != SSB_ANY_VENDOR, id->vendor);	ADD(alias, "id", id->coreid != SSB_ANY_ID, id->coreid);	ADD(alias, "rev", id->revision != SSB_ANY_REV, id->revision);	return 1;}/* Looks like: virtio:dNvN */static int do_virtio_entry(const char *filename, struct virtio_device_id *id,			   char *alias){	id->device = TO_NATIVE(id->device);	id->vendor = TO_NATIVE(id->vendor);	strcpy(alias, "virtio:");	ADD(alias, "d", 1, id->device);	ADD(alias, "v", id->vendor != VIRTIO_DEV_ANY_ID, id->vendor);	return 1;}/* Ignore any prefix, eg. v850 prepends _ */static inline int sym_is(const char *symbol, const char *name){	const char *match;	match = strstr(symbol, name);	if (!match)		return 0;	return match[strlen(symbol)] == '\0';}static void do_table(void *symval, unsigned long size,		     unsigned long id_size,		     const char *device_id,		     void *function,		     struct module *mod){	unsigned int i;	char alias[500];	int (*do_entry)(const char *, void *entry, char *alias) = function;	device_id_check(mod->name, device_id, size, id_size, symval);	/* Leave last one: it's the terminator. */	size -= id_size;	for (i = 0; i < size; i += id_size) {		if (do_entry(mod->name, symval+i, alias)) {			/* Always end in a wildcard, for future extension */			if (alias[strlen(alias)-1] != '*')				strcat(alias, "*");			buf_printf(&mod->dev_table_buf,				   "MODULE_ALIAS(\"%s\");\n", alias);		}	}}/* Create MODULE_ALIAS() statements. * At this time, we cannot write the actual output C source yet, * so we write into the mod->dev_table_buf buffer. */void handle_moddevtable(struct module *mod, struct elf_info *info,			Elf_Sym *sym, const char *symname){	void *symval;	char *zeros = NULL;	/* We're looking for a section relative symbol */	if (!sym->st_shndx || sym->st_shndx >= info->hdr->e_shnum)		return;	/* Handle all-NULL symbols allocated into .bss */	if (info->sechdrs[sym->st_shndx].sh_type & SHT_NOBITS) {		zeros = calloc(1, sym->st_size);		symval = zeros;	} else {		symval = (void *)info->hdr			+ info->sechdrs[sym->st_shndx].sh_offset			+ sym->st_value;	}	if (sym_is(symname, "__mod_pci_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct pci_device_id), "pci",			 do_pci_entry, mod);	else if (sym_is(symname, "__mod_usb_device_table"))		/* special case to handle bcdDevice ranges */		do_usb_table(symval, sym->st_size, mod);	else if (sym_is(symname, "__mod_ieee1394_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct ieee1394_device_id), "ieee1394",			 do_ieee1394_entry, mod);	else if (sym_is(symname, "__mod_ccw_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct ccw_device_id), "ccw",			 do_ccw_entry, mod);	else if (sym_is(symname, "__mod_ap_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct ap_device_id), "ap",			 do_ap_entry, mod);	else if (sym_is(symname, "__mod_serio_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct serio_device_id), "serio",			 do_serio_entry, mod);	else if (sym_is(symname, "__mod_acpi_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct acpi_device_id), "acpi",			 do_acpi_entry, mod);	else if (sym_is(symname, "__mod_pnp_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct pnp_device_id), "pnp",			 do_pnp_entry, mod);	else if (sym_is(symname, "__mod_pnp_card_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct pnp_card_device_id), "pnp_card",			 do_pnp_card_entry, mod);	else if (sym_is(symname, "__mod_pcmcia_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct pcmcia_device_id), "pcmcia",			 do_pcmcia_entry, mod);        else if (sym_is(symname, "__mod_of_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct of_device_id), "of",			 do_of_entry, mod);        else if (sym_is(symname, "__mod_vio_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct vio_device_id), "vio",			 do_vio_entry, mod);	else if (sym_is(symname, "__mod_input_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct input_device_id), "input",			 do_input_entry, mod);	else if (sym_is(symname, "__mod_eisa_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct eisa_device_id), "eisa",			 do_eisa_entry, mod);	else if (sym_is(symname, "__mod_parisc_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct parisc_device_id), "parisc",			 do_parisc_entry, mod);	else if (sym_is(symname, "__mod_sdio_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct sdio_device_id), "sdio",			 do_sdio_entry, mod);	else if (sym_is(symname, "__mod_ssb_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct ssb_device_id), "ssb",			 do_ssb_entry, mod);	else if (sym_is(symname, "__mod_virtio_device_table"))		do_table(symval, sym->st_size,			 sizeof(struct virtio_device_id), "virtio",			 do_virtio_entry, mod);	free(zeros);}/* Now add out buffered information to the generated C source */void add_moddevtable(struct buffer *buf, struct module *mod){	buf_printf(buf, "\n");	buf_write(buf, mod->dev_table_buf.p, mod->dev_table_buf.pos);	free(mod->dev_table_buf.p);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -