-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[PATCH] uml: Proper clone support for skas0
This patch implements the clone-stub mechanism, which allows skas0 to run with proc_mm==0, even if the clib in UML uses modify_ldt. Note: There is a bug in skas3.v7 host patch, that avoids UML-skas from running properly on a SMP-box. In full skas3, I never really saw problems, but in skas0 they showed up. More commentary by jdike - What this patch does is makes sure that the host parent of each new host process matches the UML parent of the corresponding UML process. This ensures that any changed LDTs are inherited. This is done by having clone actually called by the UML process from its stub, rather than by the kernel. We have special syscall stubs that are loaded onto the stub code page because that code must be completely self-contained. These stubs are given C interfaces, and used like normal C functions, but there are subtleties. Principally, we have to be careful about stack variables in stub_clone_handler after the clone. The code is written so that there aren't any - everything boils down to a fixed address. If there were any locals, references to them after the clone would be wrong because the stack just changed. Signed-off-by: Bodo Stroesser <bstroesser@fujitsu-siemens.com> Signed-off-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
- Loading branch information
Bodo Stroesser
authored and
Linus Torvalds
committed
Jul 8, 2005
1 parent
d67b569
commit 9786a8f
Showing
10 changed files
with
231 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
#include <sched.h> | ||
#include <signal.h> | ||
#include <sys/mman.h> | ||
#include <sys/time.h> | ||
#include <asm/unistd.h> | ||
#include <asm/page.h> | ||
#include "ptrace_user.h" | ||
#include "skas.h" | ||
#include "stub-data.h" | ||
#include "uml-config.h" | ||
#include "sysdep/stub.h" | ||
|
||
/* This is in a separate file because it needs to be compiled with any | ||
* extraneous gcc flags (-pg, -fprofile-arcs, -ftest-coverage) disabled | ||
*/ | ||
void __attribute__ ((__section__ (".__syscall_stub"))) | ||
stub_clone_handler(void) | ||
{ | ||
long err; | ||
struct stub_data *from = (struct stub_data *) UML_CONFIG_STUB_DATA; | ||
|
||
err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD, | ||
UML_CONFIG_STUB_DATA + PAGE_SIZE / 2 - | ||
sizeof(void *)); | ||
if(err != 0) | ||
goto out; | ||
|
||
err = stub_syscall4(__NR_ptrace, PTRACE_TRACEME, 0, 0, 0); | ||
if(err) | ||
goto out; | ||
|
||
err = stub_syscall3(__NR_setitimer, ITIMER_VIRTUAL, | ||
(long) &from->timer, 0); | ||
if(err) | ||
goto out; | ||
|
||
err = stub_syscall6(STUB_MMAP_NR, UML_CONFIG_STUB_DATA, PAGE_SIZE, | ||
PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, | ||
from->fd, from->offset); | ||
out: | ||
/* save current result. Parent: pid; child: retcode of mmap */ | ||
from->err = err; | ||
trap_myself(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/* | ||
* Copyright (C) 2005 Jeff Dike (jdike@karaya.com) | ||
* Licensed under the GPL | ||
*/ | ||
|
||
#ifndef __STUB_DATA_H | ||
#define __STUB_DATA_H | ||
|
||
#include <sys/time.h> | ||
|
||
struct stub_data { | ||
long offset; | ||
int fd; | ||
struct itimerval timer; | ||
long err; | ||
}; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters