diff --git a/debian/changelog b/debian/changelog index af96962fe..50d48c1fd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,6 +19,7 @@ linux (4.19~rc3-1~exp2) UNRELEASED; urgency=medium * lockdep, lib{cpupower,lockdep}-dev: Remove bogus deps on ${shlibs:Depends} * debian/rules.d/tools/power/linux-cpupower: Add "+" to recursive make commands + * tools: x86_energy_perf_policy: Fix "uninitialized variable" warnings at -O2 -- Ben Hutchings Mon, 10 Sep 2018 22:25:53 +0100 diff --git a/debian/patches/bugfix/x86/tools-x86_energy_perf_policy-fix-uninitialized-varia.patch b/debian/patches/bugfix/x86/tools-x86_energy_perf_policy-fix-uninitialized-varia.patch new file mode 100644 index 000000000..c07f7169d --- /dev/null +++ b/debian/patches/bugfix/x86/tools-x86_energy_perf_policy-fix-uninitialized-varia.patch @@ -0,0 +1,95 @@ +From: Ben Hutchings +Date: Tue, 11 Sep 2018 02:38:36 +0100 +Subject: tools: x86_energy_perf_policy: Fix "uninitialized variable" + warnings at -O2 + +x86_energy_perf_policy first uses __get_cpuid() to check the maximum +CPUID level and exits if it is too low. It then assumes that later +calls will succeed (which I think is architecturally guaranteed). It +also assumes that CPUID works at all (which is not guaranteed on +x86_32). + +If optimisations are enabled, gcc warns about potentially +uninitialized variables. Fix this by adding an exit-on-error after +every call to __get_cpuid() instead of just checking the maximum +level. + +Signed-off-by: Ben Hutchings +--- + .../x86_energy_perf_policy.c | 26 +++++++++++-------- + 1 file changed, 15 insertions(+), 11 deletions(-) + +diff --git a/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c b/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c +index 65bbe627a425..bbef8bcf44d6 100644 +--- a/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c ++++ b/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c +@@ -1260,6 +1260,15 @@ void probe_dev_msr(void) + if (system("/sbin/modprobe msr > /dev/null 2>&1")) + err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" "); + } ++ ++static void get_cpuid_or_exit(unsigned int leaf, ++ unsigned int *eax, unsigned int *ebx, ++ unsigned int *ecx, unsigned int *edx) ++{ ++ if (!__get_cpuid(leaf, eax, ebx, ecx, edx)) ++ errx(1, "Processor not supported\n"); ++} ++ + /* + * early_cpuid() + * initialize turbo_is_enabled, has_hwp, has_epb +@@ -1267,15 +1276,10 @@ void probe_dev_msr(void) + */ + void early_cpuid(void) + { +- unsigned int eax, ebx, ecx, edx, max_level; ++ unsigned int eax, ebx, ecx, edx; + unsigned int fms, family, model; + +- __get_cpuid(0, &max_level, &ebx, &ecx, &edx); +- +- if (max_level < 6) +- errx(1, "Processor not supported\n"); +- +- __get_cpuid(1, &fms, &ebx, &ecx, &edx); ++ get_cpuid_or_exit(1, &fms, &ebx, &ecx, &edx); + family = (fms >> 8) & 0xf; + model = (fms >> 4) & 0xf; + if (family == 6 || family == 0xf) +@@ -1289,7 +1293,7 @@ void early_cpuid(void) + bdx_highest_ratio = msr & 0xFF; + } + +- __get_cpuid(0x6, &eax, &ebx, &ecx, &edx); ++ get_cpuid_or_exit(0x6, &eax, &ebx, &ecx, &edx); + turbo_is_enabled = (eax >> 1) & 1; + has_hwp = (eax >> 7) & 1; + has_epb = (ecx >> 3) & 1; +@@ -1307,7 +1311,7 @@ void parse_cpuid(void) + + eax = ebx = ecx = edx = 0; + +- __get_cpuid(0, &max_level, &ebx, &ecx, &edx); ++ get_cpuid_or_exit(0, &max_level, &ebx, &ecx, &edx); + + if (ebx == 0x756e6547 && edx == 0x49656e69 && ecx == 0x6c65746e) + genuine_intel = 1; +@@ -1316,7 +1320,7 @@ void parse_cpuid(void) + fprintf(stderr, "CPUID(0): %.4s%.4s%.4s ", + (char *)&ebx, (char *)&edx, (char *)&ecx); + +- __get_cpuid(1, &fms, &ebx, &ecx, &edx); ++ get_cpuid_or_exit(1, &fms, &ebx, &ecx, &edx); + family = (fms >> 8) & 0xf; + model = (fms >> 4) & 0xf; + stepping = fms & 0xf; +@@ -1341,7 +1345,7 @@ void parse_cpuid(void) + errx(1, "CPUID: no MSR"); + + +- __get_cpuid(0x6, &eax, &ebx, &ecx, &edx); ++ get_cpuid_or_exit(0x6, &eax, &ebx, &ecx, &edx); + /* turbo_is_enabled already set */ + /* has_hwp already set */ + has_hwp_notify = eax & (1 << 8); diff --git a/debian/patches/series b/debian/patches/series index 48e7d514f..5d839e52c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -152,6 +152,7 @@ bugfix/all/lockdep-stub-task_struct-state.patch bugfix/all/locking-lockdep-delete-unnecesary-include.patch bugfix/all/tools-lib-api-fs-fs.c-fix-misuse-of-strncpy.patch bugfix/all/usbip-fix-misuse-of-strncpy.patch +bugfix/x86/tools-x86_energy_perf_policy-fix-uninitialized-varia.patch # wireless: Disable regulatory.db direct loading (until we sort out signing) debian/wireless-disable-regulatory.db-direct-loading.patch