1 /* 2 * linux/init/main.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 * 6 * GK 2/5/95 - Changed to support mounting root fs via NFS 7 * Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96 8 * Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96 9 * Simplified starting of init: Michael A. Griffith <grif@acm.org> 10 */ 11 12 #include <linux/types.h> 13 #include <linux/module.h> 14 #include <linux/proc_fs.h> 15 #include <linux/kernel.h> 16 #include <linux/syscalls.h> 17 #include <linux/string.h> 18 #include <linux/ctype.h> 19 #include <linux/delay.h> 20 #include <linux/utsname.h> 21 #include <linux/ioport.h> 22 #include <linux/init.h> 23 #include <linux/smp_lock.h> 24 #include <linux/initrd.h> 25 #include <linux/hdreg.h> 26 #include <linux/bootmem.h> 27 #include <linux/tty.h> 28 #include <linux/gfp.h> 29 #include <linux/percpu.h> 30 #include <linux/kmod.h> 31 #include <linux/kernel_stat.h> 32 #include <linux/start_kernel.h> 33 #include <linux/security.h> 34 #include <linux/workqueue.h> 35 #include <linux/profile.h> 36 #include <linux/rcupdate.h> 37 #include <linux/moduleparam.h> 38 #include <linux/kallsyms.h> 39 #include <linux/writeback.h> 40 #include <linux/cpu.h> 41 #include <linux/cpuset.h> 42 #include <linux/efi.h> 43 #include <linux/taskstats_kern.h> 44 #include <linux/delayacct.h> 45 #include <linux/unistd.h> 46 #include <linux/rmap.h> 47 #include <linux/mempolicy.h> 48 #include <linux/key.h> 49 #include <linux/unwind.h> 50 #include <linux/buffer_head.h> 51 #include <linux/debug_locks.h> 52 #include <linux/lockdep.h> 53 #include <linux/utsrelease.h> 54 #include <linux/pid_namespace.h> 55 #include <linux/compile.h> 56 57 #include <asm/io.h> 58 #include <asm/bugs.h> 59 #include <asm/setup.h> 60 #include <asm/sections.h> 61 #include <asm/cacheflush.h> 62 63 #ifdef CONFIG_X86_LOCAL_APIC 64 #include <asm/smp.h> 65 #endif 66 67 /* 68 * This is one of the first .c files built. Error out early if we have compiler 69 * trouble. 70 * 71 * Versions of gcc older than that listed below may actually compile and link 72 * okay, but the end product can have subtle run time bugs. To avoid associated 73 * bogus bug reports, we flatly refuse to compile with a gcc that is known to be 74 * too old from the very beginning. 75 */ 76 #if (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 2) 77 #error Sorry, your GCC is too old. It builds incorrect kernels. 78 #endif 79 80 #if __GNUC__ == 4 && __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ == 0 81 #warning gcc-4.1.0 is known to miscompile the kernel. A different compiler version is recommended. 82 #endif 83 84 static int init(void *); 85 86 extern void init_IRQ(void); 87 extern void fork_init(unsigned long); 88 extern void mca_init(void); 89 extern void sbus_init(void); 90 extern void sysctl_init(void); 91 extern void signals_init(void); 92 extern void pidhash_init(void); 93 extern void pidmap_init(void); 94 extern void prio_tree_init(void); 95 extern void radix_tree_init(void); 96 extern void free_initmem(void); 97 extern void populate_rootfs(void); 98 extern void driver_init(void); 99 extern void prepare_namespace(void); 100 #ifdef CONFIG_ACPI 101 extern void acpi_early_init(void); 102 #else 103 static inline void acpi_early_init(void) { } 104 #endif 105 #ifndef CONFIG_DEBUG_RODATA 106 static inline void mark_rodata_ro(void) { } 107 #endif 108 109 #ifdef CONFIG_TC 110 extern void tc_init(void); 111 #endif 112 113 enum system_states system_state; 114 EXPORT_SYMBOL(system_state); 115 116 /* 117 * Boot command-line arguments 118 */ 119 #define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT 120 #define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT 121 122 extern void time_init(void); 123 /* Default late time init is NULL. archs can override this later. */ 124 void (*late_time_init)(void); 125 extern void softirq_init(void); 126 127 /* Untouched command line (eg. for /proc) saved by arch-specific code. */ 128 char saved_command_line[COMMAND_LINE_SIZE]; 129 130 static char *execute_command; 131 static char *ramdisk_execute_command; 132 133 /* Setup configured maximum number of CPUs to activate */ 134 static unsigned int max_cpus = NR_CPUS; 135 136 /* 137 * If set, this is an indication to the drivers that reset the underlying 138 * device before going ahead with the initialization otherwise driver might 139 * rely on the BIOS and skip the reset operation. 140 * 141 * This is useful if kernel is booting in an unreliable environment. 142 * For ex. kdump situaiton where previous kernel has crashed, BIOS has been 143 * skipped and devices will be in unknown state. 144 */ 145 unsigned int reset_devices; 146 EXPORT_SYMBOL(reset_devices); 147 148 /* 149 * Setup routine for controlling SMP activation 150 * 151 * Command-line option of "nosmp" or "maxcpus=0" will disable SMP 152 * activation entirely (the MPS table probe still happens, though). 153 * 154 * Command-line option of "maxcpus=<NUM>", where <NUM> is an integer 155 * greater than 0, limits the maximum number of CPUs activated in 156 * SMP mode to <NUM>. 157 */ 158 static int __init nosmp(char *str) 159 { 160 max_cpus = 0; 161 return 1; 162 } 163 164 __setup("nosmp", nosmp); 165 166 static int __init maxcpus(char *str) 167 { 168 get_option(&str, &max_cpus); 169 return 1; 170 } 171 172 __setup("maxcpus=", maxcpus); 173 174 static int __init set_reset_devices(char *str) 175 { 176 reset_devices = 1; 177 return 1; 178 } 179 180 __setup("reset_devices", set_reset_devices); 181 182 static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, }; 183 char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, }; 184 static const char *panic_later, *panic_param; 185 186 extern struct obs_kernel_param __setup_start[], __setup_end[]; 187 188 static int __init obsolete_checksetup(char *line) 189 { 190 struct obs_kernel_param *p; 191 int had_early_param = 0; 192 193 p = __setup_start; 194 do { 195 int n = strlen(p->str); 196 if (!strncmp(line, p->str, n)) { 197 if (p->early) { 198 /* Already done in parse_early_param? 199 * (Needs exact match on param part). 200 * Keep iterating, as we can have early 201 * params and __setups of same names 8( */ 202 if (line[n] == '\0' || line[n] == '=') 203 had_early_param = 1; 204 } else if (!p->setup_func) { 205 printk(KERN_WARNING "Parameter %s is obsolete," 206 " ignored\n", p->str); 207 return 1; 208 } else if (p->setup_func(line + n)) 209 return 1; 210 } 211 p++; 212 } while (p < __setup_end); 213 214 return had_early_param; 215 } 216 217 /* 218 * This should be approx 2 Bo*oMips to start (note initial shift), and will 219 * still work even if initially too large, it will just take slightly longer 220 */ 221 unsigned long loops_per_jiffy = (1<<12); 222 223 EXPORT_SYMBOL(loops_per_jiffy); 224 225 static int __init debug_kernel(char *str) 226 { 227 if (*str) 228 return 0; 229 console_loglevel = 10; 230 return 1; 231 } 232 233 static int __init quiet_kernel(char *str) 234 { 235 if (*str) 236 return 0; 237 console_loglevel = 4; 238 return 1; 239 } 240 241 __setup("debug", debug_kernel); 242 __setup("quiet", quiet_kernel); 243 244 static int __init loglevel(char *str) 245 { 246 get_option(&str, &console_loglevel); 247 return 1; 248 } 249 250 __setup("loglevel=", loglevel); 251 252 /* 253 * Unknown boot options get handed to init, unless they look like 254 * failed parameters 255 */ 256 static int __init unknown_bootoption(char *param, char *val) 257 { 258 /* Change NUL term back to "=", to make "param" the whole string. */ 259 if (val) { 260 /* param=val or param="val"? */ 261 if (val == param+strlen(param)+1) 262 val[-1] = '='; 263 else if (val == param+strlen(param)+2) { 264 val[-2] = '='; 265 memmove(val-1, val, strlen(val)+1); 266 val--; 267 } else 268 BUG(); 269 } 270 271 /* Handle obsolete-style parameters */ 272 if (obsolete_checksetup(param)) 273 return 0; 274 275 /* 276 * Preemptive maintenance for "why didn't my mispelled command 277 * line work?" 278 */ 279 if (strchr(param, '.') && (!val || strchr(param, '.') < val)) { 280 printk(KERN_ERR "Unknown boot option `%s': ignoring\n", param); 281 return 0; 282 } 283 284 if (panic_later) 285 return 0; 286 287 if (val) { 288 /* Environment option */ 289 unsigned int i; 290 for (i = 0; envp_init[i]; i++) { 291 if (i == MAX_INIT_ENVS) { 292 panic_later = "Too many boot env vars at `%s'"; 293 panic_param = param; 294 } 295 if (!strncmp(param, envp_init[i], val - param)) 296 break; 297 } 298 envp_init[i] = param; 299 } else { 300 /* Command line option */ 301 unsigned int i; 302 for (i = 0; argv_init[i]; i++) { 303 if (i == MAX_INIT_ARGS) { 304 panic_later = "Too many boot init vars at `%s'"; 305 panic_param = param; 306 } 307 } 308 argv_init[i] = param; 309 } 310 return 0; 311 } 312 313 static int __init init_setup(char *str) 314 { 315 unsigned int i; 316 317 execute_command = str; 318 /* 319 * In case LILO is going to boot us with default command line, 320 * it prepends "auto" before the whole cmdline which makes 321 * the shell think it should execute a script with such name. 322 * So we ignore all arguments entered _before_ init=... [MJ] 323 */ 324 for (i = 1; i < MAX_INIT_ARGS; i++) 325 argv_init[i] = NULL; 326 return 1; 327 } 328 __setup("init=", init_setup); 329 330 static int __init rdinit_setup(char *str) 331 { 332 unsigned int i; 333 334 ramdisk_execute_command = str; 335 /* See "auto" comment in init_setup */ 336 for (i = 1; i < MAX_INIT_ARGS; i++) 337 argv_init[i] = NULL; 338 return 1; 339 } 340 __setup("rdinit=", rdinit_setup); 341 342 #ifndef CONFIG_SMP 343 344 #ifdef CONFIG_X86_LOCAL_APIC 345 static void __init smp_init(void) 346 { 347 APIC_init_uniprocessor(); 348 } 349 #else 350 #define smp_init() do { } while (0) 351 #endif 352 353 static inline void setup_per_cpu_areas(void) { } 354 static inline void smp_prepare_cpus(unsigned int maxcpus) { } 355 356 #else 357 358 #ifdef __GENERIC_PER_CPU 359 unsigned long __per_cpu_offset[NR_CPUS] __read_mostly; 360 361 EXPORT_SYMBOL(__per_cpu_offset); 362 363 static void __init setup_per_cpu_areas(void) 364 { 365 unsigned long size, i; 366 char *ptr; 367 unsigned long nr_possible_cpus = num_possible_cpus(); 368 369 /* Copy section for each CPU (we discard the original) */ 370 size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES); 371 #ifdef CONFIG_MODULES 372 if (size < PERCPU_ENOUGH_ROOM) 373 size = PERCPU_ENOUGH_ROOM; 374 #endif 375 ptr = alloc_bootmem(size * nr_possible_cpus); 376 377 for_each_possible_cpu(i) { 378 __per_cpu_offset[i] = ptr - __per_cpu_start; 379 memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); 380 ptr += size; 381 } 382 } 383 #endif /* !__GENERIC_PER_CPU */ 384 385 /* Called by boot processor to activate the rest. */ 386 static void __init smp_init(void) 387 { 388 unsigned int i; 389 390 /* FIXME: This should be done in userspace --RR */ 391 for_each_present_cpu(i) { 392 if (num_online_cpus() >= max_cpus) 393 break; 394 if (!cpu_online(i)) 395 cpu_up(i); 396 } 397 398 /* Any cleanup work */ 399 printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus()); 400 smp_cpus_done(max_cpus); 401 #if 0 402 /* Get other processors into their bootup holding patterns. */ 403 404 smp_commence(); 405 #endif 406 } 407 408 #endif 409 410 /* 411 * We need to finalize in a non-__init function or else race conditions 412 * between the root thread and the init thread may cause start_kernel to 413 * be reaped by free_initmem before the root thread has proceeded to 414 * cpu_idle. 415 * 416 * gcc-3.4 accidentally inlines this function, so use noinline. 417 */ 418 419 static void noinline rest_init(void) 420 __releases(kernel_lock) 421 { 422 kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND); 423 numa_default_policy(); 424 unlock_kernel(); 425 426 /* 427 * The boot idle thread must execute schedule() 428 * at least one to get things moving: 429 */ 430 preempt_enable_no_resched(); 431 schedule(); 432 preempt_disable(); 433 434 /* Call into cpu_idle with preempt disabled */ 435 cpu_idle(); 436 } 437 438 /* Check for early params. */ 439 static int __init do_early_param(char *param, char *val) 440 { 441 struct obs_kernel_param *p; 442 443 for (p = __setup_start; p < __setup_end; p++) { 444 if (p->early && strcmp(param, p->str) == 0) { 445 if (p->setup_func(val) != 0) 446 printk(KERN_WARNING 447 "Malformed early option '%s'\n", param); 448 } 449 } 450 /* We accept everything at this stage. */ 451 return 0; 452 } 453 454 /* Arch code calls this early on, or if not, just before other parsing. */ 455 void __init parse_early_param(void) 456 { 457 static __initdata int done = 0; 458 static __initdata char tmp_cmdline[COMMAND_LINE_SIZE]; 459 460 if (done) 461 return; 462 463 /* All fall through to do_early_param. */ 464 strlcpy(tmp_cmdline, saved_command_line, COMMAND_LINE_SIZE); 465 parse_args("early options", tmp_cmdline, NULL, 0, do_early_param); 466 done = 1; 467 } 468 469 /* 470 * Activate the first processor. 471 */ 472 473 static void __init boot_cpu_init(void) 474 { 475 int cpu = smp_processor_id(); 476 /* Mark the boot cpu "present", "online" etc for SMP and UP case */ 477 cpu_set(cpu, cpu_online_map); 478 cpu_set(cpu, cpu_present_map); 479 cpu_set(cpu, cpu_possible_map); 480 } 481 482 void __init __attribute__((weak)) smp_setup_processor_id(void) 483 { 484 } 485 486 asmlinkage void __init start_kernel(void) 487 { 488 char * command_line; 489 extern struct kernel_param __start___param[], __stop___param[]; 490 491 smp_setup_processor_id(); 492 493 /* 494 * Need to run as early as possible, to initialize the 495 * lockdep hash: 496 */ 497 unwind_init(); 498 lockdep_init(); 499 500 local_irq_disable(); 501 early_boot_irqs_off(); 502 early_init_irq_lock_class(); 503 504 /* 505 * Interrupts are still disabled. Do necessary setups, then 506 * enable them 507 */ 508 lock_kernel(); 509 boot_cpu_init(); 510 page_address_init(); 511 printk(KERN_NOTICE); 512 printk(linux_banner, UTS_RELEASE, UTS_VERSION); 513 setup_arch(&command_line); 514 unwind_setup(); 515 setup_per_cpu_areas(); 516 smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ 517 518 /* 519 * Set up the scheduler prior starting any interrupts (such as the 520 * timer interrupt). Full topology setup happens at smp_init() 521 * time - but meanwhile we still have a functioning scheduler. 522 */ 523 sched_init(); 524 /* 525 * Disable preemption - early bootup scheduling is extremely 526 * fragile until we cpu_idle() for the first time. 527 */ 528 preempt_disable(); 529 build_all_zonelists(); 530 page_alloc_init(); 531 printk(KERN_NOTICE "Kernel command line: %s\n", saved_command_line); 532 parse_early_param(); 533 parse_args("Booting kernel", command_line, __start___param, 534 __stop___param - __start___param, 535 &unknown_bootoption); 536 sort_main_extable(); 537 trap_init(); 538 rcu_init(); 539 init_IRQ(); 540 pidhash_init(); 541 init_timers(); 542 hrtimers_init(); 543 softirq_init(); 544 timekeeping_init(); 545 time_init(); 546 profile_init(); 547 if (!irqs_disabled()) 548 printk("start_kernel(): bug: interrupts were enabled early\n"); 549 early_boot_irqs_on(); 550 local_irq_enable(); 551 552 /* 553 * HACK ALERT! This is early. We're enabling the console before 554 * we've done PCI setups etc, and console_init() must be aware of 555 * this. But we do want output early, in case something goes wrong. 556 */ 557 console_init(); 558 if (panic_later) 559 panic(panic_later, panic_param); 560 561 lockdep_info(); 562 563 /* 564 * Need to run this when irqs are enabled, because it wants 565 * to self-test [hard/soft]-irqs on/off lock inversion bugs 566 * too: 567 */ 568 locking_selftest(); 569 570 #ifdef CONFIG_BLK_DEV_INITRD 571 if (initrd_start && !initrd_below_start_ok && 572 initrd_start < min_low_pfn << PAGE_SHIFT) { 573 printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - " 574 "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT); 575 initrd_start = 0; 576 } 577 #endif 578 vfs_caches_init_early(); 579 cpuset_init_early(); 580 mem_init(); 581 kmem_cache_init(); 582 setup_per_cpu_pageset(); 583 numa_policy_init(); 584 if (late_time_init) 585 late_time_init(); 586 calibrate_delay(); 587 pidmap_init(); 588 pgtable_cache_init(); 589 prio_tree_init(); 590 anon_vma_init(); 591 #ifdef CONFIG_X86 592 if (efi_enabled) 593 efi_enter_virtual_mode(); 594 #endif 595 fork_init(num_physpages); 596 proc_caches_init(); 597 buffer_init(); 598 unnamed_dev_init(); 599 key_init(); 600 security_init(); 601 vfs_caches_init(num_physpages); 602 radix_tree_init(); 603 signals_init(); 604 /* rootfs populating might need page-writeback */ 605 page_writeback_init(); 606 #ifdef CONFIG_PROC_FS 607 proc_root_init(); 608 #endif 609 cpuset_init(); 610 taskstats_init_early(); 611 delayacct_init(); 612 613 check_bugs(); 614 615 acpi_early_init(); /* before LAPIC and SMP init */ 616 617 /* Do the rest non-__init'ed, we're now alive */ 618 rest_init(); 619 } 620 621 static int __initdata initcall_debug; 622 623 static int __init initcall_debug_setup(char *str) 624 { 625 initcall_debug = 1; 626 return 1; 627 } 628 __setup("initcall_debug", initcall_debug_setup); 629 630 extern initcall_t __initcall_start[], __initcall_end[]; 631 632 static void __init do_initcalls(void) 633 { 634 initcall_t *call; 635 int count = preempt_count(); 636 637 for (call = __initcall_start; call < __initcall_end; call++) { 638 char *msg = NULL; 639 char msgbuf[40]; 640 int result; 641 642 if (initcall_debug) { 643 printk("Calling initcall 0x%p", *call); 644 print_fn_descriptor_symbol(": %s()", 645 (unsigned long) *call); 646 printk("\n"); 647 } 648 649 result = (*call)(); 650 651 if (result && result != -ENODEV && initcall_debug) { 652 sprintf(msgbuf, "error code %d", result); 653 msg = msgbuf; 654 } 655 if (preempt_count() != count) { 656 msg = "preemption imbalance"; 657 preempt_count() = count; 658 } 659 if (irqs_disabled()) { 660 msg = "disabled interrupts"; 661 local_irq_enable(); 662 } 663 if (msg) { 664 printk(KERN_WARNING "initcall at 0x%p", *call); 665 print_fn_descriptor_symbol(": %s()", 666 (unsigned long) *call); 667 printk(": returned with %s\n", msg); 668 } 669 } 670 671 /* Make sure there is no pending stuff from the initcall sequence */ 672 flush_scheduled_work(); 673 } 674 675 /* 676 * Ok, the machine is now initialized. None of the devices 677 * have been touched yet, but the CPU subsystem is up and 678 * running, and memory and process management works. 679 * 680 * Now we can finally start doing some real work.. 681 */ 682 static void __init do_basic_setup(void) 683 { 684 /* drivers will send hotplug events */ 685 init_workqueues(); 686 usermodehelper_init(); 687 driver_init(); 688 689 #ifdef CONFIG_SYSCTL 690 sysctl_init(); 691 #endif 692 693 do_initcalls(); 694 } 695 696 static void do_pre_smp_initcalls(void) 697 { 698 extern int spawn_ksoftirqd(void); 699 #ifdef CONFIG_SMP 700 extern int migration_init(void); 701 702 migration_init(); 703 #endif 704 spawn_ksoftirqd(); 705 spawn_softlockup_task(); 706 } 707 708 static void run_init_process(char *init_filename) 709 { 710 argv_init[0] = init_filename; 711 kernel_execve(init_filename, argv_init, envp_init); 712 } 713 714 static int init(void * unused) 715 { 716 lock_kernel(); 717 /* 718 * init can run on any cpu. 719 */ 720 set_cpus_allowed(current, CPU_MASK_ALL); 721 /* 722 * Tell the world that we're going to be the grim 723 * reaper of innocent orphaned children. 724 * 725 * We don't want people to have to make incorrect 726 * assumptions about where in the task array this 727 * can be found. 728 */ 729 init_pid_ns.child_reaper = current; 730 731 cad_pid = task_pid(current); 732 733 smp_prepare_cpus(max_cpus); 734 735 do_pre_smp_initcalls(); 736 737 smp_init(); 738 sched_init_smp(); 739 740 cpuset_init_smp(); 741 742 /* 743 * Do this before initcalls, because some drivers want to access 744 * firmware files. 745 */ 746 populate_rootfs(); 747 748 do_basic_setup(); 749 750 /* 751 * check if there is an early userspace init. If yes, let it do all 752 * the work 753 */ 754 755 if (!ramdisk_execute_command) 756 ramdisk_execute_command = "/init"; 757 758 if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) { 759 ramdisk_execute_command = NULL; 760 prepare_namespace(); 761 } 762 763 /* 764 * Ok, we have completed the initial bootup, and 765 * we're essentially up and running. Get rid of the 766 * initmem segments and start the user-mode stuff.. 767 */ 768 free_initmem(); 769 unlock_kernel(); 770 mark_rodata_ro(); 771 system_state = SYSTEM_RUNNING; 772 numa_default_policy(); 773 774 if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) 775 printk(KERN_WARNING "Warning: unable to open an initial console.\n"); 776 777 (void) sys_dup(0); 778 (void) sys_dup(0); 779 780 if (ramdisk_execute_command) { 781 run_init_process(ramdisk_execute_command); 782 printk(KERN_WARNING "Failed to execute %s\n", 783 ramdisk_execute_command); 784 } 785 786 /* 787 * We try each of these until one succeeds. 788 * 789 * The Bourne shell can be used instead of init if we are 790 * trying to recover a really broken machine. 791 */ 792 if (execute_command) { 793 run_init_process(execute_command); 794 printk(KERN_WARNING "Failed to execute %s. Attempting " 795 "defaults...\n", execute_command); 796 } 797 run_init_process("/sbin/init"); 798 run_init_process("/etc/init"); 799 run_init_process("/bin/init"); 800 run_init_process("/bin/sh"); 801 802 panic("No init found. Try passing init= option to kernel."); 803 } 804