2019-08-25 10:49:19 +01:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
[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>
2005-07-07 17:56:50 -07:00
|
|
|
/*
|
2015-11-02 16:16:37 +00:00
|
|
|
|
|
|
|
* Copyright (C) 2015 Thomas Meyer (thomas@m3y3r.de)
|
[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>
2005-07-07 17:56:50 -07:00
|
|
|
* Copyright (C) 2005 Jeff Dike (jdike@karaya.com)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __STUB_DATA_H
|
|
|
|
#define __STUB_DATA_H
|
|
|
|
|
2024-07-03 15:45:26 +02:00
|
|
|
#include <linux/compiler_types.h>
|
|
|
|
#include <as-layout.h>
|
2024-07-03 15:45:28 +02:00
|
|
|
#include <sysdep/tls.h>
|
|
|
|
|
2024-09-19 14:45:03 +02:00
|
|
|
struct stub_init_data {
|
|
|
|
unsigned long stub_start;
|
|
|
|
|
|
|
|
int stub_code_fd;
|
|
|
|
unsigned long stub_code_offset;
|
|
|
|
int stub_data_fd;
|
|
|
|
unsigned long stub_data_offset;
|
|
|
|
|
|
|
|
unsigned long segv_handler;
|
|
|
|
};
|
|
|
|
|
2024-07-03 15:45:28 +02:00
|
|
|
#define STUB_NEXT_SYSCALL(s) \
|
|
|
|
((struct stub_syscall *) (((unsigned long) s) + (s)->cmd_len))
|
|
|
|
|
|
|
|
enum stub_syscall_type {
|
|
|
|
STUB_SYSCALL_UNSET = 0,
|
|
|
|
STUB_SYSCALL_MMAP,
|
|
|
|
STUB_SYSCALL_MUNMAP,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct stub_syscall {
|
2024-07-03 15:45:30 +02:00
|
|
|
struct {
|
|
|
|
unsigned long addr;
|
|
|
|
unsigned long length;
|
|
|
|
unsigned long offset;
|
|
|
|
int fd;
|
|
|
|
int prot;
|
|
|
|
} mem;
|
2024-07-03 15:45:28 +02:00
|
|
|
|
|
|
|
enum stub_syscall_type syscall;
|
|
|
|
};
|
2024-07-03 15:45:26 +02:00
|
|
|
|
[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>
2005-07-07 17:56:50 -07:00
|
|
|
struct stub_data {
|
2015-11-02 16:16:37 +00:00
|
|
|
unsigned long offset;
|
2024-07-03 15:45:28 +02:00
|
|
|
long err, child_err;
|
2024-07-03 15:45:26 +02:00
|
|
|
|
2024-07-03 15:45:28 +02:00
|
|
|
int syscall_data_len;
|
2024-07-03 15:45:26 +02:00
|
|
|
/* 128 leaves enough room for additional fields in the struct */
|
2024-07-03 15:45:28 +02:00
|
|
|
struct stub_syscall syscall_data[(UM_KERN_PAGE_SIZE - 128) / sizeof(struct stub_syscall)] __aligned(16);
|
2024-07-03 15:45:26 +02:00
|
|
|
|
|
|
|
/* Stack for our signal handlers and for calling into . */
|
|
|
|
unsigned char sigstack[UM_KERN_PAGE_SIZE] __aligned(UM_KERN_PAGE_SIZE);
|
[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>
2005-07-07 17:56:50 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|