⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setup.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  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/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 <linux/device.h>#include <linux/notifier.h>#include <linux/pfn.h>#include <linux/ctype.h>#include <linux/reboot.h>#include <asm/ipl.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>#include <asm/page.h>#include <asm/ptrace.h>#include <asm/sections.h>#include <asm/ebcdic.h>#include <asm/compat.h>long psw_kernel_bits	= (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY |			   PSW_MASK_MCHECK | PSW_DEFAULT_KEY);long psw_user_bits	= (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME |			   PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK |			   PSW_MASK_PSTATE | PSW_DEFAULT_KEY);/* * User copy operations. */struct uaccess_ops uaccess;EXPORT_SYMBOL(uaccess);/* * Machine setup.. */unsigned int console_mode = 0;unsigned int console_devno = -1;unsigned int console_irq = -1;unsigned long machine_flags = 0;unsigned long elf_hwcap = 0;char elf_platform[ELF_PLATFORM_SIZE];struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */static unsigned long __initdata memory_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 struct resource code_resource = {	.name  = "Kernel code",	.flags = IORESOURCE_BUSY | IORESOURCE_MEM,};static struct resource data_resource = {	.name = "Kernel data",	.flags = IORESOURCE_BUSY | IORESOURCE_MEM,};/* * cpu_init() initializes state that is per-CPU. */void __cpuinit cpu_init(void){        int addr = hard_smp_processor_id();        /*         * Store processor id in lowcore (used e.g. in timer_interrupt)         */	get_cpu_id(&S390_lowcore.cpu_data.cpu_id);        S390_lowcore.cpu_data.cpu_addr = addr;        /*         * Force FPU initialization:         */        clear_thread_flag(TIF_USEDFPU);        clear_used_math();	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 char vmpanic_cmd[128] = "";static 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);static int vmpanic_notify(struct notifier_block *self, unsigned long event,			  void *data){	if (MACHINE_IS_VM && strlen(vmpanic_cmd) > 0)		cpcmd(vmpanic_cmd, NULL, 0, NULL);	return NOTIFY_OK;}#define PANIC_PRI_VMPANIC	0static struct notifier_block vmpanic_nb = {	.notifier_call = vmpanic_notify,	.priority = PANIC_PRI_VMPANIC};static int __init vmpanic_setup(char *str){	static int register_done __initdata = 0;	strncpy_skip_quote(vmpanic_cmd, str, 127);	vmpanic_cmd[127] = 0;	if (!register_done) {		register_done = 1;		atomic_notifier_chain_register(&panic_notifier_list,					       &vmpanic_nb);	}	return 1;}__setup("vmpanic=", vmpanic_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, NULL);		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, NULL);		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, NULL);		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	}}#if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)static void __init setup_zfcpdump(unsigned int console_devno){	static char str[64];	if (ipl_info.type != IPL_TYPE_FCP_DUMP)		return;	if (console_devno != -1)		sprintf(str, "cio_ignore=all,!0.0.%04x,!0.0.%04x",			ipl_info.data.fcp.dev_id.devno, console_devno);	else		sprintf(str, "cio_ignore=all,!0.0.%04x",			ipl_info.data.fcp.dev_id.devno);	strcat(COMMAND_LINE, " ");	strcat(COMMAND_LINE, str);	console_loglevel = 2;}#elsestatic inline void setup_zfcpdump(unsigned int console_devno) {}#endif /* CONFIG_ZFCPDUMP */#ifdef CONFIG_SMPvoid (*_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. */static void do_machine_restart_nonsmp(char * __unused){	do_reipl();}static void do_machine_halt_nonsmp(void){        if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0)		__cpcmd(vmhalt_cmd, NULL, 0, NULL);        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, NULL);        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){	if ((!in_interrupt() && !in_atomic()) || oops_in_progress)		/*		 * Only unblank the console if we are called in enabled		 * context or a bust_spinlocks cleared the way for us.		 */		console_unblank();	_machine_restart(command);}void machine_halt(void){	if (!in_interrupt() || oops_in_progress)		/*		 * Only unblank the console if we are called in enabled		 * context or a bust_spinlocks cleared the way for us.		 */		console_unblank();	_machine_halt();}void machine_power_off(void){	if (!in_interrupt() || oops_in_progress)		/*		 * Only unblank the console if we are called in enabled		 * context or a bust_spinlocks cleared the way for us.		 */		console_unblank();	_machine_power_off();}/* * Dummy power off function. */void (*pm_power_off)(void) = machine_power_off;static int __init early_parse_mem(char *p){	memory_end = memparse(p, &p);	return 0;}early_param("mem", early_parse_mem);/* * "ipldelay=XXX[sm]" sets ipl delay in seconds or minutes */static int __init early_parse_ipldelay(char *p){	unsigned long delay = 0;	delay = simple_strtoul(p, &p, 0);	switch (*p) {	case 's':	case 'S':		delay *= 1000000;		break;	case 'm':	case 'M':		delay *= 60 * 1000000;	}	/* now wait for the requested amount of time */	udelay(delay);	return 0;}early_param("ipldelay", early_parse_ipldelay);#ifdef CONFIG_S390_SWITCH_AMODEunsigned int switch_amode = 0;EXPORT_SYMBOL_GPL(switch_amode);static void set_amode_and_uaccess(unsigned long user_amode,				  unsigned long user32_amode){	psw_user_bits = PSW_BASE_BITS | PSW_MASK_DAT | user_amode |			PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK |			PSW_MASK_PSTATE | PSW_DEFAULT_KEY;#ifdef CONFIG_COMPAT	psw_user32_bits = PSW_BASE32_BITS | PSW_MASK_DAT | user_amode |			  PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK |			  PSW_MASK_PSTATE | PSW_DEFAULT_KEY;	psw32_user_bits = PSW32_BASE_BITS | PSW32_MASK_DAT | user32_amode |			  PSW32_MASK_IO | PSW32_MASK_EXT | PSW32_MASK_MCHECK |			  PSW32_MASK_PSTATE;#endif	psw_kernel_bits = PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME |			  PSW_MASK_MCHECK | PSW_DEFAULT_KEY;	if (MACHINE_HAS_MVCOS) {		printk("mvcos available.\n");		memcpy(&uaccess, &uaccess_mvcos_switch, sizeof(uaccess));	} else {		printk("mvcos not available.\n");		memcpy(&uaccess, &uaccess_pt, sizeof(uaccess));	}}/* * Switch kernel/user addressing modes? */static int __init early_parse_switch_amode(char *p){	switch_amode = 1;	return 0;}early_param("switch_amode", early_parse_switch_amode);#else /* CONFIG_S390_SWITCH_AMODE */static inline void set_amode_and_uaccess(unsigned long user_amode,					 unsigned long user32_amode){}#endif /* CONFIG_S390_SWITCH_AMODE */#ifdef CONFIG_S390_EXEC_PROTECTunsigned int s390_noexec = 0;EXPORT_SYMBOL_GPL(s390_noexec);/* * Enable execute protection? */static int __init early_parse_noexec(char *p){	if (!strncmp(p, "off", 3))		return 0;	switch_amode = 1;	s390_noexec = 1;	return 0;}early_param("noexec", early_parse_noexec);#endif /* CONFIG_S390_EXEC_PROTECT */static void setup_addressing_mode(void){	if (s390_noexec) {		printk("S390 execute protection active, ");		set_amode_and_uaccess(PSW_ASC_SECONDARY, PSW32_ASC_SECONDARY);	} else if (switch_amode) {		printk("S390 address spaces switched, ");		set_amode_and_uaccess(PSW_ASC_PRIMARY, PSW32_ASC_PRIMARY);	}#ifdef CONFIG_TRACE_IRQFLAGS	sysc_restore_trace_psw.mask = psw_kernel_bits & ~PSW_MASK_MCHECK;	io_restore_trace_psw.mask = psw_kernel_bits & ~PSW_MASK_MCHECK;#endif}static void __initsetup_lowcore(void){	struct _lowcore *lc;	int lc_pages;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -