📄 setup.c
字号:
} /* * Some machines don't have the possibility of ever * possessing lp0, lp1 or lp2 */ if (mdesc->reserve_lp0) request_resource(&ioport_resource, &lp0); if (mdesc->reserve_lp1) request_resource(&ioport_resource, &lp1); if (mdesc->reserve_lp2) request_resource(&ioport_resource, &lp2);}/* * Tag parsing. * * This is the new way of passing data to the kernel at boot time. Rather * than passing a fixed inflexible structure to the kernel, we pass a list * of variable-sized tags to the kernel. The first tag must be a ATAG_CORE * tag for the list to be recognised (to distinguish the tagged list from * a param_struct). The list is terminated with a zero-length tag (this tag * is not parsed in any way). */static int __init parse_tag_core(const struct tag *tag){ if (tag->hdr.size > 2) { if ((tag->u.core.flags & 1) == 0) root_mountflags &= ~MS_RDONLY; ROOT_DEV = to_kdev_t(tag->u.core.rootdev); } return 0;}__tagtable(ATAG_CORE, parse_tag_core);static int __init parse_tag_mem32(const struct tag *tag){ if (meminfo.nr_banks >= NR_BANKS) { printk(KERN_WARNING "Ignoring memory bank 0x%08x size %dKB\n", tag->u.mem.start, tag->u.mem.size / 1024); return -EINVAL; } meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start; meminfo.bank[meminfo.nr_banks].size = tag->u.mem.size; meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(tag->u.mem.start); meminfo.nr_banks += 1; return 0;}__tagtable(ATAG_MEM, parse_tag_mem32);#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)struct screen_info screen_info = { orig_video_lines: 30, orig_video_cols: 80, orig_video_mode: 0, orig_video_ega_bx: 0, orig_video_isVGA: 1, orig_video_points: 8};static int __init parse_tag_videotext(const struct tag *tag){ screen_info.orig_x = tag->u.videotext.x; screen_info.orig_y = tag->u.videotext.y; screen_info.orig_video_page = tag->u.videotext.video_page; screen_info.orig_video_mode = tag->u.videotext.video_mode; screen_info.orig_video_cols = tag->u.videotext.video_cols; screen_info.orig_video_ega_bx = tag->u.videotext.video_ega_bx; screen_info.orig_video_lines = tag->u.videotext.video_lines; screen_info.orig_video_isVGA = tag->u.videotext.video_isvga; screen_info.orig_video_points = tag->u.videotext.video_points; return 0;}__tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);#endifstatic int __init parse_tag_ramdisk(const struct tag *tag){ setup_ramdisk((tag->u.ramdisk.flags & 1) == 0, (tag->u.ramdisk.flags & 2) == 0, tag->u.ramdisk.start, tag->u.ramdisk.size); return 0;}__tagtable(ATAG_RAMDISK, parse_tag_ramdisk);static int __init parse_tag_initrd(const struct tag *tag){ setup_initrd(tag->u.initrd.start, tag->u.initrd.size); return 0;}__tagtable(ATAG_INITRD, parse_tag_initrd);static int __init parse_tag_initrd2(const struct tag *tag){ unsigned long start = 0; if (tag->u.initrd.size) { start = (unsigned long)phys_to_virt(tag->u.initrd.start); setup_initrd(start, tag->u.initrd.size); } return 0;}__tagtable(ATAG_INITRD2, parse_tag_initrd2);static int __init parse_tag_serialnr(const struct tag *tag){ system_serial_low = tag->u.serialnr.low; system_serial_high = tag->u.serialnr.high; return 0;}__tagtable(ATAG_SERIAL, parse_tag_serialnr);static int __init parse_tag_revision(const struct tag *tag){ system_rev = tag->u.revision.rev; return 0;}__tagtable(ATAG_REVISION, parse_tag_revision);static int __init parse_tag_cmdline(const struct tag *tag){#ifndef CONFIG_NO_TAG_CMDLINE strncpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);#endif default_command_line[COMMAND_LINE_SIZE - 1] = '\0'; return 0;}__tagtable(ATAG_CMDLINE, parse_tag_cmdline);/* * Scan the tag table for this tag, and call its parse function. * The tag table is built by the linker from all the __tagtable * declarations. */static int __init parse_tag(const struct tag *tag){ extern struct tagtable __tagtable_begin, __tagtable_end; struct tagtable *t; for (t = &__tagtable_begin; t < &__tagtable_end; t++) if (tag->hdr.tag == t->tag) { t->parse(tag); break; } return t < &__tagtable_end;}/* * Parse all tags in the list, checking both the global and architecture * specific tag tables. */static void __init parse_tags(const struct tag *t){ for (; t->hdr.size; t = tag_next(t)) if (!parse_tag(t)) printk(KERN_WARNING "Ignoring unrecognised tag 0x%08x\n", t->hdr.tag);}void __init setup_arch(char **cmdline_p){ struct tag *tags = NULL; struct machine_desc *mdesc; char *from = default_command_line; ROOT_DEV = MKDEV(0, 255); setup_processor(); mdesc = setup_machine(machine_arch_type); machine_name = mdesc->name; if (mdesc->soft_reboot) reboot_setup("s"); if (mdesc->param_offset) tags = phys_to_virt(mdesc->param_offset); /* * Do the machine-specific fixups before we parse the * parameters or tags. */ if (mdesc->fixup) mdesc->fixup(mdesc, (struct param_struct *)tags, &from, &meminfo); /* * If we have the old style parameters, convert them to * a tag list before. */ if (tags && tags->hdr.tag != ATAG_CORE) convert_to_tag_list((struct param_struct *)tags, meminfo.nr_banks == 0); if (tags && tags->hdr.tag == ATAG_CORE) parse_tags(tags); if (meminfo.nr_banks == 0) { meminfo.nr_banks = 1; meminfo.bank[0].start = PHYS_OFFSET; meminfo.bank[0].size = MEM_SIZE; } init_mm.start_code = (unsigned long) &_text; init_mm.end_code = (unsigned long) &_etext; init_mm.end_data = (unsigned long) &_edata; init_mm.brk = (unsigned long) &_end; memcpy(saved_command_line, from, COMMAND_LINE_SIZE); saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; parse_cmdline(&meminfo, cmdline_p, from); bootmem_init(&meminfo); paging_init(&meminfo, mdesc); request_standard_resources(&meminfo, mdesc); /* * Set up various architecture-specific pointers */ init_arch_irq = mdesc->init_irq;#ifdef CONFIG_VT#if defined(CONFIG_VGA_CONSOLE) conswitchp = &vga_con;#elif defined(CONFIG_DUMMY_CONSOLE) conswitchp = &dummy_con;#endif#endif}static const char *hwcap_str[] = { "swp", "half", "thumb", "26bit", "fastmult", "fpa", "vfp", "edsp", NULL};static const char *proc_arch[16] = { "undefined 0", "4", "4T", "5", "5T", "5TE", "undefined 6", "undefined 7", "undefined 8", "undefined 9", "undefined 10", "undefined 11", "undefined 12", "undefined 13", "undefined 14", "undefined 15"};static voidc_show_cache(struct seq_file *m, const char *type, unsigned int cache){ unsigned int mult = 2 + CACHE_M(cache) ? 1 : 0; seq_printf(m, "%s size\t\t: %d\n" "%s assoc\t\t: %d\n" "%s line length\t: %d\n" "%s sets\t\t: %d\n", type, mult << (8 + CACHE_SIZE(cache)), type, (mult << CACHE_ASSOC(cache)) >> 1, type, 8 << CACHE_LINE(cache), type, 1 << (6 + CACHE_SIZE(cache) - CACHE_ASSOC(cache) - CACHE_LINE(cache)));}static int c_show(struct seq_file *m, void *v){ int i; seq_printf(m, "Processor\t: %s %s rev %d (%s)\n", proc_info.manufacturer, proc_info.cpu_name, (int)processor_id & 15, elf_platform); seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", loops_per_jiffy / (500000/HZ), (loops_per_jiffy / (5000/HZ)) % 100); /* dump out the processor features */ seq_puts(m, "Features\t: "); for (i = 0; hwcap_str[i]; i++) if (elf_hwcap & (1 << i)) seq_printf(m, "%s ", hwcap_str[i]); seq_puts(m, "\n"); if ((processor_id & 0x0000f000) == 0x00000000) { /* pre-ARM7 */ seq_printf(m, "CPU part\t\t: %07x\n", processor_id >> 4); } else if ((processor_id & 0x0000f000) == 0x00007000) { /* ARM7 */ seq_printf(m, "CPU implementor\t: 0x%02x\n" "CPU architecture: %s\n" "CPU variant\t: 0x%02x\n" "CPU part\t: 0x%03x\n", processor_id >> 24, processor_id & (1 << 23) ? "4T" : "3", (processor_id >> 16) & 127, (processor_id >> 4) & 0xfff); } else { /* post-ARM7 */ seq_printf(m, "CPU implementor\t: 0x%02x\n" "CPU architecture: %s\n" "CPU variant\t: 0x%x\n" "CPU part\t: 0x%03x\n", processor_id >> 24, proc_arch[(processor_id >> 16) & 15], (processor_id >> 20) & 15, (processor_id >> 4) & 0xfff); } seq_printf(m, "CPU revision\t: %d\n", processor_id & 15);#ifdef CONFIG_CPU_32 { unsigned int cache_info; asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (cache_info)); if (cache_info != processor_id) { seq_printf(m, "Cache type\t: %s\n" "Cache clean\t: %s\n" "Cache lockdown\t: %s\n" "Cache unified\t: %s\n", cache_types[CACHE_TYPE(cache_info)], cache_clean[CACHE_TYPE(cache_info)], cache_lockdown[CACHE_TYPE(cache_info)], CACHE_S(cache_info) ? "harvard" : "unified"); if (CACHE_S(cache_info)) { c_show_cache(m, "I", CACHE_ISIZE(cache_info)); c_show_cache(m, "D", CACHE_DSIZE(cache_info)); } else { c_show_cache(m, "Cache", CACHE_ISIZE(cache_info)); } } }#endif seq_puts(m, "\n"); seq_printf(m, "Hardware\t: %s\n", machine_name); seq_printf(m, "Revision\t: %04x\n", system_rev); seq_printf(m, "Serial\t\t: %08x%08x\n", system_serial_high, system_serial_low); return 0;}static void *c_start(struct seq_file *m, loff_t *pos){ return *pos < 1 ? (void *)1 : NULL;}static void *c_next(struct seq_file *m, void *v, loff_t *pos){ ++*pos; return NULL;}static void c_stop(struct seq_file *m, void *v){}struct seq_operations cpuinfo_op = { start: c_start, next: c_next, stop: c_stop, show: c_show};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -