diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2014-03-22 00:01:05 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2014-03-22 00:01:05 +0000 |
commit | ed1fc07629682217b4262db530476fa21391c3ca (patch) | |
tree | 3c12a739377e08409d6ae7265b4e9dc023eb6154 /lib | |
parent | 7a22ae4eeaa65944653755a8ca9c78e4374c2e53 (diff) |
Second draft of my attempt to workaround the infamous R4000 end-of-page errata,
affecting R4000 processors revision 2.x and below (found on most R4000 Indigo
and a few R4000 Indy).
Since this errata gets triggered by TLB misses when the code flow crosses a
page boundary, this code attempts to identify code pages prone to trigger the
errata, and force the next page to be mapped for at least as long as the
current pc lies in the troublesome page, by creating wiring extra TLB entries.
These entries get recycled in a lazy-but-aggressive-enough way, either because
of context switches, or because of further tlb exceptions reaching trap().
The errata workaround code is only compiled on R4000-capable kernels (i.e.
sgi GENERIC-IP22 and nothing else), and only enabled on affected processors
(i.e. not on R4000 revision 3, or on R4400).
There is still room for improvemnt in unlucky cases, but in this simple enough
incarnation, this allows my R4000 2.2 Indigo to finally reliably boot multiuser,
even though both /sbin/init and /bin/sh contain code pages which can trigger
the errata.
Diffstat (limited to 'lib')
0 files changed, 0 insertions, 0 deletions