Commit bd91774e authored by Daniel Jacobowitz's avatar Daniel Jacobowitz

Merge to kernel.org

parents c7c1b99b dafe281e
...@@ -22,6 +22,7 @@ void foo(void) ...@@ -22,6 +22,7 @@ void foo(void)
BLANK(); BLANK();
DEFINE(PT_PTRACED, PT_PTRACED); DEFINE(PT_PTRACED, PT_PTRACED);
DEFINE(CLONE_VM, CLONE_VM); DEFINE(CLONE_VM, CLONE_VM);
DEFINE(CLONE_UNTRACED, CLONE_UNTRACED);
DEFINE(SIGCHLD, SIGCHLD); DEFINE(SIGCHLD, SIGCHLD);
BLANK(); BLANK();
DEFINE(HAE_CACHE, offsetof(struct alpha_machine_vector, hae_cache)); DEFINE(HAE_CACHE, offsetof(struct alpha_machine_vector, hae_cache));
......
...@@ -212,7 +212,7 @@ kernel_thread: ...@@ -212,7 +212,7 @@ kernel_thread:
stq $2, 152($30) /* HAE */ stq $2, 152($30) /* HAE */
/* Shuffle FLAGS to the front; add CLONE_VM. */ /* Shuffle FLAGS to the front; add CLONE_VM. */
ldi $1, CLONE_VM ldi $1, CLONE_VM|CLONE_UNTRACED
or $18, $1, $16 or $18, $1, $16
bsr $26, sys_clone bsr $26, sys_clone
......
...@@ -403,7 +403,7 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) ...@@ -403,7 +403,7 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
b sys_exit \n\ b sys_exit \n\
1: " 1: "
: "=r" (__ret) : "=r" (__ret)
: "Ir" (flags), "I" (CLONE_VM), "r" (fn), "r" (arg) : "Ir" (flags), "r" (CLONE_VM | CLONE_UNTRACED), "r" (fn), "r" (arg)
: "r0", "r1", "lr"); : "r0", "r1", "lr");
return __ret; return __ret;
} }
......
...@@ -748,6 +748,7 @@ kernel_thread: ...@@ -748,6 +748,7 @@ kernel_thread:
/* r11 is argument 2 to clone, the flags */ /* r11 is argument 2 to clone, the flags */
move.d $r12, $r11 move.d $r12, $r11
or.w LCLONE_VM, $r11 or.w LCLONE_VM, $r11
or.w LCLONE_UNTRACED, $r11
/* Save FN for later. */ /* Save FN for later. */
move.d $r10, $r12 move.d $r10, $r12
......
...@@ -57,5 +57,6 @@ OF (LTHREAD_DCCR, struct thread_struct, dccr) ...@@ -57,5 +57,6 @@ OF (LTHREAD_DCCR, struct thread_struct, dccr)
/* linux/sched.h values - doesn't have an #ifdef __ASSEMBLY__ for these. */ /* linux/sched.h values - doesn't have an #ifdef __ASSEMBLY__ for these. */
VAL (LCLONE_VM, CLONE_VM) VAL (LCLONE_VM, CLONE_VM)
VAL (LCLONE_UNTRACED, CLONE_UNTRACED)
__asm__ (".endif"); __asm__ (".endif");
...@@ -224,7 +224,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ...@@ -224,7 +224,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
regs.eflags = 0x286; regs.eflags = 0x286;
/* Ok, create the new process.. */ /* Ok, create the new process.. */
p = do_fork(flags | CLONE_VM, 0, &regs, 0, NULL); p = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL);
return IS_ERR(p) ? PTR_ERR(p) : p->pid; return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
......
...@@ -514,7 +514,7 @@ kernel_thread (int (*fn)(void *), void *arg, unsigned long flags) ...@@ -514,7 +514,7 @@ kernel_thread (int (*fn)(void *), void *arg, unsigned long flags)
struct task_struct *parent = current; struct task_struct *parent = current;
int result, tid; int result, tid;
tid = clone(flags | CLONE_VM, 0); tid = clone(flags | CLONE_VM | CLONE_UNTRACED, 0);
if (parent != current) { if (parent != current) {
result = (*fn)(arg); result = (*fn)(arg);
_exit(result); _exit(result);
......
...@@ -152,7 +152,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ...@@ -152,7 +152,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{ {
register long retval __asm__ ("d0"); register long retval __asm__ ("d0");
register long clone_arg __asm__ ("d1") = flags | CLONE_VM; register long clone_arg __asm__ ("d1") = flags | CLONE_VM | CLONE_UNTRACED;
retval = __NR_clone; retval = __NR_clone;
__asm__ __volatile__ __asm__ __volatile__
......
...@@ -176,7 +176,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ...@@ -176,7 +176,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
:"=r" (retval) :"=r" (retval)
:"i" (__NR_clone), "i" (__NR_exit), :"i" (__NR_clone), "i" (__NR_exit),
"r" (arg), "r" (fn), "r" (arg), "r" (fn),
"r" (flags | CLONE_VM) "r" (flags | CLONE_VM | CLONE_UNTRACED)
/* /*
* The called subroutine might have destroyed any of the * The called subroutine might have destroyed any of the
* at, result, argument or temporary registers ... * at, result, argument or temporary registers ...
......
...@@ -167,7 +167,7 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) ...@@ -167,7 +167,7 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
"1:\tmove\t%0, $2" "1:\tmove\t%0, $2"
:"=r" (retval) :"=r" (retval)
:"i" (__NR_clone), "i" (__NR_exit), "r" (arg), "r" (fn), :"i" (__NR_clone), "i" (__NR_exit), "r" (arg), "r" (fn),
"r" (flags | CLONE_VM) "r" (flags | CLONE_VM | CLONE_UNTRACED)
/* The called subroutine might have destroyed any of the /* The called subroutine might have destroyed any of the
* at, result, argument or temporary registers ... */ * at, result, argument or temporary registers ... */
......
...@@ -482,6 +482,7 @@ fault_vector_11: ...@@ -482,6 +482,7 @@ fault_vector_11:
*/ */
#define CLONE_VM 0x100 /* Must agree with <linux/sched.h> */ #define CLONE_VM 0x100 /* Must agree with <linux/sched.h> */
#define CLONE_UNTRACED 0x00800000
.export __kernel_thread, code .export __kernel_thread, code
.import do_fork .import do_fork
...@@ -497,7 +498,8 @@ __kernel_thread: ...@@ -497,7 +498,8 @@ __kernel_thread:
#endif #endif
STREG %r26, PT_GR26(%r1) /* Store function & argument for child */ STREG %r26, PT_GR26(%r1) /* Store function & argument for child */
STREG %r25, PT_GR25(%r1) STREG %r25, PT_GR25(%r1)
ldo CLONE_VM(%r0), %r26 /* Force CLONE_VM since only init_mm */ ldil L%CLONE_UNTRACED, %r26
ldo CLONE_VM(%r26), %r26 /* Force CLONE_VM since only init_mm */
or %r26, %r24, %r26 /* will have kernel mappings. */ or %r26, %r24, %r26 /* will have kernel mappings. */
copy %r0, %r25 copy %r0, %r25
bl do_fork_FIXME_NOW_RETURNS_TASK_STRUCT, %r2 bl do_fork_FIXME_NOW_RETURNS_TASK_STRUCT, %r2
......
...@@ -1005,6 +1005,7 @@ _GLOBAL(kernel_thread) ...@@ -1005,6 +1005,7 @@ _GLOBAL(kernel_thread)
mr r30,r3 /* function */ mr r30,r3 /* function */
mr r31,r4 /* argument */ mr r31,r4 /* argument */
ori r3,r5,CLONE_VM /* flags */ ori r3,r5,CLONE_VM /* flags */
oris r3,r3,CLONE_UNTRACED>>16
li r0,__NR_clone li r0,__NR_clone
sc sc
cmpi 0,r3,0 /* parent or child? */ cmpi 0,r3,0 /* parent or child? */
......
...@@ -157,6 +157,7 @@ int main(void) ...@@ -157,6 +157,7 @@ int main(void)
DEFINE(_SRR1, STACK_FRAME_OVERHEAD+sizeof(struct pt_regs)+8); DEFINE(_SRR1, STACK_FRAME_OVERHEAD+sizeof(struct pt_regs)+8);
DEFINE(CLONE_VM, CLONE_VM); DEFINE(CLONE_VM, CLONE_VM);
DEFINE(CLONE_UNTRACED, CLONE_UNTRACED);
return 0; return 0;
} }
...@@ -486,6 +486,7 @@ _GLOBAL(kernel_thread) ...@@ -486,6 +486,7 @@ _GLOBAL(kernel_thread)
/* XXX fix this when we optimise syscall entry to not save volatiles */ /* XXX fix this when we optimise syscall entry to not save volatiles */
mr r6,r3 /* function */ mr r6,r3 /* function */
ori r3,r5,CLONE_VM /* flags */ ori r3,r5,CLONE_VM /* flags */
oris r3,r3,(CLONE_UNTRACED>>16)
li r0,__NR_clone li r0,__NR_clone
sc sc
cmpi 0,r3,0 /* parent or child? */ cmpi 0,r3,0 /* parent or child? */
......
...@@ -146,7 +146,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ...@@ -146,7 +146,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
regs.orig_gpr2 = -1; regs.orig_gpr2 = -1;
/* Ok, create the new process.. */ /* Ok, create the new process.. */
p = do_fork(flags | CLONE_VM, 0, &regs, 0, NULL); p = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL);
return IS_ERR(p) ? PTR_ERR(p) : p->pid; return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
......
...@@ -143,7 +143,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ...@@ -143,7 +143,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
regs.orig_gpr2 = -1; regs.orig_gpr2 = -1;
/* Ok, create the new process.. */ /* Ok, create the new process.. */
p = do_fork(flags | CLONE_VM, 0, &regs, 0, NULL); p = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL);
return IS_ERR(p) ? PTR_ERR(p) : p->pid; return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
......
...@@ -120,7 +120,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ...@@ -120,7 +120,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{ /* Don't use this in BL=1(cli). Or else, CPU resets! */ { /* Don't use this in BL=1(cli). Or else, CPU resets! */
register unsigned long __sc0 __asm__ ("r0"); register unsigned long __sc0 __asm__ ("r0");
register unsigned long __sc3 __asm__ ("r3") = __NR_clone; register unsigned long __sc3 __asm__ ("r3") = __NR_clone;
register unsigned long __sc4 __asm__ ("r4") = (long) flags | CLONE_VM; register unsigned long __sc4 __asm__ ("r4") = (long) flags | CLONE_VM | CLONE_UNTRACED;
register unsigned long __sc5 __asm__ ("r5") = 0; register unsigned long __sc5 __asm__ ("r5") = 0;
register unsigned long __sc8 __asm__ ("r8") = (long) arg; register unsigned long __sc8 __asm__ ("r8") = (long) arg;
register unsigned long __sc9 __asm__ ("r9") = (long) fn; register unsigned long __sc9 __asm__ ("r9") = (long) fn;
......
...@@ -726,7 +726,7 @@ pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ...@@ -726,7 +726,7 @@ pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
/* Notreached by child. */ /* Notreached by child. */
"1: mov %%o0, %0\n\t" : "1: mov %%o0, %0\n\t" :
"=r" (retval) : "=r" (retval) :
"i" (__NR_clone), "r" (flags | CLONE_VM), "i" (__NR_clone), "r" (flags | CLONE_VM | CLONE_UNTRACED),
"i" (__NR_exit), "r" (fn), "r" (arg) : "i" (__NR_exit), "r" (fn), "r" (arg) :
"g1", "g2", "g3", "o0", "o1", "memory", "cc"); "g1", "g2", "g3", "o0", "o1", "memory", "cc");
return retval; return retval;
......
...@@ -694,7 +694,7 @@ pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ...@@ -694,7 +694,7 @@ pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
/* Notreached by child. */ /* Notreached by child. */
"1:" : "1:" :
"=r" (retval) : "=r" (retval) :
"i" (__NR_clone), "r" (flags | CLONE_VM), "i" (__NR_clone), "r" (flags | CLONE_VM | CLONE_UNTRACED),
"i" (__NR_exit), "r" (fn), "r" (arg) : "i" (__NR_exit), "r" (fn), "r" (arg) :
"g1", "g2", "g3", "o0", "o1", "memory", "cc"); "g1", "g2", "g3", "o0", "o1", "memory", "cc");
return retval; return retval;
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
asmlinkage extern void ret_from_fork(void); asmlinkage extern void ret_from_fork(void);
int sys_arch_prctl(int code, unsigned long addr); int sys_arch_prctl(int code, unsigned long addr);
unsigned long kernel_thread_flags = CLONE_VM; unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;
int hlt_counter; int hlt_counter;
......
...@@ -51,6 +51,7 @@ struct exec_domain; ...@@ -51,6 +51,7 @@ struct exec_domain;
#define CLONE_SETTID 0x00100000 /* write the TID back to userspace */ #define CLONE_SETTID 0x00100000 /* write the TID back to userspace */
#define CLONE_CLEARTID 0x00200000 /* clear the userspace TID */ #define CLONE_CLEARTID 0x00200000 /* clear the userspace TID */
#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */ #define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
/* /*
* List of flags we want to share for kernel threads, * List of flags we want to share for kernel threads,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment