asmlinkage void __init start_kernel(void) { char * command_line; extern struct kernel_param __start___param[], __stop___param[]; smp_setup_processor_id(); /* * Need to run as early as possible, to initialize the * lockdep hash: */ lockdep_init(); debug_objects_early_init(); /* * Set up the the initial canary ASAP: */ boot_init_stack_canary(); cgroup_init_early(); local_irq_disable(); early_boot_irqs_off(); early_init_irq_lock_class(); /* * Interrupts are still disabled. Do necessary setups, then * enable them */ lock_kernel(); tick_init(); boot_cpu_init(); page_address_init(); printk(KERN_NOTICE "%s", linux_banner); setup_arch(&command_line); mm_init_owner(&init_mm, &init_task); setup_command_line(command_line); setup_nr_cpu_ids(); setup_per_cpu_areas(); smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ build_all_zonelists(NULL); page_alloc_init(); printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line); //[email protected] 2011.11.14 begin //support lcd compatible //reviewed by [email protected] #if defined(CONFIG_LCD_DRV_ALL) char *p = strstr(boot_command_line, "lcd="); if (p) { lcd_drv_index = p[4] - 'A'; printk("lcd index = %d", lcd_drv_index); } #endif //[email protected] 2011.11.14 end parse_early_param(); parse_args("Booting kernel", static_command_line, __start___param, __stop___param - __start___param, &unknown_bootoption); /* * These use large bootmem allocations and must precede * kmem_cache_init() */ pidhash_init(); vfs_caches_init_early(); sort_main_extable(); trap_init(); mm_init(); /* * Set up the scheduler prior starting any interrupts (such as the * timer interrupt). Full topology setup happens at smp_init() * time - but meanwhile we still have a functioning scheduler. */ sched_init(); /* * Disable preemption - early bootup scheduling is extremely * fragile until we cpu_idle() for the first time. */ preempt_disable(); if (!irqs_disabled()) { printk(KERN_WARNING "start_kernel(): bug: interrupts were " "enabled *very* early, fixing it\n"); local_irq_disable(); } rcu_init(); radix_tree_init(); /* init some links before init_ISA_irqs() */ early_irq_init(); init_IRQ(); prio_tree_init(); init_timers(); hrtimers_init(); softirq_init(); timekeeping_init(); time_init(); profile_init(); if (!irqs_disabled()) printk(KERN_CRIT "start_kernel(): bug: interrupts were " "enabled early\n"); early_boot_irqs_on(); local_irq_enable(); /* Interrupts are enabled now so all GFP allocations are safe. */ gfp_allowed_mask = __GFP_BITS_MASK; kmem_cache_init_late(); /* * HACK ALERT! This is early. We're enabling the console before * we've done PCI setups etc, and console_init() must be aware of * this. But we do want output early, in case something goes wrong. */ console_init(); if (panic_later) panic(panic_later, panic_param); lockdep_info(); /* * Need to run this when irqs are enabled, because it wants * to self-test [hard/soft]-irqs on/off lock inversion bugs * too: */ locking_selftest(); #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start && !initrd_below_start_ok && page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) { printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - " "disabling it.\n", page_to_pfn(virt_to_page((void *)initrd_start)), min_low_pfn); initrd_start = 0; } #endif page_cgroup_init(); enable_debug_pagealloc(); kmemtrace_init(); kmemleak_init(); debug_objects_mem_init(); idr_init_cache(); setup_per_cpu_pageset(); numa_policy_init(); if (late_time_init) late_time_init(); sched_clock_init(); calibrate_delay(); pidmap_init(); anon_vma_init(); #ifdef CONFIG_X86 if (efi_enabled) efi_enter_virtual_mode(); #endif thread_info_cache_init(); cred_init(); fork_init(totalram_pages); proc_caches_init(); buffer_init(); key_init(); security_init(); dbg_late_init(); vfs_caches_init(totalram_pages); signals_init(); /* rootfs populating might need page-writeback */ page_writeback_init(); #ifdef CONFIG_PROC_FS proc_root_init(); #endif cgroup_init(); cpuset_init(); taskstats_init_early(); delayacct_init(); check_bugs(); acpi_early_init(); /* before LAPIC and SMP init */ sfi_init_late(); ftrace_init(); /* Do the rest non-__init'ed, we're now alive */ rest_init(); }
int main(int argc, const char* argv[]) { int dropMode = 0; int serverFinishedPermute = 0; int serverHelloPermute = 0; int clientFinishedPermute = 0; int batch = 0; int arg; nonblock = 0; debug = 0; timeout_seconds = 120; retransmit_milliseconds = 100; full = 0; run_to_end = 1; job_limit = 1; #define NEXT_ARG(name) \ do { \ if (++arg >= argc) { \ fprintf(stderr, "No argument for -" #name "\n"); \ exit(8); \ } \ } while (0); #define FAIL_ARG(name) \ do { \ fprintf(stderr, "Invalid argument for -" #name "\n"); \ exit(8); \ } while (0); for (arg = 1; arg < argc; arg++) { if (strcmp("-die", argv[arg]) == 0) { run_to_end = 0; } else if (strcmp("-batch", argv[arg]) == 0) { batch = 1; } else if (strcmp("-d", argv[arg]) == 0) { char* end; int level = strtol(argv[arg+1], &end, 10); if (*end == '\0') { debug = level; arg++; } else { debug++; } } else if (strcmp("-nb", argv[arg]) == 0) { nonblock = 1; } else if (strcmp("-timeout", argv[arg]) == 0) { char* end; int val; NEXT_ARG(timeout); val = strtol(argv[arg], &end, 10); if (*end == '\0') { timeout_seconds = val; } else { FAIL_ARG(timeout); } } else if (strcmp("-retransmit", argv[arg]) == 0) { char* end; int val; NEXT_ARG(retransmit); val = strtol(argv[arg], &end, 10); if (*end == '\0') { retransmit_milliseconds = val; } else { FAIL_ARG(retransmit); } } else if (strcmp("-j", argv[arg]) == 0) { char* end; int val; NEXT_ARG(timeout); val = strtol(argv[arg], &end, 10); if (*end == '\0') { job_limit = val; } else { FAIL_ARG(j); } } else if (strcmp("-full", argv[arg]) == 0) { full = 1; } else if (strcmp("-shello", argv[arg]) == 0) { NEXT_ARG(shello); if (!parse_permutation(argv[arg], full ? permutation_names5 : permutation_names3, &serverHelloPermute)) { FAIL_ARG(shell); } } else if (strcmp("-sfinished", argv[arg]) == 0) { NEXT_ARG(sfinished); if (!parse_permutation(argv[arg], permutation_names2, &serverFinishedPermute)) { FAIL_ARG(sfinished); } } else if (strcmp("-cfinished", argv[arg]) == 0) { NEXT_ARG(cfinished); if (!parse_permutation(argv[arg], full ? permutation_names5 : permutation_names3, &clientFinishedPermute)) { FAIL_ARG(cfinished); } } else { int drop; int filter_count = full ? 12 : 8; const char** local_filter_names = full ? filter_names_full : filter_names; for (drop = 0; drop < filter_count; drop++) { if (strcmp(local_filter_names[drop], argv[arg]) == 0) { dropMode |= (1 << drop); break; } } if (drop == filter_count) { fprintf(stderr, "Unknown packet %s\n", argv[arg]); exit(8); } } } setlinebuf(stdout); gnutls_global_init(); cred_init(); gnutls_global_set_log_function(logfn); gnutls_global_set_audit_log_function(auditfn); gnutls_global_set_log_level(debug); if (dropMode || serverFinishedPermute || serverHelloPermute || clientFinishedPermute) { return run_one_test(dropMode, serverFinishedPermute, serverHelloPermute, clientFinishedPermute); } else { job_pids = calloc(sizeof(int), job_limit); if (batch) { return run_tests_from_id_list(job_limit); } else { return run_all_tests(job_limit); } } }