Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0dafcbe1 authored by Johannes Berg's avatar Johannes Berg Committed by Richard Weinberger
Browse files

um: Implement TRACE_IRQFLAGS_SUPPORT



UML enables TRACE_IRQFLAGS_SUPPORT but doesn't actually implement
it. It seems to have been added for lockdep support, but that can't
actually really work well without IRQ flags tracing, as is also
very noisily reported when enabling CONFIG_DEBUG_LOCKDEP.

Implement it now.

Fixes: 711553ef ("[PATCH] uml: declare in Kconfig our partial LOCKDEP support")
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 276d75c4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ extern void longjmp(jmp_buf, int);
	enable = get_signals(); \
	n = setjmp(*buf); \
	if(n != 0) \
		set_signals(enable); \
		set_signals_trace(enable); \
	n; })

#endif
+7 −0
Original line number Diff line number Diff line
@@ -232,6 +232,7 @@ extern void block_signals(void);
extern void unblock_signals(void);
extern int get_signals(void);
extern int set_signals(int enable);
extern int set_signals_trace(int enable);
extern int os_is_signal_stack(void);
extern void deliver_alarm(void);

@@ -317,4 +318,10 @@ extern unsigned long os_get_top_address(void);

long syscall(long number, ...);

/* irqflags tracing */
extern void block_signals_trace(void);
extern void unblock_signals_trace(void);
extern void um_trace_signals_on(void);
extern void um_trace_signals_off(void);

#endif
+28 −0
Original line number Diff line number Diff line
@@ -6,15 +6,43 @@
#include <linux/module.h>
#include <linux/ptrace.h>
#include <linux/sched.h>
#include <linux/ftrace.h>
#include <asm/siginfo.h>
#include <asm/signal.h>
#include <asm/unistd.h>
#include <frame_kern.h>
#include <kern_util.h>
#include <os.h>

EXPORT_SYMBOL(block_signals);
EXPORT_SYMBOL(unblock_signals);

void block_signals_trace(void)
{
	block_signals();
	if (current_thread_info())
		trace_hardirqs_off();
}

void unblock_signals_trace(void)
{
	if (current_thread_info())
		trace_hardirqs_on();
	unblock_signals();
}

void um_trace_signals_on(void)
{
	if (current_thread_info())
		trace_hardirqs_on();
}

void um_trace_signals_off(void)
{
	if (current_thread_info())
		trace_hardirqs_off();
}

/*
 * OK, we're invoking a handler
 */
+2 −2
Original line number Diff line number Diff line
@@ -63,12 +63,12 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm)
	if (current->mm != NULL && current->mm != &init_mm)
		from_mm = &current->mm->context;

	block_signals();
	block_signals_trace();
	if (from_mm)
		to_mm->id.u.pid = copy_context_skas0(stack,
						     from_mm->id.u.pid);
	else to_mm->id.u.pid = start_userspace(stack);
	unblock_signals();
	unblock_signals_trace();

	if (to_mm->id.u.pid < 0) {
		ret = to_mm->id.u.pid;
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ static int __init start_kernel_proc(void *unused)
{
	int pid;

	block_signals();
	block_signals_trace();
	pid = os_getpid();

	cpu_tasks[0].pid = pid;
Loading