Implement workaround for:
arm11 Errata 364296:Possible Cache Data Corruption with Hit-Under-Miss Remove hack in userret which is redundant with workaround. workaround code from <imre.deak@teleca.com>
This commit is contained in:
parent
eb096a3c19
commit
4886aa3da7
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: ast.c,v 1.14 2008/04/27 18:58:43 matt Exp $ */
|
/* $NetBSD: ast.c,v 1.15 2008/07/22 07:07:23 matt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994,1995 Mark Brinicombe
|
* Copyright (c) 1994,1995 Mark Brinicombe
|
||||||
@ -41,7 +41,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.14 2008/04/27 18:58:43 matt Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.15 2008/07/22 07:07:23 matt Exp $");
|
||||||
|
|
||||||
#include "opt_ddb.h"
|
#include "opt_ddb.h"
|
||||||
|
|
||||||
@ -74,23 +74,8 @@ void ast(struct trapframe *);
|
|||||||
void
|
void
|
||||||
userret(struct lwp *l)
|
userret(struct lwp *l)
|
||||||
{
|
{
|
||||||
#ifdef CPU_ARM11
|
|
||||||
struct cpu_info * const ci = curcpu();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Invoke MI userret code */
|
/* Invoke MI userret code */
|
||||||
mi_userret(l);
|
mi_userret(l);
|
||||||
|
|
||||||
#ifdef CPU_ARM11
|
|
||||||
/*
|
|
||||||
* This is a hack to work around an unknown cache bug on the ARM11
|
|
||||||
* Before returning we clean the data cache.
|
|
||||||
*/
|
|
||||||
if (ci->ci_arm_cputype == CPU_ID_ARM1136JS
|
|
||||||
|| ci->ci_arm_cputype == CPU_ID_ARM1136JSR1) {
|
|
||||||
__asm("mcr\tp15, 0, %0, c7, c10, 0" :: "r"(0));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -120,7 +105,7 @@ ast(struct trapframe *tf)
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (l == NULL)
|
if (l == NULL)
|
||||||
panic("ast: no curlwp!");
|
panic("ast: no curlwp!");
|
||||||
if (&l->l_addr->u_pcb == 0)
|
if (&l->l_addr->u_pcb == NULL)
|
||||||
panic("ast: no pcb!");
|
panic("ast: no pcb!");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: cpufunc.c,v 1.85 2008/07/13 09:12:14 chris Exp $ */
|
/* $NetBSD: cpufunc.c,v 1.86 2008/07/22 07:07:23 matt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* arm7tdmi support code Copyright (c) 2001 John Fremlin
|
* arm7tdmi support code Copyright (c) 2001 John Fremlin
|
||||||
@ -47,7 +47,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.85 2008/07/13 09:12:14 chris Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.86 2008/07/22 07:07:23 matt Exp $");
|
||||||
|
|
||||||
#include "opt_compat_netbsd.h"
|
#include "opt_compat_netbsd.h"
|
||||||
#include "opt_cpuoptions.h"
|
#include "opt_cpuoptions.h"
|
||||||
@ -2367,7 +2367,10 @@ void
|
|||||||
arm1136_setup(char *args)
|
arm1136_setup(char *args)
|
||||||
{
|
{
|
||||||
int cpuctrl, cpuctrl_wax;
|
int cpuctrl, cpuctrl_wax;
|
||||||
|
uint32_t auxctrl, auxctrl_wax;
|
||||||
|
uint32_t tmp, tmp2;
|
||||||
uint32_t sbz=0;
|
uint32_t sbz=0;
|
||||||
|
uint32_t cpuid;
|
||||||
|
|
||||||
#if defined(PROCESS_ID_IS_CURCPU)
|
#if defined(PROCESS_ID_IS_CURCPU)
|
||||||
/* set curcpu() */
|
/* set curcpu() */
|
||||||
@ -2377,6 +2380,8 @@ arm1136_setup(char *args)
|
|||||||
__asm("mcr\tp15, 0, %0, c13, c0, 4" : : "r"(&lwp0));
|
__asm("mcr\tp15, 0, %0, c13, c0, 4" : : "r"(&lwp0));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
cpuid = cpu_id();
|
||||||
|
|
||||||
cpuctrl =
|
cpuctrl =
|
||||||
CPU_CONTROL_MMU_ENABLE |
|
CPU_CONTROL_MMU_ENABLE |
|
||||||
CPU_CONTROL_DC_ENABLE |
|
CPU_CONTROL_DC_ENABLE |
|
||||||
@ -2412,6 +2417,22 @@ arm1136_setup(char *args)
|
|||||||
if (vector_page == ARM_VECTORS_HIGH)
|
if (vector_page == ARM_VECTORS_HIGH)
|
||||||
cpuctrl |= CPU_CONTROL_VECRELOC;
|
cpuctrl |= CPU_CONTROL_VECRELOC;
|
||||||
|
|
||||||
|
auxctrl = 0;
|
||||||
|
auxctrl_wax = ~0;
|
||||||
|
/* This options enables the workaround for the 364296 ARM1136
|
||||||
|
* r0pX errata (possible cache data corruption with
|
||||||
|
* hit-under-miss enabled). It sets the undocumented bit 31 in
|
||||||
|
* the auxiliary control register and the FI bit in the control
|
||||||
|
* register, thus disabling hit-under-miss without putting the
|
||||||
|
* processor into full low interrupt latency mode. ARM11MPCore
|
||||||
|
* is not affected.
|
||||||
|
*/
|
||||||
|
if ((cpuid & CPU_ID_CPU_MASK) == CPU_ID_ARM1136JS) { /* ARM1136JSr0pX */
|
||||||
|
cpuctrl |= CPU_CONTROL_FI_ENABLE;
|
||||||
|
auxctrl = ARM11R0_AUXCTL_PFI;
|
||||||
|
auxctrl_wax = ~ARM11R0_AUXCTL_PFI;
|
||||||
|
}
|
||||||
|
|
||||||
/* Clear out the cache */
|
/* Clear out the cache */
|
||||||
cpu_idcache_wbinv_all();
|
cpu_idcache_wbinv_all();
|
||||||
|
|
||||||
@ -2422,6 +2443,14 @@ arm1136_setup(char *args)
|
|||||||
curcpu()->ci_ctrl = cpuctrl;
|
curcpu()->ci_ctrl = cpuctrl;
|
||||||
cpu_control(~cpuctrl_wax, cpuctrl);
|
cpu_control(~cpuctrl_wax, cpuctrl);
|
||||||
|
|
||||||
|
__asm volatile ("mrc p15, 0, %0, c1, c0, 1\n\t"
|
||||||
|
"bic %1, %0, %2\n\t"
|
||||||
|
"eor %1, %0, %3\n\t"
|
||||||
|
"teq %0, %1\n\t"
|
||||||
|
"mcrne p15, 0, %1, c1, c0, 1\n\t"
|
||||||
|
: "=r"(tmp), "=r"(tmp2) :
|
||||||
|
"r"(~auxctrl_wax), "r"(auxctrl));
|
||||||
|
|
||||||
/* And again. */
|
/* And again. */
|
||||||
cpu_idcache_wbinv_all();
|
cpu_idcache_wbinv_all();
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: armreg.h,v 1.38 2008/04/27 18:58:44 matt Exp $ */
|
/* $NetBSD: armreg.h,v 1.39 2008/07/22 07:07:23 matt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998, 2001 Ben Harris
|
* Copyright (c) 1998, 2001 Ben Harris
|
||||||
@ -292,9 +292,18 @@
|
|||||||
#define CPU_CONTROL_V4COMPAT 0x00008000 /* L4: ARMv4 compat LDR R15 etc */
|
#define CPU_CONTROL_V4COMPAT 0x00008000 /* L4: ARMv4 compat LDR R15 etc */
|
||||||
#define CPU_CONTROL_UNAL_ENABLE 0x00040000 /* U: unaligned data access */
|
#define CPU_CONTROL_UNAL_ENABLE 0x00040000 /* U: unaligned data access */
|
||||||
#define CPU_CONTROL_XP_ENABLE 0x00080000 /* XP: extended page table */
|
#define CPU_CONTROL_XP_ENABLE 0x00080000 /* XP: extended page table */
|
||||||
|
#define CPU_CONTROL_FI_ENABLE 0x00200000 /* FI: Low interrupt latency */
|
||||||
|
|
||||||
#define CPU_CONTROL_IDC_ENABLE CPU_CONTROL_DC_ENABLE
|
#define CPU_CONTROL_IDC_ENABLE CPU_CONTROL_DC_ENABLE
|
||||||
|
|
||||||
|
/* ARM11r0 Auxillary Control Register (CP15 register 1, opcode2 1) */
|
||||||
|
#define ARM11R0_AUXCTL_PFI 0x80000000 /* PFI: partial FI mode. */
|
||||||
|
/* This is an undocumented flag
|
||||||
|
* used to work around a cache bug
|
||||||
|
* in r0 steppings. See errata
|
||||||
|
* 364296.
|
||||||
|
*/
|
||||||
|
|
||||||
/* XScale Auxillary Control Register (CP15 register 1, opcode2 1) */
|
/* XScale Auxillary Control Register (CP15 register 1, opcode2 1) */
|
||||||
#define XSCALE_AUXCTL_K 0x00000001 /* dis. write buffer coalescing */
|
#define XSCALE_AUXCTL_K 0x00000001 /* dis. write buffer coalescing */
|
||||||
#define XSCALE_AUXCTL_P 0x00000002 /* ECC protect page table access */
|
#define XSCALE_AUXCTL_P 0x00000002 /* ECC protect page table access */
|
||||||
|
Loading…
Reference in New Issue
Block a user