diff -ur stock/linux-2.3.99-pre10.3/Documentation/Configure.help linux-2.3.99-pre10.3/Documentation/Configure.help --- stock/linux-2.3.99-pre10.3/Documentation/Configure.help Thu May 25 12:53:56 2000 +++ linux-2.3.99-pre10.3/Documentation/Configure.help Thu May 25 12:53:36 2000 @@ -2729,10 +2729,9 @@ all x86 CPU types (albeit not optimally fast), you can specify "386" here. - If you specify one of "486" or "586" or "Pentium" or "PPro" or - "Athlon", then the kernel will not necessarily run on earlier - architectures (e.g. a Pentium optimized kernel will run on a PPro, - but not necessarily on a i486). + The kernel will not necessarily run on earlier architectures than + the one you have chosen, e.g. a Pentium optimized kernel will run on + a PPro, but not necessarily on a i486. Here are the settings recommended for greatest speed: - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI @@ -2745,8 +2744,10 @@ (time stamp counter) register. - "Pentium" for the Intel Pentium/Pentium MMX, and AMD K5. - "PPro" for the Cyrix/IBM/National Semiconductor 6x86MX, MII and - Intel Pentium Pro/Celeron/Pentium II/Pentium III. + Intel Pentium Pro/Celeron/Pentium II. + - "Pentium III" for the Intel Pentium III. - "K6/II/III" for the AMD K6, K6-II and K6-III (aka K6-3D). + - "Crusoe" for the Transmeta Crusoe series. - "Athlon" for the AMD Athlon (K7). If you don't know what to do, choose "386". diff -ur stock/linux-2.3.99-pre10.3/MAINTAINERS linux-2.3.99-pre10.3/MAINTAINERS --- stock/linux-2.3.99-pre10.3/MAINTAINERS Thu May 25 12:53:56 2000 +++ linux-2.3.99-pre10.3/MAINTAINERS Thu May 25 13:01:11 2000 @@ -234,6 +234,11 @@ W: http://www.fi.muni.cz/~kas/cosa/ S: Maintained +CPUID/MSR DRIVER +P: H. Peter Anvin +M: hpa@zytor.com +S: Maintained + CREDITS FILE P: John A. Martin M: jam@acm.org diff -ur stock/linux-2.3.99-pre10.3/arch/i386/kernel/cpuid.c linux-2.3.99-pre10.3/arch/i386/kernel/cpuid.c --- stock/linux-2.3.99-pre10.3/arch/i386/kernel/cpuid.c Thu May 25 12:53:56 2000 +++ linux-2.3.99-pre10.3/arch/i386/kernel/cpuid.c Thu May 25 11:30:40 2000 @@ -64,11 +64,11 @@ if ( cpu == smp_processor_id() ) { cpuid(reg, &data[0], &data[1], &data[2], &data[3]); } else { - cmd->cpu = cpu; - cmd->reg = reg; - cmd->data = data; + cmd.cpu = cpu; + cmd.reg = reg; + cmd.data = data; - smp_call_function(cpuid_smp_cpuid, (void *)cmd, 1, 1); + smp_call_function(cpuid_smp_cpuid, &cmd, 1, 1); } } #else /* ! __SMP__ */ @@ -120,9 +120,12 @@ static int cpuid_open(struct inode *inode, struct file *file) { int cpu = MINOR(file->f_dentry->d_inode->i_rdev); - + struct cpuinfo_x86 *c = &(cpu_data)[cpu]; + if ( !(cpu_online_map & (1UL << cpu)) ) - return -ENXIO; /* No such CPU */ + return -ENXIO; /* No such CPU */ + if ( c->cpuid_level < 0 ) + return -EIO; /* CPUID not supported */ MOD_INC_USE_COUNT; return 0; diff -ur stock/linux-2.3.99-pre10.3/arch/i386/kernel/msr.c linux-2.3.99-pre10.3/arch/i386/kernel/msr.c --- stock/linux-2.3.99-pre10.3/arch/i386/kernel/msr.c Thu May 25 12:53:56 2000 +++ linux-2.3.99-pre10.3/arch/i386/kernel/msr.c Thu May 25 12:47:56 2000 @@ -49,13 +49,13 @@ "2:\n" ".section .fixup,\"ax\"\n" "3: movl %4,%0\n" - " jmp 1b\n" + " jmp 2b\n" ".previous\n" ".section __ex_table,\"a\"\n" " .align 4\n" " .long 1b,3b\n" ".previous" - : "+r" (err) + : "+bDS" (err) : "a" (eax), "d" (edx), "c" (reg), "i" (-EIO)); return err; @@ -70,14 +70,16 @@ "2:\n" ".section .fixup,\"ax\"\n" "3: movl %4,%0\n" - " jmp 1b\n" + " jmp 2b\n" ".previous\n" ".section __ex_table,\"a\"\n" " .align 4\n" " .long 1b,3b\n" ".previous" - : "+r" (err), "=a" (*eax), "=d" (*eax) - : "c" (reg), "i" (-EIO)); + : "+bDS" (err), "=a" (*eax), "=d" (*edx) + : "c" (reg), "i" (-EIO)); + + /* Note: if err is specified as +r, egcs-2.91.66 seems to barf */ return err; } @@ -96,7 +98,7 @@ struct msr_command *cmd = (struct msr_command *) cmd_block; if ( cmd->cpu == smp_processor_id() ) - cmd->err = wrmsr_eio(cmd->reg, &cmd->data[0], &cmd->data[1]); + cmd->err = wrmsr_eio(cmd->reg, cmd->data[0], cmd->data[1]); } static void msr_smp_rdmsr(void *cmd_block) @@ -119,7 +121,7 @@ cmd.data[0] = eax; cmd.data[1] = edx; - smp_call_function(msr_smp_wrmsr, (void *)cmd, 1, 1); + smp_call_function(msr_smp_wrmsr, &cmd, 1, 1); return cmd.err; } } @@ -134,7 +136,7 @@ cmd.cpu = cpu; cmd.reg = reg; - smp_call_function(msr_smp_rdmsr, (void *)cmd, 1, 1); + smp_call_function(msr_smp_rdmsr, &cmd, 1, 1); *eax = cmd.data[0]; *edx = cmd.data[1]; @@ -224,10 +226,12 @@ static int msr_open(struct inode *inode, struct file *file) { int cpu = MINOR(file->f_dentry->d_inode->i_rdev); + struct cpuinfo_x86 *c = &(cpu_data)[cpu]; - if ( !(cpu_online_map & (1UL << cpu)) || - !((cpu_data)[cpu].x86_capability & X86_FEATURE_MSR) ) - return -ENXIO; /* No such CPU */ + if ( !(cpu_online_map & (1UL << cpu)) ) + return -ENXIO; /* No such CPU */ + if ( !(c->x86_capability & X86_FEATURE_MSR) ) + return -EIO; /* MSR not supported */ MOD_INC_USE_COUNT; return 0;