aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/kernel/um_arch.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/kernel/um_arch.c')
-rw-r--r--arch/um/kernel/um_arch.c113
1 files changed, 4 insertions, 109 deletions
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c
index ecc458fe51b9..aa7b067565d9 100644
--- a/arch/um/kernel/um_arch.c
+++ b/arch/um/kernel/um_arch.c
@@ -38,9 +38,7 @@
38#include "choose-mode.h" 38#include "choose-mode.h"
39#include "mode_kern.h" 39#include "mode_kern.h"
40#include "mode.h" 40#include "mode.h"
41#ifdef UML_CONFIG_MODE_SKAS
42#include "skas.h" 41#include "skas.h"
43#endif
44 42
45#define DEFAULT_COMMAND_LINE "root=98:0" 43#define DEFAULT_COMMAND_LINE "root=98:0"
46 44
@@ -132,43 +130,12 @@ unsigned long end_vm;
132/* Set in uml_ncpus_setup */ 130/* Set in uml_ncpus_setup */
133int ncpus = 1; 131int ncpus = 1;
134 132
135#ifdef CONFIG_CMDLINE_ON_HOST
136/* Pointer set in linux_main, the array itself is private to each thread,
137 * and changed at address space creation time so this poses no concurrency
138 * problems.
139 */
140static char *argv1_begin = NULL;
141static char *argv1_end = NULL;
142#endif
143
144/* Set in early boot */ 133/* Set in early boot */
145static int have_root __initdata = 0; 134static int have_root __initdata = 0;
146 135
147/* Set in uml_mem_setup and modified in linux_main */ 136/* Set in uml_mem_setup and modified in linux_main */
148long long physmem_size = 32 * 1024 * 1024; 137long long physmem_size = 32 * 1024 * 1024;
149 138
150void set_cmdline(char *cmd)
151{
152#ifdef CONFIG_CMDLINE_ON_HOST
153 char *umid, *ptr;
154
155 if(CHOOSE_MODE(honeypot, 0)) return;
156
157 umid = get_umid();
158 if(*umid != '\0'){
159 snprintf(argv1_begin,
160 (argv1_end - argv1_begin) * sizeof(*ptr),
161 "(%s) ", umid);
162 ptr = &argv1_begin[strlen(argv1_begin)];
163 }
164 else ptr = argv1_begin;
165
166 snprintf(ptr, (argv1_end - ptr) * sizeof(*ptr), "[%s]", cmd);
167 memset(argv1_begin + strlen(argv1_begin), '\0',
168 argv1_end - argv1_begin - strlen(argv1_begin));
169#endif
170}
171
172static char *usage_string = 139static char *usage_string =
173"User Mode Linux v%s\n" 140"User Mode Linux v%s\n"
174" available at http://user-mode-linux.sourceforge.net/\n\n"; 141" available at http://user-mode-linux.sourceforge.net/\n\n";
@@ -201,13 +168,10 @@ __uml_setup("root=", uml_root_setup,
201" root=/dev/ubd5\n\n" 168" root=/dev/ubd5\n\n"
202); 169);
203 170
204#ifndef CONFIG_MODE_TT
205
206static int __init no_skas_debug_setup(char *line, int *add) 171static int __init no_skas_debug_setup(char *line, int *add)
207{ 172{
208 printf("'debug' is not necessary to gdb UML in skas mode - run \n"); 173 printf("'debug' is not necessary to gdb UML in skas mode - run \n");
209 printf("'gdb linux' and disable CONFIG_CMDLINE_ON_HOST if gdb \n"); 174 printf("'gdb linux'");
210 printf("doesn't work as expected\n");
211 175
212 return 0; 176 return 0;
213} 177}
@@ -217,8 +181,6 @@ __uml_setup("debug", no_skas_debug_setup,
217" this flag is not needed to run gdb on UML in skas mode\n\n" 181" this flag is not needed to run gdb on UML in skas mode\n\n"
218); 182);
219 183
220#endif
221
222#ifdef CONFIG_SMP 184#ifdef CONFIG_SMP
223static int __init uml_ncpus_setup(char *line, int *add) 185static int __init uml_ncpus_setup(char *line, int *add)
224{ 186{
@@ -236,52 +198,6 @@ __uml_setup("ncpus=", uml_ncpus_setup,
236); 198);
237#endif 199#endif
238 200
239static int force_tt = 0;
240
241#if defined(CONFIG_MODE_TT) && defined(CONFIG_MODE_SKAS)
242#define DEFAULT_TT 0
243
244static int __init mode_tt_setup(char *line, int *add)
245{
246 force_tt = 1;
247 return 0;
248}
249
250#else
251#ifdef CONFIG_MODE_SKAS
252
253#define DEFAULT_TT 0
254
255static int __init mode_tt_setup(char *line, int *add)
256{
257 printf("CONFIG_MODE_TT disabled - 'mode=tt' ignored\n");
258 return 0;
259}
260
261#else
262#ifdef CONFIG_MODE_TT
263
264#define DEFAULT_TT 1
265
266static int __init mode_tt_setup(char *line, int *add)
267{
268 printf("CONFIG_MODE_SKAS disabled - 'mode=tt' redundant\n");
269 return 0;
270}
271
272#endif
273#endif
274#endif
275
276__uml_setup("mode=tt", mode_tt_setup,
277"mode=tt\n"
278" When both CONFIG_MODE_TT and CONFIG_MODE_SKAS are enabled, this option\n"
279" forces UML to run in tt (tracing thread) mode. It is not the default\n"
280" because it's slower and less secure than skas mode.\n\n"
281);
282
283int mode_tt = DEFAULT_TT;
284
285static int __init Usage(char *line, int *add) 201static int __init Usage(char *line, int *add)
286{ 202{
287 const char **p; 203 const char **p;
@@ -357,29 +273,13 @@ int __init linux_main(int argc, char **argv)
357 add_arg(DEFAULT_COMMAND_LINE); 273 add_arg(DEFAULT_COMMAND_LINE);
358 274
359 os_early_checks(); 275 os_early_checks();
360 if (force_tt)
361 clear_can_do_skas();
362 mode_tt = force_tt ? 1 : !can_do_skas();
363#ifndef CONFIG_MODE_TT
364 if (mode_tt) {
365 /*Since CONFIG_MODE_TT is #undef'ed, force_tt cannot be 1. So,
366 * can_do_skas() returned 0, and the message is correct. */
367 printf("Support for TT mode is disabled, and no SKAS support is present on the host.\n");
368 exit(1);
369 }
370#endif
371 276
372#ifndef CONFIG_MODE_SKAS 277 can_do_skas();
373 mode = "TT"; 278
374#else 279 if (proc_mm && ptrace_faultinfo)
375 /* Show to the user the result of selection */
376 if (mode_tt)
377 mode = "TT";
378 else if (proc_mm && ptrace_faultinfo)
379 mode = "SKAS3"; 280 mode = "SKAS3";
380 else 281 else
381 mode = "SKAS0"; 282 mode = "SKAS0";
382#endif
383 283
384 printf("UML running in %s mode\n", mode); 284 printf("UML running in %s mode\n", mode);
385 285
@@ -411,11 +311,6 @@ int __init linux_main(int argc, char **argv)
411 311
412 setup_machinename(init_utsname()->machine); 312 setup_machinename(init_utsname()->machine);
413 313
414#ifdef CONFIG_CMDLINE_ON_HOST
415 argv1_begin = argv[1];
416 argv1_end = &argv[1][strlen(argv[1])];
417#endif
418
419 highmem = 0; 314 highmem = 0;
420 iomem_size = (iomem_size + PAGE_SIZE - 1) & PAGE_MASK; 315 iomem_size = (iomem_size + PAGE_SIZE - 1) & PAGE_MASK;
421 max_physmem = get_kmem_end() - uml_physmem - iomem_size - MIN_VMALLOC; 316 max_physmem = get_kmem_end() - uml_physmem - iomem_size - MIN_VMALLOC;