setup.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:81k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/i386/kernel/setup.c
  3.  *
  4.  *  Copyright (C) 1995  Linus Torvalds
  5.  *
  6.  *  Enhanced CPU type detection by Mike Jagdis, Patrick St. Jean
  7.  *  and Martin Mares, November 1997.
  8.  *
  9.  *  Force Cyrix 6x86(MX) and M II processors to report MTRR capability
  10.  *  and Cyrix "coma bug" recognition by
  11.  *      Zolt醤 B鰏z鰎m閚yi <zboszor@mail.externet.hu> February 1999.
  12.  * 
  13.  *  Force Centaur C6 processors to report MTRR capability.
  14.  *      Bart Hartgers <bart@etpmod.phys.tue.nl>, May 1999.
  15.  *
  16.  *  Intel Mobile Pentium II detection fix. Sean Gilley, June 1999.
  17.  *
  18.  *  IDT Winchip tweaks, misc clean ups.
  19.  * Dave Jones <davej@suse.de>, August 1999
  20.  *
  21.  *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
  22.  *
  23.  *  Better detection of Centaur/IDT WinChip models.
  24.  *      Bart Hartgers <bart@etpmod.phys.tue.nl>, August 1999.
  25.  *
  26.  *  Memory region support
  27.  * David Parsons <orc@pell.chi.il.us>, July-August 1999
  28.  *
  29.  *  Cleaned up cache-detection code
  30.  * Dave Jones <davej@suse.de>, October 1999
  31.  *
  32.  * Added proper L2 cache detection for Coppermine
  33.  * Dragan Stancevic <visitor@valinux.com>, October 1999
  34.  *
  35.  *  Added the original array for capability flags but forgot to credit 
  36.  *  myself :) (~1998) Fixed/cleaned up some cpu_model_info and other stuff
  37.  *   Jauder Ho <jauderho@carumba.com>, January 2000
  38.  *
  39.  *  Detection for Celeron coppermine, identify_cpu() overhauled,
  40.  *  and a few other clean ups.
  41.  *  Dave Jones <davej@suse.de>, April 2000
  42.  *
  43.  *  Pentium III FXSR, SSE support
  44.  *  General FPU state handling cleanups
  45.  * Gareth Hughes <gareth@valinux.com>, May 2000
  46.  *
  47.  *  Added proper Cascades CPU and L2 cache detection for Cascades
  48.  *  and 8-way type cache happy bunch from Intel:^)
  49.  *  Dragan Stancevic <visitor@valinux.com>, May 2000 
  50.  *
  51.  *  Forward port AMD Duron errata T13 from 2.2.17pre
  52.  *  Dave Jones <davej@suse.de>, August 2000
  53.  *
  54.  *  Forward port lots of fixes/improvements from 2.2.18pre
  55.  *  Cyrix III, Pentium IV support.
  56.  *  Dave Jones <davej@suse.de>, October 2000
  57.  *
  58.  *  Massive cleanup of CPU detection and bug handling;
  59.  *  Transmeta CPU detection,
  60.  *  H. Peter Anvin <hpa@zytor.com>, November 2000
  61.  *
  62.  *  Added E820 sanitization routine (removes overlapping memory regions);
  63.  *  Brian Moyle <bmoyle@mvista.com>, February 2001
  64.  *
  65.  *  VIA C3 Support.
  66.  *  Dave Jones <davej@suse.de>, March 2001
  67.  *
  68.  *  AMD Athlon/Duron/Thunderbird bluesmoke support.
  69.  *  Dave Jones <davej@suse.de>, April 2001.
  70.  *
  71.  *  CacheSize bug workaround updates for AMD, Intel & VIA Cyrix.
  72.  *  Dave Jones <davej@suse.de>, September, October 2001.
  73.  *
  74.  */
  75. /*
  76.  * This file handles the architecture-dependent parts of initialization
  77.  */
  78. #include <linux/errno.h>
  79. #include <linux/sched.h>
  80. #include <linux/kernel.h>
  81. #include <linux/mm.h>
  82. #include <linux/stddef.h>
  83. #include <linux/unistd.h>
  84. #include <linux/ptrace.h>
  85. #include <linux/slab.h>
  86. #include <linux/user.h>
  87. #include <linux/a.out.h>
  88. #include <linux/tty.h>
  89. #include <linux/ioport.h>
  90. #include <linux/delay.h>
  91. #include <linux/config.h>
  92. #include <linux/init.h>
  93. #include <linux/apm_bios.h>
  94. #ifdef CONFIG_BLK_DEV_RAM
  95. #include <linux/blk.h>
  96. #endif
  97. #include <linux/highmem.h>
  98. #include <linux/bootmem.h>
  99. #include <linux/pci.h>
  100. #include <linux/pci_ids.h>
  101. #include <linux/seq_file.h>
  102. #include <asm/processor.h>
  103. #include <linux/console.h>
  104. #include <asm/mtrr.h>
  105. #include <asm/uaccess.h>
  106. #include <asm/system.h>
  107. #include <asm/io.h>
  108. #include <asm/smp.h>
  109. #include <asm/cobalt.h>
  110. #include <asm/msr.h>
  111. #include <asm/desc.h>
  112. #include <asm/e820.h>
  113. #include <asm/dma.h>
  114. #include <asm/mpspec.h>
  115. #include <asm/mmu_context.h>
  116. /*
  117.  * Machine setup..
  118.  */
  119. char ignore_irq13; /* set if exception 16 works */
  120. struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
  121. unsigned long mmu_cr4_features;
  122. /*
  123.  * Bus types ..
  124.  */
  125. #ifdef CONFIG_EISA
  126. int EISA_bus;
  127. #endif
  128. int MCA_bus;
  129. /* for MCA, but anyone else can use it if they want */
  130. unsigned int machine_id;
  131. unsigned int machine_submodel_id;
  132. unsigned int BIOS_revision;
  133. unsigned int mca_pentium_flag;
  134. /* For PCI or other memory-mapped resources */
  135. unsigned long pci_mem_start = 0x10000000;
  136. /* user-defined highmem size */
  137. static unsigned int highmem_pages __initdata = -1;
  138. /*
  139.  * Setup options
  140.  */
  141. struct drive_info_struct { char dummy[32]; } drive_info;
  142. struct screen_info screen_info;
  143. struct apm_info apm_info;
  144. struct sys_desc_table_struct {
  145. unsigned short length;
  146. unsigned char table[0];
  147. };
  148. struct e820map e820;
  149. unsigned char aux_device_present;
  150. extern void mcheck_init(struct cpuinfo_x86 *c);
  151. extern void dmi_scan_machine(void);
  152. extern int root_mountflags;
  153. extern char _text, _etext, _edata, _end;
  154. static int have_cpuid_p(void) __init;
  155. static int disable_x86_serial_nr __initdata = 1;
  156. static int disable_x86_ht __initdata = 0;
  157. static u32 disabled_x86_caps[NCAPINTS] __initdata = { 0 };
  158. extern int blk_nohighio;
  159. int enable_acpi_smp_table;
  160. /*
  161.  * This is set up by the setup-routine at boot-time
  162.  */
  163. #define PARAM ((unsigned char *)empty_zero_page)
  164. #define SCREEN_INFO (*(struct screen_info *) (PARAM+0))
  165. #define EXT_MEM_K (*(unsigned short *) (PARAM+2))
  166. #define ALT_MEM_K (*(unsigned long *) (PARAM+0x1e0))
  167. #define E820_MAP_NR (*(char*) (PARAM+E820NR))
  168. #define E820_MAP    ((struct e820entry *) (PARAM+E820MAP))
  169. #define APM_BIOS_INFO (*(struct apm_bios_info *) (PARAM+0x40))
  170. #define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
  171. #define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0))
  172. #define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
  173. #define RAMDISK_FLAGS (*(unsigned short *) (PARAM+0x1F8))
  174. #define ORIG_ROOT_DEV (*(unsigned short *) (PARAM+0x1FC))
  175. #define AUX_DEVICE_INFO (*(unsigned char *) (PARAM+0x1FF))
  176. #define LOADER_TYPE (*(unsigned char *) (PARAM+0x210))
  177. #define KERNEL_START (*(unsigned long *) (PARAM+0x214))
  178. #define INITRD_START (*(unsigned long *) (PARAM+0x218))
  179. #define INITRD_SIZE (*(unsigned long *) (PARAM+0x21c))
  180. #define COMMAND_LINE ((char *) (PARAM+2048))
  181. #define COMMAND_LINE_SIZE 256
  182. #define RAMDISK_IMAGE_START_MASK   0x07FF
  183. #define RAMDISK_PROMPT_FLAG 0x8000
  184. #define RAMDISK_LOAD_FLAG 0x4000
  185. #ifdef CONFIG_VISWS
  186. char visws_board_type = -1;
  187. char visws_board_rev = -1;
  188. #define PIIX_PM_START 0x0F80
  189. #define SIO_GPIO_START 0x0FC0
  190. #define SIO_PM_START 0x0FC8
  191. #define PMBASE PIIX_PM_START
  192. #define GPIREG0 (PMBASE+0x30)
  193. #define GPIREG(x) (GPIREG0+((x)/8))
  194. #define PIIX_GPI_BD_ID1 18
  195. #define PIIX_GPI_BD_REG GPIREG(PIIX_GPI_BD_ID1)
  196. #define PIIX_GPI_BD_SHIFT (PIIX_GPI_BD_ID1 % 8)
  197. #define SIO_INDEX 0x2e
  198. #define SIO_DATA 0x2f
  199. #define SIO_DEV_SEL 0x7
  200. #define SIO_DEV_ENB 0x30
  201. #define SIO_DEV_MSB 0x60
  202. #define SIO_DEV_LSB 0x61
  203. #define SIO_GP_DEV 0x7
  204. #define SIO_GP_BASE SIO_GPIO_START
  205. #define SIO_GP_MSB (SIO_GP_BASE>>8)
  206. #define SIO_GP_LSB (SIO_GP_BASE&0xff)
  207. #define SIO_GP_DATA1 (SIO_GP_BASE+0)
  208. #define SIO_PM_DEV 0x8
  209. #define SIO_PM_BASE SIO_PM_START
  210. #define SIO_PM_MSB (SIO_PM_BASE>>8)
  211. #define SIO_PM_LSB (SIO_PM_BASE&0xff)
  212. #define SIO_PM_INDEX (SIO_PM_BASE+0)
  213. #define SIO_PM_DATA (SIO_PM_BASE+1)
  214. #define SIO_PM_FER2 0x1
  215. #define SIO_PM_GP_EN 0x80
  216. static void __init visws_get_board_type_and_rev(void)
  217. {
  218. int raw;
  219. visws_board_type = (char)(inb_p(PIIX_GPI_BD_REG) & PIIX_GPI_BD_REG)
  220.  >> PIIX_GPI_BD_SHIFT;
  221. /*
  222.  * Get Board rev.
  223.  * First, we have to initialize the 307 part to allow us access
  224.  * to the GPIO registers.  Let's map them at 0x0fc0 which is right
  225.  * after the PIIX4 PM section.
  226.  */
  227. outb_p(SIO_DEV_SEL, SIO_INDEX);
  228. outb_p(SIO_GP_DEV, SIO_DATA); /* Talk to GPIO regs. */
  229.     
  230. outb_p(SIO_DEV_MSB, SIO_INDEX);
  231. outb_p(SIO_GP_MSB, SIO_DATA); /* MSB of GPIO base address */
  232. outb_p(SIO_DEV_LSB, SIO_INDEX);
  233. outb_p(SIO_GP_LSB, SIO_DATA); /* LSB of GPIO base address */
  234. outb_p(SIO_DEV_ENB, SIO_INDEX);
  235. outb_p(1, SIO_DATA); /* Enable GPIO registers. */
  236.     
  237. /*
  238.  * Now, we have to map the power management section to write
  239.  * a bit which enables access to the GPIO registers.
  240.  * What lunatic came up with this shit?
  241.  */
  242. outb_p(SIO_DEV_SEL, SIO_INDEX);
  243. outb_p(SIO_PM_DEV, SIO_DATA); /* Talk to GPIO regs. */
  244. outb_p(SIO_DEV_MSB, SIO_INDEX);
  245. outb_p(SIO_PM_MSB, SIO_DATA); /* MSB of PM base address */
  246.     
  247. outb_p(SIO_DEV_LSB, SIO_INDEX);
  248. outb_p(SIO_PM_LSB, SIO_DATA); /* LSB of PM base address */
  249. outb_p(SIO_DEV_ENB, SIO_INDEX);
  250. outb_p(1, SIO_DATA); /* Enable PM registers. */
  251.     
  252. /*
  253.  * Now, write the PM register which enables the GPIO registers.
  254.  */
  255. outb_p(SIO_PM_FER2, SIO_PM_INDEX);
  256. outb_p(SIO_PM_GP_EN, SIO_PM_DATA);
  257.     
  258. /*
  259.  * Now, initialize the GPIO registers.
  260.  * We want them all to be inputs which is the
  261.  * power on default, so let's leave them alone.
  262.  * So, let's just read the board rev!
  263.  */
  264. raw = inb_p(SIO_GP_DATA1);
  265. raw &= 0x7f; /* 7 bits of valid board revision ID. */
  266. if (visws_board_type == VISWS_320) {
  267. if (raw < 0x6) {
  268. visws_board_rev = 4;
  269. } else if (raw < 0xc) {
  270. visws_board_rev = 5;
  271. } else {
  272. visws_board_rev = 6;
  273. }
  274. } else if (visws_board_type == VISWS_540) {
  275. visws_board_rev = 2;
  276. } else {
  277. visws_board_rev = raw;
  278. }
  279. printk(KERN_INFO "Silicon Graphics %s (rev %d)n",
  280. visws_board_type == VISWS_320 ? "320" :
  281. (visws_board_type == VISWS_540 ? "540" :
  282. "unknown"),
  283. visws_board_rev);
  284. }
  285. #endif
  286. static char command_line[COMMAND_LINE_SIZE];
  287.        char saved_command_line[COMMAND_LINE_SIZE];
  288. struct resource standard_io_resources[] = {
  289. { "dma1", 0x00, 0x1f, IORESOURCE_BUSY },
  290. { "pic1", 0x20, 0x3f, IORESOURCE_BUSY },
  291. { "timer", 0x40, 0x5f, IORESOURCE_BUSY },
  292. { "keyboard", 0x60, 0x6f, IORESOURCE_BUSY },
  293. { "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY },
  294. { "pic2", 0xa0, 0xbf, IORESOURCE_BUSY },
  295. { "dma2", 0xc0, 0xdf, IORESOURCE_BUSY },
  296. { "fpu", 0xf0, 0xff, IORESOURCE_BUSY }
  297. };
  298. #define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
  299. static struct resource code_resource = { "Kernel code", 0x100000, 0 };
  300. static struct resource data_resource = { "Kernel data", 0, 0 };
  301. static struct resource vram_resource = { "Video RAM area", 0xa0000, 0xbffff, IORESOURCE_BUSY };
  302. /* System ROM resources */
  303. #define MAXROMS 6
  304. static struct resource rom_resources[MAXROMS] = {
  305. { "System ROM", 0xF0000, 0xFFFFF, IORESOURCE_BUSY },
  306. { "Video ROM", 0xc0000, 0xc7fff, IORESOURCE_BUSY }
  307. };
  308. #define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
  309. static void __init probe_roms(void)
  310. {
  311. int roms = 1;
  312. unsigned long base;
  313. unsigned char *romstart;
  314. request_resource(&iomem_resource, rom_resources+0);
  315. /* Video ROM is standard at C000:0000 - C7FF:0000, check signature */
  316. for (base = 0xC0000; base < 0xE0000; base += 2048) {
  317. romstart = bus_to_virt(base);
  318. if (!romsignature(romstart))
  319. continue;
  320. request_resource(&iomem_resource, rom_resources + roms);
  321. roms++;
  322. break;
  323. }
  324. /* Extension roms at C800:0000 - DFFF:0000 */
  325. for (base = 0xC8000; base < 0xE0000; base += 2048) {
  326. unsigned long length;
  327. romstart = bus_to_virt(base);
  328. if (!romsignature(romstart))
  329. continue;
  330. length = romstart[2] * 512;
  331. if (length) {
  332. unsigned int i;
  333. unsigned char chksum;
  334. chksum = 0;
  335. for (i = 0; i < length; i++)
  336. chksum += romstart[i];
  337. /* Good checksum? */
  338. if (!chksum) {
  339. rom_resources[roms].start = base;
  340. rom_resources[roms].end = base + length - 1;
  341. rom_resources[roms].name = "Extension ROM";
  342. rom_resources[roms].flags = IORESOURCE_BUSY;
  343. request_resource(&iomem_resource, rom_resources + roms);
  344. roms++;
  345. if (roms >= MAXROMS)
  346. return;
  347. }
  348. }
  349. }
  350. /* Final check for motherboard extension rom at E000:0000 */
  351. base = 0xE0000;
  352. romstart = bus_to_virt(base);
  353. if (romsignature(romstart)) {
  354. rom_resources[roms].start = base;
  355. rom_resources[roms].end = base + 65535;
  356. rom_resources[roms].name = "Extension ROM";
  357. rom_resources[roms].flags = IORESOURCE_BUSY;
  358. request_resource(&iomem_resource, rom_resources + roms);
  359. }
  360. }
  361. static void __init limit_regions (unsigned long long size)
  362. {
  363. unsigned long long current_addr = 0;
  364. int i;
  365. for (i = 0; i < e820.nr_map; i++) {
  366. if (e820.map[i].type == E820_RAM) {
  367. current_addr = e820.map[i].addr + e820.map[i].size;
  368. if (current_addr >= size) {
  369. e820.map[i].size -= current_addr-size;
  370. e820.nr_map = i + 1;
  371. return;
  372. }
  373. }
  374. }
  375. }
  376. static void __init add_memory_region(unsigned long long start,
  377.                                   unsigned long long size, int type)
  378. {
  379. int x = e820.nr_map;
  380. if (x == E820MAX) {
  381.     printk(KERN_ERR "Ooops! Too many entries in the memory map!n");
  382.     return;
  383. }
  384. e820.map[x].addr = start;
  385. e820.map[x].size = size;
  386. e820.map[x].type = type;
  387. e820.nr_map++;
  388. } /* add_memory_region */
  389. #define E820_DEBUG 1
  390. static void __init print_memory_map(char *who)
  391. {
  392. int i;
  393. for (i = 0; i < e820.nr_map; i++) {
  394. printk(" %s: %016Lx - %016Lx ", who,
  395. e820.map[i].addr,
  396. e820.map[i].addr + e820.map[i].size);
  397. switch (e820.map[i].type) {
  398. case E820_RAM: printk("(usable)n");
  399. break;
  400. case E820_RESERVED:
  401. printk("(reserved)n");
  402. break;
  403. case E820_ACPI:
  404. printk("(ACPI data)n");
  405. break;
  406. case E820_NVS:
  407. printk("(ACPI NVS)n");
  408. break;
  409. default: printk("type %lun", e820.map[i].type);
  410. break;
  411. }
  412. }
  413. }
  414. /*
  415.  * Sanitize the BIOS e820 map.
  416.  *
  417.  * Some e820 responses include overlapping entries.  The following 
  418.  * replaces the original e820 map with a new one, removing overlaps.
  419.  *
  420.  */
  421. static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
  422. {
  423. struct change_member {
  424. struct e820entry *pbios; /* pointer to original bios entry */
  425. unsigned long long addr; /* address for this change point */
  426. };
  427. struct change_member change_point_list[2*E820MAX];
  428. struct change_member *change_point[2*E820MAX];
  429. struct e820entry *overlap_list[E820MAX];
  430. struct e820entry new_bios[E820MAX];
  431. struct change_member *change_tmp;
  432. unsigned long current_type, last_type;
  433. unsigned long long last_addr;
  434. int chgidx, still_changing;
  435. int overlap_entries;
  436. int new_bios_entry;
  437. int old_nr, new_nr;
  438. int i;
  439. /*
  440. Visually we're performing the following (1,2,3,4 = memory types)...
  441. Sample memory map (w/overlaps):
  442.    ____22__________________
  443.    ______________________4_
  444.    ____1111________________
  445.    _44_____________________
  446.    11111111________________
  447.    ____________________33__
  448.    ___________44___________
  449.    __________33333_________
  450.    ______________22________
  451.    ___________________2222_
  452.    _________111111111______
  453.    _____________________11_
  454.    _________________4______
  455. Sanitized equivalent (no overlap):
  456.    1_______________________
  457.    _44_____________________
  458.    ___1____________________
  459.    ____22__________________
  460.    ______11________________
  461.    _________1______________
  462.    __________3_____________
  463.    ___________44___________
  464.    _____________33_________
  465.    _______________2________
  466.    ________________1_______
  467.    _________________4______
  468.    ___________________2____
  469.    ____________________33__
  470.    ______________________4_
  471. */
  472. /* if there's only one memory region, don't bother */
  473. if (*pnr_map < 2)
  474. return -1;
  475. old_nr = *pnr_map;
  476. /* bail out if we find any unreasonable addresses in bios map */
  477. for (i=0; i<old_nr; i++)
  478. if (biosmap[i].addr + biosmap[i].size < biosmap[i].addr)
  479. return -1;
  480. /* create pointers for initial change-point information (for sorting) */
  481. for (i=0; i < 2*old_nr; i++)
  482. change_point[i] = &change_point_list[i];
  483. /* record all known change-points (starting and ending addresses) */
  484. chgidx = 0;
  485. for (i=0; i < old_nr; i++) {
  486. change_point[chgidx]->addr = biosmap[i].addr;
  487. change_point[chgidx++]->pbios = &biosmap[i];
  488. change_point[chgidx]->addr = biosmap[i].addr + biosmap[i].size;
  489. change_point[chgidx++]->pbios = &biosmap[i];
  490. }
  491. /* sort change-point list by memory addresses (low -> high) */
  492. still_changing = 1;
  493. while (still_changing) {
  494. still_changing = 0;
  495. for (i=1; i < 2*old_nr; i++)  {
  496. /* if <current_addr> > <last_addr>, swap */
  497. /* or, if current=<start_addr> & last=<end_addr>, swap */
  498. if ((change_point[i]->addr < change_point[i-1]->addr) ||
  499. ((change_point[i]->addr == change_point[i-1]->addr) &&
  500.  (change_point[i]->addr == change_point[i]->pbios->addr) &&
  501.  (change_point[i-1]->addr != change_point[i-1]->pbios->addr))
  502.    )
  503. {
  504. change_tmp = change_point[i];
  505. change_point[i] = change_point[i-1];
  506. change_point[i-1] = change_tmp;
  507. still_changing=1;
  508. }
  509. }
  510. }
  511. /* create a new bios memory map, removing overlaps */
  512. overlap_entries=0;  /* number of entries in the overlap table */
  513. new_bios_entry=0;  /* index for creating new bios map entries */
  514. last_type = 0;  /* start with undefined memory type */
  515. last_addr = 0;  /* start with 0 as last starting address */
  516. /* loop through change-points, determining affect on the new bios map */
  517. for (chgidx=0; chgidx < 2*old_nr; chgidx++)
  518. {
  519. /* keep track of all overlapping bios entries */
  520. if (change_point[chgidx]->addr == change_point[chgidx]->pbios->addr)
  521. {
  522. /* add map entry to overlap list (> 1 entry implies an overlap) */
  523. overlap_list[overlap_entries++]=change_point[chgidx]->pbios;
  524. }
  525. else
  526. {
  527. /* remove entry from list (order independent, so swap with last) */
  528. for (i=0; i<overlap_entries; i++)
  529. {
  530. if (overlap_list[i] == change_point[chgidx]->pbios)
  531. overlap_list[i] = overlap_list[overlap_entries-1];
  532. }
  533. overlap_entries--;
  534. }
  535. /* if there are overlapping entries, decide which "type" to use */
  536. /* (larger value takes precedence -- 1=usable, 2,3,4,4+=unusable) */
  537. current_type = 0;
  538. for (i=0; i<overlap_entries; i++)
  539. if (overlap_list[i]->type > current_type)
  540. current_type = overlap_list[i]->type;
  541. /* continue building up new bios map based on this information */
  542. if (current_type != last_type) {
  543. if (last_type != 0)  {
  544. new_bios[new_bios_entry].size =
  545. change_point[chgidx]->addr - last_addr;
  546. /* move forward only if the new size was non-zero */
  547. if (new_bios[new_bios_entry].size != 0)
  548. if (++new_bios_entry >= E820MAX)
  549. break;  /* no more space left for new bios entries */
  550. }
  551. if (current_type != 0) {
  552. new_bios[new_bios_entry].addr = change_point[chgidx]->addr;
  553. new_bios[new_bios_entry].type = current_type;
  554. last_addr=change_point[chgidx]->addr;
  555. }
  556. last_type = current_type;
  557. }
  558. }
  559. new_nr = new_bios_entry;   /* retain count for new bios entries */
  560. /* copy new bios mapping into original location */
  561. memcpy(biosmap, new_bios, new_nr*sizeof(struct e820entry));
  562. *pnr_map = new_nr;
  563. return 0;
  564. }
  565. /*
  566.  * Copy the BIOS e820 map into a safe place.
  567.  *
  568.  * Sanity-check it while we're at it..
  569.  *
  570.  * If we're lucky and live on a modern system, the setup code
  571.  * will have given us a memory map that we can use to properly
  572.  * set up memory.  If we aren't, we'll fake a memory map.
  573.  *
  574.  * We check to see that the memory map contains at least 2 elements
  575.  * before we'll use it, because the detection code in setup.S may
  576.  * not be perfect and most every PC known to man has two memory
  577.  * regions: one from 0 to 640k, and one from 1mb up.  (The IBM
  578.  * thinkpad 560x, for example, does not cooperate with the memory
  579.  * detection code.)
  580.  */
  581. static int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
  582. {
  583. /* Only one memory region (or negative)? Ignore it */
  584. if (nr_map < 2)
  585. return -1;
  586. do {
  587. unsigned long long start = biosmap->addr;
  588. unsigned long long size = biosmap->size;
  589. unsigned long long end = start + size;
  590. unsigned long type = biosmap->type;
  591. /* Overflow in 64 bits? Ignore the memory map. */
  592. if (start > end)
  593. return -1;
  594. /*
  595.  * Some BIOSes claim RAM in the 640k - 1M region.
  596.  * Not right. Fix it up.
  597.  */
  598. if (type == E820_RAM) {
  599. if (start < 0x100000ULL && end > 0xA0000ULL) {
  600. if (start < 0xA0000ULL)
  601. add_memory_region(start, 0xA0000ULL-start, type);
  602. if (end <= 0x100000ULL)
  603. continue;
  604. start = 0x100000ULL;
  605. size = end - start;
  606. }
  607. }
  608. add_memory_region(start, size, type);
  609. } while (biosmap++,--nr_map);
  610. return 0;
  611. }
  612. /*
  613.  * Do NOT EVER look at the BIOS memory size location.
  614.  * It does not work on many machines.
  615.  */
  616. #define LOWMEMSIZE() (0x9f000)
  617. static void __init setup_memory_region(void)
  618. {
  619. char *who = "BIOS-e820";
  620. /*
  621.  * Try to copy the BIOS-supplied E820-map.
  622.  *
  623.  * Otherwise fake a memory map; one section from 0k->640k,
  624.  * the next section from 1mb->appropriate_mem_k
  625.  */
  626. sanitize_e820_map(E820_MAP, &E820_MAP_NR);
  627. if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) {
  628. unsigned long mem_size;
  629. /* compare results from other methods and take the greater */
  630. if (ALT_MEM_K < EXT_MEM_K) {
  631. mem_size = EXT_MEM_K;
  632. who = "BIOS-88";
  633. } else {
  634. mem_size = ALT_MEM_K;
  635. who = "BIOS-e801";
  636. }
  637. e820.nr_map = 0;
  638. add_memory_region(0, LOWMEMSIZE(), E820_RAM);
  639. add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
  640.    }
  641. printk(KERN_INFO "BIOS-provided physical RAM map:n");
  642. print_memory_map(who);
  643. } /* setup_memory_region */
  644. static void __init parse_cmdline_early (char ** cmdline_p)
  645. {
  646. char c = ' ', *to = command_line, *from = COMMAND_LINE;
  647. int len = 0;
  648. int userdef = 0;
  649. /* Save unparsed command line copy for /proc/cmdline */
  650. memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
  651. saved_command_line[COMMAND_LINE_SIZE-1] = '';
  652. for (;;) {
  653. if (c != ' ')
  654. goto nextchar;
  655. /*
  656.  * "mem=nopentium" disables the 4MB page tables.
  657.  * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
  658.  * to <mem>, overriding the bios size.
  659.  * "mem=XXX[KkmM]@XXX[KkmM]" defines a memory region from
  660.  * <start> to <start>+<mem>, overriding the bios size.
  661.  */
  662. if (!memcmp(from, "mem=", 4)) {
  663. if (to != command_line)
  664. to--;
  665. if (!memcmp(from+4, "nopentium", 9)) {
  666. from += 9+4;
  667. clear_bit(X86_FEATURE_PSE, &boot_cpu_data.x86_capability);
  668. set_bit(X86_FEATURE_PSE, &disabled_x86_caps);
  669. } else if (!memcmp(from+4, "exactmap", 8)) {
  670. from += 8+4;
  671. e820.nr_map = 0;
  672. userdef = 1;
  673. } else {
  674. /* If the user specifies memory size, we
  675.  * limit the BIOS-provided memory map to
  676.  * that size. exactmap can be used to specify
  677.  * the exact map. mem=number can be used to
  678.  * trim the existing memory map.
  679.  */
  680. unsigned long long start_at, mem_size;
  681.  
  682. mem_size = memparse(from+4, &from);
  683. if (*from == '@') {
  684. start_at = memparse(from+1, &from);
  685. add_memory_region(start_at, mem_size, E820_RAM);
  686. } else {
  687. limit_regions(mem_size);
  688. userdef=1;
  689. }
  690. }
  691. }
  692. /* "noht" disables HyperThreading (2 logical cpus per Xeon) */
  693. else if (!memcmp(from, "noht", 4)) { 
  694. disable_x86_ht = 1;
  695. set_bit(X86_FEATURE_HT, disabled_x86_caps);
  696. }
  697. /* "acpismp=force" forces parsing and use of the ACPI SMP table */
  698. else if (!memcmp(from, "acpismp=force", 13))
  699. enable_acpi_smp_table = 1;
  700. /*
  701.  * highmem=size forces highmem to be exactly 'size' bytes.
  702.  * This works even on boxes that have no highmem otherwise.
  703.  * This also works to reduce highmem size on bigger boxes.
  704.  */
  705. else if (!memcmp(from, "highmem=", 8))
  706. highmem_pages = memparse(from+8, &from) >> PAGE_SHIFT;
  707. nextchar:
  708. c = *(from++);
  709. if (!c)
  710. break;
  711. if (COMMAND_LINE_SIZE <= ++len)
  712. break;
  713. *(to++) = c;
  714. }
  715. *to = '';
  716. *cmdline_p = command_line;
  717. if (userdef) {
  718. printk(KERN_INFO "user-defined physical RAM map:n");
  719. print_memory_map("user");
  720. }
  721. }
  722. #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
  723. #define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
  724. #define PFN_PHYS(x) ((x) << PAGE_SHIFT)
  725. /*
  726.  * Reserved space for vmalloc and iomap - defined in asm/page.h
  727.  */
  728. #define MAXMEM_PFN PFN_DOWN(MAXMEM)
  729. #define MAX_NONPAE_PFN (1 << 20)
  730. /*
  731.  * Find the highest page frame number we have available
  732.  */
  733. static void __init find_max_pfn(void)
  734. {
  735. int i;
  736. max_pfn = 0;
  737. for (i = 0; i < e820.nr_map; i++) {
  738. unsigned long start, end;
  739. /* RAM? */
  740. if (e820.map[i].type != E820_RAM)
  741. continue;
  742. start = PFN_UP(e820.map[i].addr);
  743. end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
  744. if (start >= end)
  745. continue;
  746. if (end > max_pfn)
  747. max_pfn = end;
  748. }
  749. }
  750. /*
  751.  * Determine low and high memory ranges:
  752.  */
  753. static unsigned long __init find_max_low_pfn(void)
  754. {
  755. unsigned long max_low_pfn;
  756. max_low_pfn = max_pfn;
  757. if (max_low_pfn > MAXMEM_PFN) {
  758. if (highmem_pages == -1)
  759. highmem_pages = max_pfn - MAXMEM_PFN;
  760. if (highmem_pages + MAXMEM_PFN < max_pfn)
  761. max_pfn = MAXMEM_PFN + highmem_pages;
  762. if (highmem_pages + MAXMEM_PFN > max_pfn) {
  763. printk("only %luMB highmem pages available, ignoring highmem size of %uMB.n", pages_to_mb(max_pfn - MAXMEM_PFN), pages_to_mb(highmem_pages));
  764. highmem_pages = 0;
  765. }
  766. max_low_pfn = MAXMEM_PFN;
  767. #ifndef CONFIG_HIGHMEM
  768. /* Maximum memory usable is what is directly addressable */
  769. printk(KERN_WARNING "Warning only %ldMB will be used.n",
  770. MAXMEM>>20);
  771. if (max_pfn > MAX_NONPAE_PFN)
  772. printk(KERN_WARNING "Use a PAE enabled kernel.n");
  773. else
  774. printk(KERN_WARNING "Use a HIGHMEM enabled kernel.n");
  775. #else /* !CONFIG_HIGHMEM */
  776. #ifndef CONFIG_X86_PAE
  777. if (max_pfn > MAX_NONPAE_PFN) {
  778. max_pfn = MAX_NONPAE_PFN;
  779. printk(KERN_WARNING "Warning only 4GB will be used.n");
  780. printk(KERN_WARNING "Use a PAE enabled kernel.n");
  781. }
  782. #endif /* !CONFIG_X86_PAE */
  783. #endif /* !CONFIG_HIGHMEM */
  784. } else {
  785. if (highmem_pages == -1)
  786. highmem_pages = 0;
  787. #if CONFIG_HIGHMEM
  788. if (highmem_pages >= max_pfn) {
  789. printk(KERN_ERR "highmem size specified (%uMB) is bigger than pages available (%luMB)!.n", pages_to_mb(highmem_pages), pages_to_mb(max_pfn));
  790. highmem_pages = 0;
  791. }
  792. if (highmem_pages) {
  793. if (max_low_pfn-highmem_pages < 64*1024*1024/PAGE_SIZE){
  794. printk(KERN_ERR "highmem size %uMB results in smaller than 64MB lowmem, ignoring it.n", pages_to_mb(highmem_pages));
  795. highmem_pages = 0;
  796. }
  797. max_low_pfn -= highmem_pages;
  798. }
  799. #else
  800. if (highmem_pages)
  801. printk(KERN_ERR "ignoring highmem size on non-highmem kernel!n");
  802. #endif
  803. }
  804. return max_low_pfn;
  805. }
  806. /*
  807.  * Register fully available low RAM pages with the bootmem allocator.
  808.  */
  809. static void __init register_bootmem_low_pages(unsigned long max_low_pfn)
  810. {
  811. int i;
  812. for (i = 0; i < e820.nr_map; i++) {
  813. unsigned long curr_pfn, last_pfn, size;
  814. /*
  815.  * Reserve usable low memory
  816.  */
  817. if (e820.map[i].type != E820_RAM)
  818. continue;
  819. /*
  820.  * We are rounding up the start address of usable memory:
  821.  */
  822. curr_pfn = PFN_UP(e820.map[i].addr);
  823. if (curr_pfn >= max_low_pfn)
  824. continue;
  825. /*
  826.  * ... and at the end of the usable range downwards:
  827.  */
  828. last_pfn = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
  829. if (last_pfn > max_low_pfn)
  830. last_pfn = max_low_pfn;
  831. /*
  832.  * .. finally, did all the rounding and playing
  833.  * around just make the area go away?
  834.  */
  835. if (last_pfn <= curr_pfn)
  836. continue;
  837. size = last_pfn - curr_pfn;
  838. free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
  839. }
  840. }
  841. static unsigned long __init setup_memory(void)
  842. {
  843. unsigned long bootmap_size, start_pfn, max_low_pfn;
  844. /*
  845.  * partially used pages are not usable - thus
  846.  * we are rounding upwards:
  847.  */
  848. start_pfn = PFN_UP(__pa(&_end));
  849. find_max_pfn();
  850. max_low_pfn = find_max_low_pfn();
  851. #ifdef CONFIG_HIGHMEM
  852. highstart_pfn = highend_pfn = max_pfn;
  853. if (max_pfn > max_low_pfn) {
  854. highstart_pfn = max_low_pfn;
  855. }
  856. printk(KERN_NOTICE "%ldMB HIGHMEM available.n",
  857. pages_to_mb(highend_pfn - highstart_pfn));
  858. #endif
  859. printk(KERN_NOTICE "%ldMB LOWMEM available.n",
  860. pages_to_mb(max_low_pfn));
  861. /*
  862.  * Initialize the boot-time allocator (with low memory only):
  863.  */
  864. bootmap_size = init_bootmem(start_pfn, max_low_pfn);
  865. register_bootmem_low_pages(max_low_pfn);
  866. /*
  867.  * Reserve the bootmem bitmap itself as well. We do this in two
  868.  * steps (first step was init_bootmem()) because this catches
  869.  * the (very unlikely) case of us accidentally initializing the
  870.  * bootmem allocator with an invalid RAM area.
  871.  */
  872. reserve_bootmem(HIGH_MEMORY, (PFN_PHYS(start_pfn) +
  873.  bootmap_size + PAGE_SIZE-1) - (HIGH_MEMORY));
  874. /*
  875.  * reserve physical page 0 - it's a special BIOS page on many boxes,
  876.  * enabling clean reboots, SMP operation, laptop functions.
  877.  */
  878. reserve_bootmem(0, PAGE_SIZE);
  879. #ifdef CONFIG_SMP
  880. /*
  881.  * But first pinch a few for the stack/trampoline stuff
  882.  * FIXME: Don't need the extra page at 4K, but need to fix
  883.  * trampoline before removing it. (see the GDT stuff)
  884.  */
  885. reserve_bootmem(PAGE_SIZE, PAGE_SIZE);
  886. #endif
  887. #ifdef CONFIG_X86_LOCAL_APIC
  888. /*
  889.  * Find and reserve possible boot-time SMP configuration:
  890.  */
  891. find_smp_config();
  892. #endif
  893. #ifdef CONFIG_BLK_DEV_INITRD
  894. if (LOADER_TYPE && INITRD_START) {
  895. if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
  896. reserve_bootmem(INITRD_START, INITRD_SIZE);
  897. initrd_start =
  898. INITRD_START ? INITRD_START + PAGE_OFFSET : 0;
  899. initrd_end = initrd_start+INITRD_SIZE;
  900. }
  901. else {
  902. printk(KERN_ERR "initrd extends beyond end of memory "
  903.     "(0x%08lx > 0x%08lx)ndisabling initrdn",
  904.     INITRD_START + INITRD_SIZE,
  905.     max_low_pfn << PAGE_SHIFT);
  906. initrd_start = 0;
  907. }
  908. }
  909. #endif
  910. return max_low_pfn;
  911. }
  912.  
  913. /*
  914.  * Request address space for all standard RAM and ROM resources
  915.  * and also for regions reported as reserved by the e820.
  916.  */
  917. static void __init register_memory(unsigned long max_low_pfn)
  918. {
  919. unsigned long low_mem_size;
  920. int i;
  921. probe_roms();
  922. for (i = 0; i < e820.nr_map; i++) {
  923. struct resource *res;
  924. if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL)
  925. continue;
  926. res = alloc_bootmem_low(sizeof(struct resource));
  927. switch (e820.map[i].type) {
  928. case E820_RAM: res->name = "System RAM"; break;
  929. case E820_ACPI: res->name = "ACPI Tables"; break;
  930. case E820_NVS: res->name = "ACPI Non-volatile Storage"; break;
  931. default: res->name = "reserved";
  932. }
  933. res->start = e820.map[i].addr;
  934. res->end = res->start + e820.map[i].size - 1;
  935. res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
  936. request_resource(&iomem_resource, res);
  937. if (e820.map[i].type == E820_RAM) {
  938. /*
  939.  *  We dont't know which RAM region contains kernel data,
  940.  *  so we try it repeatedly and let the resource manager
  941.  *  test it.
  942.  */
  943. request_resource(res, &code_resource);
  944. request_resource(res, &data_resource);
  945. }
  946. }
  947. request_resource(&iomem_resource, &vram_resource);
  948. /* request I/O space for devices used on all i[345]86 PCs */
  949. for (i = 0; i < STANDARD_IO_RESOURCES; i++)
  950. request_resource(&ioport_resource, standard_io_resources+i);
  951. /* Tell the PCI layer not to allocate too close to the RAM area.. */
  952. low_mem_size = ((max_low_pfn << PAGE_SHIFT) + 0xfffff) & ~0xfffff;
  953. if (low_mem_size > pci_mem_start)
  954. pci_mem_start = low_mem_size;
  955. }
  956. void __init setup_arch(char **cmdline_p)
  957. {
  958. unsigned long max_low_pfn;
  959. #ifdef CONFIG_VISWS
  960. visws_get_board_type_and_rev();
  961. #endif
  962. #ifndef CONFIG_HIGHIO
  963. blk_nohighio = 1;
  964. #endif
  965.   ROOT_DEV = to_kdev_t(ORIG_ROOT_DEV);
  966.   drive_info = DRIVE_INFO;
  967.   screen_info = SCREEN_INFO;
  968. apm_info.bios = APM_BIOS_INFO;
  969. if( SYS_DESC_TABLE.length != 0 ) {
  970. MCA_bus = SYS_DESC_TABLE.table[3] &0x2;
  971. machine_id = SYS_DESC_TABLE.table[0];
  972. machine_submodel_id = SYS_DESC_TABLE.table[1];
  973. BIOS_revision = SYS_DESC_TABLE.table[2];
  974. }
  975. aux_device_present = AUX_DEVICE_INFO;
  976. #ifdef CONFIG_BLK_DEV_RAM
  977. rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
  978. rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
  979. rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
  980. #endif
  981. setup_memory_region();
  982. if (!MOUNT_ROOT_RDONLY)
  983. root_mountflags &= ~MS_RDONLY;
  984. init_mm.start_code = (unsigned long) &_text;
  985. init_mm.end_code = (unsigned long) &_etext;
  986. init_mm.end_data = (unsigned long) &_edata;
  987. init_mm.brk = (unsigned long) &_end;
  988. code_resource.start = virt_to_bus(&_text);
  989. code_resource.end = virt_to_bus(&_etext)-1;
  990. data_resource.start = virt_to_bus(&_etext);
  991. data_resource.end = virt_to_bus(&_edata)-1;
  992. parse_cmdline_early(cmdline_p);
  993. max_low_pfn = setup_memory();
  994. /*
  995.  * If enable_acpi_smp_table and HT feature present, acpitable.c
  996.  * will find all logical cpus despite disable_x86_ht: so if both
  997.  * "noht" and "acpismp=force" are specified, let "noht" override
  998.  * "acpismp=force" cleanly.  Why retain "acpismp=force"? because
  999.  * parsing ACPI SMP table might prove useful on some non-HT cpu.
  1000.  */
  1001. if (disable_x86_ht) {
  1002. clear_bit(X86_FEATURE_HT, &boot_cpu_data.x86_capability[0]);
  1003. set_bit(X86_FEATURE_HT, disabled_x86_caps);
  1004. enable_acpi_smp_table = 0;
  1005. }
  1006. if (test_bit(X86_FEATURE_HT, &boot_cpu_data.x86_capability[0]))
  1007. enable_acpi_smp_table = 1;
  1008. /*
  1009.  * NOTE: before this point _nobody_ is allowed to allocate
  1010.  * any memory using the bootmem allocator.
  1011.  */
  1012. #ifdef CONFIG_SMP
  1013. smp_alloc_memory(); /* AP processor realmode stacks in low memory*/
  1014. #endif
  1015. paging_init();
  1016. #ifdef CONFIG_X86_LOCAL_APIC
  1017. /*
  1018.  * get boot-time SMP configuration:
  1019.  */
  1020. if (smp_found_config)
  1021. get_smp_config();
  1022. #endif
  1023. register_memory(max_low_pfn);
  1024. #ifdef CONFIG_VT
  1025. #if defined(CONFIG_VGA_CONSOLE)
  1026. conswitchp = &vga_con;
  1027. #elif defined(CONFIG_DUMMY_CONSOLE)
  1028. conswitchp = &dummy_con;
  1029. #endif
  1030. #endif
  1031. dmi_scan_machine();
  1032. }
  1033. static int cachesize_override __initdata = -1;
  1034. static int __init cachesize_setup(char *str)
  1035. {
  1036. get_option (&str, &cachesize_override);
  1037. return 1;
  1038. }
  1039. __setup("cachesize=", cachesize_setup);
  1040. #ifndef CONFIG_X86_TSC
  1041. static int tsc_disable __initdata = 0;
  1042. static int __init notsc_setup(char *str)
  1043. {
  1044. tsc_disable = 1;
  1045. return 1;
  1046. }
  1047. #else
  1048. static int __init notsc_setup(char *str)
  1049. {
  1050. printk("notsc: Kernel compiled with CONFIG_X86_TSC, cannot disable TSC.n");
  1051. return 1;
  1052. }
  1053. #endif
  1054. __setup("notsc", notsc_setup);
  1055. static int __init highio_setup(char *str)
  1056. {
  1057. printk("i386: disabling HIGHMEM block I/On");
  1058. blk_nohighio = 1;
  1059. return 1;
  1060. }
  1061. __setup("nohighio", highio_setup);
  1062. static int __init get_model_name(struct cpuinfo_x86 *c)
  1063. {
  1064. unsigned int *v;
  1065. char *p, *q;
  1066. if (cpuid_eax(0x80000000) < 0x80000004)
  1067. return 0;
  1068. v = (unsigned int *) c->x86_model_id;
  1069. cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
  1070. cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
  1071. cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
  1072. c->x86_model_id[48] = 0;
  1073. /* Intel chips right-justify this string for some dumb reason;
  1074.    undo that brain damage */
  1075. p = q = &c->x86_model_id[0];
  1076. while ( *p == ' ' )
  1077.      p++;
  1078. if ( p != q ) {
  1079.      while ( *p )
  1080.   *q++ = *p++;
  1081.      while ( q <= &c->x86_model_id[48] )
  1082.   *q++ = ''; /* Zero-pad the rest */
  1083. }
  1084. return 1;
  1085. }
  1086. static void __init display_cacheinfo(struct cpuinfo_x86 *c)
  1087. {
  1088. unsigned int n, dummy, ecx, edx, l2size;
  1089. n = cpuid_eax(0x80000000);
  1090. if (n >= 0x80000005) {
  1091. cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
  1092. printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)n",
  1093. edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
  1094. c->x86_cache_size=(ecx>>24)+(edx>>24);
  1095. }
  1096. if (n < 0x80000006) /* Some chips just has a large L1. */
  1097. return;
  1098. ecx = cpuid_ecx(0x80000006);
  1099. l2size = ecx >> 16;
  1100. /* AMD errata T13 (order #21922) */
  1101. if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) {
  1102. if (c->x86_model == 3 && c->x86_mask == 0) /* Duron Rev A0 */
  1103. l2size = 64;
  1104. if (c->x86_model == 4 &&
  1105. (c->x86_mask==0 || c->x86_mask==1)) /* Tbird rev A1/A2 */
  1106. l2size = 256;
  1107. }
  1108. /* Intel PIII Tualatin. This comes in two flavours.
  1109.  * One has 256kb of cache, the other 512. We have no way
  1110.  * to determine which, so we use a boottime override
  1111.  * for the 512kb model, and assume 256 otherwise.
  1112.  */
  1113. if ((c->x86_vendor == X86_VENDOR_INTEL) && (c->x86 == 6) &&
  1114. (c->x86_model == 11) && (l2size == 0))
  1115. l2size = 256;
  1116. /* VIA C3 CPUs (670-68F) need further shifting. */
  1117. if (c->x86_vendor == X86_VENDOR_CENTAUR && (c->x86 == 6) &&
  1118. ((c->x86_model == 7) || (c->x86_model == 8))) {
  1119. l2size = l2size >> 8;
  1120. }
  1121. /* Allow user to override all this if necessary. */
  1122. if (cachesize_override != -1)
  1123. l2size = cachesize_override;
  1124. if ( l2size == 0 )
  1125. return; /* Again, no L2 cache is possible */
  1126. c->x86_cache_size = l2size;
  1127. printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)n",
  1128.        l2size, ecx & 0xFF);
  1129. }
  1130. /*
  1131.  * B step AMD K6 before B 9730xxxx have hardware bugs that can cause
  1132.  * misexecution of code under Linux. Owners of such processors should
  1133.  * contact AMD for precise details and a CPU swap.
  1134.  *
  1135.  * See http://www.multimania.com/poulot/k6bug.html
  1136.  * http://www.amd.com/K6/k6docs/revgd.html
  1137.  *
  1138.  * The following test is erm.. interesting. AMD neglected to up
  1139.  * the chip setting when fixing the bug but they also tweaked some
  1140.  * performance at the same time..
  1141.  */
  1142.  
  1143. extern void vide(void);
  1144. __asm__(".align 4nvide: ret");
  1145. static int __init init_amd(struct cpuinfo_x86 *c)
  1146. {
  1147. u32 l, h;
  1148. int mbytes = max_mapnr >> (20-PAGE_SHIFT);
  1149. int r;
  1150. /*
  1151.  * FIXME: We should handle the K5 here. Set up the write
  1152.  * range and also turn on MSR 83 bits 4 and 31 (write alloc,
  1153.  * no bus pipeline)
  1154.  */
  1155. /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
  1156.    3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
  1157. clear_bit(0*32+31, &c->x86_capability);
  1158. r = get_model_name(c);
  1159. switch(c->x86)
  1160. {
  1161. case 5:
  1162. if( c->x86_model < 6 )
  1163. {
  1164. /* Based on AMD doc 20734R - June 2000 */
  1165. if ( c->x86_model == 0 ) {
  1166. clear_bit(X86_FEATURE_APIC, &c->x86_capability);
  1167. set_bit(X86_FEATURE_PGE, &c->x86_capability);
  1168. }
  1169. break;
  1170. }
  1171. if ( c->x86_model == 6 && c->x86_mask == 1 ) {
  1172. const int K6_BUG_LOOP = 1000000;
  1173. int n;
  1174. void (*f_vide)(void);
  1175. unsigned long d, d2;
  1176. printk(KERN_INFO "AMD K6 stepping B detected - ");
  1177. /*
  1178.  * It looks like AMD fixed the 2.6.2 bug and improved indirect 
  1179.  * calls at the same time.
  1180.  */
  1181. n = K6_BUG_LOOP;
  1182. f_vide = vide;
  1183. rdtscl(d);
  1184. while (n--) 
  1185. f_vide();
  1186. rdtscl(d2);
  1187. d = d2-d;
  1188. /* Knock these two lines out if it debugs out ok */
  1189. printk(KERN_INFO "K6 BUG %ld %d (Report these if test report is incorrect)n", d, 20*K6_BUG_LOOP);
  1190. printk(KERN_INFO "AMD K6 stepping B detected - ");
  1191. /* -- cut here -- */
  1192. if (d > 20*K6_BUG_LOOP) 
  1193. printk("system stability may be impaired when more than 32 MB are used.n");
  1194. else 
  1195. printk("probably OK (after B9730xxxx).n");
  1196. printk(KERN_INFO "Please see http://www.mygale.com/~poulot/k6bug.htmln");
  1197. }
  1198. /* K6 with old style WHCR */
  1199. if (c->x86_model < 8 ||
  1200.    (c->x86_model== 8 && c->x86_mask < 8)) {
  1201. /* We can only write allocate on the low 508Mb */
  1202. if(mbytes>508)
  1203. mbytes=508;
  1204. rdmsr(MSR_K6_WHCR, l, h);
  1205. if ((l&0x0000FFFF)==0) {
  1206. unsigned long flags;
  1207. l=(1<<0)|((mbytes/4)<<1);
  1208. local_irq_save(flags);
  1209. wbinvd();
  1210. wrmsr(MSR_K6_WHCR, l, h);
  1211. local_irq_restore(flags);
  1212. printk(KERN_INFO "Enabling old style K6 write allocation for %d Mbn",
  1213. mbytes);
  1214. }
  1215. break;
  1216. }
  1217. if ((c->x86_model == 8 && c->x86_mask >7) ||
  1218.      c->x86_model == 9 || c->x86_model == 13) {
  1219. /* The more serious chips .. */
  1220. if(mbytes>4092)
  1221. mbytes=4092;
  1222. rdmsr(MSR_K6_WHCR, l, h);
  1223. if ((l&0xFFFF0000)==0) {
  1224. unsigned long flags;
  1225. l=((mbytes>>2)<<22)|(1<<16);
  1226. local_irq_save(flags);
  1227. wbinvd();
  1228. wrmsr(MSR_K6_WHCR, l, h);
  1229. local_irq_restore(flags);
  1230. printk(KERN_INFO "Enabling new style K6 write allocation for %d Mbn",
  1231. mbytes);
  1232. }
  1233. /*  Set MTRR capability flag if appropriate */
  1234. if (c->x86_model == 13 || c->x86_model == 9 ||
  1235.    (c->x86_model == 8 && c->x86_mask >= 8))
  1236. set_bit(X86_FEATURE_K6_MTRR, &c->x86_capability);
  1237. break;
  1238. }
  1239. break;
  1240. case 6: /* An Athlon/Duron */
  1241.  
  1242. /* Bit 15 of Athlon specific MSR 15, needs to be 0
  1243.    * to enable SSE on Palomino/Morgan CPU's.
  1244.  * If the BIOS didn't enable it already, enable it
  1245.  * here.
  1246.  */
  1247. if (c->x86_model == 6 || c->x86_model == 7) {
  1248. if (!test_bit(X86_FEATURE_XMM,
  1249.       &c->x86_capability)) {
  1250. printk(KERN_INFO
  1251.        "Enabling Disabled K7/SSE Support...n");
  1252. rdmsr(MSR_K7_HWCR, l, h);
  1253. l &= ~0x00008000;
  1254. wrmsr(MSR_K7_HWCR, l, h);
  1255. set_bit(X86_FEATURE_XMM,
  1256.                                                 &c->x86_capability);
  1257. }
  1258. }
  1259. break;
  1260. }
  1261. display_cacheinfo(c);
  1262. return r;
  1263. }
  1264. /*
  1265.  * Read NSC/Cyrix DEVID registers (DIR) to get more detailed info. about the CPU
  1266.  */
  1267. static void __init do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
  1268. {
  1269. unsigned char ccr2, ccr3;
  1270. unsigned long flags;
  1271. /* we test for DEVID by checking whether CCR3 is writable */
  1272. local_irq_save(flags);
  1273. ccr3 = getCx86(CX86_CCR3);
  1274. setCx86(CX86_CCR3, ccr3 ^ 0x80);
  1275. getCx86(0xc0);   /* dummy to change bus */
  1276. if (getCx86(CX86_CCR3) == ccr3) {       /* no DEVID regs. */
  1277. ccr2 = getCx86(CX86_CCR2);
  1278. setCx86(CX86_CCR2, ccr2 ^ 0x04);
  1279. getCx86(0xc0);  /* dummy */
  1280. if (getCx86(CX86_CCR2) == ccr2) /* old Cx486SLC/DLC */
  1281. *dir0 = 0xfd;
  1282. else {                          /* Cx486S A step */
  1283. setCx86(CX86_CCR2, ccr2);
  1284. *dir0 = 0xfe;
  1285. }
  1286. }
  1287. else {
  1288. setCx86(CX86_CCR3, ccr3);  /* restore CCR3 */
  1289. /* read DIR0 and DIR1 CPU registers */
  1290. *dir0 = getCx86(CX86_DIR0);
  1291. *dir1 = getCx86(CX86_DIR1);
  1292. }
  1293. local_irq_restore(flags);
  1294. }
  1295. /*
  1296.  * Cx86_dir0_msb is a HACK needed by check_cx686_cpuid/slop in bugs.h in
  1297.  * order to identify the Cyrix CPU model after we're out of setup.c
  1298.  *
  1299.  * Actually since bugs.h doesn't even reference this perhaps someone should
  1300.  * fix the documentation ???
  1301.  */
  1302. static unsigned char Cx86_dir0_msb __initdata = 0;
  1303. static char Cx86_model[][9] __initdata = {
  1304. "Cx486", "Cx486", "5x86 ", "6x86", "MediaGX ", "6x86MX ",
  1305. "M II ", "Unknown"
  1306. };
  1307. static char Cx486_name[][5] __initdata = {
  1308. "SLC", "DLC", "SLC2", "DLC2", "SRx", "DRx",
  1309. "SRx2", "DRx2"
  1310. };
  1311. static char Cx486S_name[][4] __initdata = {
  1312. "S", "S2", "Se", "S2e"
  1313. };
  1314. static char Cx486D_name[][4] __initdata = {
  1315. "DX", "DX2", "?", "?", "?", "DX4"
  1316. };
  1317. static char Cx86_cb[] __initdata = "?.5x Core/Bus Clock";
  1318. static char cyrix_model_mult1[] __initdata = "12??43";
  1319. static char cyrix_model_mult2[] __initdata = "12233445";
  1320. /*
  1321.  * Reset the slow-loop (SLOP) bit on the 686(L) which is set by some old
  1322.  * BIOSes for compatability with DOS games.  This makes the udelay loop
  1323.  * work correctly, and improves performance.
  1324.  *
  1325.  * FIXME: our newer udelay uses the tsc. We dont need to frob with SLOP
  1326.  */
  1327. extern void calibrate_delay(void) __init;
  1328. static void __init check_cx686_slop(struct cpuinfo_x86 *c)
  1329. {
  1330. unsigned long flags;
  1331. if (Cx86_dir0_msb == 3) {
  1332. unsigned char ccr3, ccr5;
  1333. local_irq_save(flags);
  1334. ccr3 = getCx86(CX86_CCR3);
  1335. setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN  */
  1336. ccr5 = getCx86(CX86_CCR5);
  1337. if (ccr5 & 2)
  1338. setCx86(CX86_CCR5, ccr5 & 0xfd);  /* reset SLOP */
  1339. setCx86(CX86_CCR3, ccr3);                 /* disable MAPEN */
  1340. local_irq_restore(flags);
  1341. if (ccr5 & 2) { /* possible wrong calibration done */
  1342. printk(KERN_INFO "Recalibrating delay loop with SLOP bit resetn");
  1343. calibrate_delay();
  1344. c->loops_per_jiffy = loops_per_jiffy;
  1345. }
  1346. }
  1347. }
  1348. static void __init init_cyrix(struct cpuinfo_x86 *c)
  1349. {
  1350. unsigned char dir0, dir0_msn, dir0_lsn, dir1 = 0;
  1351. char *buf = c->x86_model_id;
  1352. const char *p = NULL;
  1353. /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
  1354.    3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
  1355. clear_bit(0*32+31, &c->x86_capability);
  1356. /* Cyrix used bit 24 in extended (AMD) CPUID for Cyrix MMX extensions */
  1357. if ( test_bit(1*32+24, &c->x86_capability) ) {
  1358. clear_bit(1*32+24, &c->x86_capability);
  1359. set_bit(X86_FEATURE_CXMMX, &c->x86_capability);
  1360. }
  1361. do_cyrix_devid(&dir0, &dir1);
  1362. check_cx686_slop(c);
  1363. Cx86_dir0_msb = dir0_msn = dir0 >> 4; /* identifies CPU "family"   */
  1364. dir0_lsn = dir0 & 0xf;                /* model or clock multiplier */
  1365. /* common case step number/rev -- exceptions handled below */
  1366. c->x86_model = (dir1 >> 4) + 1;
  1367. c->x86_mask = dir1 & 0xf;
  1368. /* Now cook; the original recipe is by Channing Corn, from Cyrix.
  1369.  * We do the same thing for each generation: we work out
  1370.  * the model, multiplier and stepping.  Black magic included,
  1371.  * to make the silicon step/rev numbers match the printed ones.
  1372.  */
  1373.  
  1374. switch (dir0_msn) {
  1375. unsigned char tmp;
  1376. case 0: /* Cx486SLC/DLC/SRx/DRx */
  1377. p = Cx486_name[dir0_lsn & 7];
  1378. break;
  1379. case 1: /* Cx486S/DX/DX2/DX4 */
  1380. p = (dir0_lsn & 8) ? Cx486D_name[dir0_lsn & 5]
  1381. : Cx486S_name[dir0_lsn & 3];
  1382. break;
  1383. case 2: /* 5x86 */
  1384. Cx86_cb[2] = cyrix_model_mult1[dir0_lsn & 5];
  1385. p = Cx86_cb+2;
  1386. break;
  1387. case 3: /* 6x86/6x86L */
  1388. Cx86_cb[1] = ' ';
  1389. Cx86_cb[2] = cyrix_model_mult1[dir0_lsn & 5];
  1390. if (dir1 > 0x21) { /* 686L */
  1391. Cx86_cb[0] = 'L';
  1392. p = Cx86_cb;
  1393. (c->x86_model)++;
  1394. } else             /* 686 */
  1395. p = Cx86_cb+1;
  1396. /* Emulate MTRRs using Cyrix's ARRs. */
  1397. set_bit(X86_FEATURE_CYRIX_ARR, &c->x86_capability);
  1398. /* 6x86's contain this bug */
  1399. c->coma_bug = 1;
  1400. break;
  1401. case 4: /* MediaGX/GXm */
  1402. #ifdef CONFIG_PCI
  1403. /* It isnt really a PCI quirk directly, but the cure is the
  1404.    same. The MediaGX has deep magic SMM stuff that handles the
  1405.    SB emulation. It thows away the fifo on disable_dma() which
  1406.    is wrong and ruins the audio. 
  1407.                    
  1408.    Bug2: VSA1 has a wrap bug so that using maximum sized DMA 
  1409.    causes bad things. According to NatSemi VSA2 has another
  1410.    bug to do with 'hlt'. I've not seen any boards using VSA2
  1411.    and X doesn't seem to support it either so who cares 8).
  1412.    VSA1 we work around however.
  1413. */
  1414. printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bugs.n");
  1415. isa_dma_bridge_buggy = 2;
  1416. #endif
  1417. c->x86_cache_size=16; /* Yep 16K integrated cache thats it */
  1418. /* GXm supports extended cpuid levels 'ala' AMD */
  1419. if (c->cpuid_level == 2) {
  1420. get_model_name(c);  /* get CPU marketing name */
  1421. /*
  1422.    * The 5510/5520 companion chips have a funky PIT
  1423.  * that breaks the TSC synchronizing, so turn it off
  1424.  */
  1425. if(pci_find_device(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, NULL) ||
  1426.    pci_find_device(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, NULL))
  1427. clear_bit(X86_FEATURE_TSC, c->x86_capability);
  1428. return;
  1429. }
  1430. else {  /* MediaGX */
  1431. Cx86_cb[2] = (dir0_lsn & 1) ? '3' : '4';
  1432. p = Cx86_cb+2;
  1433. c->x86_model = (dir1 & 0x20) ? 1 : 2;
  1434. if(pci_find_device(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, NULL) ||
  1435.    pci_find_device(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, NULL))
  1436. clear_bit(X86_FEATURE_TSC, &c->x86_capability);
  1437. }
  1438. break;
  1439.         case 5: /* 6x86MX/M II */
  1440. if (dir1 > 7)
  1441. {
  1442. dir0_msn++;  /* M II */
  1443. /* Enable MMX extensions (App note 108) */
  1444. setCx86(CX86_CCR7, getCx86(CX86_CCR7)|1);
  1445. }
  1446. else
  1447. {
  1448. c->coma_bug = 1;      /* 6x86MX, it has the bug. */
  1449. }
  1450. tmp = (!(dir0_lsn & 7) || dir0_lsn & 1) ? 2 : 0;
  1451. Cx86_cb[tmp] = cyrix_model_mult2[dir0_lsn & 7];
  1452. p = Cx86_cb+tmp;
  1453.          if (((dir1 & 0x0f) > 4) || ((dir1 & 0xf0) == 0x20))
  1454. (c->x86_model)++;
  1455. /* Emulate MTRRs using Cyrix's ARRs. */
  1456. set_bit(X86_FEATURE_CYRIX_ARR, &c->x86_capability);
  1457. break;
  1458. case 0xf:  /* Cyrix 486 without DEVID registers */
  1459. switch (dir0_lsn) {
  1460. case 0xd:  /* either a 486SLC or DLC w/o DEVID */
  1461. dir0_msn = 0;
  1462. p = Cx486_name[(c->hard_math) ? 1 : 0];
  1463. break;
  1464. case 0xe:  /* a 486S A step */
  1465. dir0_msn = 0;
  1466. p = Cx486S_name[0];
  1467. break;
  1468. }
  1469. break;
  1470. default:  /* unknown (shouldn't happen, we know everyone ;-) */
  1471. dir0_msn = 7;
  1472. break;
  1473. }
  1474. strcpy(buf, Cx86_model[dir0_msn & 7]);
  1475. if (p) strcat(buf, p);
  1476. return;
  1477. }
  1478. #ifdef CONFIG_X86_OOSTORE
  1479. static u32 __init power2(u32 x)
  1480. {
  1481. u32 s=1;
  1482. while(s<=x)
  1483. s<<=1;
  1484. return s>>=1;
  1485. }
  1486. /*
  1487.  * Set up an actual MCR
  1488.  */
  1489.  
  1490. static void __init winchip_mcr_insert(int reg, u32 base, u32 size, int key)
  1491. {
  1492. u32 lo, hi;
  1493. hi = base & ~0xFFF;
  1494. lo = ~(size-1); /* Size is a power of 2 so this makes a mask */
  1495. lo &= ~0xFFF; /* Remove the ctrl value bits */
  1496. lo |= key; /* Attribute we wish to set */
  1497. wrmsr(reg+MSR_IDT_MCR0, lo, hi);
  1498. mtrr_centaur_report_mcr(reg, lo, hi); /* Tell the mtrr driver */
  1499. }
  1500. /*
  1501.  * Figure what we can cover with MCR's
  1502.  *
  1503.  * Shortcut: We know you can't put 4Gig of RAM on a winchip
  1504.  */
  1505. static u32 __init ramtop(void) /* 16388 */
  1506. {
  1507. int i;
  1508. u32 top = 0;
  1509. u32 clip = 0xFFFFFFFFUL;
  1510. for (i = 0; i < e820.nr_map; i++) {
  1511. unsigned long start, end;
  1512. if (e820.map[i].addr > 0xFFFFFFFFUL)
  1513. continue;
  1514. /*
  1515.  * Don't MCR over reserved space. Ignore the ISA hole
  1516.  * we frob around that catastrophy already
  1517.  */
  1518.  
  1519. if (e820.map[i].type == E820_RESERVED)
  1520. {
  1521. if(e820.map[i].addr >= 0x100000UL && e820.map[i].addr < clip)
  1522. clip = e820.map[i].addr;
  1523. continue;
  1524. }
  1525. start = e820.map[i].addr;
  1526. end = e820.map[i].addr + e820.map[i].size;
  1527. if (start >= end)
  1528. continue;
  1529. if (end > top)
  1530. top = end;
  1531. }
  1532. /* Everything below 'top' should be RAM except for the ISA hole.
  1533.    Because of the limited MCR's we want to map NV/ACPI into our
  1534.    MCR range for gunk in RAM 
  1535.    
  1536.    Clip might cause us to MCR insufficient RAM but that is an
  1537.    acceptable failure mode and should only bite obscure boxes with
  1538.    a VESA hole at 15Mb
  1539.    
  1540.    The second case Clip sometimes kicks in is when the EBDA is marked
  1541.    as reserved. Again we fail safe with reasonable results
  1542. */
  1543. if(top>clip)
  1544. top=clip;
  1545. return top;
  1546. }
  1547. /*
  1548.  * Compute a set of MCR's to give maximum coverage
  1549.  */
  1550. static int __init winchip_mcr_compute(int nr, int key)
  1551. {
  1552. u32 mem = ramtop();
  1553. u32 root = power2(mem);
  1554. u32 base = root;
  1555. u32 top = root;
  1556. u32 floor = 0;
  1557. int ct = 0;
  1558. while(ct<nr)
  1559. {
  1560. u32 fspace = 0;
  1561. /*
  1562.  * Find the largest block we will fill going upwards
  1563.  */
  1564. u32 high = power2(mem-top);
  1565. /*
  1566.  * Find the largest block we will fill going downwards
  1567.  */
  1568. u32 low = base/2;
  1569. /*
  1570.  * Don't fill below 1Mb going downwards as there
  1571.  * is an ISA hole in the way.
  1572.  */
  1573.  
  1574. if(base <= 1024*1024)
  1575. low = 0;
  1576. /*
  1577.  * See how much space we could cover by filling below
  1578.  * the ISA hole
  1579.  */
  1580.  
  1581. if(floor == 0)
  1582. fspace = 512*1024;
  1583. else if(floor ==512*1024)
  1584. fspace = 128*1024;
  1585. /* And forget ROM space */
  1586. /*
  1587.  * Now install the largest coverage we get
  1588.  */
  1589.  
  1590. if(fspace > high && fspace > low)
  1591. {
  1592. winchip_mcr_insert(ct, floor, fspace, key);
  1593. floor += fspace;
  1594. }
  1595. else if(high > low)
  1596. {
  1597. winchip_mcr_insert(ct, top, high, key);
  1598. top += high;
  1599. }
  1600. else if(low > 0)
  1601. {
  1602. base -= low;
  1603. winchip_mcr_insert(ct, base, low, key);
  1604. }
  1605. else break;
  1606. ct++;
  1607. }
  1608. /*
  1609.  * We loaded ct values. We now need to set the mask. The caller
  1610.  * must do this bit.
  1611.  */
  1612.  
  1613. return ct;
  1614. }
  1615. static void __init winchip_create_optimal_mcr(void)
  1616. {
  1617. int i;
  1618. /*
  1619.  * Allocate up to 6 mcrs to mark as much of ram as possible
  1620.  * as write combining and weak write ordered.
  1621.  *
  1622.  * To experiment with: Linux never uses stack operations for 
  1623.  * mmio spaces so we could globally enable stack operation wc
  1624.  *
  1625.  * Load the registers with type 31 - full write combining, all
  1626.  * writes weakly ordered.
  1627.  */
  1628. int used = winchip_mcr_compute(6, 31);
  1629. /*
  1630.  * Wipe unused MCRs
  1631.  */
  1632.  
  1633. for(i=used;i<8;i++)
  1634. wrmsr(MSR_IDT_MCR0+i, 0, 0);
  1635. }
  1636. static void __init winchip2_create_optimal_mcr(void)
  1637. {
  1638. u32 lo, hi;
  1639. int i;
  1640. /*
  1641.  * Allocate up to 6 mcrs to mark as much of ram as possible
  1642.  * as write combining, weak store ordered.
  1643.  *
  1644.  * Load the registers with type 25
  1645.  * 8 - weak write ordering
  1646.  * 16 - weak read ordering
  1647.  * 1 - write combining
  1648.  */
  1649. int used = winchip_mcr_compute(6, 25);
  1650. /*
  1651.  * Mark the registers we are using.
  1652.  */
  1653.  
  1654. rdmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1655. for(i=0;i<used;i++)
  1656. lo|=1<<(9+i);
  1657. wrmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1658. /*
  1659.  * Wipe unused MCRs
  1660.  */
  1661.  
  1662. for(i=used;i<8;i++)
  1663. wrmsr(MSR_IDT_MCR0+i, 0, 0);
  1664. }
  1665. /*
  1666.  * Handle the MCR key on the Winchip 2.
  1667.  */
  1668. static void __init winchip2_unprotect_mcr(void)
  1669. {
  1670. u32 lo, hi;
  1671. u32 key;
  1672. rdmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1673. lo&=~0x1C0; /* blank bits 8-6 */
  1674. key = (lo>>17) & 7;
  1675. lo |= key<<6; /* replace with unlock key */
  1676. wrmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1677. }
  1678. static void __init winchip2_protect_mcr(void)
  1679. {
  1680. u32 lo, hi;
  1681. rdmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1682. lo&=~0x1C0; /* blank bits 8-6 */
  1683. wrmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1684. }
  1685. #endif
  1686. static void __init init_centaur(struct cpuinfo_x86 *c)
  1687. {
  1688. enum {
  1689. ECX8=1<<1,
  1690. EIERRINT=1<<2,
  1691. DPM=1<<3,
  1692. DMCE=1<<4,
  1693. DSTPCLK=1<<5,
  1694. ELINEAR=1<<6,
  1695. DSMC=1<<7,
  1696. DTLOCK=1<<8,
  1697. EDCTLB=1<<8,
  1698. EMMX=1<<9,
  1699. DPDC=1<<11,
  1700. EBRPRED=1<<12,
  1701. DIC=1<<13,
  1702. DDC=1<<14,
  1703. DNA=1<<15,
  1704. ERETSTK=1<<16,
  1705. E2MMX=1<<19,
  1706. EAMD3D=1<<20,
  1707. };
  1708. char *name;
  1709. u32  fcr_set=0;
  1710. u32  fcr_clr=0;
  1711. u32  lo,hi,newlo;
  1712. u32  aa,bb,cc,dd;
  1713. /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
  1714.    3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
  1715. clear_bit(0*32+31, &c->x86_capability);
  1716. switch (c->x86) {
  1717. case 5:
  1718. switch(c->x86_model) {
  1719. case 4:
  1720. name="C6";
  1721. fcr_set=ECX8|DSMC|EDCTLB|EMMX|ERETSTK;
  1722. fcr_clr=DPDC;
  1723. printk(KERN_NOTICE "Disabling bugged TSC.n");
  1724. clear_bit(X86_FEATURE_TSC, &c->x86_capability);
  1725. #ifdef CONFIG_X86_OOSTORE
  1726. winchip_create_optimal_mcr();
  1727. /* Enable
  1728. write combining on non-stack, non-string
  1729. write combining on string, all types
  1730. weak write ordering 
  1731.    The C6 original lacks weak read order 
  1732.    
  1733.    Note 0x120 is write only on Winchip 1 */
  1734.    
  1735. wrmsr(MSR_IDT_MCR_CTRL, 0x01F0001F, 0);
  1736. #endif
  1737. break;
  1738. case 8:
  1739. switch(c->x86_mask) {
  1740. default:
  1741. name="2";
  1742. break;
  1743. case 7 ... 9:
  1744. name="2A";
  1745. break;
  1746. case 10 ... 15:
  1747. name="2B";
  1748. break;
  1749. }
  1750. fcr_set=ECX8|DSMC|DTLOCK|EMMX|EBRPRED|ERETSTK|E2MMX|EAMD3D;
  1751. fcr_clr=DPDC;
  1752. #ifdef CONFIG_X86_OOSTORE
  1753. winchip2_unprotect_mcr();
  1754. winchip2_create_optimal_mcr();
  1755. rdmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1756. /* Enable
  1757. write combining on non-stack, non-string
  1758. write combining on string, all types
  1759. weak write ordering 
  1760. */
  1761. lo|=31;
  1762. wrmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1763. winchip2_protect_mcr();
  1764. #endif
  1765. break;
  1766. case 9:
  1767. name="3";
  1768. fcr_set=ECX8|DSMC|DTLOCK|EMMX|EBRPRED|ERETSTK|E2MMX|EAMD3D;
  1769. fcr_clr=DPDC;
  1770. #ifdef CONFIG_X86_OOSTORE
  1771. winchip2_unprotect_mcr();
  1772. winchip2_create_optimal_mcr();
  1773. rdmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1774. /* Enable
  1775. write combining on non-stack, non-string
  1776. write combining on string, all types
  1777. weak write ordering 
  1778. */
  1779. lo|=31;
  1780. wrmsr(MSR_IDT_MCR_CTRL, lo, hi);
  1781. winchip2_protect_mcr();
  1782. #endif
  1783. break;
  1784. case 10:
  1785. name="4";
  1786. /* no info on the WC4 yet */
  1787. break;
  1788. default:
  1789. name="??";
  1790. }
  1791. rdmsr(MSR_IDT_FCR1, lo, hi);
  1792. newlo=(lo|fcr_set) & (~fcr_clr);
  1793. if (newlo!=lo) {
  1794. printk(KERN_INFO "Centaur FCR was 0x%X now 0x%Xn", lo, newlo );
  1795. wrmsr(MSR_IDT_FCR1, newlo, hi );
  1796. } else {
  1797. printk(KERN_INFO "Centaur FCR is 0x%Xn",lo);
  1798. }
  1799. /* Emulate MTRRs using Centaur's MCR. */
  1800. set_bit(X86_FEATURE_CENTAUR_MCR, &c->x86_capability);
  1801. /* Report CX8 */
  1802. set_bit(X86_FEATURE_CX8, &c->x86_capability);
  1803. /* Set 3DNow! on Winchip 2 and above. */
  1804. if (c->x86_model >=8)
  1805. set_bit(X86_FEATURE_3DNOW, &c->x86_capability);
  1806. /* See if we can find out some more. */
  1807. if ( cpuid_eax(0x80000000) >= 0x80000005 ) {
  1808. /* Yes, we can. */
  1809. cpuid(0x80000005,&aa,&bb,&cc,&dd);
  1810. /* Add L1 data and code cache sizes. */
  1811. c->x86_cache_size = (cc>>24)+(dd>>24);
  1812. }
  1813. sprintf( c->x86_model_id, "WinChip %s", name );
  1814. break;
  1815. case 6:
  1816. switch (c->x86_model) {
  1817. case 6 ... 8: /* Cyrix III family */
  1818. rdmsr (MSR_VIA_FCR, lo, hi);
  1819. lo |= (1<<1 | 1<<7); /* Report CX8 & enable PGE */
  1820. wrmsr (MSR_VIA_FCR, lo, hi);
  1821. set_bit(X86_FEATURE_CX8, &c->x86_capability);
  1822. set_bit(X86_FEATURE_3DNOW, &c->x86_capability);
  1823. get_model_name(c);
  1824. display_cacheinfo(c);
  1825. break;
  1826. }
  1827. break;
  1828. }
  1829. }
  1830. static void __init init_transmeta(struct cpuinfo_x86 *c)
  1831. {
  1832. unsigned int cap_mask, uk, max, dummy;
  1833. unsigned int cms_rev1, cms_rev2;
  1834. unsigned int cpu_rev, cpu_freq, cpu_flags;
  1835. char cpu_info[65];
  1836. get_model_name(c); /* Same as AMD/Cyrix */
  1837. display_cacheinfo(c);
  1838. /* Print CMS and CPU revision */
  1839. max = cpuid_eax(0x80860000);
  1840. if ( max >= 0x80860001 ) {
  1841. cpuid(0x80860001, &dummy, &cpu_rev, &cpu_freq, &cpu_flags); 
  1842. printk(KERN_INFO "CPU: Processor revision %u.%u.%u.%u, %u MHzn",
  1843.        (cpu_rev >> 24) & 0xff,
  1844.        (cpu_rev >> 16) & 0xff,
  1845.        (cpu_rev >> 8) & 0xff,
  1846.        cpu_rev & 0xff,
  1847.        cpu_freq);
  1848. }
  1849. if ( max >= 0x80860002 ) {
  1850. cpuid(0x80860002, &dummy, &cms_rev1, &cms_rev2, &dummy);
  1851. printk(KERN_INFO "CPU: Code Morphing Software revision %u.%u.%u-%u-%un",
  1852.        (cms_rev1 >> 24) & 0xff,
  1853.        (cms_rev1 >> 16) & 0xff,
  1854.        (cms_rev1 >> 8) & 0xff,
  1855.        cms_rev1 & 0xff,
  1856.        cms_rev2);
  1857. }
  1858. if ( max >= 0x80860006 ) {
  1859. cpuid(0x80860003,
  1860.       (void *)&cpu_info[0],
  1861.       (void *)&cpu_info[4],
  1862.       (void *)&cpu_info[8],
  1863.       (void *)&cpu_info[12]);
  1864. cpuid(0x80860004,
  1865.       (void *)&cpu_info[16],
  1866.       (void *)&cpu_info[20],
  1867.       (void *)&cpu_info[24],
  1868.       (void *)&cpu_info[28]);
  1869. cpuid(0x80860005,
  1870.       (void *)&cpu_info[32],
  1871.       (void *)&cpu_info[36],
  1872.       (void *)&cpu_info[40],
  1873.       (void *)&cpu_info[44]);
  1874. cpuid(0x80860006,
  1875.       (void *)&cpu_info[48],
  1876.       (void *)&cpu_info[52],
  1877.       (void *)&cpu_info[56],
  1878.       (void *)&cpu_info[60]);
  1879. cpu_info[64] = '';
  1880. printk(KERN_INFO "CPU: %sn", cpu_info);
  1881. }
  1882. /* Unhide possibly hidden capability flags */
  1883. rdmsr(0x80860004, cap_mask, uk);
  1884. wrmsr(0x80860004, ~0, uk);
  1885. c->x86_capability[0] = cpuid_edx(0x00000001);
  1886. wrmsr(0x80860004, cap_mask, uk);
  1887. /* If we can run i686 user-space code, call us an i686 */
  1888. #define USER686 (X86_FEATURE_TSC|X86_FEATURE_CX8|X86_FEATURE_CMOV)
  1889. if ( c->x86 == 5 && (c->x86_capability[0] & USER686) == USER686 )
  1890.      c->x86 = 6;
  1891. }
  1892. static void __init init_rise(struct cpuinfo_x86 *c)
  1893. {
  1894. printk("CPU: Rise iDragon");
  1895. if (c->x86_model > 2)
  1896. printk(" II");
  1897. printk("n");
  1898. /* Unhide possibly hidden capability flags
  1899.    The mp6 iDragon family don't have MSRs.
  1900.    We switch on extra features with this cpuid weirdness: */
  1901. __asm__ (
  1902. "movl $0x6363452a, %%eaxnt"
  1903. "movl $0x3231206c, %%ecxnt"
  1904. "movl $0x2a32313a, %%edxnt"
  1905. "cpuidnt"
  1906. "movl $0x63634523, %%eaxnt"
  1907. "movl $0x32315f6c, %%ecxnt"
  1908. "movl $0x2333313a, %%edxnt"
  1909. "cpuidnt" : : : "eax", "ebx", "ecx", "edx"
  1910. );
  1911. set_bit(X86_FEATURE_CX8, &c->x86_capability);
  1912. }
  1913. extern void trap_init_f00f_bug(void);
  1914. #define LVL_1_INST      1
  1915. #define LVL_1_DATA      2
  1916. #define LVL_2           3
  1917. #define LVL_3           4
  1918. struct _cache_table
  1919. {
  1920.         unsigned char descriptor;
  1921.         char cache_type;
  1922.         short size;
  1923. };
  1924. /* all the cache descriptor types we care about (no TLB or trace cache entries) */
  1925. static struct _cache_table cache_table[] __initdata =
  1926. {
  1927. { 0x06, LVL_1_INST, 8 },
  1928. { 0x08, LVL_1_INST, 16 },
  1929. { 0x0A, LVL_1_DATA, 8 },
  1930. { 0x0C, LVL_1_DATA, 16 },
  1931. { 0x22, LVL_3,      512 },
  1932. { 0x23, LVL_3,      1024 },
  1933. { 0x25, LVL_3,      2048 },
  1934. { 0x29, LVL_3,      4096 },
  1935. { 0x41, LVL_2,      128 },
  1936. { 0x42, LVL_2,      256 },
  1937. { 0x43, LVL_2,      512 },
  1938. { 0x44, LVL_2,      1024 },
  1939. { 0x45, LVL_2,      2048 },
  1940. { 0x66, LVL_1_DATA, 8 },
  1941. { 0x67, LVL_1_DATA, 16 },
  1942. { 0x68, LVL_1_DATA, 32 },
  1943. { 0x79, LVL_2,      128 },
  1944. { 0x7A, LVL_2,      256 },
  1945. { 0x7B, LVL_2,      512 },
  1946. { 0x7C, LVL_2,      1024 },
  1947. { 0x82, LVL_2,      256 },
  1948. { 0x84, LVL_2,      1024 },
  1949. { 0x85, LVL_2,      2048 },
  1950. { 0x00, 0, 0}
  1951. };
  1952. static void __init init_intel(struct cpuinfo_x86 *c)
  1953. {
  1954. unsigned int l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */
  1955. char *p = NULL;
  1956. #ifndef CONFIG_X86_F00F_WORKS_OK
  1957. static int f00f_workaround_enabled = 0;
  1958. /*
  1959.  * All current models of Pentium and Pentium with MMX technology CPUs
  1960.  * have the F0 0F bug, which lets nonpriviledged users lock up the system.
  1961.  * Note that the workaround only should be initialized once...
  1962.  */
  1963. c->f00f_bug = 0;
  1964. if (c->x86 == 5) {
  1965. c->f00f_bug = 1;
  1966. if (!f00f_workaround_enabled) {
  1967. trap_init_f00f_bug();
  1968. printk(KERN_NOTICE "Intel Pentium with F0 0F bug - workaround enabled.n");
  1969. f00f_workaround_enabled = 1;
  1970. }
  1971. }
  1972. #endif /* CONFIG_X86_F00F_WORKS_OK */
  1973. if (c->cpuid_level > 1) {
  1974. /* supports eax=2  call */
  1975. int i, j, n;
  1976. int regs[4];
  1977. unsigned char *dp = (unsigned char *)regs;
  1978. /* Number of times to iterate */
  1979. n = cpuid_eax(2) & 0xFF;
  1980. for ( i = 0 ; i < n ; i++ ) {
  1981. cpuid(2, &regs[0], &regs[1], &regs[2], &regs[3]);
  1982. /* If bit 31 is set, this is an unknown format */
  1983. for ( j = 0 ; j < 3 ; j++ ) {
  1984. if ( regs[j] < 0 ) regs[j] = 0;
  1985. }
  1986. /* Byte 0 is level count, not a descriptor */
  1987. for ( j = 1 ; j < 16 ; j++ ) {
  1988. unsigned char des = dp[j];
  1989. unsigned char k = 0;
  1990. /* look up this descriptor in the table */
  1991. while (cache_table[k].descriptor != 0)
  1992. {
  1993. if (cache_table[k].descriptor == des) {
  1994. switch (cache_table[k].cache_type) {
  1995. case LVL_1_INST:
  1996. l1i += cache_table[k].size;
  1997. break;
  1998. case LVL_1_DATA:
  1999. l1d += cache_table[k].size;
  2000. break;
  2001. case LVL_2:
  2002. l2 += cache_table[k].size;
  2003. break;
  2004. case LVL_3:
  2005. l3 += cache_table[k].size;
  2006. break;
  2007. }
  2008. break;
  2009. }
  2010. k++;
  2011. }
  2012. }
  2013. }
  2014. if ( l1i || l1d )
  2015. printk(KERN_INFO "CPU: L1 I cache: %dK, L1 D cache: %dKn",
  2016.        l1i, l1d);
  2017. if ( l2 )
  2018. printk(KERN_INFO "CPU: L2 cache: %dKn", l2);
  2019. if ( l3 )
  2020. printk(KERN_INFO "CPU: L3 cache: %dKn", l3);
  2021. /*
  2022.  * This assumes the L3 cache is shared; it typically lives in
  2023.  * the northbridge.  The L1 caches are included by the L2
  2024.  * cache, and so should not be included for the purpose of
  2025.  * SMP switching weights.
  2026.  */
  2027. c->x86_cache_size = l2 ? l2 : (l1i+l1d);
  2028. }
  2029. /* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it */
  2030. if ( c->x86 == 6 && c->x86_model < 3 && c->x86_mask < 3 )
  2031. clear_bit(X86_FEATURE_SEP, &c->x86_capability);
  2032. /* Names for the Pentium II/Celeron processors 
  2033.    detectable only by also checking the cache size.
  2034.    Dixon is NOT a Celeron. */
  2035. if (c->x86 == 6) {
  2036. switch (c->x86_model) {
  2037. case 5:
  2038. if (l2 == 0)
  2039. p = "Celeron (Covington)";
  2040. if (l2 == 256)
  2041. p = "Mobile Pentium II (Dixon)";
  2042. break;
  2043. case 6:
  2044. if (l2 == 128)
  2045. p = "Celeron (Mendocino)";
  2046. break;
  2047. case 8:
  2048. if (l2 == 128)
  2049. p = "Celeron (Coppermine)";
  2050. break;
  2051. }
  2052. }
  2053. if ( p )
  2054. strcpy(c->x86_model_id, p);
  2055. #ifdef CONFIG_SMP
  2056. if (test_bit(X86_FEATURE_HT, &c->x86_capability) && !disable_x86_ht) {
  2057. extern int phys_proc_id[NR_CPUS];
  2058. u32  eax, ebx, ecx, edx;
  2059. int  index_lsb, index_msb, tmp;
  2060. int initial_apic_id;
  2061. int  cpu = smp_processor_id();
  2062. cpuid(1, &eax, &ebx, &ecx, &edx);
  2063. smp_num_siblings = (ebx & 0xff0000) >> 16;
  2064. if (smp_num_siblings == 1) {
  2065. printk(KERN_INFO  "CPU: Hyper-Threading is disabledn");
  2066. } else if (smp_num_siblings > 1 ) {
  2067. index_lsb = 0;
  2068. index_msb = 31;
  2069. /*
  2070.  * At this point we only support two siblings per
  2071.  * processor package.
  2072.  */
  2073. #define NR_SIBLINGS 2
  2074. if (smp_num_siblings != NR_SIBLINGS) {
  2075. printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
  2076. smp_num_siblings = 1;
  2077. return;
  2078. }
  2079. tmp = smp_num_siblings;
  2080. while ((tmp & 1) == 0) {
  2081. tmp >>=1 ;
  2082. index_lsb++;
  2083. }
  2084. tmp = smp_num_siblings;
  2085. while ((tmp & 0x80000000 ) == 0) {
  2086. tmp <<=1 ;
  2087. index_msb--;
  2088. }
  2089. if (index_lsb != index_msb )
  2090. index_msb++;
  2091. initial_apic_id = ebx >> 24 & 0xff;
  2092. phys_proc_id[cpu] = initial_apic_id >> index_msb;
  2093. printk(KERN_INFO  "CPU: Physical Processor ID: %dn",
  2094.                                phys_proc_id[cpu]);
  2095. }
  2096. }
  2097. #endif
  2098. }
  2099. void __init get_cpu_vendor(struct cpuinfo_x86 *c)
  2100. {
  2101. char *v = c->x86_vendor_id;
  2102. if (!strcmp(v, "GenuineIntel"))
  2103. c->x86_vendor = X86_VENDOR_INTEL;
  2104. else if (!strcmp(v, "AuthenticAMD"))
  2105. c->x86_vendor = X86_VENDOR_AMD;
  2106. else if (!strcmp(v, "CyrixInstead"))
  2107. c->x86_vendor = X86_VENDOR_CYRIX;
  2108. else if (!strcmp(v, "Geode by NSC"))
  2109. c->x86_vendor = X86_VENDOR_NSC;
  2110. else if (!strcmp(v, "UMC UMC UMC "))
  2111. c->x86_vendor = X86_VENDOR_UMC;
  2112. else if (!strcmp(v, "CentaurHauls"))
  2113. c->x86_vendor = X86_VENDOR_CENTAUR;
  2114. else if (!strcmp(v, "NexGenDriven"))
  2115. c->x86_vendor = X86_VENDOR_NEXGEN;
  2116. else if (!strcmp(v, "RiseRiseRise"))
  2117. c->x86_vendor = X86_VENDOR_RISE;
  2118. else if (!strcmp(v, "GenuineTMx86") ||
  2119.  !strcmp(v, "TransmetaCPU"))
  2120. c->x86_vendor = X86_VENDOR_TRANSMETA;
  2121. else
  2122. c->x86_vendor = X86_VENDOR_UNKNOWN;
  2123. }
  2124. struct cpu_model_info {
  2125. int vendor;
  2126. int family;
  2127. char *model_names[16];
  2128. };
  2129. /* Naming convention should be: <Name> [(<Codename>)] */
  2130. /* This table only is used unless init_<vendor>() below doesn't set it; */
  2131. /* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */
  2132. static struct cpu_model_info cpu_models[] __initdata = {
  2133. { X86_VENDOR_INTEL, 4,
  2134.   { "486 DX-25/33", "486 DX-50", "486 SX", "486 DX/2", "486 SL", 
  2135.     "486 SX/2", NULL, "486 DX/2-WB", "486 DX/4", "486 DX/4-WB", NULL, 
  2136.     NULL, NULL, NULL, NULL, NULL }},
  2137. { X86_VENDOR_INTEL, 5,
  2138.   { "Pentium 60/66 A-step", "Pentium 60/66", "Pentium 75 - 200",
  2139.     "OverDrive PODP5V83", "Pentium MMX", NULL, NULL,
  2140.     "Mobile Pentium 75 - 200", "Mobile Pentium MMX", NULL, NULL, NULL,
  2141.     NULL, NULL, NULL, NULL }},
  2142. { X86_VENDOR_INTEL, 6,
  2143.   { "Pentium Pro A-step", "Pentium Pro", NULL, "Pentium II (Klamath)", 
  2144.     NULL, "Pentium II (Deschutes)", "Mobile Pentium II",
  2145.     "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL,
  2146.     "Pentium III (Cascades)", NULL, NULL, NULL, NULL }},
  2147. { X86_VENDOR_AMD, 4,
  2148.   { NULL, NULL, NULL, "486 DX/2", NULL, NULL, NULL, "486 DX/2-WB",
  2149.     "486 DX/4", "486 DX/4-WB", NULL, NULL, NULL, NULL, "Am5x86-WT",
  2150.     "Am5x86-WB" }},
  2151. { X86_VENDOR_AMD, 5, /* Is this this really necessary?? */
  2152.   { "K5/SSA5", "K5",
  2153.     "K5", "K5", NULL, NULL,
  2154.     "K6", "K6", "K6-2",
  2155.     "K6-3", NULL, NULL, NULL, NULL, NULL, NULL }},
  2156. { X86_VENDOR_AMD, 6, /* Is this this really necessary?? */
  2157.   { "Athlon", "Athlon",
  2158.     "Athlon", NULL, "Athlon", NULL,
  2159.     NULL, NULL, NULL,
  2160.     NULL, NULL, NULL, NULL, NULL, NULL, NULL }},
  2161. { X86_VENDOR_UMC, 4,
  2162.   { NULL, "U5D", "U5S", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2163.     NULL, NULL, NULL, NULL, NULL, NULL }},
  2164. { X86_VENDOR_NEXGEN, 5,
  2165.   { "Nx586", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2166.     NULL, NULL, NULL, NULL, NULL, NULL, NULL }},
  2167. { X86_VENDOR_RISE, 5,
  2168.   { "iDragon", NULL, "iDragon", NULL, NULL, NULL, NULL,
  2169.     NULL, "iDragon II", "iDragon II", NULL, NULL, NULL, NULL, NULL, NULL }},
  2170. };
  2171. /* Look up CPU names by table lookup. */
  2172. static char __init *table_lookup_model(struct cpuinfo_x86 *c)
  2173. {
  2174. struct cpu_model_info *info = cpu_models;
  2175. int i;
  2176. if ( c->x86_model >= 16 )
  2177. return NULL; /* Range check */
  2178. for ( i = 0 ; i < sizeof(cpu_models)/sizeof(struct cpu_model_info) ; i++ ) {
  2179. if ( info->vendor == c->x86_vendor &&
  2180.      info->family == c->x86 ) {
  2181. return info->model_names[c->x86_model];
  2182. }
  2183. info++;
  2184. }
  2185. return NULL; /* Not found */
  2186. }
  2187. /*
  2188.  * Detect a NexGen CPU running without BIOS hypercode new enough
  2189.  * to have CPUID. (Thanks to Herbert Oppmann)
  2190.  */
  2191.  
  2192. static int __init deep_magic_nexgen_probe(void)
  2193. {
  2194. int ret;
  2195. __asm__ __volatile__ (
  2196. " movw $0x5555, %%axn"
  2197. " xorw %%dx,%%dxn"
  2198. " movw $2, %%cxn"
  2199. " divw %%cxn"
  2200. " movl $0, %%eaxn"
  2201. " jnz 1fn"
  2202. " movl $1, %%eaxn"
  2203. "1:n" 
  2204. : "=a" (ret) : : "cx", "dx" );
  2205. return  ret;
  2206. }
  2207. static void __init squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
  2208. {
  2209. if( test_bit(X86_FEATURE_PN, &c->x86_capability) &&
  2210.     disable_x86_serial_nr ) {
  2211. /* Disable processor serial number */
  2212. unsigned long lo,hi;
  2213. rdmsr(MSR_IA32_BBL_CR_CTL,lo,hi);
  2214. lo |= 0x200000;
  2215. wrmsr(MSR_IA32_BBL_CR_CTL,lo,hi);
  2216. printk(KERN_NOTICE "CPU serial number disabled.n");
  2217. clear_bit(X86_FEATURE_PN, &c->x86_capability);
  2218. /* Disabling the serial number may affect the cpuid level */
  2219. c->cpuid_level = cpuid_eax(0);
  2220. }
  2221. }
  2222. static int __init x86_serial_nr_setup(char *s)
  2223. {
  2224. disable_x86_serial_nr = 0;
  2225. return 1;
  2226. }
  2227. __setup("serialnumber", x86_serial_nr_setup);
  2228. static int __init x86_fxsr_setup(char * s)
  2229. {
  2230. set_bit(X86_FEATURE_XMM, disabled_x86_caps); 
  2231. set_bit(X86_FEATURE_FXSR, disabled_x86_caps);
  2232. return 1;
  2233. }
  2234. __setup("nofxsr", x86_fxsr_setup);
  2235. /* Standard macro to see if a specific flag is changeable */
  2236. static inline int flag_is_changeable_p(u32 flag)
  2237. {
  2238. u32 f1, f2;
  2239. asm("pushflnt"
  2240.     "pushflnt"
  2241.     "popl %0nt"
  2242.     "movl %0,%1nt"
  2243.     "xorl %2,%0nt"
  2244.     "pushl %0nt"
  2245.     "popflnt"
  2246.     "pushflnt"
  2247.     "popl %0nt"
  2248.     "popflnt"
  2249.     : "=&r" (f1), "=&r" (f2)
  2250.     : "ir" (flag));
  2251. return ((f1^f2) & flag) != 0;
  2252. }
  2253. /* Probe for the CPUID instruction */
  2254. static int __init have_cpuid_p(void)
  2255. {
  2256. return flag_is_changeable_p(X86_EFLAGS_ID);
  2257. }
  2258. /*
  2259.  * Cyrix CPUs without cpuid or with cpuid not yet enabled can be detected
  2260.  * by the fact that they preserve the flags across the division of 5/2.
  2261.  * PII and PPro exhibit this behavior too, but they have cpuid available.
  2262.  */
  2263.  
  2264. /*
  2265.  * Perform the Cyrix 5/2 test. A Cyrix won't change
  2266.  * the flags, while other 486 chips will.
  2267.  */
  2268. static inline int test_cyrix_52div(void)
  2269. {
  2270. unsigned int test;
  2271. __asm__ __volatile__(
  2272.      "sahfnt" /* clear flags (%eax = 0x0005) */
  2273.      "div %b2nt" /* divide 5 by 2 */
  2274.      "lahf" /* store flags into %ah */
  2275.      : "=a" (test)
  2276.      : "0" (5), "q" (2)
  2277.      : "cc");
  2278. /* AH is 0x02 on Cyrix after the divide.. */
  2279. return (unsigned char) (test >> 8) == 0x02;
  2280. }
  2281. /* Try to detect a CPU with disabled CPUID, and if so, enable.  This routine
  2282.    may also be used to detect non-CPUID processors and fill in some of
  2283.    the information manually. */
  2284. static int __init id_and_try_enable_cpuid(struct cpuinfo_x86 *c)
  2285. {
  2286. /* First of all, decide if this is a 486 or higher */
  2287. /* It's a 486 if we can modify the AC flag */
  2288. if ( flag_is_changeable_p(X86_EFLAGS_AC) )
  2289. c->x86 = 4;
  2290. else
  2291. c->x86 = 3;
  2292. /* Detect Cyrix with disabled CPUID */
  2293. if ( c->x86 == 4 && test_cyrix_52div() ) {
  2294. unsigned char dir0, dir1;
  2295. strcpy(c->x86_vendor_id, "CyrixInstead");
  2296.         c->x86_vendor = X86_VENDOR_CYRIX;
  2297.         
  2298.         /* Actually enable cpuid on the older cyrix */
  2299.     
  2300.      /* Retrieve CPU revisions */
  2301.     
  2302. do_cyrix_devid(&dir0, &dir1);
  2303. dir0>>=4;
  2304. /* Check it is an affected model */
  2305.             if (dir0 == 5 || dir0 == 3)
  2306.             {
  2307. unsigned char ccr3, ccr4;
  2308. unsigned long flags;
  2309. printk(KERN_INFO "Enabling CPUID on Cyrix processor.n");
  2310. local_irq_save(flags);
  2311. ccr3 = getCx86(CX86_CCR3);
  2312. setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN  */
  2313. ccr4 = getCx86(CX86_CCR4);
  2314. setCx86(CX86_CCR4, ccr4 | 0x80);          /* enable cpuid  */
  2315. setCx86(CX86_CCR3, ccr3);                 /* disable MAPEN */
  2316. local_irq_restore(flags);
  2317. }
  2318. } else
  2319. /* Detect NexGen with old hypercode */
  2320. if ( deep_magic_nexgen_probe() ) {
  2321. strcpy(c->x86_vendor_id, "NexGenDriven");
  2322. }
  2323. return have_cpuid_p(); /* Check to see if CPUID now enabled? */
  2324. }
  2325. /*
  2326.  * This does the hard work of actually picking apart the CPU stuff...
  2327.  */
  2328. void __init identify_cpu(struct cpuinfo_x86 *c)
  2329. {
  2330. int junk, i;
  2331. u32 xlvl, tfms;
  2332. c->loops_per_jiffy = loops_per_jiffy;
  2333. c->x86_cache_size = -1;
  2334. c->x86_vendor = X86_VENDOR_UNKNOWN;
  2335. c->cpuid_level = -1; /* CPUID not detected */
  2336. c->x86_model = c->x86_mask = 0; /* So far unknown... */
  2337. c->x86_vendor_id[0] = ''; /* Unset */
  2338. c->x86_model_id[0] = '';  /* Unset */
  2339. memset(&c->x86_capability, 0, sizeof c->x86_capability);
  2340. if ( !have_cpuid_p() && !id_and_try_enable_cpuid(c) ) {
  2341. /* CPU doesn't have CPUID */
  2342. /* If there are any capabilities, they're vendor-specific */
  2343. /* enable_cpuid() would have set c->x86 for us. */
  2344. } else {
  2345. /* CPU does have CPUID */
  2346. /* Get vendor name */
  2347. cpuid(0x00000000, &c->cpuid_level,
  2348.       (int *)&c->x86_vendor_id[0],
  2349.       (int *)&c->x86_vendor_id[8],
  2350.       (int *)&c->x86_vendor_id[4]);
  2351. get_cpu_vendor(c);
  2352. /* Initialize the standard set of capabilities */
  2353. /* Note that the vendor-specific code below might override */
  2354. /* Intel-defined flags: level 0x00000001 */
  2355. if ( c->cpuid_level >= 0x00000001 ) {
  2356. cpuid(0x00000001, &tfms, &junk, &junk,
  2357.       &c->x86_capability[0]);
  2358. c->x86 = (tfms >> 8) & 15;
  2359. c->x86_model = (tfms >> 4) & 15;
  2360. c->x86_mask = tfms & 15;
  2361. } else {
  2362. /* Have CPUID level 0 only - unheard of */
  2363. c->x86 = 4;
  2364. }
  2365. /* AMD-defined flags: level 0x80000001 */
  2366. xlvl = cpuid_eax(0x80000000);
  2367. if ( (xlvl & 0xffff0000) == 0x80000000 ) {
  2368. if ( xlvl >= 0x80000001 )
  2369. c->x86_capability[1] = cpuid_edx(0x80000001);
  2370. if ( xlvl >= 0x80000004 )
  2371. get_model_name(c); /* Default name */
  2372. }
  2373. /* Transmeta-defined flags: level 0x80860001 */
  2374. xlvl = cpuid_eax(0x80860000);
  2375. if ( (xlvl & 0xffff0000) == 0x80860000 ) {
  2376. if (  xlvl >= 0x80860001 )
  2377. c->x86_capability[2] = cpuid_edx(0x80860001);
  2378. }
  2379. }
  2380. /*
  2381.  * Vendor-specific initialization.  In this section we
  2382.  * canonicalize the feature flags, meaning if there are
  2383.  * features a certain CPU supports which CPUID doesn't
  2384.  * tell us, CPUID claiming incorrect flags, or other bugs,
  2385.  * we handle them here.
  2386.  *
  2387.  * At the end of this section, c->x86_capability better
  2388.  * indicate the features this CPU genuinely supports!
  2389.  */
  2390. switch ( c->x86_vendor ) {
  2391. case X86_VENDOR_UNKNOWN:
  2392. default:
  2393. /* Not much we can do here... */
  2394. /* Check if at least it has cpuid */
  2395. if (c->cpuid_level == -1)
  2396. {
  2397. /* No cpuid. It must be an ancient CPU */
  2398. if (c->x86 == 4)
  2399. strcpy(c->x86_model_id, "486");
  2400. else if (c->x86 == 3)
  2401. strcpy(c->x86_model_id, "386");
  2402. }
  2403. break;
  2404. case X86_VENDOR_CYRIX:
  2405. init_cyrix(c);
  2406. break;
  2407. case X86_VENDOR_NSC:
  2408.         init_cyrix(c);
  2409. break;
  2410. case X86_VENDOR_AMD:
  2411. init_amd(c);
  2412. break;
  2413. case X86_VENDOR_CENTAUR:
  2414. init_centaur(c);
  2415. break;
  2416. case X86_VENDOR_INTEL:
  2417. init_intel(c);
  2418. break;
  2419. case X86_VENDOR_NEXGEN:
  2420. c->x86_cache_size = 256; /* A few had 1 MB... */
  2421. break;
  2422. case X86_VENDOR_TRANSMETA:
  2423. init_transmeta(c);
  2424. break;
  2425. case X86_VENDOR_RISE:
  2426. init_rise(c);
  2427. break;
  2428. }
  2429. /*
  2430.  * The vendor-specific functions might have changed features.  Now
  2431.  * we do "generic changes."
  2432.  */
  2433. /* TSC disabled? */
  2434. #ifndef CONFIG_X86_TSC
  2435. if ( tsc_disable )
  2436. clear_bit(X86_FEATURE_TSC, &c->x86_capability);
  2437. #endif
  2438. /* check for caps that have been disabled earlier */ 
  2439. for (i = 0; i < NCAPINTS; i++) { 
  2440.      c->x86_capability[i] &= ~disabled_x86_caps[i];
  2441. }
  2442. /* Disable the PN if appropriate */
  2443. squash_the_stupid_serial_number(c);
  2444. /* Init Machine Check Exception if available. */
  2445. mcheck_init(c);
  2446. /* If the model name is still unset, do table lookup. */
  2447. if ( !c->x86_model_id[0] ) {
  2448. char *p;
  2449. p = table_lookup_model(c);
  2450. if ( p )
  2451. strcpy(c->x86_model_id, p);
  2452. else
  2453. /* Last resort... */
  2454. sprintf(c->x86_model_id, "%02x/%02x",
  2455. c->x86_vendor, c->x86_model);
  2456. }
  2457. /* Now the feature flags better reflect actual CPU features! */
  2458. printk(KERN_DEBUG "CPU:     After generic, caps: %08x %08x %08x %08xn",
  2459.        c->x86_capability[0],
  2460.        c->x86_capability[1],
  2461.        c->x86_capability[2],
  2462.        c->x86_capability[3]);
  2463. /*
  2464.  * On SMP, boot_cpu_data holds the common feature set between
  2465.  * all CPUs; so make sure that we indicate which features are
  2466.  * common between the CPUs.  The first time this routine gets
  2467.  * executed, c == &boot_cpu_data.
  2468.  */
  2469. if ( c != &boot_cpu_data ) {
  2470. /* AND the already accumulated flags with these */
  2471. for ( i = 0 ; i < NCAPINTS ; i++ )
  2472. boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
  2473. }
  2474. printk(KERN_DEBUG "CPU:             Common caps: %08x %08x %08x %08xn",
  2475.        boot_cpu_data.x86_capability[0],
  2476.        boot_cpu_data.x86_capability[1],
  2477.        boot_cpu_data.x86_capability[2],
  2478.        boot_cpu_data.x86_capability[3]);
  2479. }
  2480. /*
  2481.  * Perform early boot up checks for a valid TSC. See arch/i386/kernel/time.c
  2482.  */
  2483.  
  2484. void __init dodgy_tsc(void)
  2485. {
  2486. get_cpu_vendor(&boot_cpu_data);
  2487. if ( boot_cpu_data.x86_vendor == X86_VENDOR_CYRIX ||
  2488.      boot_cpu_data.x86_vendor == X86_VENDOR_NSC )
  2489. init_cyrix(&boot_cpu_data);
  2490. }
  2491. /* These need to match <asm/processor.h> */
  2492. static char *cpu_vendor_names[] __initdata = {
  2493. "Intel", "Cyrix", "AMD", "UMC", "NexGen", 
  2494. "Centaur", "Rise", "Transmeta", "NSC"
  2495. };
  2496. void __init print_cpu_info(struct cpuinfo_x86 *c)
  2497. {
  2498. char *vendor = NULL;
  2499. if (c->x86_vendor < sizeof(cpu_vendor_names)/sizeof(char *))
  2500. vendor = cpu_vendor_names[c->x86_vendor];
  2501. else if (c->cpuid_level >= 0)
  2502. vendor = c->x86_vendor_id;
  2503. if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor)))
  2504. printk("%s ", vendor);
  2505. if (!c->x86_model_id[0])
  2506. printk("%d86", c->x86);
  2507. else
  2508. printk("%s", c->x86_model_id);
  2509. if (c->x86_mask || c->cpuid_level >= 0) 
  2510. printk(" stepping %02xn", c->x86_mask);
  2511. else
  2512. printk("n");
  2513. }
  2514. /*
  2515.  * Get CPU information for use by the procfs.
  2516.  */
  2517. static int show_cpuinfo(struct seq_file *m, void *v)
  2518. {
  2519. /* 
  2520.  * These flag bits must match the definitions in <asm/cpufeature.h>.
  2521.  * NULL means this bit is undefined or reserved; either way it doesn't
  2522.  * have meaning as far as Linux is concerned.  Note that it's important
  2523.  * to realize there is a difference between this table and CPUID -- if
  2524.  * applications want to get the raw CPUID data, they should access
  2525.  * /dev/cpu/<cpu_nr>/cpuid instead.
  2526.  */
  2527. static char *x86_cap_flags[] = {
  2528. /* Intel-defined */
  2529.         "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
  2530.         "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",
  2531.         "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx",
  2532.         "fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", NULL,
  2533. /* AMD-defined */
  2534. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2535. NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
  2536. NULL, NULL, NULL, NULL, NULL, NULL, "mmxext", NULL,
  2537. NULL, NULL, NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
  2538. /* Transmeta-defined */
  2539. "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
  2540. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2541. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2542. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2543. /* Other (Linux-defined) */
  2544. "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", NULL, NULL, NULL, NULL,
  2545. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2546. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2547. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  2548. };
  2549. struct cpuinfo_x86 *c = v;
  2550. int i, n = c - cpu_data;
  2551. int fpu_exception;
  2552. #ifdef CONFIG_SMP
  2553. if (!(cpu_online_map & (1<<n)))
  2554. return 0;
  2555. #endif
  2556. seq_printf(m, "processort: %dn"
  2557. "vendor_idt: %sn"
  2558. "cpu familyt: %dn"
  2559. "modeltt: %dn"
  2560. "model namet: %sn",
  2561. n,
  2562. c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
  2563. c->x86,
  2564. c->x86_model,
  2565. c->x86_model_id[0] ? c->x86_model_id : "unknown");
  2566. if (c->x86_mask || c->cpuid_level >= 0)
  2567. seq_printf(m, "steppingt: %dn", c->x86_mask);
  2568. else
  2569. seq_printf(m, "steppingt: unknownn");
  2570. if ( test_bit(X86_FEATURE_TSC, &c->x86_capability) ) {
  2571. seq_printf(m, "cpu MHztt: %lu.%03lun",
  2572. cpu_khz / 1000, (cpu_khz % 1000));
  2573. }
  2574. /* Cache size */
  2575. if (c->x86_cache_size >= 0)
  2576. seq_printf(m, "cache sizet: %d KBn", c->x86_cache_size);
  2577. /* We use exception 16 if we have hardware math and we've either seen it or the CPU claims it is internal */
  2578. fpu_exception = c->hard_math && (ignore_irq13 || cpu_has_fpu);
  2579. seq_printf(m, "fdiv_bugt: %sn"
  2580. "hlt_bugtt: %sn"
  2581. "f00f_bugt: %sn"
  2582. "coma_bugt: %sn"
  2583. "fputt: %sn"
  2584. "fpu_exceptiont: %sn"
  2585. "cpuid levelt: %dn"
  2586. "wptt: %sn"
  2587. "flagstt:",
  2588.      c->fdiv_bug ? "yes" : "no",
  2589.      c->hlt_works_ok ? "no" : "yes",
  2590.      c->f00f_bug ? "yes" : "no",
  2591.      c->coma_bug ? "yes" : "no",
  2592.      c->hard_math ? "yes" : "no",
  2593.      fpu_exception ? "yes" : "no",
  2594.      c->cpuid_level,
  2595.      c->wp_works_ok ? "yes" : "no");
  2596. for ( i = 0 ; i < 32*NCAPINTS ; i++ )
  2597. if ( test_bit(i, &c->x86_capability) &&
  2598.      x86_cap_flags[i] != NULL )
  2599. seq_printf(m, " %s", x86_cap_flags[i]);
  2600. seq_printf(m, "nbogomipst: %lu.%02lunn",
  2601.      c->loops_per_jiffy/(500000/HZ),
  2602.      (c->loops_per_jiffy/(5000/HZ)) % 100);
  2603. return 0;
  2604. }
  2605. static void *c_start(struct seq_file *m, loff_t *pos)
  2606. {
  2607. return *pos < NR_CPUS ? cpu_data + *pos : NULL;
  2608. }
  2609. static void *c_next(struct seq_file *m, void *v, loff_t *pos)
  2610. {
  2611. ++*pos;
  2612. return c_start(m, pos);
  2613. }
  2614. static void c_stop(struct seq_file *m, void *v)
  2615. {
  2616. }
  2617. struct seq_operations cpuinfo_op = {
  2618. start: c_start,
  2619. next: c_next,
  2620. stop: c_stop,
  2621. show: show_cpuinfo,
  2622. };
  2623. unsigned long cpu_initialized __initdata = 0;
  2624. /*
  2625.  * cpu_init() initializes state that is per-CPU. Some data is already
  2626.  * initialized (naturally) in the bootstrap process, such as the GDT
  2627.  * and IDT. We reload them nevertheless, this function acts as a
  2628.  * 'CPU state barrier', nothing should get across.
  2629.  */
  2630. void __init cpu_init (void)
  2631. {
  2632. int nr = smp_processor_id();
  2633. struct tss_struct * t = &init_tss[nr];
  2634. if (test_and_set_bit(nr, &cpu_initialized)) {
  2635. printk(KERN_WARNING "CPU#%d already initialized!n", nr);
  2636. for (;;) __sti();
  2637. }
  2638. printk(KERN_INFO "Initializing CPU#%dn", nr);
  2639. if (cpu_has_vme || cpu_has_tsc || cpu_has_de)
  2640. clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
  2641. #ifndef CONFIG_X86_TSC
  2642. if (tsc_disable && cpu_has_tsc) {
  2643. printk(KERN_NOTICE "Disabling TSC...n");
  2644. /**** FIX-HPA: DOES THIS REALLY BELONG HERE? ****/
  2645. clear_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability);
  2646. set_in_cr4(X86_CR4_TSD);
  2647. }
  2648. #endif
  2649. __asm__ __volatile__("lgdt %0": "=m" (gdt_descr));
  2650. __asm__ __volatile__("lidt %0": "=m" (idt_descr));
  2651. /*
  2652.  * Delete NT
  2653.  */
  2654. __asm__("pushfl ; andl $0xffffbfff,(%esp) ; popfl");
  2655. /*
  2656.  * set up and load the per-CPU TSS and LDT
  2657.  */
  2658. atomic_inc(&init_mm.mm_count);
  2659. current->active_mm = &init_mm;
  2660. if(current->mm)
  2661. BUG();
  2662. enter_lazy_tlb(&init_mm, current, nr);
  2663. t->esp0 = current->thread.esp0;
  2664. set_tss_desc(nr,t);
  2665. gdt_table[__TSS(nr)].b &= 0xfffffdff;
  2666. load_TR(nr);
  2667. load_LDT(&init_mm);
  2668. /*
  2669.  * Clear all 6 debug registers:
  2670.  */
  2671. #define CD(register) __asm__("movl %0,%%db" #register ::"r"(0) );
  2672. CD(0); CD(1); CD(2); CD(3); /* no db4 and db5 */; CD(6); CD(7);
  2673. #undef CD
  2674. /*
  2675.  * Force FPU initialization:
  2676.  */
  2677. current->flags &= ~PF_USEDFPU;
  2678. current->used_math = 0;
  2679. stts();
  2680. }
  2681. /*
  2682.  * Early probe support logic for ppro memory erratum #50
  2683.  *
  2684.  * This is called before we do cpu ident work
  2685.  */
  2686.  
  2687. int __init ppro_with_ram_bug(void)
  2688. {
  2689. char vendor_id[16];
  2690. int ident;
  2691. /* Must have CPUID */
  2692. if(!have_cpuid_p())
  2693. return 0;
  2694. if(cpuid_eax(0)<1)
  2695. return 0;
  2696. /* Must be Intel */
  2697. cpuid(0, &ident, 
  2698. (int *)&vendor_id[0],
  2699. (int *)&vendor_id[8],
  2700. (int *)&vendor_id[4]);
  2701. if(memcmp(vendor_id, "IntelInside", 12))
  2702. return 0;
  2703. ident = cpuid_eax(1);
  2704. /* Model 6 */
  2705. if(((ident>>8)&15)!=6)
  2706. return 0;
  2707. /* Pentium Pro */
  2708. if(((ident>>4)&15)!=1)
  2709. return 0;
  2710. if((ident&15) < 8)
  2711. {
  2712. printk(KERN_INFO "Pentium Pro with Errata#50 detected. Taking evasive action.n");
  2713. return 1;
  2714. }
  2715. printk(KERN_INFO "Your Pentium Pro seems ok.n");
  2716. return 0;
  2717. }
  2718. /*
  2719.  * Local Variables:
  2720.  * mode:c
  2721.  * c-file-style:"k&r"
  2722.  * c-basic-offset:8
  2723.  * End:
  2724.  */