From d65987a88dc8b182ef933edf93c23cf4233dd8d5 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 7 May 2012 14:21:02 +0200 Subject: microblaze: ftrace: Pass the first calling instruction for dynamic ftrace Selftest for dynamic ftrace requres to pass address of the first calling instruction because hash function is calculated from it. ftrace_update_ftrace_func setups pointer to function which is called in _mcount function. trace_selftest is not aware about instruction size (for microblaze 8 - imm and addik) and that's why we have to pass in r5 address of imm not addik which is in r15.12 For more info look at ftrace_ops_list_func/ftrace.c. Signed-off-by: Michal Simek --- arch/microblaze/kernel/mcount.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arch/microblaze/kernel') diff --git a/arch/microblaze/kernel/mcount.S b/arch/microblaze/kernel/mcount.S index e7eaa7a8cbd3..fc1e1322ce4c 100644 --- a/arch/microblaze/kernel/mcount.S +++ b/arch/microblaze/kernel/mcount.S @@ -138,7 +138,7 @@ NOALIGN_ENTRY(ftrace_call) #endif /* CONFIG_DYNAMIC_FTRACE */ /* static normal trace */ lwi r6, r1, 120; /* MS: load parent addr */ - addik r5, r15, 0; /* MS: load current function addr */ + addik r5, r15, -4; /* MS: load current function addr */ /* MS: here is dependency on previous code */ brald r15, r20; /* MS: jump to ftrace handler */ nop; -- cgit v1.2.3 From 8d95e1224afa22e7881fc823849342b5602d736e Mon Sep 17 00:00:00 2001 From: "Edgar E. Iglesias" Date: Fri, 24 Feb 2012 14:52:26 +1000 Subject: microblaze: Add TLS support to sys_clone Formerly unused Args 4/5 now load parent tid / child tid so the brid to do_fork can pick up TLS from r10. Arg 3 still unused There is also necessary to fix old glibc which do not setup r9/r10 (arg 4/5). Simple clearing them is fine. Signed-off-by: Edgar E. Iglesias Signed-off-by: David Holsgrove Signed-off-by: Michal Simek --- arch/microblaze/kernel/entry.S | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'arch/microblaze/kernel') diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 66e34a3bfe1b..288678c5fea6 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S @@ -493,10 +493,11 @@ C_ENTRY(sys_clone): bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */ 1: addik r7, r1, 0; /* Arg 2: parent context */ - add r8, r0, r0; /* Arg 3: (unused) */ - add r9, r0, r0; /* Arg 4: (unused) */ + lwi r9, r1, PT_R8; /* parent tid. */ + lwi r10, r1, PT_R9; /* child tid. */ + /* do_fork will pick up TLS from regs->r10. */ brid do_fork /* Do real work (tail-call) */ - add r10, r0, r0; /* Arg 5: (unused) */ + add r8, r0, r0; /* Arg 3: (unused) */ C_ENTRY(sys_execve): brid microblaze_execve; /* Do real work (tail-call).*/ -- cgit v1.2.3 From d5c15f17844b8883bc13b61a8ae114f0d3d59cdd Mon Sep 17 00:00:00 2001 From: "Edgar E. Iglesias" Date: Fri, 24 Feb 2012 14:52:25 +1000 Subject: microblaze: Setup correct pointer to TLS area Setup a pointer to the TLS area in copy_thread. r10 is 6th argumetn which contains TLS area. And r21 is the thread reg. Signed-off-by: Edgar E. Iglesias Signed-off-by: David Holsgrove Signed-off-by: Michal Simek --- arch/microblaze/kernel/process.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'arch/microblaze/kernel') diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c index 883b92789cdf..1944e00f07e1 100644 --- a/arch/microblaze/kernel/process.c +++ b/arch/microblaze/kernel/process.c @@ -182,8 +182,12 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, #endif ti->cpu_context.r15 = (unsigned long)ret_from_fork - 8; + /* + * r21 is the thread reg, r10 is 6th arg to clone + * which contains TLS area + */ if (clone_flags & CLONE_SETTLS) - ; + childregs->r21 = childregs->r10; return 0; } -- cgit v1.2.3