This increases the core size on i386-pc needlessly. And will increase even more when we improve backtrace command. This needs to be a hook and loaded together with normal. Also it needs to be cpu-agnostic
Le lun. 7 oct. 2024, 21:22, Leo Sandoval <lsand...@redhat.com> a écrit : > From: Peter Jones <pjo...@redhat.com> > > --- > grub-core/Makefile.core.def | 3 ++ > grub-core/kern/misc.c | 6 ++++ > grub-core/lib/arm64/backtrace.c | 62 +++++++++++++++++++++++++++++++++ > grub-core/lib/backtrace.c | 2 ++ > grub-core/lib/i386/backtrace.c | 14 +++++++- > 5 files changed, 86 insertions(+), 1 deletion(-) > create mode 100644 grub-core/lib/arm64/backtrace.c > > diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def > index 0bffbfea9..17b581220 100644 > --- a/grub-core/Makefile.core.def > +++ b/grub-core/Makefile.core.def > @@ -199,6 +199,9 @@ kernel = { > > softdiv = lib/division.c; > > + x86 = lib/i386/backtrace.c; > + x86 = lib/backtrace.c; > + > i386 = kern/i386/dl.c; > i386_xen = kern/i386/dl.c; > i386_xen_pvh = kern/i386/dl.c; > diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c > index 11037dc02..465a8e74e 100644 > --- a/grub-core/kern/misc.c > +++ b/grub-core/kern/misc.c > @@ -26,6 +26,7 @@ > #include <grub/i18n.h> > #include <grub/types.h> > #include <grub/charset.h> > +#include <grub/backtrace.h> > > union printf_arg > { > @@ -1301,6 +1302,11 @@ grub_printf_fmt_check (const char *fmt, const char > *fmt_expected) > void __attribute__ ((noreturn)) > grub_abort (void) > { > +#ifndef GRUB_UTIL > +#if defined(__i386__) || defined(__x86_64__) > + grub_backtrace(); > +#endif > +#endif > grub_printf ("\nAborted."); > > #ifndef GRUB_UTIL > diff --git a/grub-core/lib/arm64/backtrace.c > b/grub-core/lib/arm64/backtrace.c > new file mode 100644 > index 000000000..1079b5380 > --- /dev/null > +++ b/grub-core/lib/arm64/backtrace.c > @@ -0,0 +1,62 @@ > +/* > + * GRUB -- GRand Unified Bootloader > + * Copyright (C) 2009 Free Software Foundation, Inc. > + * > + * GRUB is free software: you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation, either version 3 of the License, or > + * (at your option) any later version. > + * > + * GRUB is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <grub/misc.h> > +#include <grub/command.h> > +#include <grub/err.h> > +#include <grub/dl.h> > +#include <grub/mm.h> > +#include <grub/term.h> > +#include <grub/backtrace.h> > + > +#define MAX_STACK_FRAME 102400 > + > +void > +grub_backtrace_pointer (int frame) > +{ > + while (1) > + { > + void *lp = __builtin_return_address (frame); > + if (!lp) > + break; > + > + lp = __builtin_extract_return_addr (lp); > + > + grub_printf ("%p: ", lp); > + grub_backtrace_print_address (lp); > + grub_printf (" ("); > + for (i = 0; i < 2; i++) > + grub_printf ("%p,", ((void **)ptr) [i + 2]); > + grub_printf ("%p)\n", ((void **)ptr) [i + 2]); > + nptr = *(void **)ptr; > + if (nptr < ptr || (void **) nptr - (void **) ptr > MAX_STACK_FRAME > + || nptr == ptr) > + { > + grub_printf ("Invalid stack frame at %p (%p)\n", ptr, nptr); > + break; > + } > + ptr = nptr; > + } > +} > + > +void > +grub_backtrace (void) > +{ > + grub_backtrace_pointer (1); > +} > + > diff --git a/grub-core/lib/backtrace.c b/grub-core/lib/backtrace.c > index 825a8800e..c0ad6ab8b 100644 > --- a/grub-core/lib/backtrace.c > +++ b/grub-core/lib/backtrace.c > @@ -29,6 +29,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); > void > grub_backtrace_print_address (void *addr) > { > +#ifndef GRUB_UTIL > grub_dl_t mod; > > FOR_DL_MODULES (mod) > @@ -44,6 +45,7 @@ grub_backtrace_print_address (void *addr) > } > } > > +#endif > grub_printf ("%p", addr); > } > > diff --git a/grub-core/lib/i386/backtrace.c > b/grub-core/lib/i386/backtrace.c > index c3e03c727..c67273db3 100644 > --- a/grub-core/lib/i386/backtrace.c > +++ b/grub-core/lib/i386/backtrace.c > @@ -15,11 +15,23 @@ > * You should have received a copy of the GNU General Public License > * along with GRUB. If not, see <http://www.gnu.org/licenses/>. > */ > +#include <config.h> > +#ifdef GRUB_UTIL > +#define REALLY_GRUB_UTIL GRUB_UTIL > +#undef GRUB_UTIL > +#endif > + > +#include <grub/symbol.h> > +#include <grub/dl.h> > + > +#ifdef REALLY_GRUB_UTIL > +#define GRUB_UTIL REALLY_GRUB_UTIL > +#undef REALLY_GRUB_UTIL > +#endif > > #include <grub/misc.h> > #include <grub/command.h> > #include <grub/err.h> > -#include <grub/dl.h> > #include <grub/mm.h> > #include <grub/term.h> > #include <grub/backtrace.h> > -- > 2.46.2 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel