Re: [PATCH] modutils: ieee1394 device_id extraction

From: Kristian Hogsberg (hogsberg@users.sourceforge.net)
Date: Sun Sep 16 2001 - 05:18:53 EST


Keith Owens <kaos@ocs.com.au> writes:

> On 15 Sep 2001 18:02:10 +0200,
> Kristian Hogsberg <hogsberg@users.sf.net> wrote:
> >I've been adding hotplug support to the ieee1394 subsystem, and the
> >ieee1394 stack in cvs now calls the usermode helper just like usb, pci
> >and the rest of them. Next step is to extend depmod so it extracts
> >the device id tables from the 1394 device drivers, which is exactly
> >what the patch below does.
> >
> >Keith, would you apply this to modutils?
>
> Patch looks OK, expect that sometimes you use hpsb and sometimes
> ieee1394 as a prefix for variable names. Can they all be iee1394,
> including the device table? Use MODULE_DEVICE_TABLE(ieee1394,name)
> instead of MODULE_DEVICE_TABLE(hpsb, name).

Ok, the patch below changes this. Within the drivers, though, hpsb
(High Performance Serial Bus) is used, but I believe ieee1394 is more
widely recognized.

Kristian

diff -ur modutils-2.4.8/depmod/depmod.c modutils-2.4.8-ieee1394/depmod/depmod.c
--- modutils-2.4.8/depmod/depmod.c Wed Aug 22 07:13:56 2001
+++ modutils-2.4.8-ieee1394/depmod/depmod.c Sun Sep 16 11:38:03 2001
@@ -182,6 +182,26 @@
         ElfW(Addr) pattern;
 };
 
+/* Device tables for ieee1394 devices.
+ * Added sep. 15, 2001, Kristian Hogsberg <hogsberg@users.sf.net>.
+ * See linux/drivers/ieee1394/ieee1394_hotplug.h
+ */
+
+#ifndef u32
+#define u32 u_int32_t
+#endif
+
+unsigned int ieee1394_device_id_ver;
+
+struct ieee1394_device_id {
+ u32 match_flags;
+ u32 vendor_id;
+ u32 model_id;
+ u32 specifier_id;
+ u32 version;
+ void *driver_data;
+};
+
 typedef struct MODULE {
         char *name;
         int resolved;
@@ -201,6 +221,8 @@
         int n_usb_device;
         struct parport_device_id *parport_device;
         int n_parport_device;
+ struct ieee1394_device_id *ieee1394_device;
+ int n_ieee1394_device;
 } MODULE;
 
 typedef enum SYM_STATUS {
@@ -646,6 +668,41 @@
 }
 
 /*
+ * Extract any ieee1394_device_table from the module.
+ * Note: assumes same machine and arch for depmod and module.
+ */
+static void extract_ieee1394_device_id(struct obj_file *f, void *image, unsigned long m_size, MODULE *mod)
+{
+ struct ieee1394_device_id ieee1394_device, *latest;
+ ElfW(Addr) ref_ieee1394, ref_ref_ieee1394;
+ unsigned tgt_long ieee1394_device_size;
+ ref_ieee1394 = obj_symbol_final_value(f, obj_find_symbol(f, "__module_ieee1394_device_size"));
+ if (!in_range(f, m_size, ref_ieee1394, sizeof(ieee1394_device_size)))
+ return;
+ memcpy(&ieee1394_device_size, (char *)image + ref_ieee1394 - f->baseaddr, sizeof(ieee1394_device_size));
+ ref_ref_ieee1394 = obj_symbol_final_value(f, obj_find_symbol(f, "__module_ieee1394_device_table"));
+ if (!in_range(f, m_size, ref_ref_ieee1394, sizeof(ref_ieee1394)))
+ return;
+ memcpy(&ref_ieee1394, (char *)image + ref_ref_ieee1394 - f->baseaddr, sizeof(ref_ieee1394));
+ extract_version(f, image, m_size, "ieee1394_device", &ieee1394_device_id_ver, 1, 1);
+ if (ieee1394_device_size != sizeof(ieee1394_device)) {
+ error("Unexpected value (%" tgt_long_fmt "d) in '%s' for ieee1394_device_size%s",
+ ieee1394_device_size, f->filename, has_kernel_changed);
+ exit(-1);
+ }
+ while (in_range(f, m_size, ref_ieee1394, ieee1394_device_size)) {
+ memset(&ieee1394_device, 0, sizeof(ieee1394_device));
+ memcpy(&ieee1394_device, (char *)image + ref_ieee1394 - f->baseaddr, ieee1394_device_size);
+ ref_ieee1394 += ieee1394_device_size;
+ if (ieee1394_device.match_flags == 0)
+ break;
+ mod->ieee1394_device = xrealloc(mod->ieee1394_device, ++(mod->n_ieee1394_device)*sizeof(*(mod->ieee1394_device)));
+ latest = mod->ieee1394_device + mod->n_ieee1394_device-1;
+ *latest = ieee1394_device;
+ }
+}
+
+/*
  * Read the symbols in an object and register them in the symbol table.
  * Return -1 if there is an error.
  */
@@ -827,6 +884,7 @@
         extract_isapnp_card_id(f, image, m_size, mod);
         extract_usb_device_id(f, image, m_size, mod);
         extract_parport_device_id(f, image, m_size, mod);
+ extract_ieee1394_device_id(f, image, m_size, mod);
         free(image);
 
         obj_free(f);
@@ -1025,6 +1083,7 @@
         FILE *isapnpmap = stdout;
         FILE *usbmap = stdout;
         FILE *parportmap = stdout;
+ FILE *ieee1394map = stdout;
         MODULE **tbdep;
         MODULE *ptmod;
         int i;
@@ -1038,6 +1097,7 @@
                 isapnpmap = gen_file_open(gen_file+GEN_ISAPNPMAPFILE);
                 usbmap = gen_file_open(gen_file+GEN_USBMAPFILE);
                 parportmap = gen_file_open(gen_file+GEN_PARPORTMAPFILE);
+ ieee1394map = gen_file_open(gen_file+GEN_IEEE1394MAPFILE);
         }
 
         skipchars = strlen(base_dir);
@@ -1216,6 +1276,27 @@
                 }
         }
 
+ ptmod = modules;
+ fprintf(ieee1394map, "# ieee1394 module ");
+ /* Requires all users to be on kernel 2.4.0 or later */
+ fprintf(ieee1394map, "match_flags ");
+ fprintf(ieee1394map, "vendor_id model_id specifier_id version\n");
+ for (i = 0; i < n_modules; i++, ptmod++) {
+ int j;
+ struct ieee1394_device_id *ieee1394_device = ptmod->ieee1394_device;
+ if (!ptmod->n_ieee1394_device)
+ continue;
+ for (j = 0; j < ptmod->n_ieee1394_device; j++, ieee1394_device++) {
+ fprintf(ieee1394map, "%-20s 0x%08x 0x%06x 0x%06x 0x%06x 0x%06x\n",
+ shortname(ptmod->name),
+ ieee1394_device->match_flags,
+ ieee1394_device->vendor_id,
+ ieee1394_device->model_id,
+ ieee1394_device->specifier_id,
+ ieee1394_device->version);
+ }
+ }
+
         if (generic_string != stdout)
                 fclose(generic_string);
         if (pcimap != stdout)
@@ -1225,6 +1306,8 @@
         if (usbmap != stdout)
                 fclose(usbmap);
         if (parportmap != stdout)
+ fclose(parportmap);
+ if (ieee1394map != stdout)
                 fclose(parportmap);
         /* Close depfile last, it's timestamp is critical */
         if (dep != stdout)
Only in modutils-2.4.8-ieee1394/depmod: depmod.c.orig
Only in modutils-2.4.8-ieee1394/depmod: depmod.c~
diff -ur modutils-2.4.8/include/config.h modutils-2.4.8-ieee1394/include/config.h
--- modutils-2.4.8/include/config.h Fri Jan 5 02:45:19 2001
+++ modutils-2.4.8-ieee1394/include/config.h Sat Sep 15 16:52:52 2001
@@ -92,6 +92,7 @@
         GEN_ISAPNPMAPFILE,
         GEN_USBMAPFILE,
         GEN_PARPORTMAPFILE,
+ GEN_IEEE1394MAPFILE,
         GEN_DEPFILE,
 };
 
diff -ur modutils-2.4.8/util/alias.h modutils-2.4.8-ieee1394/util/alias.h
--- modutils-2.4.8/util/alias.h Thu Aug 16 14:12:26 2001
+++ modutils-2.4.8-ieee1394/util/alias.h Sat Sep 15 16:52:52 2001
@@ -247,6 +247,7 @@
         "modules.isapnpmap",
         "modules.usbmap",
         "modules.parportmap",
+ "modules.ieee1394map",
         "System.map",
         ".config",
         "build", /* symlink to source tree */
Only in modutils-2.4.8-ieee1394/util: alias.h.orig
diff -ur modutils-2.4.8/util/config.c modutils-2.4.8-ieee1394/util/config.c
--- modutils-2.4.8/util/config.c Sun Mar 25 13:13:48 2001
+++ modutils-2.4.8-ieee1394/util/config.c Sat Sep 15 16:52:52 2001
@@ -116,6 +116,7 @@
         {"isapnpmap", NULL, 0},
         {"usbmap", NULL, 0},
         {"parportmap", NULL, 0},
+ {"ieee1394map", NULL, 0},
         {"dep", NULL, 0},
 };
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Sep 23 2001 - 21:00:13 EST