#
1.8 |
|
11-Mar-2021 |
jsg |
spelling
|
Revision tags: OPENBSD_5_9_BASE OPENBSD_6_0_BASE OPENBSD_6_1_BASE OPENBSD_6_2_BASE OPENBSD_6_3_BASE OPENBSD_6_4_BASE OPENBSD_6_5_BASE OPENBSD_6_6_BASE OPENBSD_6_7_BASE OPENBSD_6_8_BASE
|
#
1.7 |
|
05-Jan-2016 |
visa |
Some implementations of HitSyncDCache() call pmap_extract() for va->pa conversion. Because pmap_extract() acquires the PTE mutex, a "locking against myself" panic is triggered if the cache routine gets called in a context where the mutex is already held.
In the pmap, all calls to HitSyncDCache() are for a whole page. Add a new cache routine, HitSyncDCachePage(), which gets both the va and the pa of a page. This removes the need of the va->pa conversion. The new routine has the same signature as SyncDCachePage(), allowing reuse of the same routine for cache implementations that do not need differences between "Hit" and non-"Hit" routines.
With the diff, POWER Indigo2 R8000 boots multiuser again. Tested on sgi GENERIC-IP27.MP and octeon GENERIC.MP, too.
Diff from miod@, ok kettenis@
|
Revision tags: OPENBSD_5_6_BASE OPENBSD_5_7_BASE OPENBSD_5_8_BASE
|
#
1.6 |
|
31-Mar-2014 |
miod |
Due the virtually indexed nature of the L1 instruction cache on most mips processors, every time a new text page is mapped in a pmap, the L1 I$ is flushed for the va spanned by this page.
Since we map pages of our binaries upon demand, as they get faulted in, but uvm_fault() tries to map the few neighbour pages, this can end up in a bunch of pmap_enter() calls in a row, for executable mappings. If the L1 I$ is small enough, this can cause the whole L1 I$ cache to be flushed several times.
Change pmap_enter() to postpone these flushes by only registering the pending flushes, and have pmap_update() perform them. The cpu-specific cache code can then optimize this to avoid unnecessary operations.
Tested on R4000SC, R4600SC, R5000SC, RM7000, R10000 with 4KB and 16KB page sizes (coherent and non-coherent designs), and Loongson 2F by mikeb@ and me. Should not affect anything on Octeon since there is no way to flush a subset of I$ anyway.
|
#
1.5 |
|
29-Mar-2014 |
guenther |
It's been a quarter century: we can assume volatile is present with that name.
ok dlg@ mpi@ deraadt@
|
#
1.4 |
|
09-Mar-2014 |
miod |
Rework the per-cpu cache information. Use a common struct to store the line size, the number of sets, and the total size (and the set size, for convenience) per cache (I$, D$, L2, L3). This allows cpu.c to print the number of ways (sets) of L2 and L3 caches from the cache information, rather than hardcoding this from the processor type.
|
Revision tags: OPENBSD_5_3_BASE OPENBSD_5_4_BASE OPENBSD_5_5_BASE
|
#
1.3 |
|
29-Sep-2012 |
miod |
Proide a mips_sync() macro to wrap asm("sync"), and replace gazillions of such statements with it.
|
Revision tags: OPENBSD_5_2_BASE
|
#
1.2 |
|
24-Jun-2012 |
miod |
Add cache operation functions pointers to struct cpu_info; the various cache lines and sizes are already there, after all.
The ConfigCache cache routine is responsible for filling these function pointers; cache routine invocation macros are updated to use the cpu_info fields, but may still be overriden in <machine/cpu.h> on platforms where only one set of cache routines is used.
|
#
1.1 |
|
27-May-2012 |
miod |
Replace Loongson2F assembly cache routines with equivalent C code. This will make future maintainance easier.
|
Revision tags: OPENBSD_5_9_BASE OPENBSD_6_0_BASE OPENBSD_6_1_BASE OPENBSD_6_2_BASE
|
#
1.7 |
|
05-Jan-2016 |
visa |
Some implementations of HitSyncDCache() call pmap_extract() for va->pa conversion. Because pmap_extract() acquires the PTE mutex, a "locking against myself" panic is triggered if the cache routine gets called in a context where the mutex is already held.
In the pmap, all calls to HitSyncDCache() are for a whole page. Add a new cache routine, HitSyncDCachePage(), which gets both the va and the pa of a page. This removes the need of the va->pa conversion. The new routine has the same signature as SyncDCachePage(), allowing reuse of the same routine for cache implementations that do not need differences between "Hit" and non-"Hit" routines.
With the diff, POWER Indigo2 R8000 boots multiuser again. Tested on sgi GENERIC-IP27.MP and octeon GENERIC.MP, too.
Diff from miod@, ok kettenis@
|
Revision tags: OPENBSD_5_6_BASE OPENBSD_5_7_BASE OPENBSD_5_8_BASE
|
#
1.6 |
|
31-Mar-2014 |
miod |
Due the virtually indexed nature of the L1 instruction cache on most mips processors, every time a new text page is mapped in a pmap, the L1 I$ is flushed for the va spanned by this page.
Since we map pages of our binaries upon demand, as they get faulted in, but uvm_fault() tries to map the few neighbour pages, this can end up in a bunch of pmap_enter() calls in a row, for executable mappings. If the L1 I$ is small enough, this can cause the whole L1 I$ cache to be flushed several times.
Change pmap_enter() to postpone these flushes by only registering the pending flushes, and have pmap_update() perform them. The cpu-specific cache code can then optimize this to avoid unnecessary operations.
Tested on R4000SC, R4600SC, R5000SC, RM7000, R10000 with 4KB and 16KB page sizes (coherent and non-coherent designs), and Loongson 2F by mikeb@ and me. Should not affect anything on Octeon since there is no way to flush a subset of I$ anyway.
|
#
1.5 |
|
29-Mar-2014 |
guenther |
It's been a quarter century: we can assume volatile is present with that name.
ok dlg@ mpi@ deraadt@
|
#
1.4 |
|
09-Mar-2014 |
miod |
Rework the per-cpu cache information. Use a common struct to store the line size, the number of sets, and the total size (and the set size, for convenience) per cache (I$, D$, L2, L3). This allows cpu.c to print the number of ways (sets) of L2 and L3 caches from the cache information, rather than hardcoding this from the processor type.
|
Revision tags: OPENBSD_5_3_BASE OPENBSD_5_4_BASE OPENBSD_5_5_BASE
|
#
1.3 |
|
29-Sep-2012 |
miod |
Proide a mips_sync() macro to wrap asm("sync"), and replace gazillions of such statements with it.
|
Revision tags: OPENBSD_5_2_BASE
|
#
1.2 |
|
24-Jun-2012 |
miod |
Add cache operation functions pointers to struct cpu_info; the various cache lines and sizes are already there, after all.
The ConfigCache cache routine is responsible for filling these function pointers; cache routine invocation macros are updated to use the cpu_info fields, but may still be overriden in <machine/cpu.h> on platforms where only one set of cache routines is used.
|
#
1.1 |
|
27-May-2012 |
miod |
Replace Loongson2F assembly cache routines with equivalent C code. This will make future maintainance easier.
|