Commit 60b04df6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 fixes from Vasily Gorbik:

 - Fix unwinding from irq context of interrupted user process.

 - Add purgatory build missing symbols check. That helped to uncover and
   fix missing symbols when built with kasan support enabled.

 - Couple of ftrace fixes. Avoid broken stack trace and fix recursion
   loop in function_graph tracer.

* tag 's390-5.5-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/ftrace: save traced function caller
  s390/unwind: stop gracefully at user mode pt_regs in irq stack
  s390/purgatory: do not build purgatory with kcov, kasan and friends
  s390/purgatory: Make sure we fail the build if purgatory has missing symbols
  s390/ftrace: fix endless recursion in function_graph tracer
parents fd7a6d2b b4adfe55
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -194,9 +194,9 @@ static inline unsigned long long get_tod_clock_monotonic(void)
{
{
	unsigned long long tod;
	unsigned long long tod;


	preempt_disable();
	preempt_disable_notrace();
	tod = get_tod_clock() - *(unsigned long long *) &tod_clock_base[1];
	tod = get_tod_clock() - *(unsigned long long *) &tod_clock_base[1];
	preempt_enable();
	preempt_enable_notrace();
	return tod;
	return tod;
}
}


+1 −0
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@ EXPORT_SYMBOL(_mcount)
ENTRY(ftrace_caller)
ENTRY(ftrace_caller)
	.globl	ftrace_regs_caller
	.globl	ftrace_regs_caller
	.set	ftrace_regs_caller,ftrace_caller
	.set	ftrace_regs_caller,ftrace_caller
	stg	%r14,(__SF_GPRS+8*8)(%r15)	# save traced function caller
	lgr	%r1,%r15
	lgr	%r1,%r15
#if !(defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT))
#if !(defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT))
	aghi	%r0,MCOUNT_RETURN_FIXUP
	aghi	%r0,MCOUNT_RETURN_FIXUP
+11 −4
Original line number Original line Diff line number Diff line
@@ -36,10 +36,17 @@ static bool update_stack_info(struct unwind_state *state, unsigned long sp)
	return true;
	return true;
}
}


static inline bool is_task_pt_regs(struct unwind_state *state,
static inline bool is_final_pt_regs(struct unwind_state *state,
				    struct pt_regs *regs)
				    struct pt_regs *regs)
{
{
	return task_pt_regs(state->task) == regs;
	/* user mode or kernel thread pt_regs at the bottom of task stack */
	if (task_pt_regs(state->task) == regs)
		return true;

	/* user mode pt_regs at the bottom of irq stack */
	return state->stack_info.type == STACK_TYPE_IRQ &&
	       state->stack_info.end - sizeof(struct pt_regs) == (unsigned long)regs &&
	       READ_ONCE_NOCHECK(regs->psw.mask) & PSW_MASK_PSTATE;
}
}


bool unwind_next_frame(struct unwind_state *state)
bool unwind_next_frame(struct unwind_state *state)
@@ -80,7 +87,7 @@ bool unwind_next_frame(struct unwind_state *state)
			if (!on_stack(info, sp, sizeof(struct pt_regs)))
			if (!on_stack(info, sp, sizeof(struct pt_regs)))
				goto out_err;
				goto out_err;
			regs = (struct pt_regs *) sp;
			regs = (struct pt_regs *) sp;
			if (is_task_pt_regs(state, regs))
			if (is_final_pt_regs(state, regs))
				goto out_stop;
				goto out_stop;
			ip = READ_ONCE_NOCHECK(regs->psw.addr);
			ip = READ_ONCE_NOCHECK(regs->psw.addr);
			sp = READ_ONCE_NOCHECK(regs->gprs[15]);
			sp = READ_ONCE_NOCHECK(regs->gprs[15]);
+1 −0
Original line number Original line Diff line number Diff line
purgatory
purgatory
purgatory.chk
purgatory.lds
purgatory.lds
purgatory.ro
purgatory.ro
+14 −5
Original line number Original line Diff line number Diff line
@@ -4,7 +4,7 @@ OBJECT_FILES_NON_STANDARD := y


purgatory-y := head.o purgatory.o string.o sha256.o mem.o
purgatory-y := head.o purgatory.o string.o sha256.o mem.o


targets += $(purgatory-y) purgatory.lds purgatory purgatory.ro
targets += $(purgatory-y) purgatory.lds purgatory purgatory.chk purgatory.ro
PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y))
PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y))


$(obj)/sha256.o: $(srctree)/lib/crypto/sha256.c FORCE
$(obj)/sha256.o: $(srctree)/lib/crypto/sha256.c FORCE
@@ -15,8 +15,10 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTS
$(obj)/mem.o: $(srctree)/arch/s390/lib/mem.S FORCE
$(obj)/mem.o: $(srctree)/arch/s390/lib/mem.S FORCE
	$(call if_changed_rule,as_o_S)
	$(call if_changed_rule,as_o_S)


$(obj)/string.o: $(srctree)/arch/s390/lib/string.c FORCE
KCOV_INSTRUMENT := n
	$(call if_changed_rule,cc_o_c)
GCOV_PROFILE := n
UBSAN_SANITIZE := n
KASAN_SANITIZE := n


KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes
KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes
KBUILD_CFLAGS += -Wno-pointer-sign -Wno-sign-compare
KBUILD_CFLAGS += -Wno-pointer-sign -Wno-sign-compare
@@ -26,15 +28,22 @@ KBUILD_CFLAGS += $(CLANG_FLAGS)
KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
KBUILD_AFLAGS := $(filter-out -DCC_USING_EXPOLINE,$(KBUILD_AFLAGS))
KBUILD_AFLAGS := $(filter-out -DCC_USING_EXPOLINE,$(KBUILD_AFLAGS))


LDFLAGS_purgatory := -r --no-undefined -nostdlib -z nodefaultlib -T
# Since we link purgatory with -r unresolved symbols are not checked, so we
# also link a purgatory.chk binary without -r to check for unresolved symbols.
PURGATORY_LDFLAGS := -nostdlib -z nodefaultlib
LDFLAGS_purgatory := -r $(PURGATORY_LDFLAGS) -T
LDFLAGS_purgatory.chk := -e purgatory_start $(PURGATORY_LDFLAGS)
$(obj)/purgatory: $(obj)/purgatory.lds $(PURGATORY_OBJS) FORCE
$(obj)/purgatory: $(obj)/purgatory.lds $(PURGATORY_OBJS) FORCE
		$(call if_changed,ld)
		$(call if_changed,ld)


$(obj)/purgatory.chk: $(obj)/purgatory FORCE
		$(call if_changed,ld)

OBJCOPYFLAGS_purgatory.ro := -O elf64-s390
OBJCOPYFLAGS_purgatory.ro := -O elf64-s390
OBJCOPYFLAGS_purgatory.ro += --remove-section='*debug*'
OBJCOPYFLAGS_purgatory.ro += --remove-section='*debug*'
OBJCOPYFLAGS_purgatory.ro += --remove-section='.comment'
OBJCOPYFLAGS_purgatory.ro += --remove-section='.comment'
OBJCOPYFLAGS_purgatory.ro += --remove-section='.note.*'
OBJCOPYFLAGS_purgatory.ro += --remove-section='.note.*'
$(obj)/purgatory.ro: $(obj)/purgatory FORCE
$(obj)/purgatory.ro: $(obj)/purgatory $(obj)/purgatory.chk FORCE
		$(call if_changed,objcopy)
		$(call if_changed,objcopy)


$(obj)/kexec-purgatory.o: $(obj)/kexec-purgatory.S $(obj)/purgatory.ro FORCE
$(obj)/kexec-purgatory.o: $(obj)/kexec-purgatory.S $(obj)/purgatory.ro FORCE
Loading