Blame view

arch/x86/kernel/setup.c 25.6 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   *  Copyright (C) 1995  Linus Torvalds
   *
   *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
   *
   *  Memory region support
   *	David Parsons <orc@pell.chi.il.us>, July-August 1999
   *
   *  Added E820 sanitization routine (removes overlapping memory regions);
   *  Brian Moyle <bmoyle@mvista.com>, February 2001
   *
   * Moved CPU detection code to cpu/${cpu}.c
   *    Patrick Mochel <mochel@osdl.org>, March 2002
   *
   *  Provisions for empty E820 memory regions (reported by certain BIOSes).
   *  Alex Achenbach <xela@slit.de>, December 2002.
   *
   */
  
  /*
   * This file handles the architecture-dependent parts of initialization
   */
  
  #include <linux/sched.h>
  #include <linux/mm.h>
05b79bdcb   Andy Whitcroft   [PATCH] sparsemem...
26
  #include <linux/mmzone.h>
894673ee6   Jon Smirl   [PATCH] tty: Remo...
27
  #include <linux/screen_info.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
  #include <linux/ioport.h>
  #include <linux/acpi.h>
efafc8b21   Feng Tang   x86: add arch-spe...
30
  #include <linux/sfi.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
  #include <linux/apm_bios.h>
  #include <linux/initrd.h>
  #include <linux/bootmem.h>
72d7c3b33   Yinghai Lu   x86: Use memblock...
34
  #include <linux/memblock.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
40
41
42
43
  #include <linux/seq_file.h>
  #include <linux/console.h>
  #include <linux/mca.h>
  #include <linux/root_dev.h>
  #include <linux/highmem.h>
  #include <linux/module.h>
  #include <linux/efi.h>
  #include <linux/init.h>
  #include <linux/edd.h>
138fe4e06   Konrad Rzeszutek   Firmware: add iSC...
44
  #include <linux/iscsi_ibft.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
  #include <linux/nodemask.h>
1bc3b91ae   Eric W. Biederman   [PATCH] crashdump...
46
  #include <linux/kexec.h>
e99286744   Andi Kleen   [PATCH] x86_64: G...
47
  #include <linux/dmi.h>
22a9835c3   Dave Hansen   [PATCH] unify PFN...
48
  #include <linux/pfn.h>
376ff0352   Thomas Gleixner   x86: move acpi an...
49
  #include <linux/pci.h>
46d671b52   Yinghai Lu   x86: add extra in...
50
  #include <asm/pci-direct.h>
f212ec4b7   Bernhard Kaindl   x86: early boot d...
51
  #include <linux/init_ohci1394_dma.h>
790c73f62   Glauber de Oliveira Costa   x86: KVM guest: p...
52
  #include <linux/kvm_para.h>
1bc3b91ae   Eric W. Biederman   [PATCH] crashdump...
53

46d671b52   Yinghai Lu   x86: add extra in...
54
55
56
57
58
  #include <linux/errno.h>
  #include <linux/kernel.h>
  #include <linux/stddef.h>
  #include <linux/unistd.h>
  #include <linux/ptrace.h>
46d671b52   Yinghai Lu   x86: add extra in...
59
60
  #include <linux/user.h>
  #include <linux/delay.h>
46d671b52   Yinghai Lu   x86: add extra in...
61
62
  
  #include <linux/kallsyms.h>
46d671b52   Yinghai Lu   x86: add extra in...
63
64
65
66
67
68
69
  #include <linux/cpufreq.h>
  #include <linux/dma-mapping.h>
  #include <linux/ctype.h>
  #include <linux/uaccess.h>
  
  #include <linux/percpu.h>
  #include <linux/crash_dump.h>
69575d388   Shane Wang   x86, intel_txt: c...
70
  #include <linux/tboot.h>
46d671b52   Yinghai Lu   x86: add extra in...
71

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
  #include <video/edid.h>
1bc3b91ae   Eric W. Biederman   [PATCH] crashdump...
73

093af8d7f   Yinghai Lu   x86_32: trim memo...
74
  #include <asm/mtrr.h>
9635b47d9   Eric W. Biederman   [PATCH] kexec: x8...
75
  #include <asm/apic.h>
893f38d14   Yinghai Lu   x86: Use find_e82...
76
  #include <asm/trampoline.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
79
  #include <asm/e820.h>
  #include <asm/mpspec.h>
  #include <asm/setup.h>
55f262391   Yinghai Lu   x86: rename setup...
80
  #include <asm/efi.h>
8e6dafd6c   Ingo Molnar   x86: refactor x86...
81
82
  #include <asm/timer.h>
  #include <asm/i8259.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
  #include <asm/sections.h>
1c6e55032   Yinghai Lu   x86: use acpi_num...
84
  #include <asm/dmi.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
  #include <asm/io_apic.h>
  #include <asm/ist.h>
1164dd009   Ingo Molnar   x86: move mach-de...
87
  #include <asm/setup_arch.h>
ce3fe6b2b   Alexey Starikovskiy   x86: use get_bios...
88
  #include <asm/bios_ebda.h>
00bf4098b   Bernhard Walle   kexec: add BSS to...
89
  #include <asm/cacheflush.h>
2fde61fdb   Alexander van Heukelum   x86: reserve end-...
90
  #include <asm/processor.h>
cc9f7a0cc   Yinghai Lu   x86: kill bad_ppro
91
  #include <asm/bugs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92

46d671b52   Yinghai Lu   x86: add extra in...
93
94
  #include <asm/system.h>
  #include <asm/vsyscall.h>
6e5385d44   Jaswinder Singh Rajput   x86: smp.h move p...
95
  #include <asm/cpu.h>
46d671b52   Yinghai Lu   x86: add extra in...
96
97
  #include <asm/desc.h>
  #include <asm/dma.h>
46a7fa270   FUJITA Tomonori   x86: make only GA...
98
  #include <asm/iommu.h>
1d9b16d16   Joerg Roedel   x86: move GART sp...
99
  #include <asm/gart.h>
46d671b52   Yinghai Lu   x86: add extra in...
100
101
  #include <asm/mmu_context.h>
  #include <asm/proto.h>
46d671b52   Yinghai Lu   x86: add extra in...
102
  #include <asm/paravirt.h>
88b094fb8   Alok Kataria   x86: Hypervisor d...
103
  #include <asm/hypervisor.h>
fd699c765   Andres Salomon   x86, olpc: Add su...
104
  #include <asm/olpc_ofw.h>
46d671b52   Yinghai Lu   x86: add extra in...
105
106
  
  #include <asm/percpu.h>
46d671b52   Yinghai Lu   x86: add extra in...
107
108
  #include <asm/topology.h>
  #include <asm/apicdef.h>
23ac4ae82   Andreas Herrmann   x86, k8: Rename k...
109
  #include <asm/amd_nb.h>
55f262391   Yinghai Lu   x86: rename setup...
110
111
112
  #ifdef CONFIG_X86_64
  #include <asm/numa_64.h>
  #endif
a2202aa29   Yong Wang   x86: Under BIOS c...
113
  #include <asm/mce.h>
f49aa4485   Jason Baron   jump label: Make ...
114
  #include <asm/alternative.h>
da6b737b9   Sebastian Andrzej Siewior   x86: Add device t...
115
  #include <asm/prom.h>
46d671b52   Yinghai Lu   x86: add extra in...
116

2b72394e4   Pekka Enberg   x86: move max_pfn...
117
118
119
120
121
122
123
  /*
   * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries.
   * The direct mapping extends to max_pfn_mapped, so that we can directly access
   * apertures, ACPI and other tables without having to play with fixmaps.
   */
  unsigned long max_low_pfn_mapped;
  unsigned long max_pfn_mapped;
e808bae24   Thadeu Lima de Souza Cascardo   x86: Do not reser...
124
  #ifdef CONFIG_DMI
796216a57   Jeremy Fitzhardinge   x86: allow extend...
125
  RESERVE_BRK(dmi_alloc, 65536);
e808bae24   Thadeu Lima de Souza Cascardo   x86: Do not reser...
126
  #endif
796216a57   Jeremy Fitzhardinge   x86: allow extend...
127

c0b5842a4   Ingo Molnar   x86: generalize b...
128

93dbda7cb   Jeremy Fitzhardinge   x86: add brk allo...
129
130
  static __initdata unsigned long _brk_start = (unsigned long)__brk_base;
  unsigned long _brk_end = (unsigned long)__brk_base;
c0b5842a4   Ingo Molnar   x86: generalize b...
131
132
133
134
135
  #ifdef CONFIG_X86_64
  int default_cpu_present_to_apicid(int mps_cpu)
  {
  	return __default_cpu_present_to_apicid(mps_cpu);
  }
e11dadabf   Thomas Gleixner   x86: apic namespa...
136
  int default_check_phys_apicid_present(int phys_apicid)
c0b5842a4   Ingo Molnar   x86: generalize b...
137
  {
e11dadabf   Thomas Gleixner   x86: apic namespa...
138
  	return __default_check_phys_apicid_present(phys_apicid);
c0b5842a4   Ingo Molnar   x86: generalize b...
139
140
  }
  #endif
217b8ce89   Yinghai Lu   x86: move boot_pa...
141
142
143
144
145
  #ifndef CONFIG_DEBUG_BOOT_PARAMS
  struct boot_params __initdata boot_params;
  #else
  struct boot_params boot_params;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
147
148
  /*
   * Machine setup..
   */
c9cce83dd   Bernhard Walle   x86: remove exter...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  static struct resource data_resource = {
  	.name	= "Kernel data",
  	.start	= 0,
  	.end	= 0,
  	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
  };
  
  static struct resource code_resource = {
  	.name	= "Kernel code",
  	.start	= 0,
  	.end	= 0,
  	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
  };
  
  static struct resource bss_resource = {
  	.name	= "Kernel bss",
  	.start	= 0,
  	.end	= 0,
  	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
  };
7dea23ecd   Yinghai Lu   x86: put global v...
169
170
  
  #ifdef CONFIG_X86_32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  /* cpu data as detected by the assembly code in head.S */
7dea23ecd   Yinghai Lu   x86: put global v...
172
  struct cpuinfo_x86 new_cpu_data __cpuinitdata = {0, 0, 0, 0, -1, 1, 0, 0, -1};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
  /* common cpu data for all cpus */
7dea23ecd   Yinghai Lu   x86: put global v...
174
  struct cpuinfo_x86 boot_cpu_data __read_mostly = {0, 0, 0, 0, -1, 1, 0, 0, -1};
129f69465   Alexey Dobriyan   [PATCH] Remove i3...
175
  EXPORT_SYMBOL(boot_cpu_data);
7dea23ecd   Yinghai Lu   x86: put global v...
176
177
178
179
180
181
  static void set_mca_bus(int x)
  {
  #ifdef CONFIG_MCA
  	MCA_bus = x;
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182

0c254e38d   Alexey Starikovskiy   x86: move def_to_...
183
  unsigned int def_to_bigsmp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
185
186
187
  /* for MCA, but anyone else can use it if they want */
  unsigned int machine_id;
  unsigned int machine_submodel_id;
  unsigned int BIOS_revision;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188

7dea23ecd   Yinghai Lu   x86: put global v...
189
190
191
192
193
194
195
196
197
198
199
200
  struct apm_info apm_info;
  EXPORT_SYMBOL(apm_info);
  
  #if defined(CONFIG_X86_SPEEDSTEP_SMI) || \
  	defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
  struct ist_info ist_info;
  EXPORT_SYMBOL(ist_info);
  #else
  struct ist_info ist_info;
  #endif
  
  #else
ed26dbe5a   Jeremy Fitzhardinge   x86: pre-initiali...
201
202
203
  struct cpuinfo_x86 boot_cpu_data __read_mostly = {
  	.x86_phys_bits = MAX_PHYSMEM_BITS,
  };
7dea23ecd   Yinghai Lu   x86: put global v...
204
205
206
207
208
209
210
211
212
  EXPORT_SYMBOL(boot_cpu_data);
  #endif
  
  
  #if !defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
  unsigned long mmu_cr4_features;
  #else
  unsigned long mmu_cr4_features = X86_CR4_PAE;
  #endif
5031296c5   H. Peter Anvin   x86: add extensio...
213
214
  /* Boot loader ID and version as integers, for the benefit of proc_dointvec */
  int bootloader_type, bootloader_version;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216
217
218
  /*
   * Setup options
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
  struct screen_info screen_info;
129f69465   Alexey Dobriyan   [PATCH] Remove i3...
220
  EXPORT_SYMBOL(screen_info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
  struct edid_info edid_info;
5e518d767   Antonino A. Daplas   [PATCH] fbdev: Re...
222
  EXPORT_SYMBOL_GPL(edid_info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
224
  extern int root_mountflags;
e44b7b752   Pavel Machek   x86: move suspend...
225
  unsigned long saved_video_mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226

cf8fa920c   H. Peter Anvin   i386: handle an i...
227
  #define RAMDISK_IMAGE_START_MASK	0x07FF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
  #define RAMDISK_PROMPT_FLAG		0x8000
cf8fa920c   H. Peter Anvin   i386: handle an i...
229
  #define RAMDISK_LOAD_FLAG		0x4000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230

4e498b661   Alon Bar-Lev   [PATCH] Dynamic k...
231
  static char __initdata command_line[COMMAND_LINE_SIZE];
516cbf373   Tim Bird   x86, bootup: add ...
232
233
234
  #ifdef CONFIG_CMDLINE_BOOL
  static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
237
238
239
240
241
242
243
244
245
  #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
  struct edd edd;
  #ifdef CONFIG_EDD_MODULE
  EXPORT_SYMBOL(edd);
  #endif
  /**
   * copy_edd() - Copy the BIOS EDD information
   *              from boot_params into a safe place.
   *
   */
9eaa192d8   Helight.Xu   x86: Fix a sectio...
246
  static inline void __init copy_edd(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
  {
30c826451   H. Peter Anvin   [x86] remove uses...
248
249
250
251
252
       memcpy(edd.mbr_signature, boot_params.edd_mbr_sig_buffer,
  	    sizeof(edd.mbr_signature));
       memcpy(edd.edd_info, boot_params.eddbuf, sizeof(edd.edd_info));
       edd.mbr_signature_nr = boot_params.edd_mbr_sig_buf_entries;
       edd.edd_info_nr = boot_params.eddbuf_entries;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
254
  }
  #else
9eaa192d8   Helight.Xu   x86: Fix a sectio...
255
  static inline void __init copy_edd(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
256
257
258
  {
  }
  #endif
5368a2be3   H. Peter Anvin   x86: move brk ini...
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
  void * __init extend_brk(size_t size, size_t align)
  {
  	size_t mask = align - 1;
  	void *ret;
  
  	BUG_ON(_brk_start == 0);
  	BUG_ON(align & mask);
  
  	_brk_end = (_brk_end + mask) & ~mask;
  	BUG_ON((char *)(_brk_end + size) > __brk_limit);
  
  	ret = (void *)_brk_end;
  	_brk_end += size;
  
  	memset(ret, 0, size);
  
  	return ret;
  }
854c879f5   Pekka J Enberg   x86: Move init_gb...
277
278
279
280
281
282
283
284
285
286
287
288
289
  #ifdef CONFIG_X86_64
  static void __init init_gbpages(void)
  {
  	if (direct_gbpages && cpu_has_gbpages)
  		printk(KERN_INFO "Using GB pages for direct mapping
  ");
  	else
  		direct_gbpages = 0;
  }
  #else
  static inline void init_gbpages(void)
  {
  }
e5f15b45d   Yinghai Lu   x86: Cleanup high...
290
  static void __init cleanup_highmap(void)
f005fe12b   Yinghai Lu   x86-64: Move out ...
291
292
  {
  }
854c879f5   Pekka J Enberg   x86: Move init_gb...
293
  #endif
5368a2be3   H. Peter Anvin   x86: move brk ini...
294
295
296
  static void __init reserve_brk(void)
  {
  	if (_brk_end > _brk_start)
24aa07882   Tejun Heo   memblock, x86: Re...
297
298
  		memblock_reserve(__pa(_brk_start),
  				 __pa(_brk_end) - __pa(_brk_start));
5368a2be3   H. Peter Anvin   x86: move brk ini...
299
300
301
302
303
  
  	/* Mark brk area as locked down and no longer taking any
  	   new allocations */
  	_brk_start = 0;
  }
cf8fa920c   H. Peter Anvin   i386: handle an i...
304
  #ifdef CONFIG_BLK_DEV_INITRD
eb1379cb2   Yinghai Lu   x86: update reser...
305
306
  #define MAX_MAP_CHUNK	(NR_FIX_BTMAPS << PAGE_SHIFT)
  static void __init relocate_initrd(void)
cf8fa920c   H. Peter Anvin   i386: handle an i...
307
  {
c967da6a0   Yinghai Lu   x86: Make sure fr...
308
  	/* Assume only end is not page aligned */
ba5b14cc0   Yinghai Lu   x86: extend e820 ...
309
310
  	u64 ramdisk_image = boot_params.hdr.ramdisk_image;
  	u64 ramdisk_size  = boot_params.hdr.ramdisk_size;
c967da6a0   Yinghai Lu   x86: Make sure fr...
311
  	u64 area_size     = PAGE_ALIGN(ramdisk_size);
8c5dd8f43   Yinghai Lu   x86: handle initr...
312
  	u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;
ba5b14cc0   Yinghai Lu   x86: extend e820 ...
313
  	u64 ramdisk_here;
eb1379cb2   Yinghai Lu   x86: update reser...
314
315
  	unsigned long slop, clen, mapaddr;
  	char *p, *q;
cf8fa920c   H. Peter Anvin   i386: handle an i...
316
317
  
  	/* We need to move the initrd down into lowmem */
a9ce6bc15   Yinghai Lu   x86, memblock: Re...
318
  	ramdisk_here = memblock_find_in_range(0, end_of_lowmem, area_size,
4e29684c4   Yinghai Lu   x86: introduce in...
319
  					 PAGE_SIZE);
cf8fa920c   H. Peter Anvin   i386: handle an i...
320

1f5026a7e   Tejun Heo   memblock: Kill ME...
321
  	if (!ramdisk_here)
3945e2c9a   Yinghai Lu   x86: extend e820 ...
322
323
324
  		panic("Cannot find place for new RAMDISK of size %lld
  ",
  			 ramdisk_size);
cf8fa920c   H. Peter Anvin   i386: handle an i...
325
326
  	/* Note: this includes all the lowmem currently occupied by
  	   the initrd, we rely on that fact to keep the data intact. */
24aa07882   Tejun Heo   memblock, x86: Re...
327
  	memblock_reserve(ramdisk_here, area_size);
cf8fa920c   H. Peter Anvin   i386: handle an i...
328
329
  	initrd_start = ramdisk_here + PAGE_OFFSET;
  	initrd_end   = initrd_start + ramdisk_size;
f0d43100f   Yinghai Lu   x86: extend e820 ...
330
331
332
  	printk(KERN_INFO "Allocated new RAMDISK: %08llx - %08llx
  ",
  			 ramdisk_here, ramdisk_here + ramdisk_size);
cf8fa920c   H. Peter Anvin   i386: handle an i...
333

cf8fa920c   H. Peter Anvin   i386: handle an i...
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
  	q = (char *)initrd_start;
  
  	/* Copy any lowmem portion of the initrd */
  	if (ramdisk_image < end_of_lowmem) {
  		clen = end_of_lowmem - ramdisk_image;
  		p = (char *)__va(ramdisk_image);
  		memcpy(q, p, clen);
  		q += clen;
  		ramdisk_image += clen;
  		ramdisk_size  -= clen;
  	}
  
  	/* Copy the highmem portion of the initrd */
  	while (ramdisk_size) {
  		slop = ramdisk_image & ~PAGE_MASK;
  		clen = ramdisk_size;
  		if (clen > MAX_MAP_CHUNK-slop)
  			clen = MAX_MAP_CHUNK-slop;
  		mapaddr = ramdisk_image & PAGE_MASK;
88b4c1469   Jeremy Fitzhardinge   x86: use early_me...
353
  		p = early_memremap(mapaddr, clen+slop);
cf8fa920c   H. Peter Anvin   i386: handle an i...
354
  		memcpy(q, p+slop, clen);
beacfaac3   Huang, Ying   x86 32-bit boot: ...
355
  		early_iounmap(p, clen+slop);
cf8fa920c   H. Peter Anvin   i386: handle an i...
356
357
358
359
  		q += clen;
  		ramdisk_image += clen;
  		ramdisk_size  -= clen;
  	}
a4c81cf68   Yinghai Lu   x86: extend e820 ...
360
  	/* high pages is not converted by early_res_to_bootmem */
ba5b14cc0   Yinghai Lu   x86: extend e820 ...
361
362
  	ramdisk_image = boot_params.hdr.ramdisk_image;
  	ramdisk_size  = boot_params.hdr.ramdisk_size;
eb1379cb2   Yinghai Lu   x86: update reser...
363
364
365
  	printk(KERN_INFO "Move RAMDISK from %016llx - %016llx to"
  		" %08llx - %08llx
  ",
ba5b14cc0   Yinghai Lu   x86: extend e820 ...
366
367
  		ramdisk_image, ramdisk_image + ramdisk_size - 1,
  		ramdisk_here, ramdisk_here + ramdisk_size - 1);
eb1379cb2   Yinghai Lu   x86: update reser...
368
  }
9a27f5c51   Yinghai Lu   x86: clean up rel...
369

eb1379cb2   Yinghai Lu   x86: update reser...
370
371
  static void __init reserve_initrd(void)
  {
c967da6a0   Yinghai Lu   x86: Make sure fr...
372
  	/* Assume only end is not page aligned */
eb1379cb2   Yinghai Lu   x86: update reser...
373
374
  	u64 ramdisk_image = boot_params.hdr.ramdisk_image;
  	u64 ramdisk_size  = boot_params.hdr.ramdisk_size;
c967da6a0   Yinghai Lu   x86: Make sure fr...
375
  	u64 ramdisk_end   = PAGE_ALIGN(ramdisk_image + ramdisk_size);
8c5dd8f43   Yinghai Lu   x86: handle initr...
376
  	u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;
eb1379cb2   Yinghai Lu   x86: update reser...
377
378
379
380
381
382
383
384
  
  	if (!boot_params.hdr.type_of_loader ||
  	    !ramdisk_image || !ramdisk_size)
  		return;		/* No initrd provided by bootloader */
  
  	initrd_start = 0;
  
  	if (ramdisk_size >= (end_of_lowmem>>1)) {
24aa07882   Tejun Heo   memblock, x86: Re...
385
  		memblock_free(ramdisk_image, ramdisk_end - ramdisk_image);
eb1379cb2   Yinghai Lu   x86: update reser...
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
  		printk(KERN_ERR "initrd too large to handle, "
  		       "disabling initrd
  ");
  		return;
  	}
  
  	printk(KERN_INFO "RAMDISK: %08llx - %08llx
  ", ramdisk_image,
  			ramdisk_end);
  
  
  	if (ramdisk_end <= end_of_lowmem) {
  		/* All in lowmem, easy case */
  		/*
  		 * don't need to reserve again, already reserved early
  		 * in i386_start_kernel
  		 */
  		initrd_start = ramdisk_image + PAGE_OFFSET;
  		initrd_end = initrd_start + ramdisk_size;
  		return;
  	}
eb1379cb2   Yinghai Lu   x86: update reser...
407
  	relocate_initrd();
8c5dd8f43   Yinghai Lu   x86: handle initr...
408

24aa07882   Tejun Heo   memblock, x86: Re...
409
  	memblock_free(ramdisk_image, ramdisk_end - ramdisk_image);
cf8fa920c   H. Peter Anvin   i386: handle an i...
410
  }
225c37d71   Yinghai Lu   x86: introduce re...
411
  #else
eb1379cb2   Yinghai Lu   x86: update reser...
412
  static void __init reserve_initrd(void)
225c37d71   Yinghai Lu   x86: introduce re...
413
414
  {
  }
cf8fa920c   H. Peter Anvin   i386: handle an i...
415
  #endif /* CONFIG_BLK_DEV_INITRD */
29f784e36   Yinghai Lu   x86: change some ...
416
  static void __init parse_setup_data(void)
257b0fde9   Yinghai Lu   x86: move parse_s...
417
418
419
420
421
422
423
424
  {
  	struct setup_data *data;
  	u64 pa_data;
  
  	if (boot_params.hdr.version < 0x0209)
  		return;
  	pa_data = boot_params.hdr.setup_data;
  	while (pa_data) {
f1c2b3571   Sebastian Andrzej Siewior   x86: e820: Remove...
425
426
427
428
429
430
431
432
433
434
435
  		u32 data_len, map_len;
  
  		map_len = max(PAGE_SIZE - (pa_data & ~PAGE_MASK),
  			      (u64)sizeof(struct setup_data));
  		data = early_memremap(pa_data, map_len);
  		data_len = data->len + sizeof(struct setup_data);
  		if (data_len > map_len) {
  			early_iounmap(data, map_len);
  			data = early_memremap(pa_data, data_len);
  			map_len = data_len;
  		}
257b0fde9   Yinghai Lu   x86: move parse_s...
436
437
  		switch (data->type) {
  		case SETUP_E820_EXT:
f1c2b3571   Sebastian Andrzej Siewior   x86: e820: Remove...
438
  			parse_e820_ext(data);
257b0fde9   Yinghai Lu   x86: move parse_s...
439
  			break;
da6b737b9   Sebastian Andrzej Siewior   x86: Add device t...
440
441
  		case SETUP_DTB:
  			add_dtb(pa_data);
257b0fde9   Yinghai Lu   x86: move parse_s...
442
443
444
445
  			break;
  		default:
  			break;
  		}
257b0fde9   Yinghai Lu   x86: move parse_s...
446
  		pa_data = data->next;
f1c2b3571   Sebastian Andrzej Siewior   x86: e820: Remove...
447
  		early_iounmap(data, map_len);
257b0fde9   Yinghai Lu   x86: move parse_s...
448
449
  	}
  }
a0a0becd2   Yinghai Lu   x86: make e820_sa...
450
  static void __init e820_reserve_setup_data(void)
28bb22379   Yinghai Lu   x86: move reserve...
451
452
453
  {
  	struct setup_data *data;
  	u64 pa_data;
d9a81b441   Yinghai Lu   x86: do not print...
454
  	int found = 0;
28bb22379   Yinghai Lu   x86: move reserve...
455
456
457
458
459
  
  	if (boot_params.hdr.version < 0x0209)
  		return;
  	pa_data = boot_params.hdr.setup_data;
  	while (pa_data) {
88b4c1469   Jeremy Fitzhardinge   x86: use early_me...
460
  		data = early_memremap(pa_data, sizeof(*data));
28bb22379   Yinghai Lu   x86: move reserve...
461
462
  		e820_update_range(pa_data, sizeof(*data)+data->len,
  			 E820_RAM, E820_RESERVED_KERN);
d9a81b441   Yinghai Lu   x86: do not print...
463
  		found = 1;
28bb22379   Yinghai Lu   x86: move reserve...
464
465
466
  		pa_data = data->next;
  		early_iounmap(data, sizeof(*data));
  	}
d9a81b441   Yinghai Lu   x86: do not print...
467
468
  	if (!found)
  		return;
28bb22379   Yinghai Lu   x86: move reserve...
469
  	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
a0a0becd2   Yinghai Lu   x86: make e820_sa...
470
  	memcpy(&e820_saved, &e820, sizeof(struct e820map));
28bb22379   Yinghai Lu   x86: move reserve...
471
472
473
474
  	printk(KERN_INFO "extended physical RAM map:
  ");
  	e820_print_map("reserve setup_data");
  }
a9ce6bc15   Yinghai Lu   x86, memblock: Re...
475
  static void __init memblock_x86_reserve_range_setup_data(void)
a0a0becd2   Yinghai Lu   x86: make e820_sa...
476
477
478
  {
  	struct setup_data *data;
  	u64 pa_data;
a0a0becd2   Yinghai Lu   x86: make e820_sa...
479
480
481
482
483
  
  	if (boot_params.hdr.version < 0x0209)
  		return;
  	pa_data = boot_params.hdr.setup_data;
  	while (pa_data) {
88b4c1469   Jeremy Fitzhardinge   x86: use early_me...
484
  		data = early_memremap(pa_data, sizeof(*data));
24aa07882   Tejun Heo   memblock, x86: Re...
485
  		memblock_reserve(pa_data, sizeof(*data) + data->len);
a0a0becd2   Yinghai Lu   x86: make e820_sa...
486
487
488
489
  		pa_data = data->next;
  		early_iounmap(data, sizeof(*data));
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
  /*
ccb4defa7   Yinghai Lu   x86: move back cr...
491
492
493
494
   * --------- Crashkernel reservation ------------------------------
   */
  
  #ifdef CONFIG_KEXEC
32105f7fd   Bernhard Walle   x86: find offset ...
495

ccb4defa7   Yinghai Lu   x86: move back cr...
496
497
498
  static inline unsigned long long get_total_mem(void)
  {
  	unsigned long long total;
44280733e   Yinghai Lu   x86: Change crash...
499
  	total = max_pfn - min_low_pfn;
ccb4defa7   Yinghai Lu   x86: move back cr...
500
501
502
  
  	return total << PAGE_SHIFT;
  }
7f8595bfa   H. Peter Anvin   x86, kexec: Limit...
503
504
505
506
507
508
509
510
511
512
513
  /*
   * Keep the crash kernel below this limit.  On 32 bits earlier kernels
   * would limit the kernel to the low 512 MiB due to mapping restrictions.
   * On 64 bits, kexec-tools currently limits us to 896 MiB; increase this
   * limit once kexec-tools are fixed.
   */
  #ifdef CONFIG_X86_32
  # define CRASH_KERNEL_ADDR_MAX	(512 << 20)
  #else
  # define CRASH_KERNEL_ADDR_MAX	(896 << 20)
  #endif
29f784e36   Yinghai Lu   x86: change some ...
514
  static void __init reserve_crashkernel(void)
ccb4defa7   Yinghai Lu   x86: move back cr...
515
516
517
518
519
520
521
522
523
  {
  	unsigned long long total_mem;
  	unsigned long long crash_size, crash_base;
  	int ret;
  
  	total_mem = get_total_mem();
  
  	ret = parse_crashkernel(boot_command_line, total_mem,
  			&crash_size, &crash_base);
32105f7fd   Bernhard Walle   x86: find offset ...
524
525
526
527
528
  	if (ret != 0 || crash_size <= 0)
  		return;
  
  	/* 0 means: find the address automatically */
  	if (crash_base <= 0) {
44280733e   Yinghai Lu   x86: Change crash...
529
  		const unsigned long long alignment = 16<<20;	/* 16M */
9f4c13964   Yinghai Lu   x86, memblock: Fi...
530
  		/*
7f8595bfa   H. Peter Anvin   x86, kexec: Limit...
531
  		 *  kexec want bzImage is below CRASH_KERNEL_ADDR_MAX
9f4c13964   Yinghai Lu   x86, memblock: Fi...
532
533
  		 */
  		crash_base = memblock_find_in_range(alignment,
7f8595bfa   H. Peter Anvin   x86, kexec: Limit...
534
  			       CRASH_KERNEL_ADDR_MAX, crash_size, alignment);
9f4c13964   Yinghai Lu   x86, memblock: Fi...
535

1f5026a7e   Tejun Heo   memblock: Kill ME...
536
  		if (!crash_base) {
44280733e   Yinghai Lu   x86: Change crash...
537
538
  			pr_info("crashkernel reservation failed - No suitable area found.
  ");
ccb4defa7   Yinghai Lu   x86: move back cr...
539
540
  			return;
  		}
32105f7fd   Bernhard Walle   x86: find offset ...
541
  	} else {
44280733e   Yinghai Lu   x86: Change crash...
542
  		unsigned long long start;
9f4c13964   Yinghai Lu   x86, memblock: Fi...
543
544
  		start = memblock_find_in_range(crash_base,
  				 crash_base + crash_size, crash_size, 1<<20);
44280733e   Yinghai Lu   x86: Change crash...
545
546
547
  		if (start != crash_base) {
  			pr_info("crashkernel reservation failed - memory is in use.
  ");
ccb4defa7   Yinghai Lu   x86: move back cr...
548
549
  			return;
  		}
32105f7fd   Bernhard Walle   x86: find offset ...
550
  	}
24aa07882   Tejun Heo   memblock, x86: Re...
551
  	memblock_reserve(crash_base, crash_size);
ccb4defa7   Yinghai Lu   x86: move back cr...
552

32105f7fd   Bernhard Walle   x86: find offset ...
553
554
555
556
557
558
  	printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
  			"for crashkernel (System RAM: %ldMB)
  ",
  			(unsigned long)(crash_size >> 20),
  			(unsigned long)(crash_base >> 20),
  			(unsigned long)(total_mem >> 20));
ccb4defa7   Yinghai Lu   x86: move back cr...
559

32105f7fd   Bernhard Walle   x86: find offset ...
560
561
562
  	crashk_res.start = crash_base;
  	crashk_res.end   = crash_base + crash_size - 1;
  	insert_resource(&iomem_resource, &crashk_res);
ccb4defa7   Yinghai Lu   x86: move back cr...
563
564
  }
  #else
29f784e36   Yinghai Lu   x86: change some ...
565
  static void __init reserve_crashkernel(void)
ccb4defa7   Yinghai Lu   x86: move back cr...
566
567
568
  {
  }
  #endif
bdba0e700   Yinghai Lu   x86: move reserve...
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
  static struct resource standard_io_resources[] = {
  	{ .name = "dma1", .start = 0x00, .end = 0x1f,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "pic1", .start = 0x20, .end = 0x21,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "timer0", .start = 0x40, .end = 0x43,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "timer1", .start = 0x50, .end = 0x53,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "keyboard", .start = 0x60, .end = 0x60,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "keyboard", .start = 0x64, .end = 0x64,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "dma page reg", .start = 0x80, .end = 0x8f,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "pic2", .start = 0xa0, .end = 0xa1,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "dma2", .start = 0xc0, .end = 0xdf,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO },
  	{ .name = "fpu", .start = 0xf0, .end = 0xff,
  		.flags = IORESOURCE_BUSY | IORESOURCE_IO }
  };
8fee697d9   Thomas Gleixner   x86: Add request_...
591
  void __init reserve_standard_io_resources(void)
bdba0e700   Yinghai Lu   x86: move reserve...
592
593
594
595
596
597
598
599
  {
  	int i;
  
  	/* request I/O space for devices used on all i[345]86 PCs */
  	for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++)
  		request_resource(&ioport_resource, &standard_io_resources[i]);
  
  }
042be38e6   Yinghai Lu   ibft, x86: Change...
600
601
602
603
604
605
606
  static __init void reserve_ibft_region(void)
  {
  	unsigned long addr, size = 0;
  
  	addr = find_ibft_region(&size);
  
  	if (size)
24aa07882   Tejun Heo   memblock, x86: Re...
607
  		memblock_reserve(addr, size);
042be38e6   Yinghai Lu   ibft, x86: Change...
608
  }
9ea77bdb3   H. Peter Anvin   x86, bios: Make t...
609
  static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10;
5649b7c30   Ingo Molnar   x86: add DMI quir...
610

1b5576e69   Yinghai Lu   x86: Remove BIOS ...
611
612
613
614
615
616
  static void __init trim_bios_range(void)
  {
  	/*
  	 * A special case is the first 4Kb of memory;
  	 * This is a BIOS owned area, not kernel ram, but generally
  	 * not listed as such in the E820 table.
d0cd7425f   H. Peter Anvin   x86, bios: By def...
617
618
619
  	 *
  	 * This typically reserves additional memory (64KiB by default)
  	 * since some BIOSes are known to corrupt low memory.  See the
9ea77bdb3   H. Peter Anvin   x86, bios: Make t...
620
  	 * Kconfig help text for X86_RESERVE_LOW.
1b5576e69   Yinghai Lu   x86: Remove BIOS ...
621
  	 */
9ea77bdb3   H. Peter Anvin   x86, bios: Make t...
622
  	e820_update_range(0, ALIGN(reserve_low, PAGE_SIZE),
d0cd7425f   H. Peter Anvin   x86, bios: By def...
623
  			  E820_RAM, E820_RESERVED);
1b5576e69   Yinghai Lu   x86: Remove BIOS ...
624
625
626
627
628
629
630
631
  	/*
  	 * special case: Some BIOSen report the PC BIOS
  	 * area (640->1Mb) as ram even though it is not.
  	 * take them out.
  	 */
  	e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1);
  	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
  }
9ea77bdb3   H. Peter Anvin   x86, bios: Make t...
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
  static int __init parse_reservelow(char *p)
  {
  	unsigned long long size;
  
  	if (!p)
  		return -EINVAL;
  
  	size = memparse(p, &p);
  
  	if (size < 4096)
  		size = 4096;
  
  	if (size > 640*1024)
  		size = 640*1024;
  
  	reserve_low = size;
  
  	return 0;
  }
  
  early_param("reservelow", parse_reservelow);
5394f80f9   Jeremy Fitzhardinge   x86: check for an...
653
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
654
655
656
657
658
659
   * Determine if we were loaded by an EFI loader.  If so, then we have also been
   * passed the efi memmap, systab, etc., so we should use these data structures
   * for initialization.  Note, the efi init code path is determined by the
   * global efi_enabled. This allows the same kernel image to be used on existing
   * systems (with a traditional BIOS) as well as on EFI systems.
   */
76934ed4b   Yinghai Lu   x86: merge 64bit ...
660
661
662
663
664
  /*
   * setup_arch - architecture-specific boot-time initializations
   *
   * Note: On x86_64, fixmaps are ready for use even before this is called.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
665
666
  void __init setup_arch(char **cmdline_p)
  {
76934ed4b   Yinghai Lu   x86: merge 64bit ...
667
  #ifdef CONFIG_X86_32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
  	memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
3b33553ba   Ingo Molnar   x86: add early qu...
669
  	visws_early_detect();
b40827fa7   Borislav Petkov   x86-32, mm: Add a...
670
671
672
673
674
675
676
677
678
679
680
  
  	/*
  	 * copy kernel address range established so far and switch
  	 * to the proper swapper page table
  	 */
  	clone_pgd_range(swapper_pg_dir     + KERNEL_PGD_BOUNDARY,
  			initial_page_table + KERNEL_PGD_BOUNDARY,
  			KERNEL_PGD_PTRS);
  
  	load_cr3(swapper_pg_dir);
  	__flush_tlb_all();
76934ed4b   Yinghai Lu   x86: merge 64bit ...
681
682
683
684
  #else
  	printk(KERN_INFO "Command line: %s
  ", boot_command_line);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685

9863c90f6   Alok Kataria   x86, vmware: Remo...
686
687
688
689
  	/*
  	 * If we have OLPC OFW, we might end up relocating the fixmap due to
  	 * reserve_top(), so do this before touching the ioremap area.
  	 */
fd699c765   Andres Salomon   x86, olpc: Add su...
690
  	olpc_ofw_detect();
29c843912   Jan Kiszka   x86, kgdb: early ...
691
  	early_trap_init();
9e882c928   Jeremy Fitzhardinge   x86: call early_c...
692
  	early_cpu_init();
1a98fd14f   Jeremy Fitzhardinge   x86: setup_arch()...
693
  	early_ioremap_init();
fd699c765   Andres Salomon   x86, olpc: Add su...
694
  	setup_olpc_ofw_pgd();
30c826451   H. Peter Anvin   [x86] remove uses...
695
696
697
  	ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev);
  	screen_info = boot_params.screen_info;
  	edid_info = boot_params.edid_info;
76934ed4b   Yinghai Lu   x86: merge 64bit ...
698
  #ifdef CONFIG_X86_32
30c826451   H. Peter Anvin   [x86] remove uses...
699
700
  	apm_info.bios = boot_params.apm_bios_info;
  	ist_info = boot_params.ist_info;
76934ed4b   Yinghai Lu   x86: merge 64bit ...
701
  	if (boot_params.sys_desc_table.length != 0) {
30c826451   H. Peter Anvin   [x86] remove uses...
702
703
704
705
  		set_mca_bus(boot_params.sys_desc_table.table[3] & 0x2);
  		machine_id = boot_params.sys_desc_table.table[0];
  		machine_submodel_id = boot_params.sys_desc_table.table[1];
  		BIOS_revision = boot_params.sys_desc_table.table[2];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
  	}
76934ed4b   Yinghai Lu   x86: merge 64bit ...
707
708
  #endif
  	saved_video_mode = boot_params.hdr.vid_mode;
30c826451   H. Peter Anvin   [x86] remove uses...
709
  	bootloader_type = boot_params.hdr.type_of_loader;
5031296c5   H. Peter Anvin   x86: add extensio...
710
711
712
713
714
715
  	if ((bootloader_type >> 4) == 0xe) {
  		bootloader_type &= 0xf;
  		bootloader_type |= (boot_params.hdr.ext_loader_type+0x10) << 4;
  	}
  	bootloader_version  = bootloader_type & 0xf;
  	bootloader_version |= boot_params.hdr.ext_loader_ver << 4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
716
717
  
  #ifdef CONFIG_BLK_DEV_RAM
30c826451   H. Peter Anvin   [x86] remove uses...
718
719
720
  	rd_image_start = boot_params.hdr.ram_size & RAMDISK_IMAGE_START_MASK;
  	rd_prompt = ((boot_params.hdr.ram_size & RAMDISK_PROMPT_FLAG) != 0);
  	rd_doload = ((boot_params.hdr.ram_size & RAMDISK_LOAD_FLAG) != 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
721
  #endif
7465252ea   Yinghai Lu   x86: setup_arch 3...
722
723
  #ifdef CONFIG_EFI
  	if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
f7d7d01be   Matt Fleming   x86: Don't use ma...
724
  		     EFI_LOADER_SIGNATURE, 4)) {
7465252ea   Yinghai Lu   x86: setup_arch 3...
725
  		efi_enabled = 1;
a9ce6bc15   Yinghai Lu   x86, memblock: Re...
726
  		efi_memblock_x86_reserve_range();
7465252ea   Yinghai Lu   x86: setup_arch 3...
727
728
  	}
  #endif
42bbdb43b   Thomas Gleixner   x86: Replace ARCH...
729
  	x86_init.oem.arch_setup();
2215e69d2   Huang, Ying   x86 boot: use E82...
730

419afdf53   Bjorn Helgaas   x86: update iomem...
731
  	iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1;
0dbfafa5f   Alexander van Heukelum   x86: move i386 me...
732
  	setup_memory_map();
28bb22379   Yinghai Lu   x86: move reserve...
733
  	parse_setup_data();
a0a0becd2   Yinghai Lu   x86: make e820_sa...
734
735
  	/* update the e820_saved too */
  	e820_reserve_setup_data();
28bb22379   Yinghai Lu   x86: move reserve...
736

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
737
  	copy_edd();
30c826451   H. Peter Anvin   [x86] remove uses...
738
  	if (!boot_params.hdr.root_flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
740
741
742
  		root_mountflags &= ~MS_RDONLY;
  	init_mm.start_code = (unsigned long) _text;
  	init_mm.end_code = (unsigned long) _etext;
  	init_mm.end_data = (unsigned long) _edata;
93dbda7cb   Jeremy Fitzhardinge   x86: add brk allo...
743
  	init_mm.brk = _brk_end;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
744
745
746
747
748
  
  	code_resource.start = virt_to_phys(_text);
  	code_resource.end = virt_to_phys(_etext)-1;
  	data_resource.start = virt_to_phys(_etext);
  	data_resource.end = virt_to_phys(_edata)-1;
00bf4098b   Bernhard Walle   kexec: add BSS to...
749
750
  	bss_resource.start = virt_to_phys(&__bss_start);
  	bss_resource.end = virt_to_phys(&__bss_stop)-1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
751

516cbf373   Tim Bird   x86, bootup: add ...
752
753
754
755
756
757
758
759
760
761
762
763
  #ifdef CONFIG_CMDLINE_BOOL
  #ifdef CONFIG_CMDLINE_OVERRIDE
  	strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
  #else
  	if (builtin_cmdline[0]) {
  		/* append boot loader cmdline to builtin */
  		strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
  		strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
  		strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
  	}
  #endif
  #endif
eda6da928   Yinghai Lu   Revert 'x86: Fix ...
764
765
  	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
  	*cmdline_p = command_line;
eda6da928   Yinghai Lu   Revert 'x86: Fix ...
766
  	/*
4b0f3b81e   Kees Cook   x86, mm: Report s...
767
768
769
770
771
  	 * x86_configure_nx() is called before parse_early_param() to detect
  	 * whether hardware doesn't support NX (so that the early EHCI debug
  	 * console setup can safely call set_fixmap()). It may then be called
  	 * again from within noexec_setup() during parsing early parameters
  	 * to honor the respective command line option.
eda6da928   Yinghai Lu   Revert 'x86: Fix ...
772
  	 */
4763ed4d4   H. Peter Anvin   x86, mm: Clean up...
773
  	x86_configure_nx();
eda6da928   Yinghai Lu   Revert 'x86: Fix ...
774
775
  
  	parse_early_param();
4b0f3b81e   Kees Cook   x86, mm: Report s...
776
  	x86_report_nx();
0ad5bce74   Jeremy Fitzhardinge   x86: fix possible...
777

28bb22379   Yinghai Lu   x86: move reserve...
778
  	/* after early param, so could get panic from serial */
a9ce6bc15   Yinghai Lu   x86, memblock: Re...
779
  	memblock_x86_reserve_range_setup_data();
28bb22379   Yinghai Lu   x86: move reserve...
780

76934ed4b   Yinghai Lu   x86: merge 64bit ...
781
  	if (acpi_mps_check()) {
3eb11edc1   Ingo Molnar   x86: build fix
782
  #ifdef CONFIG_X86_LOCAL_APIC
76934ed4b   Yinghai Lu   x86: merge 64bit ...
783
784
  		disable_apic = 1;
  #endif
988781dc3   Yinghai Lu   x86: use setup_cl...
785
  		setup_clear_cpu_cap(X86_FEATURE_APIC);
3c999f142   Yinghai Lu   x86: check comman...
786
  	}
dc7c65db2   Linus Torvalds   Merge branch 'lin...
787
788
789
790
  #ifdef CONFIG_PCI
  	if (pci_early_dump_regs)
  		early_dump_pci_devices();
  #endif
0dbfafa5f   Alexander van Heukelum   x86: move i386 me...
791
  	finish_e820_parsing();
1a3f239dd   Rusty Russell   [PATCH] i386: Rep...
792

ff0c08749   Brian Maly   x86: fix DMI on EFI
793
794
  	if (efi_enabled)
  		efi_init();
2216d199b   Yinghai Lu   x86: fix CONFIG_X...
795
  	dmi_scan_machine();
88b094fb8   Alok Kataria   x86: Hypervisor d...
796
797
798
799
  	/*
  	 * VMware detection requires dmi to be available, so this
  	 * needs to be done after dmi_scan_machine, for the BP.
  	 */
2d826404f   Thomas Gleixner   x86: Move tsc_cal...
800
  	init_hypervisor_platform();
88b094fb8   Alok Kataria   x86: Hypervisor d...
801

f7cf5a5b8   Thomas Gleixner   x86: Add probe_ro...
802
  	x86_init.resources.probe_roms();
41c094fd3   Yinghai Lu   x86: move e820_re...
803
804
805
806
807
  
  	/* after parse_early_param, so could debug it */
  	insert_resource(&iomem_resource, &code_resource);
  	insert_resource(&iomem_resource, &data_resource);
  	insert_resource(&iomem_resource, &bss_resource);
1b5576e69   Yinghai Lu   x86: Remove BIOS ...
808
  	trim_bios_range();
76934ed4b   Yinghai Lu   x86: merge 64bit ...
809
  #ifdef CONFIG_X86_32
cc9f7a0cc   Yinghai Lu   x86: kill bad_ppro
810
811
812
813
814
815
816
817
  	if (ppro_with_ram_bug()) {
  		e820_update_range(0x70000000ULL, 0x40000ULL, E820_RAM,
  				  E820_RESERVED);
  		sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
  		printk(KERN_INFO "fixed physical RAM map:
  ");
  		e820_print_map("bad_ppro");
  	}
76934ed4b   Yinghai Lu   x86: merge 64bit ...
818
819
820
  #else
  	early_gart_iommu_check();
  #endif
cc9f7a0cc   Yinghai Lu   x86: kill bad_ppro
821

7b2a0a6c4   Yinghai Lu   x86: make 32-bit ...
822
823
824
825
  	/*
  	 * partially used pages are not usable - thus
  	 * we are rounding upwards:
  	 */
f361a450b   Yinghai Lu   x86: introduce ma...
826
  	max_pfn = e820_end_of_ram_pfn();
7b2a0a6c4   Yinghai Lu   x86: make 32-bit ...
827

093af8d7f   Yinghai Lu   x86_32: trim memo...
828
829
  	/* update e820 for memory not covered by WB MTRRs */
  	mtrr_bp_init();
2dc807b37   Yinghai Lu   x86: make max_pfn...
830
  	if (mtrr_trim_uncached_memory(max_pfn))
f361a450b   Yinghai Lu   x86: introduce ma...
831
  		max_pfn = e820_end_of_ram_pfn();
76c324182   Yinghai Lu   x86: fix trim mtr...
832

76934ed4b   Yinghai Lu   x86: merge 64bit ...
833
  #ifdef CONFIG_X86_32
4e29684c4   Yinghai Lu   x86: introduce in...
834
  	/* max_low_pfn get updated here */
2ec65f8b8   Yinghai Lu   x86: clean up usi...
835
  	find_low_pfn_range();
76934ed4b   Yinghai Lu   x86: merge 64bit ...
836
837
  #else
  	num_physpages = max_pfn;
06cd9a7dc   Yinghai Lu   x86: add x2apic c...
838
  	check_x2apic();
76934ed4b   Yinghai Lu   x86: merge 64bit ...
839
840
841
  
  	/* How many end-of-memory variables you have, grandma! */
  	/* need this before calling reserve_initrd */
f361a450b   Yinghai Lu   x86: introduce ma...
842
843
844
845
  	if (max_pfn > (1UL<<(32 - PAGE_SHIFT)))
  		max_low_pfn = e820_end_of_low_ram_pfn();
  	else
  		max_low_pfn = max_pfn;
76934ed4b   Yinghai Lu   x86: merge 64bit ...
846
  	high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
5394f80f9   Jeremy Fitzhardinge   x86: check for an...
847
  #endif
893f38d14   Yinghai Lu   x86: Use find_e82...
848
849
850
851
  	/*
  	 * Find and reserve possible boot-time SMP configuration:
  	 */
  	find_smp_config();
042be38e6   Yinghai Lu   ibft, x86: Change...
852
  	reserve_ibft_region();
72d7c3b33   Yinghai Lu   x86: Use memblock...
853
854
855
856
857
858
  	/*
  	 * Need to conclude brk, before memblock_x86_fill()
  	 *  it could use memblock_find_in_range, could overlap with
  	 *  brk area.
  	 */
  	reserve_brk();
e5f15b45d   Yinghai Lu   x86: Cleanup high...
859
  	cleanup_highmap();
72d7c3b33   Yinghai Lu   x86: Use memblock...
860
861
  	memblock.current_limit = get_max_mapped();
  	memblock_x86_fill();
916f676f8   Matthew Garrett   x86, efi: Retain ...
862
863
864
865
866
867
  	/*
  	 * The EFI specification says that boot service code won't be called
  	 * after ExitBootServices(). This is, in fact, a lie.
  	 */
  	if (efi_enabled)
  		efi_reserve_boot_services();
72d7c3b33   Yinghai Lu   x86: Use memblock...
868
869
870
871
872
873
874
875
876
877
  	/* preallocate 4k for mptable mpc */
  	early_reserve_e820_mpc_new();
  
  #ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION
  	setup_bios_corruption_check();
  #endif
  
  	printk(KERN_DEBUG "initial memory mapped : 0 - %08lx
  ",
  			max_pfn_mapped<<PAGE_SHIFT);
4822b7fc6   H. Peter Anvin   x86, trampoline: ...
878
  	setup_trampolines();
893f38d14   Yinghai Lu   x86: Use find_e82...
879

854c879f5   Pekka J Enberg   x86: Move init_gb...
880
  	init_gbpages();
4e29684c4   Yinghai Lu   x86: introduce in...
881
  	/* max_pfn_mapped is updated here */
f361a450b   Yinghai Lu   x86: introduce ma...
882
883
  	max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
  	max_pfn_mapped = max_low_pfn_mapped;
f89112502   Tejun Heo   x86-64, NUMA: Rev...
884
885
886
887
888
889
890
891
  #ifdef CONFIG_X86_64
  	if (max_pfn > max_low_pfn) {
  		max_pfn_mapped = init_memory_mapping(1UL<<32,
  						     max_pfn<<PAGE_SHIFT);
  		/* can we preseve max_low_pfn ?*/
  		max_low_pfn = max_pfn;
  	}
  #endif
72d7c3b33   Yinghai Lu   x86: Use memblock...
892
  	memblock.current_limit = get_max_mapped();
4e29684c4   Yinghai Lu   x86: introduce in...
893

e7b378952   Yinghai Lu   x86: move fix map...
894
895
896
897
898
899
900
901
  	/*
  	 * NOTE: On x86-32, only from this point on, fixmaps are ready for use.
  	 */
  
  #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
  	if (init_ohci1394_dma_early)
  		init_ohci1394_dma_on_all_controllers();
  #endif
162a7e750   Mike Travis   printk: allocate ...
902
903
  	/* Allocate bigger log buffer */
  	setup_log_buf(1);
e7b378952   Yinghai Lu   x86: move fix map...
904

2ec65f8b8   Yinghai Lu   x86: clean up usi...
905
  	reserve_initrd();
44280733e   Yinghai Lu   x86: Change crash...
906
  	reserve_crashkernel();
76934ed4b   Yinghai Lu   x86: merge 64bit ...
907
  	vsmp_init();
76934ed4b   Yinghai Lu   x86: merge 64bit ...
908

1c6e55032   Yinghai Lu   x86: use acpi_num...
909
  	io_delay_init();
1c6e55032   Yinghai Lu   x86: use acpi_num...
910
911
912
913
  	/*
  	 * Parse the ACPI tables for possible boot-time SMP configuration.
  	 */
  	acpi_boot_table_init();
1c6e55032   Yinghai Lu   x86: use acpi_num...
914

2e42060c1   Jack Steiner   x86, uv: add earl...
915
  	early_acpi_boot_init();
d8fc3afc4   Tejun Heo   x86, NUMA: Move *...
916
  	initmem_init();
6f2a75369   Yinghai Lu   x86, memblock: Us...
917
  	memblock_find_dma_reserve();
91467bdf6   Bernhard Walle   x86: move dma32_r...
918

790c73f62   Glauber de Oliveira Costa   x86: KVM guest: p...
919
920
921
  #ifdef CONFIG_KVM_CLOCK
  	kvmclock_init();
  #endif
030cb6c00   Thomas Gleixner   x86: Move paravir...
922
  	x86_init.paging.pagetable_setup_start(swapper_pg_dir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
923
  	paging_init();
030cb6c00   Thomas Gleixner   x86: Move paravir...
924
  	x86_init.paging.pagetable_setup_done(swapper_pg_dir);
f212ec4b7   Bernhard Kaindl   x86: early boot d...
925

4da9484bd   H. Peter Anvin   x86, hibernate: I...
926
927
928
929
  	if (boot_cpu_data.cpuid_level >= 0) {
  		/* A CPU has %cr4 if and only if it has CPUID */
  		mmu_cr4_features = read_cr4();
  	}
b40827fa7   Borislav Petkov   x86-32, mm: Add a...
930
931
932
933
934
935
  #ifdef CONFIG_X86_32
  	/* sync back kernel address range */
  	clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY,
  			swapper_pg_dir     + KERNEL_PGD_BOUNDARY,
  			KERNEL_PGD_PTRS);
  #endif
fd89a1379   Joerg Roedel   x86-32: Separate ...
936

316253406   Joseph Cihula   x86, intel_txt: I...
937
  	tboot_probe();
76934ed4b   Yinghai Lu   x86: merge 64bit ...
938
939
940
  #ifdef CONFIG_X86_64
  	map_vsyscall();
  #endif
1a3f239dd   Rusty Russell   [PATCH] i386: Rep...
941
  	generic_apic_probe();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
942

54ef34009   Andi Kleen   x86: Unify i386 a...
943
  	early_quirks();
d44647b0a   Andy Currid   [PATCH] Fix HPET ...
944

295deae40   Yinghai Lu   x86: setup_arch 3...
945
946
947
  	/*
  	 * Read APIC and some other early information from ACPI tables.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
948
  	acpi_boot_init();
efafc8b21   Feng Tang   x86: add arch-spe...
949
  	sfi_init();
a906fdaac   Thomas Gleixner   x86: dt: Cleanup ...
950
  	x86_dtb_init();
04606618b   Yinghai Lu   x86: remove some ...
951

295deae40   Yinghai Lu   x86: setup_arch 3...
952
953
954
  	/*
  	 * get boot-time SMP configuration:
  	 */
e0da33646   Yinghai Lu   x86: introduce ma...
955
956
  	if (smp_found_config)
  		get_smp_config();
76934ed4b   Yinghai Lu   x86: merge 64bit ...
957

329513a35   Yinghai Lu   x86: move prefill...
958
  	prefill_possible_map();
301e61902   Yinghai Lu   x86: use dyn_arra...
959

5f4765f96   Yinghai Lu   x86: move init_cp...
960
  	init_cpu_to_node();
5f4765f96   Yinghai Lu   x86: move init_cp...
961

76934ed4b   Yinghai Lu   x86: merge 64bit ...
962
  	init_apic_mappings();
23f9b2671   Thomas Gleixner   x86: apic: Move p...
963
  	ioapic_and_gsi_init();
9d6a4d082   Yinghai Lu   x86: probe nr_irq...
964

295deae40   Yinghai Lu   x86: setup_arch 3...
965
  	kvm_guest_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
966

41c094fd3   Yinghai Lu   x86: move e820_re...
967
  	e820_reserve_resources();
bf62f3981   Yinghai Lu   x86: move e820_ma...
968
  	e820_mark_nosave_regions(max_low_pfn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
969

8fee697d9   Thomas Gleixner   x86: Add request_...
970
  	x86_init.resources.reserve_resources();
41c094fd3   Yinghai Lu   x86: move e820_re...
971
972
  
  	e820_setup_gap();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973
974
975
976
977
978
979
980
  #ifdef CONFIG_VT
  #if defined(CONFIG_VGA_CONSOLE)
  	if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
  		conswitchp = &vga_con;
  #elif defined(CONFIG_DUMMY_CONSOLE)
  	conswitchp = &dummy_con;
  #endif
  #endif
6f30c1ac3   Thomas Gleixner   x86: Move paravir...
981
  	x86_init.oem.banner();
a2202aa29   Yong Wang   x86: Under BIOS c...
982

6b617e224   Feng Tang   x86/platform: Add...
983
  	x86_init.timers.wallclock_init();
cf8ff6b6a   Feng Tang   x86/platform: Add...
984
  	x86_platform.wallclock_init();
a2202aa29   Yong Wang   x86: Under BIOS c...
985
  	mcheck_init();
f49aa4485   Jason Baron   jump label: Make ...
986

dc326fca2   H. Peter Anvin   x86, cpu: Clean u...
987
  	arch_init_ideal_nops();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
988
  }
5649b7c30   Ingo Molnar   x86: add DMI quir...
989

9be1b56a3   Ingo Molnar   x86, apic: separa...
990
  #ifdef CONFIG_X86_32
8fee697d9   Thomas Gleixner   x86: Add request_...
991
992
993
994
995
  static struct resource video_ram_resource = {
  	.name	= "Video RAM area",
  	.start	= 0xa0000,
  	.end	= 0xbffff,
  	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
9be1b56a3   Ingo Molnar   x86, apic: separa...
996
  };
8fee697d9   Thomas Gleixner   x86: Add request_...
997
  void __init i386_reserve_resources(void)
9be1b56a3   Ingo Molnar   x86, apic: separa...
998
  {
8fee697d9   Thomas Gleixner   x86: Add request_...
999
1000
  	request_resource(&iomem_resource, &video_ram_resource);
  	reserve_standard_io_resources();
9be1b56a3   Ingo Molnar   x86, apic: separa...
1001
  }
9be1b56a3   Ingo Molnar   x86, apic: separa...
1002
  #endif /* CONFIG_X86_32 */