added atom n270 cpuid + small fixes

This commit is contained in:
Stanislav Shwartsman 2011-08-03 17:49:49 +00:00
parent b889e91898
commit 075db389a9
9 changed files with 836 additions and 8 deletions

View File

@ -7,7 +7,7 @@ Bochs repository moved to the SVN version control !
The option selects CPU configuration to emulate from pre-defined list
of supported configurations. When this option is used, Bochs CPU emulation
engine is automatically configured to emulate a specific real hardware CPU,
including exact CPUID matching reference hardware. Check .bochrc example
including exact CPUID matching reference hardware. Check .bochsrc example
or read docs for list of supported configurations or more details.
- Implemented Supervisor Mode Execution Protection (SMEP), the feature can
be enabled using .bochsrc CPUID option.

View File

@ -131,7 +131,8 @@ CPUDB_OBJS = cpudb/corei7_sandy_bridge_2600K.o \
cpudb/p4_prescott_celeron_336.o \
cpudb/athlon64_clawhammer.o \
cpudb/p3_katmai.o \
cpudb/p4_willamette.o
cpudb/p4_willamette.o \
cpudb/atom_n270.o
BX_INCLUDES = ../bochs.h ../config.h
@ -840,3 +841,10 @@ cpudb/p4_willamette.o: cpudb/p4_willamette.@CPP_SUFFIX@ ../bochs.h ../config.h .
cpuid.h crregs.h descriptor.h instr.h ia_opcodes.h lazy_flags.h icache.h \
apic.h ../cpu/i387.h ../fpu/softfloat.h ../fpu/tag_w.h ../fpu/status_w.h \
../fpu/control_w.h ../cpu/xmm.h vmx.h stack.h cpudb/p4_willamette.h
cpudb/atom_n270.o: cpudb/atom_n270.@CPP_SUFFIX@ ../bochs.h ../config.h ../osdep.h \
../bx_debug/debug.h ../bxversion.h ../gui/siminterface.h \
../gui/paramtree.h ../memory/memory.h ../pc_system.h ../plugin.h \
../extplugin.h ../gui/gui.h ../instrument/stubs/instrument.h cpu.h \
cpuid.h crregs.h descriptor.h instr.h ia_opcodes.h lazy_flags.h icache.h \
apic.h ../cpu/i387.h ../fpu/softfloat.h ../fpu/tag_w.h ../fpu/status_w.h \
../fpu/control_w.h ../cpu/xmm.h vmx.h stack.h cpudb/atom_n270.h

View File

@ -3468,7 +3468,6 @@ public: // for now...
BX_SMF BX_CPP_INLINE int bx_cpuid_support_pae(void);
BX_SMF BX_CPP_INLINE int bx_cpuid_support_pge(void);
BX_SMF BX_CPP_INLINE int bx_cpuid_support_pse(void);
BX_SMF BX_CPP_INLINE int bx_cpuid_support_pse36(void);
BX_SMF BX_CPP_INLINE int bx_cpuid_support_mmx(void);
BX_SMF BX_CPP_INLINE int bx_cpuid_support_sse(void);
BX_SMF BX_CPP_INLINE int bx_cpuid_support_sep(void);
@ -3968,11 +3967,6 @@ BX_CPP_INLINE int BX_CPU_C::bx_cpuid_support_pge(void)
return (BX_CPU_THIS_PTR cpu_extensions_bitmask & BX_CPU_PGE);
}
BX_CPP_INLINE int BX_CPU_C::bx_cpuid_support_pse36(void)
{
return (BX_CPU_THIS_PTR cpu_extensions_bitmask & BX_CPU_PSE36);
}
BX_CPP_INLINE int BX_CPU_C::bx_cpuid_support_mmx(void)
{
return (BX_CPU_THIS_PTR isa_extensions_bitmask & BX_CPU_MMX);

View File

@ -0,0 +1,594 @@
/////////////////////////////////////////////////////////////////////////
// $Id$
/////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2011 Stanislav Shwartsman
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA B 02110-1301 USA
//
/////////////////////////////////////////////////////////////////////////
#include "bochs.h"
#include "cpu/cpu.h"
#include "param_names.h"
#include "atom_n270.h"
#define LOG_THIS cpu->
#if BX_CPU_LEVEL >= 6 && BX_SUPPORT_X86_64 == 0
atom_n270_t::atom_n270_t(BX_CPU_C *cpu): bx_cpuid_t(cpu)
{
#if BX_SUPPORT_SMP
nthreads = SIM->get_param_num(BXPN_CPU_NTHREADS)->get();
ncores = SIM->get_param_num(BXPN_CPU_NCORES)->get();
nprocessors = SIM->get_param_num(BXPN_CPU_NPROCESSORS)->get();
#endif
if (BX_SUPPORT_X86_64)
BX_PANIC(("x86-64 should be disabled for Intel Atom N270 (Diamondville) configuration"));
}
void atom_n270_t::get_cpuid_leaf(Bit32u function, Bit32u subfunction, cpuid_function_t *leaf) const
{
static bx_bool cpuid_limit_winnt = SIM->get_param_bool(BXPN_CPUID_LIMIT_WINNT)->get();
if (cpuid_limit_winnt)
if (function > 2 && function < 0x80000000) function = 2;
switch(function) {
case 0x80000000:
get_ext_cpuid_leaf_0(leaf);
return;
case 0x80000001:
get_ext_cpuid_leaf_1(leaf);
return;
case 0x80000002:
case 0x80000003:
case 0x80000004:
get_ext_cpuid_brand_string_leaf(function, leaf);
return;
case 0x80000005:
get_ext_cpuid_leaf_5(leaf);
return;
case 0x80000006:
get_ext_cpuid_leaf_6(leaf);
return;
case 0x80000007:
get_ext_cpuid_leaf_7(leaf);
return;
case 0x80000008:
get_ext_cpuid_leaf_8(leaf);
return;
case 0x00000000:
get_std_cpuid_leaf_0(leaf);
return;
case 0x00000001:
get_std_cpuid_leaf_1(leaf);
return;
case 0x00000002:
get_std_cpuid_leaf_2(leaf);
return;
case 0x00000003:
get_std_cpuid_leaf_3(leaf);
return;
case 0x00000004:
get_std_cpuid_leaf_4(subfunction, leaf);
return;
case 0x00000005:
get_std_cpuid_leaf_5(leaf);
return;
case 0x00000006:
get_std_cpuid_leaf_6(leaf);
return;
case 0x00000007:
get_std_cpuid_leaf_7(subfunction, leaf);
return;
case 0x00000008:
get_std_cpuid_leaf_8(leaf);
return;
case 0x00000009:
get_std_cpuid_leaf_9(leaf);
return;
case 0x0000000A:
default:
get_std_cpuid_leaf_A(leaf);
return;
}
}
Bit32u atom_n270_t::get_isa_extensions_bitmask(void) const
{
return BX_CPU_X87 |
BX_CPU_486 |
BX_CPU_PENTIUM |
BX_CPU_P6 |
BX_CPU_MMX |
BX_CPU_FXSAVE_FXRSTOR |
BX_CPU_SYSENTER_SYSEXIT |
BX_CPU_CLFLUSH |
BX_CPU_SSE |
BX_CPU_SSE2 |
BX_CPU_SSE3 |
BX_CPU_SSSE3 |
#if BX_SUPPORT_MONITOR_MWAIT
BX_CPU_MONITOR_MWAIT |
#endif
BX_CPU_MOVBE |
}
Bit32u atom_n270_t::get_cpu_extensions_bitmask(void) const
{
return BX_CPU_DEBUG_EXTENSIONS |
BX_CPU_VME |
BX_CPU_PSE |
#if BX_PHY_ADDRESS_LONG
BX_CPU_PSE36 |
#endif
BX_CPU_PAE |
BX_CPU_PGE |
BX_CPU_PAT_MTRR |
BX_CPU_XAPIC;
}
// leaf 0x00000000 //
void atom_n270_t::get_std_cpuid_leaf_0(cpuid_function_t *leaf) const
{
static const char* vendor_string = "GenuineIntel";
// EAX: highest std function understood by CPUID
// EBX: vendor ID string
// EDX: vendor ID string
// ECX: vendor ID string
leaf->eax = 0xA;
// CPUID vendor string (e.g. GenuineIntel, AuthenticAMD, CentaurHauls, ...)
memcpy(&(leaf->ebx), vendor_string, 4);
memcpy(&(leaf->edx), vendor_string + 4, 4);
memcpy(&(leaf->ecx), vendor_string + 8, 4);
#ifdef BX_BIG_ENDIAN
leaf->ebx = bx_bswap32(leaf->ebx);
leaf->ecx = bx_bswap32(leaf->ecx);
leaf->edx = bx_bswap32(leaf->edx);
#endif
}
// leaf 0x00000001 //
void atom_n270_t::get_std_cpuid_leaf_1(cpuid_function_t *leaf) const
{
// EAX: CPU Version Information
// [3:0] Stepping ID
// [7:4] Model: starts at 1
// [11:8] Family: 4=486, 5=Pentium, 6=PPro, ...
// [13:12] Type: 0=OEM, 1=overdrive, 2=dual cpu, 3=reserved
// [19:16] Extended Model
// [27:20] Extended Family
leaf->eax = 0x000106C2;
// EBX:
// [7:0] Brand ID
// [15:8] CLFLUSH cache line size (value*8 = cache line size in bytes)
// [23:16] Number of logical processors in one physical processor
// [31:24] Local Apic ID
#if BX_SUPPORT_SMP
unsigned n_logical_processors = ncores*nthreads;
#else
unsigned n_logical_processors = 1;
#endif
leaf->ebx = ((CACHE_LINE_SIZE / 8) << 8) |
(n_logical_processors << 16);
#if BX_SUPPORT_APIC
leaf->ebx |= ((cpu->get_apic_id() & 0xff) << 24);
#endif
// ECX: Extended Feature Flags
// * [0:0] SSE3: SSE3 Instructions
// [1:1] PCLMULQDQ Instruction support
// * [2:2] DTES64: 64-bit DS area
// * [3:3] MONITOR/MWAIT support
// * [4:4] DS-CPL: CPL qualified debug store
// [5:5] VMX: Virtual Machine Technology
// [6:6] SMX: Secure Virtual Machine Technology
// * [7:7] EST: Enhanced Intel SpeedStep Technology
// * [8:8] TM2: Thermal Monitor 2
// * [9:9] SSSE3: SSSE3 Instructions
// [10:10] CNXT-ID: L1 context ID
// [11:11] reserved
// [12:12] FMA Instructions support
// [13:13] CMPXCHG16B: CMPXCHG16B instruction support
// * [14:14] xTPR update control
// * [15:15] PDCM - Perfon and Debug Capability MSR
// [16:16] reserved
// [17:17] PCID: Process Context Identifiers
// [18:18] DCA - Direct Cache Access
// [19:19] SSE4.1 Instructions
// [20:20] SSE4.2 Instructions
// [21:21] X2APIC
// * [22:22] MOVBE instruction
// [23:23] POPCNT instruction
// [24:24] TSC Deadline
// [25:25] AES Instructions
// [26:26] XSAVE extensions support
// [27:27] OSXSAVE support
// [28:28] AVX extensions support
// [29:29] AVX F16C - Float16 conversion support
// [30:30] RDRAND instruction
// [31:31] reserved
leaf->ecx = BX_CPUID_EXT_SSE3 |
BX_CPUID_EXT_DTES64 |
#if BX_SUPPORT_MONITOR_MWAIT
BX_CPUID_EXT_MONITOR_MWAIT |
#endif
BX_CPUID_EXT_DS_CPL |
BX_CPUID_EXT_EST |
BX_CPUID_EXT_THERMAL_MONITOR2 |
BX_CPUID_EXT_SSSE3 |
BX_CPUID_EXT_xTPR |
BX_CPUID_EXT_PDCM |
BX_CPUID_EXT_MOVBE;
// EDX: Standard Feature Flags
// * [0:0] FPU on chip
// * [1:1] VME: Virtual-8086 Mode enhancements
// * [2:2] DE: Debug Extensions (I/O breakpoints)
// * [3:3] PSE: Page Size Extensions
// * [4:4] TSC: Time Stamp Counter
// * [5:5] MSR: RDMSR and WRMSR support
// * [6:6] PAE: Physical Address Extensions
// * [7:7] MCE: Machine Check Exception
// * [8:8] CXS: CMPXCHG8B instruction
// * [9:9] APIC: APIC on Chip
// [10:10] Reserved
// * [11:11] SYSENTER/SYSEXIT support
// * [12:12] MTRR: Memory Type Range Reg
// * [13:13] PGE/PTE Global Bit
// * [14:14] MCA: Machine Check Architecture
// * [15:15] CMOV: Cond Mov/Cmp Instructions
// * [16:16] PAT: Page Attribute Table
// - [17:17] PSE-36: Physical Address Extensions
// [18:18] PSN: Processor Serial Number
// * [19:19] CLFLUSH: CLFLUSH Instruction support
// [20:20] Reserved
// * [21:21] DS: Debug Store
// * [22:22] ACPI: Thermal Monitor and Software Controlled Clock Facilities
// * [23:23] MMX Technology
// * [24:24] FXSR: FXSAVE/FXRSTOR (also indicates CR4.OSFXSR is available)
// * [25:25] SSE: SSE Extensions
// * [26:26] SSE2: SSE2 Extensions
// * [27:27] Self Snoop
// * [28:28] Hyper Threading Technology
// * [29:29] TM: Thermal Monitor
// [30:30] Reserved
// * [31:31] PBE: Pending Break Enable
leaf->edx = BX_CPUID_STD_X87 |
BX_CPUID_STD_VME |
BX_CPUID_STD_DEBUG_EXTENSIONS |
BX_CPUID_STD_PSE |
BX_CPUID_STD_TSC |
BX_CPUID_STD_MSR |
BX_CPUID_STD_PAE |
BX_CPUID_STD_MCE |
BX_CPUID_STD_CMPXCHG8B |
BX_CPUID_STD_SYSENTER_SYSEXIT |
BX_CPUID_STD_MTRR |
BX_CPUID_STD_GLOBAL_PAGES |
BX_CPUID_STD_MCA |
BX_CPUID_STD_CMOV |
BX_CPUID_STD_PAT |
#if BX_PHY_ADDRESS_LONG
BX_CPUID_STD_PSE36 |
#endif
BX_CPUID_STD_CLFLUSH |
BX_CPUID_STD_DEBUG_STORE |
BX_CPUID_STD_ACPI |
BX_CPUID_STD_MMX |
BX_CPUID_STD_FXSAVE_FXRSTOR |
BX_CPUID_STD_SSE |
BX_CPUID_STD_SSE2 |
BX_CPUID_STD_SELF_SNOOP |
BX_CPUID_STD_HT |
BX_CPUID_STD_THERMAL_MONITOR |
BX_CPUID_STD_PBE;
#if BX_SUPPORT_APIC
// if MSR_APICBASE APIC Global Enable bit has been cleared,
// the CPUID feature flag for the APIC is set to 0.
if (cpu->msr.apicbase & 0x800)
leaf->edx |= BX_CPUID_STD_APIC; // APIC on chip
#endif
}
// leaf 0x00000002 //
void atom_n270_t::get_std_cpuid_leaf_2(cpuid_function_t *leaf) const
{
// CPUID function 0x00000002 - Cache and TLB Descriptors
leaf->eax = 0x4FBA5901;
leaf->ebx = 0x0E3080C0;
leaf->ecx = 0x00000000;
leaf->edx = 0x00000000;
}
// leaf 0x00000003 //
void core2_extreme_x9770_t::get_std_cpuid_leaf_3(cpuid_function_t *leaf) const
{
// CPUID function 0x00000003 - Processor Serial Number
leaf->eax = 0;
leaf->ebx = 0;
leaf->ecx = 0;
leaf->edx = 0;
}
// leaf 0x00000004 //
void core2_extreme_x9770_t::get_std_cpuid_leaf_4(Bit32u subfunction, cpuid_function_t *leaf) const
{
// CPUID function 0x00000004 - Deterministic Cache Parameters
switch(subfunction) {
case 0:
leaf->eax = 0x00004121;
leaf->ebx = 0x0140003F;
leaf->ecx = 0x0000003F;
leaf->edx = 0x00000001;
return;
case 1:
leaf->eax = 0x00004122;
leaf->ebx = 0x01C0003F;
leaf->ecx = 0x0000003F;
leaf->edx = 0x00000001;
return;
case 2:
leaf->eax = 0x00004143;
leaf->ebx = 0x01C0003F;
leaf->ecx = 0x000003FF;
leaf->edx = 0x00000001;
return;
default:
leaf->eax = 0;
leaf->ebx = 0;
leaf->ecx = 0;
leaf->edx = 0;
}
}
// leaf 0x00000005 //
void core2_extreme_x9770_t::get_std_cpuid_leaf_5(cpuid_function_t *leaf) const
{
// CPUID function 0x00000005 - MONITOR/MWAIT Leaf
#if BX_SUPPORT_MONITOR_MWAIT
// EAX - Smallest monitor-line size in bytes
// EBX - Largest monitor-line size in bytes
// ECX -
// [31:2] - reserved
// [1:1] - exit MWAIT even with EFLAGS.IF = 0
// [0:0] - MONITOR/MWAIT extensions are supported
// EDX - Reserved
leaf->eax = CACHE_LINE_SIZE;
leaf->ebx = CACHE_LINE_SIZE;
leaf->ecx = 3;
leaf->edx = 0;
#else
leaf->eax = 0;
leaf->ebx = 0;
leaf->ecx = 0;
leaf->edx = 0;
#endif
}
// leaf 0x00000006 //
void core2_extreme_x9770_t::get_std_cpuid_leaf_6(cpuid_function_t *leaf) const
{
// CPUID function 0x00000006 - Thermal and Power Management Leaf
leaf->eax = 0x00000001;
leaf->ebx = 0x00000002;
leaf->ecx = 0x00000001;
leaf->edx = 0x00000000;
}
// leaf 0x00000007 //
void core2_extreme_x9770_t::get_std_cpuid_leaf_7(Bit32u subfunction, cpuid_function_t *leaf) const
{
leaf->eax = 0; /* leaf 7 not supported */
leaf->ebx = 0;
leaf->ecx = 0;
leaf->edx = 0;
}
// leaf 0x00000008 //
void core2_extreme_x9770_t::get_std_cpuid_leaf_8(cpuid_function_t *leaf) const
{
// CPUID function 0x00000008 - reserved
leaf->eax = 0;
leaf->ebx = 0;
leaf->ecx = 0;
leaf->edx = 0;
}
// leaf 0x00000009 //
void core2_extreme_x9770_t::get_std_cpuid_leaf_9(cpuid_function_t *leaf) const
{
// CPUID function 0x00000009 - Direct Cache Access Information
leaf->eax = 0;
leaf->ebx = 0;
leaf->ecx = 0;
leaf->edx = 0;
}
// leaf 0x0000000A //
void core2_extreme_x9770_t::get_std_cpuid_leaf_A(cpuid_function_t *leaf) const
{
// CPUID function 0x0000000A - Architectural Performance Monitoring Leaf
leaf->eax = 0x07280203;
leaf->ebx = 0x00000000;
leaf->ecx = 0x00000000;
leaf->edx = 0x00002501;
BX_INFO(("WARNING: Architectural Performance Monitoring is not implemented"));
}
// leaf 0x80000000 //
void core2_extreme_x9770_t::get_ext_cpuid_leaf_0(cpuid_function_t *leaf) const
{
// EAX: highest extended function understood by CPUID
// EBX: reserved
// EDX: reserved
// ECX: reserved
leaf->eax = 0x80000008;
leaf->ebx = 0;
leaf->edx = 0; // Reserved for Intel
leaf->ecx = 0;
}
// leaf 0x80000001 //
void core2_extreme_x9770_t::get_ext_cpuid_leaf_1(cpuid_function_t *leaf) const
{
// EAX: CPU Version Information (reserved for Intel)
leaf->eax = 0;
// EBX: Brand ID (reserved for Intel)
leaf->ebx = 0;
// ECX:
// ? [0:0] LAHF/SAHF instructions support in 64-bit mode
// [1:1] CMP_Legacy: Core multi-processing legacy mode (AMD)
// [2:2] SVM: Secure Virtual Machine (AMD)
// [3:3] Extended APIC Space
// [4:4] AltMovCR8: LOCK MOV CR0 means MOV CR8
// [5:5] LZCNT: LZCNT instruction support
// [6:6] SSE4A: SSE4A Instructions support (deprecated?)
// [7:7] Misaligned SSE support
// [8:8] PREFETCHW: PREFETCHW instruction support
// [9:9] OSVW: OS visible workarounds (AMD)
// [11:10] reserved
// [12:12] SKINIT support
// [13:13] WDT: Watchdog timer support
// [31:14] reserved
leaf->ecx = BX_CPUID_EXT2_LAHF_SAHF;
// EDX:
// Many of the bits in EDX are the same as FN 0x00000001 [*] for AMD
// [10:0] Reserved for Intel
// [11:11] SYSCALL/SYSRET support
// [19:12] Reserved for Intel
// [20:20] No-Execute page protection
// [25:21] Reserved
// [26:26] 1G paging support
// [27:27] Support RDTSCP Instruction
// [28:28] Reserved
// [29:29] Long Mode
// [30:30] AMD 3DNow! Extensions
// [31:31] AMD 3DNow! Instructions
leaf->edx = 0;
}
// leaf 0x80000002 //
// leaf 0x80000003 //
// leaf 0x80000004 //
void core2_extreme_x9770_t::get_ext_cpuid_brand_string_leaf(Bit32u function, cpuid_function_t *leaf) const
{
// CPUID function 0x800000002-0x800000004 - Processor Name String Identifier
static const char* brand_string = " Intel(R) Atom(TM) CPU N270 @ 1.60GHz";
switch(function) {
case 0x80000002:
memcpy(&(leaf->eax), brand_string , 4);
memcpy(&(leaf->ebx), brand_string + 4, 4);
memcpy(&(leaf->ecx), brand_string + 8, 4);
memcpy(&(leaf->edx), brand_string + 12, 4);
break;
case 0x80000003:
memcpy(&(leaf->eax), brand_string + 16, 4);
memcpy(&(leaf->ebx), brand_string + 20, 4);
memcpy(&(leaf->ecx), brand_string + 24, 4);
memcpy(&(leaf->edx), brand_string + 28, 4);
break;
case 0x80000004:
memcpy(&(leaf->eax), brand_string + 32, 4);
memcpy(&(leaf->ebx), brand_string + 36, 4);
memcpy(&(leaf->ecx), brand_string + 40, 4);
memcpy(&(leaf->edx), brand_string + 44, 4);
break;
default:
break;
}
#ifdef BX_BIG_ENDIAN
leaf->eax = bx_bswap32(leaf->eax);
leaf->ebx = bx_bswap32(leaf->ebx);
leaf->ecx = bx_bswap32(leaf->ecx);
leaf->edx = bx_bswap32(leaf->edx);
#endif
}
// leaf 0x80000005 //
void core2_extreme_x9770_t::get_ext_cpuid_leaf_5(cpuid_function_t *leaf) const
{
// CPUID function 0x800000005 - L1 Cache and TLB Identifiers
leaf->eax = 0;
leaf->ebx = 0;
leaf->ecx = 0; // reserved for Intel
leaf->edx = 0;
}
// leaf 0x80000006 //
void core2_extreme_x9770_t::get_ext_cpuid_leaf_6(cpuid_function_t *leaf) const
{
// CPUID function 0x800000006 - L2 Cache and TLB Identifiers
leaf->eax = 0x00000000;
leaf->ebx = 0x00000000;
leaf->ecx = 0x02008040;
leaf->edx = 0x00000000;
}
// leaf 0x80000007 //
void core2_extreme_x9770_t::get_ext_cpuid_leaf_7(cpuid_function_t *leaf) const
{
// CPUID function 0x800000007 - Advanced Power Management
leaf->eax = 0;
leaf->ebx = 0;
leaf->ecx = 0;
leaf->edx = 0;
}
// leaf 0x80000008 //
void core2_extreme_x9770_t::get_ext_cpuid_leaf_8(cpuid_function_t *leaf) const
{
// virtual & phys address size in low 2 bytes.
leaf->eax = BX_PHY_ADDRESS_WIDTH | (BX_LIN_ADDRESS_WIDTH << 8); // physical address should be 32-bit, no PSE-36
leaf->ebx = 0;
leaf->ecx = 0; // Reserved, undefined
leaf->edx = 0;
}
void atom_n270_t::dump_cpuid(void) const
{
struct cpuid_function_t leaf;
unsigned n;
for (n=0; n<=0xA; n++) {
get_cpuid_leaf(n, 0x00000000, &leaf);
BX_INFO(("CPUID[0x%08x]: %08x %08x %08x %08x", n, leaf.eax, leaf.ebx, leaf.ecx, leaf.edx));
}
for (n=0x80000000; n<=0x80000008; n++) {
get_cpuid_leaf(n, 0x00000000, &leaf);
BX_INFO(("CPUID[0x%08x]: %08x %08x %08x %08x", n, leaf.eax, leaf.ebx, leaf.ecx, leaf.edx));
}
}
bx_cpuid_t *create_atom_n270_cpuid(BX_CPU_C *cpu) { return new atom_n270_t(cpu); }
#endif

View File

@ -0,0 +1,79 @@
/////////////////////////////////////////////////////////////////////////
// $Id$
/////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2011 Stanislav Shwartsman
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA B 02110-1301 USA
//
/////////////////////////////////////////////////////////////////////////
#ifndef BX_ATOM_N270_CPUID_DEFINITIONS_H
#define BX_ATOM_N270_CPUID_DEFINITIONS_H
#if BX_CPU_LEVEL >= 6 && BX_SUPPORT_X86_64 == 0
#include "cpu/cpuid.h"
class atom_n270_t : public bx_cpuid_t {
public:
atom_n270_t(BX_CPU_C *cpu);
virtual ~atom_n270_t() {}
// return CPU name
virtual const char *get_name(void) const { return "atom_n270"; }
virtual Bit32u get_isa_extensions_bitmask(void) const;
virtual Bit32u get_cpu_extensions_bitmask(void) const;
virtual void get_cpuid_leaf(Bit32u function, Bit32u subfunction, cpuid_function_t *leaf) const;
virtual void dump_cpuid(void) const;
private:
#if BX_SUPPORT_SMP
unsigned nprocessors;
unsigned ncores;
unsigned nthreads;
#endif
void get_std_cpuid_leaf_0(cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_1(cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_2(cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_3(cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_4(Bit32u subfunction, cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_5(cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_6(cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_7(Bit32u subfunction, cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_8(cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_9(cpuid_function_t *leaf) const;
void get_std_cpuid_leaf_A(cpuid_function_t *leaf) const;
void get_ext_cpuid_leaf_0(cpuid_function_t *leaf) const;
void get_ext_cpuid_leaf_1(cpuid_function_t *leaf) const;
void get_ext_cpuid_brand_string_leaf(Bit32u function, cpuid_function_t *leaf) const;
void get_ext_cpuid_leaf_5(cpuid_function_t *leaf) const;
void get_ext_cpuid_leaf_6(cpuid_function_t *leaf) const;
void get_ext_cpuid_leaf_7(cpuid_function_t *leaf) const;
void get_ext_cpuid_leaf_8(cpuid_function_t *leaf) const;
};
extern bx_cpuid_t *create_atom_n270_cpuid(BX_CPU_C *cpu);
#endif // BX_CPU_LEVEL >= 6 && BX_SUPPORT_X86_64 == 0
#endif

View File

@ -0,0 +1,144 @@
CPU-Z TXT Report
-------------------------------------------------------------------------
Binaries
-------------------------------------------------------------------------
CPU-Z version 1.56
Processors
-------------------------------------------------------------------------
Number of processors 1
Number of threads 2
APICs
-------------------------------------------------------------------------
Processor 0
-- Core 0
-- Thread 0 0
-- Thread 1 1
Processors Information
-------------------------------------------------------------------------
Processor 1 ID = 0
Number of cores 1 (max 1)
Number of threads 2 (max 2)
Name Intel Atom N270
Codename Diamondville
Specification Intel(R) Atom(TM) CPU N270 @ 1.60GHz
Package (platform ID) Socket 437 FCBGA8 (0x2)
CPUID 6.C.2
Extended CPUID 6.1C
Core Stepping C0
Technology 45 nm
Core Speed 798.1 MHz
Multiplier x FSB 6.0 x 133.0 MHz
Rated Bus speed 532.1 MHz
Stock frequency 1600 MHz
Instructions sets MMX, SSE, SSE2, SSE3, SSSE3
L1 Data cache 24 KBytes, 6-way set associative, 64-byte line size
L1 Instruction cache 32 KBytes, 8-way set associative, 64-byte line size
L2 cache 512 KBytes, 8-way set associative, 64-byte line size
FID/VID Control yes
FID range 6.0x - 12.0x
Max VID 1.113 V
Thread dumps
-------------------------------------------------------------------------
CPU Thread 0
APIC ID 0
Topology Processor ID 0, Core ID 0, Thread ID 0
Type 01010001h
Max CPUID level 0000000Ah
Max CPUID ext. level 80000008h
Cache descriptor Level 1, D, 24 KB, 2 thread(s)
Cache descriptor Level 1, I, 32 KB, 2 thread(s)
Cache descriptor Level 2, U, 512 KB, 2 thread(s)
CPUID
0x00000000 0x0000000A 0x756E6547 0x6C65746E 0x49656E69
0x00000001 0x000106C2 0x00020800 0x0040C39D 0xBFE9FBFF
0x00000002 0x4FBA5901 0x0E3080C0 0x00000000 0x00000000
0x00000003 0x00000000 0x00000000 0x00000000 0x00000000
0x00000004 0x00004121 0x0140003F 0x0000003F 0x00000001
0x00000004 0x00004122 0x01C0003F 0x0000003F 0x00000001
0x00000004 0x00004143 0x01C0003F 0x000003FF 0x00000001
0x00000005 0x00000040 0x00000040 0x00000003 0x00020220
0x00000006 0x00000001 0x00000002 0x00000001 0x00000000
0x00000007 0x00000000 0x00000000 0x00000000 0x00000000
0x00000008 0x00000000 0x00000000 0x00000000 0x00000000
0x00000009 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000A 0x07280203 0x00000000 0x00000000 0x00002501
0x80000000 0x80000008 0x00000000 0x00000000 0x00000000
0x80000001 0x00000000 0x00000000 0x00000001 0x00000000
0x80000002 0x20202020 0x20202020 0x746E4920 0x52286C65
0x80000003 0x74412029 0x54286D6F 0x4320294D 0x4E205550
0x80000004 0x20303732 0x20402020 0x30362E31 0x007A4847
0x80000005 0x00000000 0x00000000 0x00000000 0x00000000
0x80000006 0x00000000 0x00000000 0x02008040 0x00000000
0x80000007 0x00000000 0x00000000 0x00000000 0x00000000
0x80000008 0x00002020 0x00000000 0x00000000 0x00000000
MSR 0x0000001B 0x00000000 0xFEE00900
MSR 0x00000017 0x00080000 0x9024AC20
MSR 0x000000CD 0x00000000 0x00000111
MSR 0x0000003F 0x00000000 0x00000000
MSR 0x000000CE 0x200F0C00 0x4B4B0000
MSR 0x000001A0 0x00000007 0x64950480
MSR 0x000000EE 0x00000000 0x02F90002
MSR 0x0000011E 0x00000000 0x7E00011F
MSR 0x0000019C 0x00000000 0x88380000
MSR 0x00000198 0x060F0C20 0x06000C20
MSR 0x00000199 0x00000000 0x00000C20
CPU Thread 1
APIC ID 1
Topology Processor ID 0, Core ID 0, Thread ID 1
Type 01010001h
Max CPUID level 0000000Ah
Max CPUID ext. level 80000008h
Cache descriptor Level 1, D, 24 KB, 2 thread(s)
Cache descriptor Level 1, I, 32 KB, 2 thread(s)
Cache descriptor Level 2, U, 512 KB, 2 thread(s)
CPUID
0x00000000 0x0000000A 0x756E6547 0x6C65746E 0x49656E69
0x00000001 0x000106C2 0x01020800 0x0040C39D 0xBFE9FBFF
0x00000002 0x4FBA5901 0x0E3080C0 0x00000000 0x00000000
0x00000003 0x00000000 0x00000000 0x00000000 0x00000000
0x00000004 0x00004121 0x0140003F 0x0000003F 0x00000001
0x00000004 0x00004122 0x01C0003F 0x0000003F 0x00000001
0x00000004 0x00004143 0x01C0003F 0x000003FF 0x00000001
0x00000005 0x00000040 0x00000040 0x00000003 0x00020220
0x00000006 0x00000001 0x00000002 0x00000001 0x00000000
0x00000007 0x00000000 0x00000000 0x00000000 0x00000000
0x00000008 0x00000000 0x00000000 0x00000000 0x00000000
0x00000009 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000A 0x07280203 0x00000000 0x00000000 0x00002501
0x80000000 0x80000008 0x00000000 0x00000000 0x00000000
0x80000001 0x00000000 0x00000000 0x00000001 0x00000000
0x80000002 0x20202020 0x20202020 0x746E4920 0x52286C65
0x80000003 0x74412029 0x54286D6F 0x4320294D 0x4E205550
0x80000004 0x20303732 0x20402020 0x30362E31 0x007A4847
0x80000005 0x00000000 0x00000000 0x00000000 0x00000000
0x80000006 0x00000000 0x00000000 0x02008040 0x00000000
0x80000007 0x00000000 0x00000000 0x00000000 0x00000000
0x80000008 0x00002020 0x00000000 0x00000000 0x00000000
MSR 0x0000001B 0x00000000 0xFEE00800
MSR 0x00000017 0x00080000 0x9024AC20
MSR 0x000000CD 0x00000000 0x00000111
MSR 0x0000003F 0x00000000 0x00000000
MSR 0x000000CE 0x200F0C00 0x4B4B0000
MSR 0x000001A0 0x00000007 0x64950480
MSR 0x000000EE 0x00000000 0x02F90002
MSR 0x0000011E 0x00000000 0x7E00011F
MSR 0x0000019C 0x00000000 0x88370000
MSR 0x00000198 0x060F0C20 0x06000C20
MSR 0x00000199 0x00000000 0x00000C20

View File

@ -76,7 +76,9 @@ Bit32u p3_katmai_t::get_cpu_extensions_bitmask(void) const
BX_CPU_PSE |
BX_CPU_PAE |
BX_CPU_PGE |
#if BX_PHY_ADDRESS_LONG
BX_CPU_PSE36 |
#endif
BX_CPU_PAT_MTRR;
}
@ -165,7 +167,9 @@ void p3_katmai_t::get_std_cpuid_leaf_1(cpuid_function_t *leaf) const
BX_CPUID_STD_MCA |
BX_CPUID_STD_CMOV |
BX_CPUID_STD_PAT |
#if BX_PHY_ADDRESS_LONG
BX_CPUID_STD_PSE36 |
#endif
BX_CPUID_STD_MMX |
BX_CPUID_STD_FXSAVE_FXRSTOR |
BX_CPUID_STD_SSE;

View File

@ -90,7 +90,9 @@ Bit32u p4_willamette_t::get_cpu_extensions_bitmask(void) const
BX_CPU_PSE |
BX_CPU_PAE |
BX_CPU_PGE |
#if BX_PHY_ADDRESS_LONG
BX_CPU_PSE36 |
#endif
BX_CPU_PAT_MTRR |
BX_CPU_XAPIC;
}
@ -197,7 +199,9 @@ void p4_willamette_t::get_std_cpuid_leaf_1(cpuid_function_t *leaf) const
BX_CPUID_STD_MCA |
BX_CPUID_STD_CMOV |
BX_CPUID_STD_PAT |
#if BX_PHY_ADDRESS_LONG
BX_CPUID_STD_PSE36 |
#endif
BX_CPUID_STD_CLFLUSH |
BX_CPUID_STD_DEBUG_STORE |
BX_CPUID_STD_ACPI |

View File

@ -26,6 +26,7 @@ bx_define_cpudb(bx_generic)
#if BX_SUPPORT_X86_64 == 0
bx_define_cpudb(p3_katmai)
bx_define_cpudb(p4_willamette)
bx_define_cpudb(atom_n270)
#else
bx_define_cpudb(p4_prescott_celeron_336)
bx_define_cpudb(athlon64_clawhammer)