diff options
Diffstat (limited to 'sys/arch/amd64')
-rw-r--r-- | sys/arch/amd64/amd64/amd64errata.c | 21 | ||||
-rw-r--r-- | sys/arch/amd64/include/specialreg.h | 5 |
2 files changed, 24 insertions, 2 deletions
diff --git a/sys/arch/amd64/amd64/amd64errata.c b/sys/arch/amd64/amd64/amd64errata.c index be69cf56929..f8463e80b18 100644 --- a/sys/arch/amd64/amd64/amd64errata.c +++ b/sys/arch/amd64/amd64/amd64errata.c @@ -1,4 +1,4 @@ -/* $OpenBSD: amd64errata.c,v 1.2 2008/06/26 05:42:09 ray Exp $ */ +/* $OpenBSD: amd64errata.c,v 1.3 2012/03/27 05:59:46 jsg Exp $ */ /* $NetBSD: errata.c,v 1.6 2007/02/05 21:05:45 ad Exp $ */ /*- @@ -64,6 +64,8 @@ typedef struct errata { typedef enum cpurev { BH_E4, CH_CG, CH_D0, DH_CG, DH_D0, DH_E3, DH_E6, JH_E1, JH_E6, SH_B0, SH_B3, SH_C0, SH_CG, SH_D0, SH_E4, SH_E5, + DR_BA, DR_B2, DR_B3, RB_C2, RB_C3, BL_C2, BL_C3, DA_C2, + DA_C3, HY_D0, HY_D1, HY_D1_G34R1, PH_E0, LN_B0, OINK } cpurev_t; @@ -78,6 +80,11 @@ static const u_int cpurevs[] = { SH_CG, 0x0000f4a, SH_CG, 0x0000f5a, SH_CG, 0x0000f7a, SH_D0, 0x0010f40, SH_D0, 0x0010f50, SH_D0, 0x0010f70, SH_E4, 0x0020f51, SH_E4, 0x0020f71, SH_E5, 0x0020f42, + DR_BA, 0x0100f2a, DR_B2, 0x0100f22, DR_B3, 0x0100f23, + RB_C2, 0x0100f42, RB_C3, 0x0100f43, BL_C2, 0x0100f52, + BL_C3, 0x0100f53, DA_C2, 0x0100f62, DA_C3, 0x0100f63, + HY_D0, 0x0100f80, HY_D1, 0x0100f81, HY_D1_G34R1, 0x0100f91, + PH_E0, 0x0100fa0, LN_B0, 0x0300f10, OINK }; @@ -117,6 +124,11 @@ static const uint8_t amd64_errata_set8[] = { SH_D0, SH_D0, SH_D0, SH_E4, SH_E4, SH_E5, OINK }; +static const uint8_t amd64_errata_set9[] = { + DR_BA, DR_B2, DR_B3, RB_C2, RB_C3, BL_C2, BL_C3, DA_C2, + DA_C3, HY_D0, HY_D1, HY_D1_G34R1, PH_E0, LN_B0, OINK +}; + static int amd64_errata_setmsr(struct cpu_info *, errata_t *); static int amd64_errata_testmsr(struct cpu_info *, errata_t *); @@ -222,6 +234,13 @@ static errata_t errata[] = { }, #endif #endif /* MULTIPROCESSOR */ + /* + * 721: Processor May Incorrectly Update Stack Pointer + */ + { + 721, 0, MSR_DE_CFG, amd64_errata_set9, + amd64_errata_setmsr, DE_CFG_721 + }, }; static int diff --git a/sys/arch/amd64/include/specialreg.h b/sys/arch/amd64/include/specialreg.h index 3b5839fae74..cbcc256fe05 100644 --- a/sys/arch/amd64/include/specialreg.h +++ b/sys/arch/amd64/include/specialreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: specialreg.h,v 1.20 2011/12/26 23:07:04 haesbaert Exp $ */ +/* $OpenBSD: specialreg.h,v 1.21 2012/03/27 05:59:46 jsg Exp $ */ /* $NetBSD: specialreg.h,v 1.1 2003/04/26 18:39:48 fvdl Exp $ */ /* $NetBSD: x86/specialreg.h,v 1.2 2003/04/25 21:54:30 fvdl Exp $ */ @@ -333,6 +333,9 @@ #define MSR_KERNELGSBASE 0xc0000102 /* storage for swapgs ins */ #define MSR_INT_PEN_MSG 0xc0010055 /* Interrupt pending message */ +#define MSR_DE_CFG 0xc0011029 /* Decode Configuration */ +#define DE_CFG_721 0x00000001 /* errata 721 */ + #define IPM_C1E_CMP_HLT 0x10000000 #define IPM_SMI_CMP_HLT 0x08000000 |