?? setup.c
字號:
/* * arch/s390/kernel/setup.c * * S390 version * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation * Author(s): Hartmut Penner (hp@de.ibm.com), * Martin Schwidefsky (schwidefsky@de.ibm.com) * * Derived from "arch/i386/kernel/setup.c" * Copyright (C) 1995, Linus Torvalds *//* * This file handles the architecture-dependent parts of initialization */#include <linux/errno.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/mm.h>#include <linux/stddef.h>#include <linux/unistd.h>#include <linux/ptrace.h>#include <linux/slab.h>#include <linux/user.h>#include <linux/a.out.h>#include <linux/tty.h>#include <linux/ioport.h>#include <linux/delay.h>#include <linux/config.h>#include <linux/init.h>#include <linux/initrd.h>#include <linux/bootmem.h>#include <linux/root_dev.h>#include <linux/console.h>#include <linux/seq_file.h>#include <linux/kernel_stat.h>#include <asm/uaccess.h>#include <asm/system.h>#include <asm/smp.h>#include <asm/mmu_context.h>#include <asm/cpcmd.h>#include <asm/lowcore.h>#include <asm/irq.h>/* * Machine setup.. */unsigned int console_mode = 0;unsigned int console_devno = -1;unsigned int console_irq = -1;unsigned long memory_size = 0;unsigned long machine_flags = 0;struct { unsigned long addr, size, type;} memory_chunk[MEMORY_CHUNKS] = { { 0 } };#define CHUNK_READ_WRITE 0#define CHUNK_READ_ONLY 1volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address *//* * Setup options */extern int _text,_etext, _edata, _end;/* * This is set up by the setup-routine at boot-time * for S390 need to find out, what we have to setup * using address 0x10400 ... */#include <asm/setup.h>static char command_line[COMMAND_LINE_SIZE] = { 0, };static struct resource code_resource = { "Kernel code", 0x100000, 0 };static struct resource data_resource = { "Kernel data", 0, 0 };/* * cpu_init() initializes state that is per-CPU. */void __devinit cpu_init (void){ int addr = hard_smp_processor_id(); /* * Store processor id in lowcore (used e.g. in timer_interrupt) */ asm volatile ("stidp %0": "=m" (S390_lowcore.cpu_data.cpu_id)); S390_lowcore.cpu_data.cpu_addr = addr; /* * Force FPU initialization: */ clear_thread_flag(TIF_USEDFPU); current->used_math = 0; /* Setup active_mm for idle_task */ atomic_inc(&init_mm.mm_count); current->active_mm = &init_mm; if (current->mm) BUG(); enter_lazy_tlb(&init_mm, current);}/* * VM halt and poweroff setup routines */char vmhalt_cmd[128] = "";char vmpoff_cmd[128] = "";static inline void strncpy_skip_quote(char *dst, char *src, int n){ int sx, dx; dx = 0; for (sx = 0; src[sx] != 0; sx++) { if (src[sx] == '"') continue; dst[dx++] = src[sx]; if (dx >= n) break; }}static int __init vmhalt_setup(char *str){ strncpy_skip_quote(vmhalt_cmd, str, 127); vmhalt_cmd[127] = 0; return 1;}__setup("vmhalt=", vmhalt_setup);static int __init vmpoff_setup(char *str){ strncpy_skip_quote(vmpoff_cmd, str, 127); vmpoff_cmd[127] = 0; return 1;}__setup("vmpoff=", vmpoff_setup);/* * condev= and conmode= setup parameter. */static int __init condev_setup(char *str){ int vdev; vdev = simple_strtoul(str, &str, 0); if (vdev >= 0 && vdev < 65536) { console_devno = vdev; console_irq = -1; } return 1;}__setup("condev=", condev_setup);static int __init conmode_setup(char *str){#if defined(CONFIG_SCLP_CONSOLE) if (strncmp(str, "hwc", 4) == 0 || strncmp(str, "sclp", 5) == 0) SET_CONSOLE_SCLP;#endif#if defined(CONFIG_TN3215_CONSOLE) if (strncmp(str, "3215", 5) == 0) SET_CONSOLE_3215;#endif#if defined(CONFIG_TN3270_CONSOLE) if (strncmp(str, "3270", 5) == 0) SET_CONSOLE_3270;#endif return 1;}__setup("conmode=", conmode_setup);static void __init conmode_default(void){ char query_buffer[1024]; char *ptr; if (MACHINE_IS_VM) { cpcmd("QUERY CONSOLE", query_buffer, 1024); console_devno = simple_strtoul(query_buffer + 5, NULL, 16); ptr = strstr(query_buffer, "SUBCHANNEL ="); console_irq = simple_strtoul(ptr + 13, NULL, 16); cpcmd("QUERY TERM", query_buffer, 1024); ptr = strstr(query_buffer, "CONMODE"); /* * Set the conmode to 3215 so that the device recognition * will set the cu_type of the console to 3215. If the * conmode is 3270 and we don't set it back then both * 3215 and the 3270 driver will try to access the console * device (3215 as console and 3270 as normal tty). */ cpcmd("TERM CONMODE 3215", NULL, 0); if (ptr == NULL) {#if defined(CONFIG_SCLP_CONSOLE) SET_CONSOLE_SCLP;#endif return; } if (strncmp(ptr + 8, "3270", 4) == 0) {#if defined(CONFIG_TN3270_CONSOLE) SET_CONSOLE_3270;#elif defined(CONFIG_TN3215_CONSOLE) SET_CONSOLE_3215;#elif defined(CONFIG_SCLP_CONSOLE) SET_CONSOLE_SCLP;#endif } else if (strncmp(ptr + 8, "3215", 4) == 0) {#if defined(CONFIG_TN3215_CONSOLE) SET_CONSOLE_3215;#elif defined(CONFIG_TN3270_CONSOLE) SET_CONSOLE_3270;#elif defined(CONFIG_SCLP_CONSOLE) SET_CONSOLE_SCLP;#endif } } else if (MACHINE_IS_P390) {#if defined(CONFIG_TN3215_CONSOLE) SET_CONSOLE_3215;#elif defined(CONFIG_TN3270_CONSOLE) SET_CONSOLE_3270;#endif } else {#if defined(CONFIG_SCLP_CONSOLE) SET_CONSOLE_SCLP;#endif }}#ifdef CONFIG_SMPextern void machine_restart_smp(char *);extern void machine_halt_smp(void);extern void machine_power_off_smp(void);void (*_machine_restart)(char *command) = machine_restart_smp;void (*_machine_halt)(void) = machine_halt_smp;void (*_machine_power_off)(void) = machine_power_off_smp;#else/* * Reboot, halt and power_off routines for non SMP. */extern void reipl(unsigned long devno);static void do_machine_restart_nonsmp(char * __unused){ if (MACHINE_IS_VM) cpcmd ("IPL", NULL, 0); else reipl (0x10000 | S390_lowcore.ipl_device);}static void do_machine_halt_nonsmp(void){ if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0) cpcmd(vmhalt_cmd, NULL, 0); signal_processor(smp_processor_id(), sigp_stop_and_store_status);}static void do_machine_power_off_nonsmp(void){ if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0) cpcmd(vmpoff_cmd, NULL, 0); signal_processor(smp_processor_id(), sigp_stop_and_store_status);}void (*_machine_restart)(char *command) = do_machine_restart_nonsmp;void (*_machine_halt)(void) = do_machine_halt_nonsmp;void (*_machine_power_off)(void) = do_machine_power_off_nonsmp;#endif /* * Reboot, halt and power_off stubs. They just call _machine_restart, * _machine_halt or _machine_power_off. */void machine_restart(char *command){ console_unblank(); _machine_restart(command);}EXPORT_SYMBOL(machine_restart);void machine_halt(void){ console_unblank(); _machine_halt();}EXPORT_SYMBOL(machine_halt);void machine_power_off(void){ console_unblank(); _machine_power_off();}EXPORT_SYMBOL(machine_power_off);/* * Setup function called from init/main.c just after the banner * was printed. */extern char _pstart, _pend, _stext;void __init setup_arch(char **cmdline_p){ unsigned long bootmap_size; unsigned long memory_start, memory_end; char c = ' ', cn, *to = command_line, *from = COMMAND_LINE; struct resource *res; unsigned long start_pfn, end_pfn; static unsigned int smptrap=0; unsigned long delay = 0; struct _lowcore *lc; int i; if (smptrap) return; smptrap=1;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -