[PATCH] x86_64: don't copy command line twice
[profile/ivi/kernel-adaptation-intel-automotive.git] / arch / x86_64 / kernel / setup.c
1 /*
2  *  linux/arch/x86-64/kernel/setup.c
3  *
4  *  Copyright (C) 1995  Linus Torvalds
5  *
6  *  Nov 2001 Dave Jones <davej@suse.de>
7  *  Forked from i386 setup code.
8  *
9  *  $Id$
10  */
11
12 /*
13  * This file handles the architecture-dependent parts of initialization
14  */
15
16 #include <linux/errno.h>
17 #include <linux/sched.h>
18 #include <linux/kernel.h>
19 #include <linux/mm.h>
20 #include <linux/stddef.h>
21 #include <linux/unistd.h>
22 #include <linux/ptrace.h>
23 #include <linux/slab.h>
24 #include <linux/user.h>
25 #include <linux/a.out.h>
26 #include <linux/tty.h>
27 #include <linux/ioport.h>
28 #include <linux/delay.h>
29 #include <linux/config.h>
30 #include <linux/init.h>
31 #include <linux/initrd.h>
32 #include <linux/highmem.h>
33 #include <linux/bootmem.h>
34 #include <linux/module.h>
35 #include <asm/processor.h>
36 #include <linux/console.h>
37 #include <linux/seq_file.h>
38 #include <linux/crash_dump.h>
39 #include <linux/root_dev.h>
40 #include <linux/pci.h>
41 #include <linux/acpi.h>
42 #include <linux/kallsyms.h>
43 #include <linux/edd.h>
44 #include <linux/mmzone.h>
45 #include <linux/kexec.h>
46 #include <linux/cpufreq.h>
47 #include <linux/dmi.h>
48 #include <linux/dma-mapping.h>
49
50 #include <asm/mtrr.h>
51 #include <asm/uaccess.h>
52 #include <asm/system.h>
53 #include <asm/io.h>
54 #include <asm/smp.h>
55 #include <asm/msr.h>
56 #include <asm/desc.h>
57 #include <video/edid.h>
58 #include <asm/e820.h>
59 #include <asm/dma.h>
60 #include <asm/mpspec.h>
61 #include <asm/mmu_context.h>
62 #include <asm/bootsetup.h>
63 #include <asm/proto.h>
64 #include <asm/setup.h>
65 #include <asm/mach_apic.h>
66 #include <asm/numa.h>
67 #include <asm/swiotlb.h>
68 #include <asm/sections.h>
69 #include <asm/gart-mapping.h>
70
71 /*
72  * Machine setup..
73  */
74
75 struct cpuinfo_x86 boot_cpu_data __read_mostly;
76
77 unsigned long mmu_cr4_features;
78
79 int acpi_disabled;
80 EXPORT_SYMBOL(acpi_disabled);
81 #ifdef  CONFIG_ACPI
82 extern int __initdata acpi_ht;
83 extern acpi_interrupt_flags     acpi_sci_flags;
84 int __initdata acpi_force = 0;
85 #endif
86
87 int acpi_numa __initdata;
88
89 /* Boot loader ID as an integer, for the benefit of proc_dointvec */
90 int bootloader_type;
91
92 unsigned long saved_video_mode;
93
94 /*
95  * Setup options
96  */
97 struct drive_info_struct { char dummy[32]; } drive_info;
98 struct screen_info screen_info;
99 struct sys_desc_table_struct {
100         unsigned short length;
101         unsigned char table[0];
102 };
103
104 struct edid_info edid_info;
105 struct e820map e820;
106
107 extern int root_mountflags;
108
109 char command_line[COMMAND_LINE_SIZE];
110
111 struct resource standard_io_resources[] = {
112         { .name = "dma1", .start = 0x00, .end = 0x1f,
113                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
114         { .name = "pic1", .start = 0x20, .end = 0x21,
115                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
116         { .name = "timer0", .start = 0x40, .end = 0x43,
117                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
118         { .name = "timer1", .start = 0x50, .end = 0x53,
119                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
120         { .name = "keyboard", .start = 0x60, .end = 0x6f,
121                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
122         { .name = "dma page reg", .start = 0x80, .end = 0x8f,
123                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
124         { .name = "pic2", .start = 0xa0, .end = 0xa1,
125                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
126         { .name = "dma2", .start = 0xc0, .end = 0xdf,
127                 .flags = IORESOURCE_BUSY | IORESOURCE_IO },
128         { .name = "fpu", .start = 0xf0, .end = 0xff,
129                 .flags = IORESOURCE_BUSY | IORESOURCE_IO }
130 };
131
132 #define STANDARD_IO_RESOURCES \
133         (sizeof standard_io_resources / sizeof standard_io_resources[0])
134
135 #define IORESOURCE_RAM (IORESOURCE_BUSY | IORESOURCE_MEM)
136
137 struct resource data_resource = {
138         .name = "Kernel data",
139         .start = 0,
140         .end = 0,
141         .flags = IORESOURCE_RAM,
142 };
143 struct resource code_resource = {
144         .name = "Kernel code",
145         .start = 0,
146         .end = 0,
147         .flags = IORESOURCE_RAM,
148 };
149
150 #define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM)
151
152 static struct resource system_rom_resource = {
153         .name = "System ROM",
154         .start = 0xf0000,
155         .end = 0xfffff,
156         .flags = IORESOURCE_ROM,
157 };
158
159 static struct resource extension_rom_resource = {
160         .name = "Extension ROM",
161         .start = 0xe0000,
162         .end = 0xeffff,
163         .flags = IORESOURCE_ROM,
164 };
165
166 static struct resource adapter_rom_resources[] = {
167         { .name = "Adapter ROM", .start = 0xc8000, .end = 0,
168                 .flags = IORESOURCE_ROM },
169         { .name = "Adapter ROM", .start = 0, .end = 0,
170                 .flags = IORESOURCE_ROM },
171         { .name = "Adapter ROM", .start = 0, .end = 0,
172                 .flags = IORESOURCE_ROM },
173         { .name = "Adapter ROM", .start = 0, .end = 0,
174                 .flags = IORESOURCE_ROM },
175         { .name = "Adapter ROM", .start = 0, .end = 0,
176                 .flags = IORESOURCE_ROM },
177         { .name = "Adapter ROM", .start = 0, .end = 0,
178                 .flags = IORESOURCE_ROM }
179 };
180
181 #define ADAPTER_ROM_RESOURCES \
182         (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
183
184 static struct resource video_rom_resource = {
185         .name = "Video ROM",
186         .start = 0xc0000,
187         .end = 0xc7fff,
188         .flags = IORESOURCE_ROM,
189 };
190
191 static struct resource video_ram_resource = {
192         .name = "Video RAM area",
193         .start = 0xa0000,
194         .end = 0xbffff,
195         .flags = IORESOURCE_RAM,
196 };
197
198 #define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
199
200 static int __init romchecksum(unsigned char *rom, unsigned long length)
201 {
202         unsigned char *p, sum = 0;
203
204         for (p = rom; p < rom + length; p++)
205                 sum += *p;
206         return sum == 0;
207 }
208
209 static void __init probe_roms(void)
210 {
211         unsigned long start, length, upper;
212         unsigned char *rom;
213         int           i;
214
215         /* video rom */
216         upper = adapter_rom_resources[0].start;
217         for (start = video_rom_resource.start; start < upper; start += 2048) {
218                 rom = isa_bus_to_virt(start);
219                 if (!romsignature(rom))
220                         continue;
221
222                 video_rom_resource.start = start;
223
224                 /* 0 < length <= 0x7f * 512, historically */
225                 length = rom[2] * 512;
226
227                 /* if checksum okay, trust length byte */
228                 if (length && romchecksum(rom, length))
229                         video_rom_resource.end = start + length - 1;
230
231                 request_resource(&iomem_resource, &video_rom_resource);
232                 break;
233                         }
234
235         start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
236         if (start < upper)
237                 start = upper;
238
239         /* system rom */
240         request_resource(&iomem_resource, &system_rom_resource);
241         upper = system_rom_resource.start;
242
243         /* check for extension rom (ignore length byte!) */
244         rom = isa_bus_to_virt(extension_rom_resource.start);
245         if (romsignature(rom)) {
246                 length = extension_rom_resource.end - extension_rom_resource.start + 1;
247                 if (romchecksum(rom, length)) {
248                         request_resource(&iomem_resource, &extension_rom_resource);
249                         upper = extension_rom_resource.start;
250                 }
251         }
252
253         /* check for adapter roms on 2k boundaries */
254         for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
255                 rom = isa_bus_to_virt(start);
256                 if (!romsignature(rom))
257                         continue;
258
259                 /* 0 < length <= 0x7f * 512, historically */
260                 length = rom[2] * 512;
261
262                 /* but accept any length that fits if checksum okay */
263                 if (!length || start + length > upper || !romchecksum(rom, length))
264                         continue;
265
266                 adapter_rom_resources[i].start = start;
267                 adapter_rom_resources[i].end = start + length - 1;
268                 request_resource(&iomem_resource, &adapter_rom_resources[i]);
269
270                 start = adapter_rom_resources[i++].end & ~2047UL;
271         }
272 }
273
274 static __init void parse_cmdline_early (char ** cmdline_p)
275 {
276         char c = ' ', *to = command_line, *from = COMMAND_LINE;
277         int len = 0;
278         int userdef = 0;
279
280         for (;;) {
281                 if (c != ' ') 
282                         goto next_char; 
283
284 #ifdef  CONFIG_SMP
285                 /*
286                  * If the BIOS enumerates physical processors before logical,
287                  * maxcpus=N at enumeration-time can be used to disable HT.
288                  */
289                 else if (!memcmp(from, "maxcpus=", 8)) {
290                         extern unsigned int maxcpus;
291
292                         maxcpus = simple_strtoul(from + 8, NULL, 0);
293                 }
294 #endif
295 #ifdef CONFIG_ACPI
296                 /* "acpi=off" disables both ACPI table parsing and interpreter init */
297                 if (!memcmp(from, "acpi=off", 8))
298                         disable_acpi();
299
300                 if (!memcmp(from, "acpi=force", 10)) { 
301                         /* add later when we do DMI horrors: */
302                         acpi_force = 1;
303                         acpi_disabled = 0;
304                 }
305
306                 /* acpi=ht just means: do ACPI MADT parsing 
307                    at bootup, but don't enable the full ACPI interpreter */
308                 if (!memcmp(from, "acpi=ht", 7)) { 
309                         if (!acpi_force)
310                                 disable_acpi();
311                         acpi_ht = 1; 
312                 }
313                 else if (!memcmp(from, "pci=noacpi", 10)) 
314                         acpi_disable_pci();
315                 else if (!memcmp(from, "acpi=noirq", 10))
316                         acpi_noirq_set();
317
318                 else if (!memcmp(from, "acpi_sci=edge", 13))
319                         acpi_sci_flags.trigger =  1;
320                 else if (!memcmp(from, "acpi_sci=level", 14))
321                         acpi_sci_flags.trigger = 3;
322                 else if (!memcmp(from, "acpi_sci=high", 13))
323                         acpi_sci_flags.polarity = 1;
324                 else if (!memcmp(from, "acpi_sci=low", 12))
325                         acpi_sci_flags.polarity = 3;
326
327                 /* acpi=strict disables out-of-spec workarounds */
328                 else if (!memcmp(from, "acpi=strict", 11)) {
329                         acpi_strict = 1;
330                 }
331 #ifdef CONFIG_X86_IO_APIC
332                 else if (!memcmp(from, "acpi_skip_timer_override", 24))
333                         acpi_skip_timer_override = 1;
334 #endif
335 #endif
336
337                 if (!memcmp(from, "disable_timer_pin_1", 19))
338                         disable_timer_pin_1 = 1;
339                 if (!memcmp(from, "enable_timer_pin_1", 18))
340                         disable_timer_pin_1 = -1;
341
342                 if (!memcmp(from, "nolapic", 7) ||
343                     !memcmp(from, "disableapic", 11))
344                         disable_apic = 1;
345
346                 if (!memcmp(from, "noapic", 6)) 
347                         skip_ioapic_setup = 1;
348
349                 /* Make sure to not confuse with apic= */
350                 if (!memcmp(from, "apic", 4) &&
351                         (from[4] == ' ' || from[4] == 0)) {
352                         skip_ioapic_setup = 0;
353                         ioapic_force = 1;
354                 }
355                         
356                 if (!memcmp(from, "mem=", 4))
357                         parse_memopt(from+4, &from); 
358
359                 if (!memcmp(from, "memmap=", 7)) {
360                         /* exactmap option is for used defined memory */
361                         if (!memcmp(from+7, "exactmap", 8)) {
362 #ifdef CONFIG_CRASH_DUMP
363                                 /* If we are doing a crash dump, we
364                                  * still need to know the real mem
365                                  * size before original memory map is
366                                  * reset.
367                                  */
368                                 saved_max_pfn = e820_end_of_ram();
369 #endif
370                                 from += 8+7;
371                                 end_pfn_map = 0;
372                                 e820.nr_map = 0;
373                                 userdef = 1;
374                         }
375                         else {
376                                 parse_memmapopt(from+7, &from);
377                                 userdef = 1;
378                         }
379                 }
380
381 #ifdef CONFIG_NUMA
382                 if (!memcmp(from, "numa=", 5))
383                         numa_setup(from+5); 
384 #endif
385
386                 if (!memcmp(from,"iommu=",6)) { 
387                         iommu_setup(from+6); 
388                 }
389
390                 if (!memcmp(from,"oops=panic", 10))
391                         panic_on_oops = 1;
392
393                 if (!memcmp(from, "noexec=", 7))
394                         nonx_setup(from + 7);
395
396 #ifdef CONFIG_KEXEC
397                 /* crashkernel=size@addr specifies the location to reserve for
398                  * a crash kernel.  By reserving this memory we guarantee
399                  * that linux never set's it up as a DMA target.
400                  * Useful for holding code to do something appropriate
401                  * after a kernel panic.
402                  */
403                 else if (!memcmp(from, "crashkernel=", 12)) {
404                         unsigned long size, base;
405                         size = memparse(from+12, &from);
406                         if (*from == '@') {
407                                 base = memparse(from+1, &from);
408                                 /* FIXME: Do I want a sanity check
409                                  * to validate the memory range?
410                                  */
411                                 crashk_res.start = base;
412                                 crashk_res.end   = base + size - 1;
413                         }
414                 }
415 #endif
416
417 #ifdef CONFIG_PROC_VMCORE
418                 /* elfcorehdr= specifies the location of elf core header
419                  * stored by the crashed kernel. This option will be passed
420                  * by kexec loader to the capture kernel.
421                  */
422                 else if(!memcmp(from, "elfcorehdr=", 11))
423                         elfcorehdr_addr = memparse(from+11, &from);
424 #endif
425         next_char:
426                 c = *(from++);
427                 if (!c)
428                         break;
429                 if (COMMAND_LINE_SIZE <= ++len)
430                         break;
431                 *(to++) = c;
432         }
433         if (userdef) {
434                 printk(KERN_INFO "user-defined physical RAM map:\n");
435                 e820_print_map("user");
436         }
437         *to = '\0';
438         *cmdline_p = command_line;
439 }
440
441 #ifndef CONFIG_NUMA
442 static void __init
443 contig_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
444 {
445         unsigned long bootmap_size, bootmap;
446
447         bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT;
448         bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size);
449         if (bootmap == -1L)
450                 panic("Cannot find bootmem map of size %ld\n",bootmap_size);
451         bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn);
452         e820_bootmem_free(NODE_DATA(0), 0, end_pfn << PAGE_SHIFT);
453         reserve_bootmem(bootmap, bootmap_size);
454
455 #endif
456
457 /* Use inline assembly to define this because the nops are defined 
458    as inline assembly strings in the include files and we cannot 
459    get them easily into strings. */
460 asm("\t.data\nk8nops: " 
461     K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6
462     K8_NOP7 K8_NOP8); 
463     
464 extern unsigned char k8nops[];
465 static unsigned char *k8_nops[ASM_NOP_MAX+1] = { 
466      NULL,
467      k8nops,
468      k8nops + 1,
469      k8nops + 1 + 2,
470      k8nops + 1 + 2 + 3,
471      k8nops + 1 + 2 + 3 + 4,
472      k8nops + 1 + 2 + 3 + 4 + 5,
473      k8nops + 1 + 2 + 3 + 4 + 5 + 6,
474      k8nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
475 }; 
476
477 extern char __vsyscall_0;
478
479 /* Replace instructions with better alternatives for this CPU type.
480
481    This runs before SMP is initialized to avoid SMP problems with
482    self modifying code. This implies that assymetric systems where
483    APs have less capabilities than the boot processor are not handled. 
484    In this case boot with "noreplacement". */ 
485 void apply_alternatives(void *start, void *end) 
486
487         struct alt_instr *a; 
488         int diff, i, k;
489         for (a = start; (void *)a < end; a++) { 
490                 u8 *instr;
491
492                 if (!boot_cpu_has(a->cpuid))
493                         continue;
494
495                 BUG_ON(a->replacementlen > a->instrlen); 
496                 instr = a->instr;
497                 /* vsyscall code is not mapped yet. resolve it manually. */
498                 if (instr >= (u8 *)VSYSCALL_START && instr < (u8*)VSYSCALL_END)
499                         instr = __va(instr - (u8*)VSYSCALL_START + (u8*)__pa_symbol(&__vsyscall_0));
500                 __inline_memcpy(instr, a->replacement, a->replacementlen);
501                 diff = a->instrlen - a->replacementlen; 
502
503                 /* Pad the rest with nops */
504                 for (i = a->replacementlen; diff > 0; diff -= k, i += k) {
505                         k = diff;
506                         if (k > ASM_NOP_MAX)
507                                 k = ASM_NOP_MAX;
508                         __inline_memcpy(instr + i, k8_nops[k], k);
509                 } 
510         }
511
512
513 static int no_replacement __initdata = 0; 
514  
515 void __init alternative_instructions(void)
516 {
517         extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
518         if (no_replacement) 
519                 return;
520         apply_alternatives(__alt_instructions, __alt_instructions_end);
521 }
522
523 static int __init noreplacement_setup(char *s)
524
525      no_replacement = 1; 
526      return 0; 
527
528
529 __setup("noreplacement", noreplacement_setup); 
530
531 #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
532 struct edd edd;
533 #ifdef CONFIG_EDD_MODULE
534 EXPORT_SYMBOL(edd);
535 #endif
536 /**
537  * copy_edd() - Copy the BIOS EDD information
538  *              from boot_params into a safe place.
539  *
540  */
541 static inline void copy_edd(void)
542 {
543      memcpy(edd.mbr_signature, EDD_MBR_SIGNATURE, sizeof(edd.mbr_signature));
544      memcpy(edd.edd_info, EDD_BUF, sizeof(edd.edd_info));
545      edd.mbr_signature_nr = EDD_MBR_SIG_NR;
546      edd.edd_info_nr = EDD_NR;
547 }
548 #else
549 static inline void copy_edd(void)
550 {
551 }
552 #endif
553
554 #define EBDA_ADDR_POINTER 0x40E
555 static void __init reserve_ebda_region(void)
556 {
557         unsigned int addr;
558         /** 
559          * there is a real-mode segmented pointer pointing to the 
560          * 4K EBDA area at 0x40E
561          */
562         addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER);
563         addr <<= 4;
564         if (addr)
565                 reserve_bootmem_generic(addr, PAGE_SIZE);
566 }
567
568 void __init setup_arch(char **cmdline_p)
569 {
570         unsigned long kernel_end;
571
572         ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
573         drive_info = DRIVE_INFO;
574         screen_info = SCREEN_INFO;
575         edid_info = EDID_INFO;
576         saved_video_mode = SAVED_VIDEO_MODE;
577         bootloader_type = LOADER_TYPE;
578
579 #ifdef CONFIG_BLK_DEV_RAM
580         rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
581         rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
582         rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
583 #endif
584         setup_memory_region();
585         copy_edd();
586
587         if (!MOUNT_ROOT_RDONLY)
588                 root_mountflags &= ~MS_RDONLY;
589         init_mm.start_code = (unsigned long) &_text;
590         init_mm.end_code = (unsigned long) &_etext;
591         init_mm.end_data = (unsigned long) &_edata;
592         init_mm.brk = (unsigned long) &_end;
593
594         code_resource.start = virt_to_phys(&_text);
595         code_resource.end = virt_to_phys(&_etext)-1;
596         data_resource.start = virt_to_phys(&_etext);
597         data_resource.end = virt_to_phys(&_edata)-1;
598
599         parse_cmdline_early(cmdline_p);
600
601         early_identify_cpu(&boot_cpu_data);
602
603         /*
604          * partially used pages are not usable - thus
605          * we are rounding upwards:
606          */
607         end_pfn = e820_end_of_ram();
608
609         check_efer();
610
611         init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT));
612
613         zap_low_mappings(0);
614
615 #ifdef CONFIG_ACPI
616         /*
617          * Initialize the ACPI boot-time table parser (gets the RSDP and SDT).
618          * Call this early for SRAT node setup.
619          */
620         acpi_boot_table_init();
621 #endif
622
623 #ifdef CONFIG_ACPI_NUMA
624         /*
625          * Parse SRAT to discover nodes.
626          */
627         acpi_numa_init();
628 #endif
629
630 #ifdef CONFIG_NUMA
631         numa_initmem_init(0, end_pfn); 
632 #else
633         contig_initmem_init(0, end_pfn);
634 #endif
635
636         /* Reserve direct mapping */
637         reserve_bootmem_generic(table_start << PAGE_SHIFT, 
638                                 (table_end - table_start) << PAGE_SHIFT);
639
640         /* reserve kernel */
641         kernel_end = round_up(__pa_symbol(&_end),PAGE_SIZE);
642         reserve_bootmem_generic(HIGH_MEMORY, kernel_end - HIGH_MEMORY);
643
644         /*
645          * reserve physical page 0 - it's a special BIOS page on many boxes,
646          * enabling clean reboots, SMP operation, laptop functions.
647          */
648         reserve_bootmem_generic(0, PAGE_SIZE);
649
650         /* reserve ebda region */
651         reserve_ebda_region();
652
653 #ifdef CONFIG_SMP
654         /*
655          * But first pinch a few for the stack/trampoline stuff
656          * FIXME: Don't need the extra page at 4K, but need to fix
657          * trampoline before removing it. (see the GDT stuff)
658          */
659         reserve_bootmem_generic(PAGE_SIZE, PAGE_SIZE);
660
661         /* Reserve SMP trampoline */
662         reserve_bootmem_generic(SMP_TRAMPOLINE_BASE, PAGE_SIZE);
663 #endif
664
665 #ifdef CONFIG_ACPI_SLEEP
666        /*
667         * Reserve low memory region for sleep support.
668         */
669        acpi_reserve_bootmem();
670 #endif
671 #ifdef CONFIG_X86_LOCAL_APIC
672         /*
673          * Find and reserve possible boot-time SMP configuration:
674          */
675         find_smp_config();
676 #endif
677 #ifdef CONFIG_BLK_DEV_INITRD
678         if (LOADER_TYPE && INITRD_START) {
679                 if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) {
680                         reserve_bootmem_generic(INITRD_START, INITRD_SIZE);
681                         initrd_start =
682                                 INITRD_START ? INITRD_START + PAGE_OFFSET : 0;
683                         initrd_end = initrd_start+INITRD_SIZE;
684                 }
685                 else {
686                         printk(KERN_ERR "initrd extends beyond end of memory "
687                             "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
688                             (unsigned long)(INITRD_START + INITRD_SIZE),
689                             (unsigned long)(end_pfn << PAGE_SHIFT));
690                         initrd_start = 0;
691                 }
692         }
693 #endif
694 #ifdef CONFIG_KEXEC
695         if (crashk_res.start != crashk_res.end) {
696                 reserve_bootmem(crashk_res.start,
697                         crashk_res.end - crashk_res.start + 1);
698         }
699 #endif
700
701         paging_init();
702
703         check_ioapic();
704
705 #ifdef CONFIG_ACPI
706         /*
707          * Read APIC and some other early information from ACPI tables.
708          */
709         acpi_boot_init();
710 #endif
711
712         init_cpu_to_node();
713
714 #ifdef CONFIG_X86_LOCAL_APIC
715         /*
716          * get boot-time SMP configuration:
717          */
718         if (smp_found_config)
719                 get_smp_config();
720         init_apic_mappings();
721 #endif
722
723         /*
724          * Request address space for all standard RAM and ROM resources
725          * and also for regions reported as reserved by the e820.
726          */
727         probe_roms();
728         e820_reserve_resources(); 
729
730         request_resource(&iomem_resource, &video_ram_resource);
731
732         {
733         unsigned i;
734         /* request I/O space for devices used on all i[345]86 PCs */
735         for (i = 0; i < STANDARD_IO_RESOURCES; i++)
736                 request_resource(&ioport_resource, &standard_io_resources[i]);
737         }
738
739         e820_setup_gap();
740
741 #ifdef CONFIG_GART_IOMMU
742        iommu_hole_init();
743 #endif
744
745 #ifdef CONFIG_VT
746 #if defined(CONFIG_VGA_CONSOLE)
747         conswitchp = &vga_con;
748 #elif defined(CONFIG_DUMMY_CONSOLE)
749         conswitchp = &dummy_con;
750 #endif
751 #endif
752 }
753
754 static int __cpuinit get_model_name(struct cpuinfo_x86 *c)
755 {
756         unsigned int *v;
757
758         if (c->extended_cpuid_level < 0x80000004)
759                 return 0;
760
761         v = (unsigned int *) c->x86_model_id;
762         cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
763         cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
764         cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
765         c->x86_model_id[48] = 0;
766         return 1;
767 }
768
769
770 static void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
771 {
772         unsigned int n, dummy, eax, ebx, ecx, edx;
773
774         n = c->extended_cpuid_level;
775
776         if (n >= 0x80000005) {
777                 cpuid(0x80000005, &dummy, &ebx, &ecx, &edx);
778                 printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
779                         edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
780                 c->x86_cache_size=(ecx>>24)+(edx>>24);
781                 /* On K8 L1 TLB is inclusive, so don't count it */
782                 c->x86_tlbsize = 0;
783         }
784
785         if (n >= 0x80000006) {
786                 cpuid(0x80000006, &dummy, &ebx, &ecx, &edx);
787                 ecx = cpuid_ecx(0x80000006);
788                 c->x86_cache_size = ecx >> 16;
789                 c->x86_tlbsize += ((ebx >> 16) & 0xfff) + (ebx & 0xfff);
790
791                 printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
792                 c->x86_cache_size, ecx & 0xFF);
793         }
794
795         if (n >= 0x80000007)
796                 cpuid(0x80000007, &dummy, &dummy, &dummy, &c->x86_power); 
797         if (n >= 0x80000008) {
798                 cpuid(0x80000008, &eax, &dummy, &dummy, &dummy); 
799                 c->x86_virt_bits = (eax >> 8) & 0xff;
800                 c->x86_phys_bits = eax & 0xff;
801         }
802 }
803
804 #ifdef CONFIG_NUMA
805 static int nearby_node(int apicid)
806 {
807         int i;
808         for (i = apicid - 1; i >= 0; i--) {
809                 int node = apicid_to_node[i];
810                 if (node != NUMA_NO_NODE && node_online(node))
811                         return node;
812         }
813         for (i = apicid + 1; i < MAX_LOCAL_APIC; i++) {
814                 int node = apicid_to_node[i];
815                 if (node != NUMA_NO_NODE && node_online(node))
816                         return node;
817         }
818         return first_node(node_online_map); /* Shouldn't happen */
819 }
820 #endif
821
822 /*
823  * On a AMD dual core setup the lower bits of the APIC id distingush the cores.
824  * Assumes number of cores is a power of two.
825  */
826 static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
827 {
828 #ifdef CONFIG_SMP
829         int cpu = smp_processor_id();
830         unsigned bits;
831 #ifdef CONFIG_NUMA
832         int node = 0;
833         unsigned apicid = phys_proc_id[cpu];
834 #endif
835
836         bits = 0;
837         while ((1 << bits) < c->x86_max_cores)
838                 bits++;
839
840         /* Low order bits define the core id (index of core in socket) */
841         cpu_core_id[cpu] = phys_proc_id[cpu] & ((1 << bits)-1);
842         /* Convert the APIC ID into the socket ID */
843         phys_proc_id[cpu] >>= bits;
844
845 #ifdef CONFIG_NUMA
846         node = phys_proc_id[cpu];
847         if (apicid_to_node[apicid] != NUMA_NO_NODE)
848                 node = apicid_to_node[apicid];
849         if (!node_online(node)) {
850                 /* Two possibilities here:
851                    - The CPU is missing memory and no node was created.
852                    In that case try picking one from a nearby CPU
853                    - The APIC IDs differ from the HyperTransport node IDs
854                    which the K8 northbridge parsing fills in.
855                    Assume they are all increased by a constant offset,
856                    but in the same order as the HT nodeids.
857                    If that doesn't result in a usable node fall back to the
858                    path for the previous case.  */
859                 int ht_nodeid = apicid - (phys_proc_id[0] << bits);
860                 if (ht_nodeid >= 0 &&
861                     apicid_to_node[ht_nodeid] != NUMA_NO_NODE)
862                         node = apicid_to_node[ht_nodeid];
863                 /* Pick a nearby node */
864                 if (!node_online(node))
865                         node = nearby_node(apicid);
866         }
867         numa_set_node(cpu, node);
868
869         printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n",
870                         cpu, c->x86_max_cores, node, cpu_core_id[cpu]);
871 #endif
872 #endif
873 }
874
875 static int __init init_amd(struct cpuinfo_x86 *c)
876 {
877         int r;
878
879 #ifdef CONFIG_SMP
880         unsigned long value;
881
882         /*
883          * Disable TLB flush filter by setting HWCR.FFDIS on K8
884          * bit 6 of msr C001_0015
885          *
886          * Errata 63 for SH-B3 steppings
887          * Errata 122 for all steppings (F+ have it disabled by default)
888          */
889         if (c->x86 == 15) {
890                 rdmsrl(MSR_K8_HWCR, value);
891                 value |= 1 << 6;
892                 wrmsrl(MSR_K8_HWCR, value);
893         }
894 #endif
895
896         /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
897            3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
898         clear_bit(0*32+31, &c->x86_capability);
899         
900         r = get_model_name(c);
901         if (!r) { 
902                 switch (c->x86) { 
903                 case 15:
904                         /* Should distinguish Models here, but this is only
905                            a fallback anyways. */
906                         strcpy(c->x86_model_id, "Hammer");
907                         break; 
908                 } 
909         } 
910         display_cacheinfo(c);
911
912         /* c->x86_power is 8000_0007 edx. Bit 8 is constant TSC */
913         if (c->x86_power & (1<<8))
914                 set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
915
916         if (c->extended_cpuid_level >= 0x80000008) {
917                 c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
918                 if (c->x86_max_cores & (c->x86_max_cores - 1))
919                         c->x86_max_cores = 1;
920
921                 amd_detect_cmp(c);
922         }
923
924         return r;
925 }
926
927 static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
928 {
929 #ifdef CONFIG_SMP
930         u32     eax, ebx, ecx, edx;
931         int     index_msb, core_bits;
932         int     cpu = smp_processor_id();
933
934         cpuid(1, &eax, &ebx, &ecx, &edx);
935
936         c->apicid = phys_pkg_id(0);
937
938         if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
939                 return;
940
941         smp_num_siblings = (ebx & 0xff0000) >> 16;
942
943         if (smp_num_siblings == 1) {
944                 printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
945         } else if (smp_num_siblings > 1 ) {
946
947                 if (smp_num_siblings > NR_CPUS) {
948                         printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
949                         smp_num_siblings = 1;
950                         return;
951                 }
952
953                 index_msb = get_count_order(smp_num_siblings);
954                 phys_proc_id[cpu] = phys_pkg_id(index_msb);
955
956                 printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
957                        phys_proc_id[cpu]);
958
959                 smp_num_siblings = smp_num_siblings / c->x86_max_cores;
960
961                 index_msb = get_count_order(smp_num_siblings) ;
962
963                 core_bits = get_count_order(c->x86_max_cores);
964
965                 cpu_core_id[cpu] = phys_pkg_id(index_msb) &
966                                                ((1 << core_bits) - 1);
967
968                 if (c->x86_max_cores > 1)
969                         printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
970                                cpu_core_id[cpu]);
971         }
972 #endif
973 }
974
975 /*
976  * find out the number of processor cores on the die
977  */
978 static int __cpuinit intel_num_cpu_cores(struct cpuinfo_x86 *c)
979 {
980         unsigned int eax;
981
982         if (c->cpuid_level < 4)
983                 return 1;
984
985         __asm__("cpuid"
986                 : "=a" (eax)
987                 : "0" (4), "c" (0)
988                 : "bx", "dx");
989
990         if (eax & 0x1f)
991                 return ((eax >> 26) + 1);
992         else
993                 return 1;
994 }
995
996 static void srat_detect_node(void)
997 {
998 #ifdef CONFIG_NUMA
999         unsigned node;
1000         int cpu = smp_processor_id();
1001
1002         /* Don't do the funky fallback heuristics the AMD version employs
1003            for now. */
1004         node = apicid_to_node[hard_smp_processor_id()];
1005         if (node == NUMA_NO_NODE)
1006                 node = 0;
1007         numa_set_node(cpu, node);
1008
1009         if (acpi_numa > 0)
1010                 printk(KERN_INFO "CPU %d -> Node %d\n", cpu, node);
1011 #endif
1012 }
1013
1014 static void __cpuinit init_intel(struct cpuinfo_x86 *c)
1015 {
1016         /* Cache sizes */
1017         unsigned n;
1018
1019         init_intel_cacheinfo(c);
1020         n = c->extended_cpuid_level;
1021         if (n >= 0x80000008) {
1022                 unsigned eax = cpuid_eax(0x80000008);
1023                 c->x86_virt_bits = (eax >> 8) & 0xff;
1024                 c->x86_phys_bits = eax & 0xff;
1025                 /* CPUID workaround for Intel 0F34 CPU */
1026                 if (c->x86_vendor == X86_VENDOR_INTEL &&
1027                     c->x86 == 0xF && c->x86_model == 0x3 &&
1028                     c->x86_mask == 0x4)
1029                         c->x86_phys_bits = 36;
1030         }
1031
1032         if (c->x86 == 15)
1033                 c->x86_cache_alignment = c->x86_clflush_size * 2;
1034         if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
1035             (c->x86 == 0x6 && c->x86_model >= 0x0e))
1036                 set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
1037         set_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
1038         c->x86_max_cores = intel_num_cpu_cores(c);
1039
1040         srat_detect_node();
1041 }
1042
1043 static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
1044 {
1045         char *v = c->x86_vendor_id;
1046
1047         if (!strcmp(v, "AuthenticAMD"))
1048                 c->x86_vendor = X86_VENDOR_AMD;
1049         else if (!strcmp(v, "GenuineIntel"))
1050                 c->x86_vendor = X86_VENDOR_INTEL;
1051         else
1052                 c->x86_vendor = X86_VENDOR_UNKNOWN;
1053 }
1054
1055 struct cpu_model_info {
1056         int vendor;
1057         int family;
1058         char *model_names[16];
1059 };
1060
1061 /* Do some early cpuid on the boot CPU to get some parameter that are
1062    needed before check_bugs. Everything advanced is in identify_cpu
1063    below. */
1064 void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
1065 {
1066         u32 tfms;
1067
1068         c->loops_per_jiffy = loops_per_jiffy;
1069         c->x86_cache_size = -1;
1070         c->x86_vendor = X86_VENDOR_UNKNOWN;
1071         c->x86_model = c->x86_mask = 0; /* So far unknown... */
1072         c->x86_vendor_id[0] = '\0'; /* Unset */
1073         c->x86_model_id[0] = '\0';  /* Unset */
1074         c->x86_clflush_size = 64;
1075         c->x86_cache_alignment = c->x86_clflush_size;
1076         c->x86_max_cores = 1;
1077         c->extended_cpuid_level = 0;
1078         memset(&c->x86_capability, 0, sizeof c->x86_capability);
1079
1080         /* Get vendor name */
1081         cpuid(0x00000000, (unsigned int *)&c->cpuid_level,
1082               (unsigned int *)&c->x86_vendor_id[0],
1083               (unsigned int *)&c->x86_vendor_id[8],
1084               (unsigned int *)&c->x86_vendor_id[4]);
1085                 
1086         get_cpu_vendor(c);
1087
1088         /* Initialize the standard set of capabilities */
1089         /* Note that the vendor-specific code below might override */
1090
1091         /* Intel-defined flags: level 0x00000001 */
1092         if (c->cpuid_level >= 0x00000001) {
1093                 __u32 misc;
1094                 cpuid(0x00000001, &tfms, &misc, &c->x86_capability[4],
1095                       &c->x86_capability[0]);
1096                 c->x86 = (tfms >> 8) & 0xf;
1097                 c->x86_model = (tfms >> 4) & 0xf;
1098                 c->x86_mask = tfms & 0xf;
1099                 if (c->x86 == 0xf)
1100                         c->x86 += (tfms >> 20) & 0xff;
1101                 if (c->x86 >= 0x6)
1102                         c->x86_model += ((tfms >> 16) & 0xF) << 4;
1103                 if (c->x86_capability[0] & (1<<19)) 
1104                         c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
1105         } else {
1106                 /* Have CPUID level 0 only - unheard of */
1107                 c->x86 = 4;
1108         }
1109
1110 #ifdef CONFIG_SMP
1111         phys_proc_id[smp_processor_id()] = (cpuid_ebx(1) >> 24) & 0xff;
1112 #endif
1113 }
1114
1115 /*
1116  * This does the hard work of actually picking apart the CPU stuff...
1117  */
1118 void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
1119 {
1120         int i;
1121         u32 xlvl;
1122
1123         early_identify_cpu(c);
1124
1125         /* AMD-defined flags: level 0x80000001 */
1126         xlvl = cpuid_eax(0x80000000);
1127         c->extended_cpuid_level = xlvl;
1128         if ((xlvl & 0xffff0000) == 0x80000000) {
1129                 if (xlvl >= 0x80000001) {
1130                         c->x86_capability[1] = cpuid_edx(0x80000001);
1131                         c->x86_capability[6] = cpuid_ecx(0x80000001);
1132                 }
1133                 if (xlvl >= 0x80000004)
1134                         get_model_name(c); /* Default name */
1135         }
1136
1137         /* Transmeta-defined flags: level 0x80860001 */
1138         xlvl = cpuid_eax(0x80860000);
1139         if ((xlvl & 0xffff0000) == 0x80860000) {
1140                 /* Don't set x86_cpuid_level here for now to not confuse. */
1141                 if (xlvl >= 0x80860001)
1142                         c->x86_capability[2] = cpuid_edx(0x80860001);
1143         }
1144
1145         /*
1146          * Vendor-specific initialization.  In this section we
1147          * canonicalize the feature flags, meaning if there are
1148          * features a certain CPU supports which CPUID doesn't
1149          * tell us, CPUID claiming incorrect flags, or other bugs,
1150          * we handle them here.
1151          *
1152          * At the end of this section, c->x86_capability better
1153          * indicate the features this CPU genuinely supports!
1154          */
1155         switch (c->x86_vendor) {
1156         case X86_VENDOR_AMD:
1157                 init_amd(c);
1158                 break;
1159
1160         case X86_VENDOR_INTEL:
1161                 init_intel(c);
1162                 break;
1163
1164         case X86_VENDOR_UNKNOWN:
1165         default:
1166                 display_cacheinfo(c);
1167                 break;
1168         }
1169
1170         select_idle_routine(c);
1171         detect_ht(c); 
1172
1173         /*
1174          * On SMP, boot_cpu_data holds the common feature set between
1175          * all CPUs; so make sure that we indicate which features are
1176          * common between the CPUs.  The first time this routine gets
1177          * executed, c == &boot_cpu_data.
1178          */
1179         if (c != &boot_cpu_data) {
1180                 /* AND the already accumulated flags with these */
1181                 for (i = 0 ; i < NCAPINTS ; i++)
1182                         boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
1183         }
1184
1185 #ifdef CONFIG_X86_MCE
1186         mcheck_init(c);
1187 #endif
1188         if (c == &boot_cpu_data)
1189                 mtrr_bp_init();
1190         else
1191                 mtrr_ap_init();
1192 #ifdef CONFIG_NUMA
1193         numa_add_cpu(smp_processor_id());
1194 #endif
1195 }
1196  
1197
1198 void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
1199 {
1200         if (c->x86_model_id[0])
1201                 printk("%s", c->x86_model_id);
1202
1203         if (c->x86_mask || c->cpuid_level >= 0) 
1204                 printk(" stepping %02x\n", c->x86_mask);
1205         else
1206                 printk("\n");
1207 }
1208
1209 /*
1210  *      Get CPU information for use by the procfs.
1211  */
1212
1213 static int show_cpuinfo(struct seq_file *m, void *v)
1214 {
1215         struct cpuinfo_x86 *c = v;
1216
1217         /* 
1218          * These flag bits must match the definitions in <asm/cpufeature.h>.
1219          * NULL means this bit is undefined or reserved; either way it doesn't
1220          * have meaning as far as Linux is concerned.  Note that it's important
1221          * to realize there is a difference between this table and CPUID -- if
1222          * applications want to get the raw CPUID data, they should access
1223          * /dev/cpu/<cpu_nr>/cpuid instead.
1224          */
1225         static char *x86_cap_flags[] = {
1226                 /* Intel-defined */
1227                 "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
1228                 "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",
1229                 "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx",
1230                 "fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", NULL,
1231
1232                 /* AMD-defined */
1233                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1234                 NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
1235                 NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL,
1236                 NULL, "fxsr_opt", "rdtscp", NULL, NULL, "lm", "3dnowext", "3dnow",
1237
1238                 /* Transmeta-defined */
1239                 "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
1240                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1241                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1242                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1243
1244                 /* Other (Linux-defined) */
1245                 "cxmmx", NULL, "cyrix_arr", "centaur_mcr", NULL,
1246                 "constant_tsc", NULL, NULL,
1247                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1248                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1249                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1250
1251                 /* Intel-defined (#2) */
1252                 "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", NULL, "est",
1253                 "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL,
1254                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1255                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1256
1257                 /* VIA/Cyrix/Centaur-defined */
1258                 NULL, NULL, "rng", "rng_en", NULL, NULL, "ace", "ace_en",
1259                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1260                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1261                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1262
1263                 /* AMD-defined (#2) */
1264                 "lahf_lm", "cmp_legacy", "svm", NULL, "cr8_legacy", NULL, NULL, NULL,
1265                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1266                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1267                 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1268         };
1269         static char *x86_power_flags[] = { 
1270                 "ts",   /* temperature sensor */
1271                 "fid",  /* frequency id control */
1272                 "vid",  /* voltage id control */
1273                 "ttp",  /* thermal trip */
1274                 "tm",
1275                 "stc",
1276                 NULL,
1277                 /* nothing */   /* constant_tsc - moved to flags */
1278         };
1279
1280
1281 #ifdef CONFIG_SMP
1282         if (!cpu_online(c-cpu_data))
1283                 return 0;
1284 #endif
1285
1286         seq_printf(m,"processor\t: %u\n"
1287                      "vendor_id\t: %s\n"
1288                      "cpu family\t: %d\n"
1289                      "model\t\t: %d\n"
1290                      "model name\t: %s\n",
1291                      (unsigned)(c-cpu_data),
1292                      c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
1293                      c->x86,
1294                      (int)c->x86_model,
1295                      c->x86_model_id[0] ? c->x86_model_id : "unknown");
1296         
1297         if (c->x86_mask || c->cpuid_level >= 0)
1298                 seq_printf(m, "stepping\t: %d\n", c->x86_mask);
1299         else
1300                 seq_printf(m, "stepping\t: unknown\n");
1301         
1302         if (cpu_has(c,X86_FEATURE_TSC)) {
1303                 unsigned int freq = cpufreq_quick_get((unsigned)(c-cpu_data));
1304                 if (!freq)
1305                         freq = cpu_khz;
1306                 seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
1307                              freq / 1000, (freq % 1000));
1308         }
1309
1310         /* Cache size */
1311         if (c->x86_cache_size >= 0) 
1312                 seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
1313         
1314 #ifdef CONFIG_SMP
1315         if (smp_num_siblings * c->x86_max_cores > 1) {
1316                 int cpu = c - cpu_data;
1317                 seq_printf(m, "physical id\t: %d\n", phys_proc_id[cpu]);
1318                 seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[cpu]));
1319                 seq_printf(m, "core id\t\t: %d\n", cpu_core_id[cpu]);
1320                 seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
1321         }
1322 #endif  
1323
1324         seq_printf(m,
1325                 "fpu\t\t: yes\n"
1326                 "fpu_exception\t: yes\n"
1327                 "cpuid level\t: %d\n"
1328                 "wp\t\t: yes\n"
1329                 "flags\t\t:",
1330                    c->cpuid_level);
1331
1332         { 
1333                 int i; 
1334                 for ( i = 0 ; i < 32*NCAPINTS ; i++ )
1335                         if ( test_bit(i, &c->x86_capability) &&
1336                              x86_cap_flags[i] != NULL )
1337                                 seq_printf(m, " %s", x86_cap_flags[i]);
1338         }
1339                 
1340         seq_printf(m, "\nbogomips\t: %lu.%02lu\n",
1341                    c->loops_per_jiffy/(500000/HZ),
1342                    (c->loops_per_jiffy/(5000/HZ)) % 100);
1343
1344         if (c->x86_tlbsize > 0) 
1345                 seq_printf(m, "TLB size\t: %d 4K pages\n", c->x86_tlbsize);
1346         seq_printf(m, "clflush size\t: %d\n", c->x86_clflush_size);
1347         seq_printf(m, "cache_alignment\t: %d\n", c->x86_cache_alignment);
1348
1349         seq_printf(m, "address sizes\t: %u bits physical, %u bits virtual\n", 
1350                    c->x86_phys_bits, c->x86_virt_bits);
1351
1352         seq_printf(m, "power management:");
1353         {
1354                 unsigned i;
1355                 for (i = 0; i < 32; i++) 
1356                         if (c->x86_power & (1 << i)) {
1357                                 if (i < ARRAY_SIZE(x86_power_flags) &&
1358                                         x86_power_flags[i])
1359                                         seq_printf(m, "%s%s",
1360                                                 x86_power_flags[i][0]?" ":"",
1361                                                 x86_power_flags[i]);
1362                                 else
1363                                         seq_printf(m, " [%d]", i);
1364                         }
1365         }
1366
1367         seq_printf(m, "\n\n");
1368
1369         return 0;
1370 }
1371
1372 static void *c_start(struct seq_file *m, loff_t *pos)
1373 {
1374         return *pos < NR_CPUS ? cpu_data + *pos : NULL;
1375 }
1376
1377 static void *c_next(struct seq_file *m, void *v, loff_t *pos)
1378 {
1379         ++*pos;
1380         return c_start(m, pos);
1381 }
1382
1383 static void c_stop(struct seq_file *m, void *v)
1384 {
1385 }
1386
1387 struct seq_operations cpuinfo_op = {
1388         .start =c_start,
1389         .next = c_next,
1390         .stop = c_stop,
1391         .show = show_cpuinfo,
1392 };
1393
1394 static int __init run_dmi_scan(void)
1395 {
1396         dmi_scan_machine();
1397         return 0;
1398 }
1399 core_initcall(run_dmi_scan);
1400