Message ID | 20220904130501.1983806-1-romain.naour@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [for-master] package/gcc: 11.3.0: fix glibc crash on G4 ppc cpus | expand |
On Sun, 4 Sept 2022 at 13:05, Romain Naour <romain.naour@gmail.com> wrote: > > gcc 11.3.0 contains a backported patch [1] that introduce > a regression for old powerpc cpus like the powerpc 7400 (G4). > > The glibc crash the init process due to a wrong asm machine > directive (.machine). > > Run /sbin/init as init process > init[1]: segfault (11) at 7369693e nip 6f6e08 lr 6f6a68 code 1 in libc.so.6[690000+18f000] > init[1]: code: 280a000c 41c1ffe0 811edb80 554a103a 7d48502e 7d4a4214 7d4903a6 4e800420 > init[1]: code: 2c08007a 4bffffbc 89290000 5529103a <7d2a482e> 2c090000 41c2ff78 7fe4fb78 > Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b > > Backport two patches from the gcc-11 stable branch (the upcoming gcc > 11.4.0). > > [1] https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=3cb53c10831be59d967d9dce8e7980fee4703500 > > Fixes: > https://gitlab.com/kubu93/buildroot/-/jobs/2976071284 > > Signed-off-by: Romain Naour <romain.naour@gmail.com> I haven't come across this myself, but looking through the gcc 11 branch this looks like a reasonable fix. Reviewed-by: Joel Stanley <joel@jms.id.au> Cheers, Joel > Cc: Joel Stanley <joel@jms.id.au> > --- > .../11.3.0/0005-rs6000-Improve-.machine.patch | 120 ++++++++++++++++++ > ...e-rs6000_cpu-for-.machine-ppc-and-pp.patch | 68 ++++++++++ > 2 files changed, 188 insertions(+) > create mode 100644 package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch > create mode 100644 package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch > > diff --git a/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch b/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch > new file mode 100644 > index 0000000000..7a4564b59e > --- /dev/null > +++ b/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch > @@ -0,0 +1,120 @@ > +From ca2c3a7d3db7a699c358d3408f820396dd536fc8 Mon Sep 17 00:00:00 2001 > +From: Segher Boessenkool <segher@kernel.crashing.org> > +Date: Tue, 1 Mar 2022 17:04:29 +0000 > +Subject: [PATCH 5/6] rs6000: Improve .machine > + > +This adds more correct .machine for most older CPUs. It should be > +conservative in the sense that everything we handled before we handle at > +least as well now. This does not yet revamp the server CPU handling, it > +is too risky at this point in time. > + > +Tested on powerpc64-linux {-m32,-m64}. Also manually tested with all > +-mcpu=, and the output of that passed through the GNU assembler. > + > +2022-03-04 Segher Boessenkool <segher@kernel.crashing.org> > + > + * config/rs6000/rs6000.c (rs6000_machine_from_flags): Restructure a > + bit. Handle most older CPUs. > + > +(cherry picked from commit 77eccbf39ed55297802bb66dff5f62507a7239e3) > +(cherry picked from commit fc7e603edc67c66a14f893f3b5a0a34e7d26f77c) > +Signed-off-by: Romain Naour <romain.naour@gmail.com> > +--- > + gcc/config/rs6000/rs6000.c | 81 +++++++++++++++++++++++++------------- > + 1 file changed, 54 insertions(+), 27 deletions(-) > + > +diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > +index 0421dc7adb3..0a55c979c36 100644 > +--- a/gcc/config/rs6000/rs6000.c > ++++ b/gcc/config/rs6000/rs6000.c > +@@ -5742,33 +5742,60 @@ const char *rs6000_machine; > + const char * > + rs6000_machine_from_flags (void) > + { > +- /* For some CPUs, the machine cannot be determined by ISA flags. We have to > +- check them first. */ > +- switch (rs6000_cpu) > +- { > +- case PROCESSOR_PPC8540: > +- case PROCESSOR_PPC8548: > +- return "e500"; > +- > +- case PROCESSOR_PPCE300C2: > +- case PROCESSOR_PPCE300C3: > +- return "e300"; > +- > +- case PROCESSOR_PPCE500MC: > +- return "e500mc"; > +- > +- case PROCESSOR_PPCE500MC64: > +- return "e500mc64"; > +- > +- case PROCESSOR_PPCE5500: > +- return "e5500"; > +- > +- case PROCESSOR_PPCE6500: > +- return "e6500"; > +- > +- default: > +- break; > +- } > ++ /* e300 and e500 */ > ++ if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3) > ++ return "e300"; > ++ if (rs6000_cpu == PROCESSOR_PPC8540 || rs6000_cpu == PROCESSOR_PPC8548) > ++ return "e500"; > ++ if (rs6000_cpu == PROCESSOR_PPCE500MC) > ++ return "e500mc"; > ++ if (rs6000_cpu == PROCESSOR_PPCE500MC64) > ++ return "e500mc64"; > ++ if (rs6000_cpu == PROCESSOR_PPCE5500) > ++ return "e5500"; > ++ if (rs6000_cpu == PROCESSOR_PPCE6500) > ++ return "e6500"; > ++ > ++ /* 400 series */ > ++ if (rs6000_cpu == PROCESSOR_PPC403) > ++ return "\"403\""; > ++ if (rs6000_cpu == PROCESSOR_PPC405) > ++ return "\"405\""; > ++ if (rs6000_cpu == PROCESSOR_PPC440) > ++ return "\"440\""; > ++ if (rs6000_cpu == PROCESSOR_PPC476) > ++ return "\"476\""; > ++ > ++ /* A2 */ > ++ if (rs6000_cpu == PROCESSOR_PPCA2) > ++ return "a2"; > ++ > ++ /* Cell BE */ > ++ if (rs6000_cpu == PROCESSOR_CELL) > ++ return "cell"; > ++ > ++ /* Titan */ > ++ if (rs6000_cpu == PROCESSOR_TITAN) > ++ return "titan"; > ++ > ++ /* 500 series and 800 series */ > ++ if (rs6000_cpu == PROCESSOR_MPCCORE) > ++ return "\"821\""; > ++ > ++ /* 600 series and 700 series, "classic" */ > ++ if (rs6000_cpu == PROCESSOR_PPC601 || rs6000_cpu == PROCESSOR_PPC603 > ++ || rs6000_cpu == PROCESSOR_PPC604 || rs6000_cpu == PROCESSOR_PPC604e > ++ || rs6000_cpu == PROCESSOR_PPC750 || rs6000_cpu == PROCESSOR_POWERPC) > ++ return "ppc"; > ++ > ++ /* Classic with AltiVec, "G4" */ > ++ if (rs6000_cpu == PROCESSOR_PPC7400 || rs6000_cpu == PROCESSOR_PPC7450) > ++ return "\"7450\""; > ++ > ++ /* The older 64-bit CPUs */ > ++ if (rs6000_cpu == PROCESSOR_PPC620 || rs6000_cpu == PROCESSOR_PPC630 > ++ || rs6000_cpu == PROCESSOR_RS64A || rs6000_cpu == PROCESSOR_POWERPC64) > ++ return "ppc64"; > + > + HOST_WIDE_INT flags = rs6000_isa_flags; > + > +-- > +2.34.3 > + > diff --git a/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch b/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch > new file mode 100644 > index 0000000000..8e31c8241c > --- /dev/null > +++ b/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch > @@ -0,0 +1,68 @@ > +From 6de33ed642f119f1e2543095dd56e4a94f97c27f Mon Sep 17 00:00:00 2001 > +From: Segher Boessenkool <segher@kernel.crashing.org> > +Date: Fri, 11 Mar 2022 21:15:18 +0000 > +Subject: [PATCH 6/6] rs6000: Do not use rs6000_cpu for .machine ppc and ppc64 > + (PR104829) > + > +Fixes: 77eccbf39ed5 > + > +rs6000.h has > + #define PROCESSOR_POWERPC PROCESSOR_PPC604 > + #define PROCESSOR_POWERPC64 PROCESSOR_RS64A > +which means that if you use things like -mcpu=powerpc -mvsx it will no > +longer work after my latest .machine patch. This causes GCC build errors > +in some cases, not a good idea (even if the errors are actually > +pre-existing: using -mvsx with a machine that does not have VSX cannot > +work properly). > + > +2022-03-11 Segher Boessenkool <segher@kernel.crashing.org> > + > + PR target/104829 > + * config/rs6000/rs6000.c (rs6000_machine_from_flags): Don't output > + "ppc" and "ppc64" based on rs6000_cpu. > + > +(cherry picked from commit 80fcc4b6afee72443bef551064826b3b4b6785e6) > +(cherry picked from commit d87e0e297b1cba73a0c055d2a3e9267d288f435a) > +Signed-off-by: Romain Naour <romain.naour@gmail.com> > +--- > + gcc/config/rs6000/rs6000.c | 12 ++++++++++-- > + 1 file changed, 10 insertions(+), 2 deletions(-) > + > +diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > +index 0a55c979c36..7e5cdd34840 100644 > +--- a/gcc/config/rs6000/rs6000.c > ++++ b/gcc/config/rs6000/rs6000.c > +@@ -5782,20 +5782,28 @@ rs6000_machine_from_flags (void) > + if (rs6000_cpu == PROCESSOR_MPCCORE) > + return "\"821\""; > + > ++#if 0 > ++ /* This (and ppc64 below) are disabled here (for now at least) because > ++ PROCESSOR_POWERPC, PROCESSOR_POWERPC64, and PROCESSOR_COMMON > ++ are #define'd as some of these. Untangling that is a job for later. */ > ++ > + /* 600 series and 700 series, "classic" */ > + if (rs6000_cpu == PROCESSOR_PPC601 || rs6000_cpu == PROCESSOR_PPC603 > + || rs6000_cpu == PROCESSOR_PPC604 || rs6000_cpu == PROCESSOR_PPC604e > +- || rs6000_cpu == PROCESSOR_PPC750 || rs6000_cpu == PROCESSOR_POWERPC) > ++ || rs6000_cpu == PROCESSOR_PPC750) > + return "ppc"; > ++#endif > + > + /* Classic with AltiVec, "G4" */ > + if (rs6000_cpu == PROCESSOR_PPC7400 || rs6000_cpu == PROCESSOR_PPC7450) > + return "\"7450\""; > + > ++#if 0 > + /* The older 64-bit CPUs */ > + if (rs6000_cpu == PROCESSOR_PPC620 || rs6000_cpu == PROCESSOR_PPC630 > +- || rs6000_cpu == PROCESSOR_RS64A || rs6000_cpu == PROCESSOR_POWERPC64) > ++ || rs6000_cpu == PROCESSOR_RS64A) > + return "ppc64"; > ++#endif > + > + HOST_WIDE_INT flags = rs6000_isa_flags; > + > +-- > +2.34.3 > + > -- > 2.34.3 >
Romain, All, On 2022-09-04 15:05 +0200, Romain Naour spake thusly: > gcc 11.3.0 contains a backported patch [1] that introduce > a regression for old powerpc cpus like the powerpc 7400 (G4). > > The glibc crash the init process due to a wrong asm machine > directive (.machine). > > Run /sbin/init as init process > init[1]: segfault (11) at 7369693e nip 6f6e08 lr 6f6a68 code 1 in libc.so.6[690000+18f000] > init[1]: code: 280a000c 41c1ffe0 811edb80 554a103a 7d48502e 7d4a4214 7d4903a6 4e800420 > init[1]: code: 2c08007a 4bffffbc 89290000 5529103a <7d2a482e> 2c090000 41c2ff78 7fe4fb78 > Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b > > Backport two patches from the gcc-11 stable branch (the upcoming gcc > 11.4.0). > > [1] https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=3cb53c10831be59d967d9dce8e7980fee4703500 > > Fixes: > https://gitlab.com/kubu93/buildroot/-/jobs/2976071284 > > Signed-off-by: Romain Naour <romain.naour@gmail.com> > Cc: Joel Stanley <joel@jms.id.au> Applied to master, thanks. Regards, Yann E. MORIN. > --- > .../11.3.0/0005-rs6000-Improve-.machine.patch | 120 ++++++++++++++++++ > ...e-rs6000_cpu-for-.machine-ppc-and-pp.patch | 68 ++++++++++ > 2 files changed, 188 insertions(+) > create mode 100644 package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch > create mode 100644 package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch > > diff --git a/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch b/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch > new file mode 100644 > index 0000000000..7a4564b59e > --- /dev/null > +++ b/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch > @@ -0,0 +1,120 @@ > +From ca2c3a7d3db7a699c358d3408f820396dd536fc8 Mon Sep 17 00:00:00 2001 > +From: Segher Boessenkool <segher@kernel.crashing.org> > +Date: Tue, 1 Mar 2022 17:04:29 +0000 > +Subject: [PATCH 5/6] rs6000: Improve .machine > + > +This adds more correct .machine for most older CPUs. It should be > +conservative in the sense that everything we handled before we handle at > +least as well now. This does not yet revamp the server CPU handling, it > +is too risky at this point in time. > + > +Tested on powerpc64-linux {-m32,-m64}. Also manually tested with all > +-mcpu=, and the output of that passed through the GNU assembler. > + > +2022-03-04 Segher Boessenkool <segher@kernel.crashing.org> > + > + * config/rs6000/rs6000.c (rs6000_machine_from_flags): Restructure a > + bit. Handle most older CPUs. > + > +(cherry picked from commit 77eccbf39ed55297802bb66dff5f62507a7239e3) > +(cherry picked from commit fc7e603edc67c66a14f893f3b5a0a34e7d26f77c) > +Signed-off-by: Romain Naour <romain.naour@gmail.com> > +--- > + gcc/config/rs6000/rs6000.c | 81 +++++++++++++++++++++++++------------- > + 1 file changed, 54 insertions(+), 27 deletions(-) > + > +diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > +index 0421dc7adb3..0a55c979c36 100644 > +--- a/gcc/config/rs6000/rs6000.c > ++++ b/gcc/config/rs6000/rs6000.c > +@@ -5742,33 +5742,60 @@ const char *rs6000_machine; > + const char * > + rs6000_machine_from_flags (void) > + { > +- /* For some CPUs, the machine cannot be determined by ISA flags. We have to > +- check them first. */ > +- switch (rs6000_cpu) > +- { > +- case PROCESSOR_PPC8540: > +- case PROCESSOR_PPC8548: > +- return "e500"; > +- > +- case PROCESSOR_PPCE300C2: > +- case PROCESSOR_PPCE300C3: > +- return "e300"; > +- > +- case PROCESSOR_PPCE500MC: > +- return "e500mc"; > +- > +- case PROCESSOR_PPCE500MC64: > +- return "e500mc64"; > +- > +- case PROCESSOR_PPCE5500: > +- return "e5500"; > +- > +- case PROCESSOR_PPCE6500: > +- return "e6500"; > +- > +- default: > +- break; > +- } > ++ /* e300 and e500 */ > ++ if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3) > ++ return "e300"; > ++ if (rs6000_cpu == PROCESSOR_PPC8540 || rs6000_cpu == PROCESSOR_PPC8548) > ++ return "e500"; > ++ if (rs6000_cpu == PROCESSOR_PPCE500MC) > ++ return "e500mc"; > ++ if (rs6000_cpu == PROCESSOR_PPCE500MC64) > ++ return "e500mc64"; > ++ if (rs6000_cpu == PROCESSOR_PPCE5500) > ++ return "e5500"; > ++ if (rs6000_cpu == PROCESSOR_PPCE6500) > ++ return "e6500"; > ++ > ++ /* 400 series */ > ++ if (rs6000_cpu == PROCESSOR_PPC403) > ++ return "\"403\""; > ++ if (rs6000_cpu == PROCESSOR_PPC405) > ++ return "\"405\""; > ++ if (rs6000_cpu == PROCESSOR_PPC440) > ++ return "\"440\""; > ++ if (rs6000_cpu == PROCESSOR_PPC476) > ++ return "\"476\""; > ++ > ++ /* A2 */ > ++ if (rs6000_cpu == PROCESSOR_PPCA2) > ++ return "a2"; > ++ > ++ /* Cell BE */ > ++ if (rs6000_cpu == PROCESSOR_CELL) > ++ return "cell"; > ++ > ++ /* Titan */ > ++ if (rs6000_cpu == PROCESSOR_TITAN) > ++ return "titan"; > ++ > ++ /* 500 series and 800 series */ > ++ if (rs6000_cpu == PROCESSOR_MPCCORE) > ++ return "\"821\""; > ++ > ++ /* 600 series and 700 series, "classic" */ > ++ if (rs6000_cpu == PROCESSOR_PPC601 || rs6000_cpu == PROCESSOR_PPC603 > ++ || rs6000_cpu == PROCESSOR_PPC604 || rs6000_cpu == PROCESSOR_PPC604e > ++ || rs6000_cpu == PROCESSOR_PPC750 || rs6000_cpu == PROCESSOR_POWERPC) > ++ return "ppc"; > ++ > ++ /* Classic with AltiVec, "G4" */ > ++ if (rs6000_cpu == PROCESSOR_PPC7400 || rs6000_cpu == PROCESSOR_PPC7450) > ++ return "\"7450\""; > ++ > ++ /* The older 64-bit CPUs */ > ++ if (rs6000_cpu == PROCESSOR_PPC620 || rs6000_cpu == PROCESSOR_PPC630 > ++ || rs6000_cpu == PROCESSOR_RS64A || rs6000_cpu == PROCESSOR_POWERPC64) > ++ return "ppc64"; > + > + HOST_WIDE_INT flags = rs6000_isa_flags; > + > +-- > +2.34.3 > + > diff --git a/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch b/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch > new file mode 100644 > index 0000000000..8e31c8241c > --- /dev/null > +++ b/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch > @@ -0,0 +1,68 @@ > +From 6de33ed642f119f1e2543095dd56e4a94f97c27f Mon Sep 17 00:00:00 2001 > +From: Segher Boessenkool <segher@kernel.crashing.org> > +Date: Fri, 11 Mar 2022 21:15:18 +0000 > +Subject: [PATCH 6/6] rs6000: Do not use rs6000_cpu for .machine ppc and ppc64 > + (PR104829) > + > +Fixes: 77eccbf39ed5 > + > +rs6000.h has > + #define PROCESSOR_POWERPC PROCESSOR_PPC604 > + #define PROCESSOR_POWERPC64 PROCESSOR_RS64A > +which means that if you use things like -mcpu=powerpc -mvsx it will no > +longer work after my latest .machine patch. This causes GCC build errors > +in some cases, not a good idea (even if the errors are actually > +pre-existing: using -mvsx with a machine that does not have VSX cannot > +work properly). > + > +2022-03-11 Segher Boessenkool <segher@kernel.crashing.org> > + > + PR target/104829 > + * config/rs6000/rs6000.c (rs6000_machine_from_flags): Don't output > + "ppc" and "ppc64" based on rs6000_cpu. > + > +(cherry picked from commit 80fcc4b6afee72443bef551064826b3b4b6785e6) > +(cherry picked from commit d87e0e297b1cba73a0c055d2a3e9267d288f435a) > +Signed-off-by: Romain Naour <romain.naour@gmail.com> > +--- > + gcc/config/rs6000/rs6000.c | 12 ++++++++++-- > + 1 file changed, 10 insertions(+), 2 deletions(-) > + > +diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > +index 0a55c979c36..7e5cdd34840 100644 > +--- a/gcc/config/rs6000/rs6000.c > ++++ b/gcc/config/rs6000/rs6000.c > +@@ -5782,20 +5782,28 @@ rs6000_machine_from_flags (void) > + if (rs6000_cpu == PROCESSOR_MPCCORE) > + return "\"821\""; > + > ++#if 0 > ++ /* This (and ppc64 below) are disabled here (for now at least) because > ++ PROCESSOR_POWERPC, PROCESSOR_POWERPC64, and PROCESSOR_COMMON > ++ are #define'd as some of these. Untangling that is a job for later. */ > ++ > + /* 600 series and 700 series, "classic" */ > + if (rs6000_cpu == PROCESSOR_PPC601 || rs6000_cpu == PROCESSOR_PPC603 > + || rs6000_cpu == PROCESSOR_PPC604 || rs6000_cpu == PROCESSOR_PPC604e > +- || rs6000_cpu == PROCESSOR_PPC750 || rs6000_cpu == PROCESSOR_POWERPC) > ++ || rs6000_cpu == PROCESSOR_PPC750) > + return "ppc"; > ++#endif > + > + /* Classic with AltiVec, "G4" */ > + if (rs6000_cpu == PROCESSOR_PPC7400 || rs6000_cpu == PROCESSOR_PPC7450) > + return "\"7450\""; > + > ++#if 0 > + /* The older 64-bit CPUs */ > + if (rs6000_cpu == PROCESSOR_PPC620 || rs6000_cpu == PROCESSOR_PPC630 > +- || rs6000_cpu == PROCESSOR_RS64A || rs6000_cpu == PROCESSOR_POWERPC64) > ++ || rs6000_cpu == PROCESSOR_RS64A) > + return "ppc64"; > ++#endif > + > + HOST_WIDE_INT flags = rs6000_isa_flags; > + > +-- > +2.34.3 > + > -- > 2.34.3 > > _______________________________________________ > buildroot mailing list > buildroot@buildroot.org > https://lists.buildroot.org/mailman/listinfo/buildroot
>>>>> "Romain" == Romain Naour <romain.naour@gmail.com> writes: > gcc 11.3.0 contains a backported patch [1] that introduce > a regression for old powerpc cpus like the powerpc 7400 (G4). > The glibc crash the init process due to a wrong asm machine > directive (.machine). > Run /sbin/init as init process > init[1]: segfault (11) at 7369693e nip 6f6e08 lr 6f6a68 code 1 in libc.so.6[690000+18f000] > init[1]: code: 280a000c 41c1ffe0 811edb80 554a103a 7d48502e 7d4a4214 7d4903a6 4e800420 > init[1]: code: 2c08007a 4bffffbc 89290000 5529103a <7d2a482e> 2c090000 41c2ff78 7fe4fb78 > Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b > Backport two patches from the gcc-11 stable branch (the upcoming gcc > 11.4.0). > [1] https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=3cb53c10831be59d967d9dce8e7980fee4703500 > Fixes: > https://gitlab.com/kubu93/buildroot/-/jobs/2976071284 > Signed-off-by: Romain Naour <romain.naour@gmail.com> > Cc: Joel Stanley <joel@jms.id.au> Committed to 2022.05.x and 2022.02.x, thanks.
diff --git a/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch b/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch new file mode 100644 index 0000000000..7a4564b59e --- /dev/null +++ b/package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch @@ -0,0 +1,120 @@ +From ca2c3a7d3db7a699c358d3408f820396dd536fc8 Mon Sep 17 00:00:00 2001 +From: Segher Boessenkool <segher@kernel.crashing.org> +Date: Tue, 1 Mar 2022 17:04:29 +0000 +Subject: [PATCH 5/6] rs6000: Improve .machine + +This adds more correct .machine for most older CPUs. It should be +conservative in the sense that everything we handled before we handle at +least as well now. This does not yet revamp the server CPU handling, it +is too risky at this point in time. + +Tested on powerpc64-linux {-m32,-m64}. Also manually tested with all +-mcpu=, and the output of that passed through the GNU assembler. + +2022-03-04 Segher Boessenkool <segher@kernel.crashing.org> + + * config/rs6000/rs6000.c (rs6000_machine_from_flags): Restructure a + bit. Handle most older CPUs. + +(cherry picked from commit 77eccbf39ed55297802bb66dff5f62507a7239e3) +(cherry picked from commit fc7e603edc67c66a14f893f3b5a0a34e7d26f77c) +Signed-off-by: Romain Naour <romain.naour@gmail.com> +--- + gcc/config/rs6000/rs6000.c | 81 +++++++++++++++++++++++++------------- + 1 file changed, 54 insertions(+), 27 deletions(-) + +diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c +index 0421dc7adb3..0a55c979c36 100644 +--- a/gcc/config/rs6000/rs6000.c ++++ b/gcc/config/rs6000/rs6000.c +@@ -5742,33 +5742,60 @@ const char *rs6000_machine; + const char * + rs6000_machine_from_flags (void) + { +- /* For some CPUs, the machine cannot be determined by ISA flags. We have to +- check them first. */ +- switch (rs6000_cpu) +- { +- case PROCESSOR_PPC8540: +- case PROCESSOR_PPC8548: +- return "e500"; +- +- case PROCESSOR_PPCE300C2: +- case PROCESSOR_PPCE300C3: +- return "e300"; +- +- case PROCESSOR_PPCE500MC: +- return "e500mc"; +- +- case PROCESSOR_PPCE500MC64: +- return "e500mc64"; +- +- case PROCESSOR_PPCE5500: +- return "e5500"; +- +- case PROCESSOR_PPCE6500: +- return "e6500"; +- +- default: +- break; +- } ++ /* e300 and e500 */ ++ if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3) ++ return "e300"; ++ if (rs6000_cpu == PROCESSOR_PPC8540 || rs6000_cpu == PROCESSOR_PPC8548) ++ return "e500"; ++ if (rs6000_cpu == PROCESSOR_PPCE500MC) ++ return "e500mc"; ++ if (rs6000_cpu == PROCESSOR_PPCE500MC64) ++ return "e500mc64"; ++ if (rs6000_cpu == PROCESSOR_PPCE5500) ++ return "e5500"; ++ if (rs6000_cpu == PROCESSOR_PPCE6500) ++ return "e6500"; ++ ++ /* 400 series */ ++ if (rs6000_cpu == PROCESSOR_PPC403) ++ return "\"403\""; ++ if (rs6000_cpu == PROCESSOR_PPC405) ++ return "\"405\""; ++ if (rs6000_cpu == PROCESSOR_PPC440) ++ return "\"440\""; ++ if (rs6000_cpu == PROCESSOR_PPC476) ++ return "\"476\""; ++ ++ /* A2 */ ++ if (rs6000_cpu == PROCESSOR_PPCA2) ++ return "a2"; ++ ++ /* Cell BE */ ++ if (rs6000_cpu == PROCESSOR_CELL) ++ return "cell"; ++ ++ /* Titan */ ++ if (rs6000_cpu == PROCESSOR_TITAN) ++ return "titan"; ++ ++ /* 500 series and 800 series */ ++ if (rs6000_cpu == PROCESSOR_MPCCORE) ++ return "\"821\""; ++ ++ /* 600 series and 700 series, "classic" */ ++ if (rs6000_cpu == PROCESSOR_PPC601 || rs6000_cpu == PROCESSOR_PPC603 ++ || rs6000_cpu == PROCESSOR_PPC604 || rs6000_cpu == PROCESSOR_PPC604e ++ || rs6000_cpu == PROCESSOR_PPC750 || rs6000_cpu == PROCESSOR_POWERPC) ++ return "ppc"; ++ ++ /* Classic with AltiVec, "G4" */ ++ if (rs6000_cpu == PROCESSOR_PPC7400 || rs6000_cpu == PROCESSOR_PPC7450) ++ return "\"7450\""; ++ ++ /* The older 64-bit CPUs */ ++ if (rs6000_cpu == PROCESSOR_PPC620 || rs6000_cpu == PROCESSOR_PPC630 ++ || rs6000_cpu == PROCESSOR_RS64A || rs6000_cpu == PROCESSOR_POWERPC64) ++ return "ppc64"; + + HOST_WIDE_INT flags = rs6000_isa_flags; + +-- +2.34.3 + diff --git a/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch b/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch new file mode 100644 index 0000000000..8e31c8241c --- /dev/null +++ b/package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch @@ -0,0 +1,68 @@ +From 6de33ed642f119f1e2543095dd56e4a94f97c27f Mon Sep 17 00:00:00 2001 +From: Segher Boessenkool <segher@kernel.crashing.org> +Date: Fri, 11 Mar 2022 21:15:18 +0000 +Subject: [PATCH 6/6] rs6000: Do not use rs6000_cpu for .machine ppc and ppc64 + (PR104829) + +Fixes: 77eccbf39ed5 + +rs6000.h has + #define PROCESSOR_POWERPC PROCESSOR_PPC604 + #define PROCESSOR_POWERPC64 PROCESSOR_RS64A +which means that if you use things like -mcpu=powerpc -mvsx it will no +longer work after my latest .machine patch. This causes GCC build errors +in some cases, not a good idea (even if the errors are actually +pre-existing: using -mvsx with a machine that does not have VSX cannot +work properly). + +2022-03-11 Segher Boessenkool <segher@kernel.crashing.org> + + PR target/104829 + * config/rs6000/rs6000.c (rs6000_machine_from_flags): Don't output + "ppc" and "ppc64" based on rs6000_cpu. + +(cherry picked from commit 80fcc4b6afee72443bef551064826b3b4b6785e6) +(cherry picked from commit d87e0e297b1cba73a0c055d2a3e9267d288f435a) +Signed-off-by: Romain Naour <romain.naour@gmail.com> +--- + gcc/config/rs6000/rs6000.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c +index 0a55c979c36..7e5cdd34840 100644 +--- a/gcc/config/rs6000/rs6000.c ++++ b/gcc/config/rs6000/rs6000.c +@@ -5782,20 +5782,28 @@ rs6000_machine_from_flags (void) + if (rs6000_cpu == PROCESSOR_MPCCORE) + return "\"821\""; + ++#if 0 ++ /* This (and ppc64 below) are disabled here (for now at least) because ++ PROCESSOR_POWERPC, PROCESSOR_POWERPC64, and PROCESSOR_COMMON ++ are #define'd as some of these. Untangling that is a job for later. */ ++ + /* 600 series and 700 series, "classic" */ + if (rs6000_cpu == PROCESSOR_PPC601 || rs6000_cpu == PROCESSOR_PPC603 + || rs6000_cpu == PROCESSOR_PPC604 || rs6000_cpu == PROCESSOR_PPC604e +- || rs6000_cpu == PROCESSOR_PPC750 || rs6000_cpu == PROCESSOR_POWERPC) ++ || rs6000_cpu == PROCESSOR_PPC750) + return "ppc"; ++#endif + + /* Classic with AltiVec, "G4" */ + if (rs6000_cpu == PROCESSOR_PPC7400 || rs6000_cpu == PROCESSOR_PPC7450) + return "\"7450\""; + ++#if 0 + /* The older 64-bit CPUs */ + if (rs6000_cpu == PROCESSOR_PPC620 || rs6000_cpu == PROCESSOR_PPC630 +- || rs6000_cpu == PROCESSOR_RS64A || rs6000_cpu == PROCESSOR_POWERPC64) ++ || rs6000_cpu == PROCESSOR_RS64A) + return "ppc64"; ++#endif + + HOST_WIDE_INT flags = rs6000_isa_flags; + +-- +2.34.3 +
gcc 11.3.0 contains a backported patch [1] that introduce a regression for old powerpc cpus like the powerpc 7400 (G4). The glibc crash the init process due to a wrong asm machine directive (.machine). Run /sbin/init as init process init[1]: segfault (11) at 7369693e nip 6f6e08 lr 6f6a68 code 1 in libc.so.6[690000+18f000] init[1]: code: 280a000c 41c1ffe0 811edb80 554a103a 7d48502e 7d4a4214 7d4903a6 4e800420 init[1]: code: 2c08007a 4bffffbc 89290000 5529103a <7d2a482e> 2c090000 41c2ff78 7fe4fb78 Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b Backport two patches from the gcc-11 stable branch (the upcoming gcc 11.4.0). [1] https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=3cb53c10831be59d967d9dce8e7980fee4703500 Fixes: https://gitlab.com/kubu93/buildroot/-/jobs/2976071284 Signed-off-by: Romain Naour <romain.naour@gmail.com> Cc: Joel Stanley <joel@jms.id.au> --- .../11.3.0/0005-rs6000-Improve-.machine.patch | 120 ++++++++++++++++++ ...e-rs6000_cpu-for-.machine-ppc-and-pp.patch | 68 ++++++++++ 2 files changed, 188 insertions(+) create mode 100644 package/gcc/11.3.0/0005-rs6000-Improve-.machine.patch create mode 100644 package/gcc/11.3.0/0006-rs6000-Do-not-use-rs6000_cpu-for-.machine-ppc-and-pp.patch