Commit 53c25878 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

uml: redo host capability detection and disabling

Redo how host capabilities are recorded at startup and disabled on the
command line.

There are now explicit variables saying what's been disabled by the
command line rather than the implicitness of the have_* variable being
zero.  The capability variables now start at zero and are set to one
as their capabilities are found to be present on the host.
Signed-off-by: default avatarJeff Dike <jdike@linux.intel.com>
Cc: WANG Cong <xiyou.wangcong@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c714a534
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "mem_user.h" #include "mem_user.h"
#include "ptrace_user.h" #include "ptrace_user.h"
#include "registers.h" #include "registers.h"
#include "skas.h"
#include "skas_ptrace.h" #include "skas_ptrace.h"
static void ptrace_child(void) static void ptrace_child(void)
...@@ -140,14 +141,27 @@ static int stop_ptraced_child(int pid, int exitcode, int mustexit) ...@@ -140,14 +141,27 @@ static int stop_ptraced_child(int pid, int exitcode, int mustexit)
} }
/* Changed only during early boot */ /* Changed only during early boot */
int ptrace_faultinfo = 1; int ptrace_faultinfo;
int ptrace_ldt = 1; static int disable_ptrace_faultinfo;
int proc_mm = 1;
int skas_needs_stub = 0; int ptrace_ldt;
static int disable_ptrace_ldt;
int proc_mm;
static int disable_proc_mm;
int have_switch_mm;
static int disable_switch_mm;
int skas_needs_stub;
static int __init skas0_cmd_param(char *str, int* add) static int __init skas0_cmd_param(char *str, int* add)
{ {
ptrace_faultinfo = proc_mm = 0; disable_ptrace_faultinfo = 1;
disable_ptrace_ldt = 1;
disable_proc_mm = 1;
disable_switch_mm = 1;
return 0; return 0;
} }
...@@ -157,15 +171,12 @@ static int __init mode_skas0_cmd_param(char *str, int* add) ...@@ -157,15 +171,12 @@ static int __init mode_skas0_cmd_param(char *str, int* add)
__attribute__((alias("skas0_cmd_param"))); __attribute__((alias("skas0_cmd_param")));
__uml_setup("skas0", skas0_cmd_param, __uml_setup("skas0", skas0_cmd_param,
"skas0\n" "skas0\n"
" Disables SKAS3 usage, so that SKAS0 is used, unless \n" " Disables SKAS3 and SKAS4 usage, so that SKAS0 is used\n\n");
" you specify mode=tt.\n\n");
__uml_setup("mode=skas0", mode_skas0_cmd_param, __uml_setup("mode=skas0", mode_skas0_cmd_param,
"mode=skas0\n" "mode=skas0\n"
" Disables SKAS3 usage, so that SKAS0 is used, unless you \n" " Disables SKAS3 and SKAS4 usage, so that SKAS0 is used.\n\n");
" specify mode=tt. Note that this was recently added - on \n"
" older kernels you must use simply \"skas0\".\n\n");
/* Changed only during early boot */ /* Changed only during early boot */
static int force_sysemu_disabled = 0; static int force_sysemu_disabled = 0;
...@@ -360,7 +371,7 @@ void __init os_early_checks(void) ...@@ -360,7 +371,7 @@ void __init os_early_checks(void)
static int __init noprocmm_cmd_param(char *str, int* add) static int __init noprocmm_cmd_param(char *str, int* add)
{ {
proc_mm = 0; disable_proc_mm = 1;
return 0; return 0;
} }
...@@ -372,7 +383,7 @@ __uml_setup("noprocmm", noprocmm_cmd_param, ...@@ -372,7 +383,7 @@ __uml_setup("noprocmm", noprocmm_cmd_param,
static int __init noptracefaultinfo_cmd_param(char *str, int* add) static int __init noptracefaultinfo_cmd_param(char *str, int* add)
{ {
ptrace_faultinfo = 0; disable_ptrace_faultinfo = 1;
return 0; return 0;
} }
...@@ -384,7 +395,7 @@ __uml_setup("noptracefaultinfo", noptracefaultinfo_cmd_param, ...@@ -384,7 +395,7 @@ __uml_setup("noptracefaultinfo", noptracefaultinfo_cmd_param,
static int __init noptraceldt_cmd_param(char *str, int* add) static int __init noptraceldt_cmd_param(char *str, int* add)
{ {
ptrace_ldt = 0; disable_ptrace_ldt = 1;
return 0; return 0;
} }
...@@ -404,16 +415,14 @@ static inline void check_skas3_ptrace_faultinfo(void) ...@@ -404,16 +415,14 @@ static inline void check_skas3_ptrace_faultinfo(void)
n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi);
if (n < 0) { if (n < 0) {
ptrace_faultinfo = 0;
if (errno == EIO) if (errno == EIO)
non_fatal("not found\n"); non_fatal("not found\n");
else else
perror("not found"); perror("not found");
} } else if (disable_ptrace_faultinfo)
else {
if (!ptrace_faultinfo)
non_fatal("found but disabled on command line\n"); non_fatal("found but disabled on command line\n");
else else {
ptrace_faultinfo = 1;
non_fatal("found\n"); non_fatal("found\n");
} }
...@@ -437,38 +446,30 @@ static inline void check_skas3_ptrace_ldt(void) ...@@ -437,38 +446,30 @@ static inline void check_skas3_ptrace_ldt(void)
if (n < 0) { if (n < 0) {
if (errno == EIO) if (errno == EIO)
non_fatal("not found\n"); non_fatal("not found\n");
else { else
perror("not found"); perror("not found");
} } else if (disable_ptrace_ldt)
ptrace_ldt = 0; non_fatal("found, but use is disabled\n");
}
else { else {
if (ptrace_ldt) ptrace_ldt = 1;
non_fatal("found\n"); non_fatal("found\n");
else
non_fatal("found, but use is disabled\n");
} }
stop_ptraced_child(pid, 1, 1); stop_ptraced_child(pid, 1, 1);
#else
/* PTRACE_LDT might be disabled via cmdline option.
* We want to override this, else we might use the stub
* without real need
*/
ptrace_ldt = 1;
#endif #endif
} }
static inline void check_skas3_proc_mm(void) static inline void check_skas3_proc_mm(void)
{ {
non_fatal(" - /proc/mm..."); non_fatal(" - /proc/mm...");
if (access("/proc/mm", W_OK) < 0) { if (access("/proc/mm", W_OK) < 0)
proc_mm = 0;
perror("not found"); perror("not found");
} else if (disable_proc_mm)
else if (!proc_mm)
non_fatal("found but disabled on command line\n"); non_fatal("found but disabled on command line\n");
else non_fatal("found\n"); else {
proc_mm = 1;
non_fatal("found\n");
}
} }
void can_do_skas(void) void can_do_skas(void)
......
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