History

cpu: add generic support for CPU feature based module autoloading

This patch adds support for advertising optional CPU features over udev using the modalias, and for declaring compatibility with/dependency upon such a feature in a module. The mapping between feature numbers and actual features should be provided by the architecture in a file called <asm/cpufeature.h> which exports the following functions/macros: - cpu_feature(FEAT), a preprocessor macro that maps token FEAT to a numeric index; - bool cpu_have_feature(n), returning whether this CPU has support for feature #n; - MAX_CPU_FEATURES, an upper bound for 'n' in the previous function. The feature can then be enabled by setting CONFIG_GENERIC_CPU_AUTOPROBE for the architecture. For instance, a module that registers its module init function using module_cpu_feature_match(FEAT_X, module_init_function) will be probed automatically when the CPU's support for the 'FEAT_X' feature is advertised over udev, and will only allow the module to be loaded by hand if the 'FEAT_X' feature is supported.

Ard Biesheuvel committed 12 years ago

Commit 67bad2f1 parent 91219a36 files · +135 −5Browse files

Showing the changes to scripts/mod (2 of 6 files). Show all

Unified · Split

2 files
  1. scripts/mod/devicetable-offsets.c +3 −0
  2. scripts/mod/file2alias.c +10 −0
scripts/mod/devicetable-offsets.c+3−0
@@ -174,6 +174,9 @@ int main(void) · 173 unmodified lines
174 DEVID_FIELD(x86_cpu_id, model);174 DEVID_FIELD(x86_cpu_id, model);
175 DEVID_FIELD(x86_cpu_id, vendor);175 DEVID_FIELD(x86_cpu_id, vendor);
176 176
177 DEVID(cpu_feature);
178 DEVID_FIELD(cpu_feature, feature);
179
177 DEVID(mei_cl_device_id);180 DEVID(mei_cl_device_id);
178 DEVID_FIELD(mei_cl_device_id, name);181 DEVID_FIELD(mei_cl_device_id, name);
179 182
scripts/mod/file2alias.c+10−0
@@ -1135,6 +1135,16 @@ static int do_x86cpu_entry(const char *filename, void *symval, · 1134 unmodified lines
1135}1135}
1136ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry);1136ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry);
1137 1137
1138/* LOOKS like cpu:type:*:feature:*FEAT* */
1139static int do_cpu_entry(const char *filename, void *symval, char *alias)
1140{
1141 DEF_FIELD(symval, cpu_feature, feature);
1142
1143 sprintf(alias, "cpu:type:*:feature:*%04X*", feature);
1144 return 1;
1145}
1146ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry);
1147
1138/* Looks like: mei:S */1148/* Looks like: mei:S */
1139static int do_mei_entry(const char *filename, void *symval,1149static int do_mei_entry(const char *filename, void *symval,
1140 char *alias)1150 char *alias)