Skip to content

Commit aa49f20

Browse files
thejhsuryasaimadhu
authored andcommitted
x86/dumpstack: Introduce die_addr() for die() with #GP fault address
Split __die() into __die_header() and __die_body(). This allows inserting extra information below the header line that initiates the bug report. Introduce a new function die_addr() that behaves like die(), but is for faults only and uses __die_header() and __die_body() so that a future commit can print extra information after the header line. [ bp: Comment the KASAN-specific usage of gp_addr. ] Signed-off-by: Jann Horn <jannh@google.com> Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Alexander Potapenko <glider@google.com> Cc: Andrey Konovalov <andreyknvl@google.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: kasan-dev@googlegroups.com Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org> Cc: Sean Christopherson <sean.j.christopherson@intel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: x86-ml <x86@kernel.org> Link: https://lkml.kernel.org/r/20191218231150.12139-3-jannh@google.com
1 parent 59c1dcb commit aa49f20

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

arch/x86/include/asm/kdebug.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ enum show_regs_mode {
3333
};
3434

3535
extern void die(const char *, struct pt_regs *,long);
36+
void die_addr(const char *str, struct pt_regs *regs, long err, long gp_addr);
3637
extern int __must_check __die(const char *, struct pt_regs *, long);
3738
extern void show_stack_regs(struct pt_regs *regs);
3839
extern void __show_regs(struct pt_regs *regs, enum show_regs_mode);

arch/x86/kernel/dumpstack.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ void oops_end(unsigned long flags, struct pt_regs *regs, int signr)
365365
}
366366
NOKPROBE_SYMBOL(oops_end);
367367

368-
int __die(const char *str, struct pt_regs *regs, long err)
368+
static void __die_header(const char *str, struct pt_regs *regs, long err)
369369
{
370370
const char *pr = "";
371371

@@ -384,7 +384,11 @@ int __die(const char *str, struct pt_regs *regs, long err)
384384
IS_ENABLED(CONFIG_KASAN) ? " KASAN" : "",
385385
IS_ENABLED(CONFIG_PAGE_TABLE_ISOLATION) ?
386386
(boot_cpu_has(X86_FEATURE_PTI) ? " PTI" : " NOPTI") : "");
387+
}
388+
NOKPROBE_SYMBOL(__die_header);
387389

390+
static int __die_body(const char *str, struct pt_regs *regs, long err)
391+
{
388392
show_regs(regs);
389393
print_modules();
390394

@@ -394,6 +398,13 @@ int __die(const char *str, struct pt_regs *regs, long err)
394398

395399
return 0;
396400
}
401+
NOKPROBE_SYMBOL(__die_body);
402+
403+
int __die(const char *str, struct pt_regs *regs, long err)
404+
{
405+
__die_header(str, regs, err);
406+
return __die_body(str, regs, err);
407+
}
397408
NOKPROBE_SYMBOL(__die);
398409

399410
/*
@@ -410,6 +421,17 @@ void die(const char *str, struct pt_regs *regs, long err)
410421
oops_end(flags, regs, sig);
411422
}
412423

424+
void die_addr(const char *str, struct pt_regs *regs, long err, long gp_addr)
425+
{
426+
unsigned long flags = oops_begin();
427+
int sig = SIGSEGV;
428+
429+
__die_header(str, regs, err);
430+
if (__die_body(str, regs, err))
431+
sig = 0;
432+
oops_end(flags, regs, sig);
433+
}
434+
413435
void show_regs(struct pt_regs *regs)
414436
{
415437
show_regs_print_info(KERN_DEFAULT);

arch/x86/kernel/traps.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,14 @@ dotraplinkage void do_general_protection(struct pt_regs *regs, long error_code)
619619
"maybe for address",
620620
gp_addr);
621621

622-
die(desc, regs, error_code);
622+
/*
623+
* KASAN is interested only in the non-canonical case, clear it
624+
* otherwise.
625+
*/
626+
if (hint != GP_NON_CANONICAL)
627+
gp_addr = 0;
628+
629+
die_addr(desc, regs, error_code, gp_addr);
623630
return;
624631
}
625632

0 commit comments

Comments
 (0)