Home | History | Annotate | Download | only in oea
History log of /src/sys/arch/powerpc/oea/pmap.c
RevisionDateAuthorComments
 1.122  28-Feb-2025  andvar Fix various typos in comments.
 1.121  15-Dec-2023  rin powerpc: oea: For OEA64_BRIDGE, 1:1 map up to 3GiB memory

As done for OEA. Note that kva over 3GiB is reserved.

Provide PMAP_MAP_POOLPAGE for OEA64_BRIDGE at the same time, by
which direct-mapped memory is utilized in order to work around
starvation of 512MiB kernel virtual space.

PR kern/57621
 1.120  15-Dec-2023  rin powerpc/oea: pmap_create: Use PR_ZERO and drop memset(9), NFC

Part of PR kern/57621
 1.119  15-Dec-2023  rin powerpc/oea: pmap: Fix mostly-pointless overhead of pmap_pvo_pool

(1) Drop __aligned(32) from struct pvo_entry; otherwise,
sizeof(struct pvo_entry) is round-up'ed to a multiple of 32.

(2) Do not set sizeof(struct pvo_entry) to `align` argument for
pool_init(9); it must be power of 2.

(3) Align pvo_entry to 32-byte boundary only if reasonably possible,
i.e., OEA without DIAGNOSTIC (--> POOL_REDZONE) for now.

Part of PR kern/57621
 1.118  15-Dec-2023  rin powerpc/oea: pmap: Rework pmap_pte_spill()

It was broken in many ways... Now, it gets working stable both for
OEA and OEA64_BRIDGE, as far as I can see.

Part of PR kern/57621
 1.117  15-Dec-2023  rin powerpc/oea: pmap: Drop unused argument for pmap_pvo_reclaim(), NFC

Part of PR kern/57621
 1.116  08-Dec-2023  andvar fix triple s typos in comments.
 1.115  09-Oct-2023  rin powerpc/oea: pmap: Use pool_allocator_nointr() for pmap_pool

As done for (majority of) other pmap implementations.

pmap_pool_allocator() allocates memory below 256MB, but it is not
necessary for struct pmap.

Fix part of PR kern/57621, i.e., stall in pmap_create(9).

There should be another bugs that cause (MP?) kernel hangs
reported in the PR, in pmap or other MD components for powerpc
(PR port-powerpc/56922 should be one of the candidates).

XXX
pmap for powerpc/oea apparently needs some clean ups. But leave it
as is, and pull up this minimum fix to netbsd-10 at the moment.
 1.114  09-May-2022  rin branches: 1.114.4;
PR port-powerpc/56818

Fix inverted logic introduced in rev. 1.108, by which modified/referenced
bits of pages were never cleared appropriately.

Now, full ATF runs on macppc and sandpoint, with no regression observed.
 1.113  09-Apr-2022  riastradh sys: Use membar_release/acquire around reference drop.

This just goes through my recent reference count membar audit and
changes membar_exit to membar_release and membar_enter to
membar_acquire -- this should make everything cheaper on most CPUs
without hurting correctness, because membar_acquire is generally
cheaper than membar_enter.
 1.112  12-Mar-2022  riastradh sys: Membar audit around reference count releases.

If two threads are using an object that is freed when the reference
count goes to zero, we need to ensure that all memory operations
related to the object happen before freeing the object.

Using an atomic_dec_uint_nv(&refcnt) == 0 ensures that only one
thread takes responsibility for freeing, but it's not enough to
ensure that the other thread's memory operations happen before the
freeing.

Consider:

Thread A Thread B
obj->foo = 42; obj->baz = 73;
mumble(&obj->bar); grumble(&obj->quux);
/* membar_exit(); */ /* membar_exit(); */
atomic_dec -- not last atomic_dec -- last
/* membar_enter(); */
KASSERT(invariant(obj->foo,
obj->bar));
free_stuff(obj);

The memory barriers ensure that

obj->foo = 42;
mumble(&obj->bar);

in thread A happens before

KASSERT(invariant(obj->foo, obj->bar));
free_stuff(obj);

in thread B. Without them, this ordering is not guaranteed.

So in general it is necessary to do

membar_exit();
if (atomic_dec_uint_nv(&obj->refcnt) != 0)
return;
membar_enter();

to release a reference, for the `last one out hit the lights' style
of reference counting. (This is in contrast to the style where one
thread blocks new references and then waits under a lock for existing
ones to drain with a condvar -- no membar needed thanks to mutex(9).)

I searched for atomic_dec to find all these. Obviously we ought to
have a better abstraction for this because there's so much copypasta.
This is a stop-gap measure to fix actual bugs until we have that. It
would be nice if an abstraction could gracefully handle the different
styles of reference counting in use -- some years ago I drafted an
API for this, but making it cover everything got a little out of hand
(particularly with struct vnode::v_usecount) and I ended up setting
it aside to work on psref/localcount instead for better scalability.

I got bored of adding #ifdef __HAVE_ATOMIC_AS_MEMBAR everywhere, so I
only put it on things that look performance-critical on 5sec review.
We should really adopt membar_enter_preatomic/membar_exit_postatomic
or something (except they are applicable only to atomic r/m/w, not to
atomic_load/store_*, making the naming annoying) and get rid of all
the ifdefs.
 1.111  18-Feb-2022  martin Backout previous and fix the correct macro magic
 1.110  18-Feb-2022  martin pmap_pv_protect is not STATIC
 1.109  16-Feb-2022  riastradh powerpc: Sprinkle "memory" clobbers on eieio and nearby asm blocks.

Otherwise the compiler may reorder these around loads and stores,
which mostly defeats the purpose. `asm volatile' just ensures the
instruction isn't _deleted_; it may still move around.
 1.108  16-Feb-2022  riastradh powerpc: Implement pv-tracking for unmanaged pages.

Needed for drm.
 1.107  19-Jul-2021  chs there is no need to keep pvos for unmanaged mappings on a hidden p/v list,
since "unmanaged" means that we don't want to find such pvos on any p/v list.
instead, just don't put such pvos on any p/v list at all and remove
the two hidden p/v lists for unmanaged mappings. code mostly from martin,
to implement rin's suggestion of unifying the two hidden lists.
 1.106  27-Jun-2021  martin PR 55325: unify both pvo pools (for managed and unmanaged pages).
Analyzis by rin, fix suggested by chs.
 1.105  12-Mar-2021  thorpej branches: 1.105.4;
Fix paste-o in last.
 1.104  12-Mar-2021  thorpej Re-factor the code in pmap_extract() that checks the 601 I/O segment
table and the BAT tables into separate functions that can be called
from outside of the pmap module.
 1.103  11-Mar-2021  thorpej Tidy up initialization of the kernel SRs just a bit.
 1.102  10-Mar-2021  thorpej - In pmap_bootstrap1(), make sure to initialize pmap_kernel()->pm_vsid
with the kernel's base VSID.
- In va_to_vsid(), always compute the VSID from the base VSID in the
pmap and the effective segment ID (ESID), rather than extracting it
from the pmap's segment register value for that ESID. Not only does
this make the code the same between OEA and OEA64, but is also lets
us compute the correct VSID for that pmap/ESID even if the cached SR
for that ESID currently contains something else, such as an I/O segment
mapping (as might be the case on a 601).

With this change, we can temporarily toggle between an I/O segment and
and HTAB-mapped segment if needed (e.g. when calling OpenFirmware on
a 601-based system).
 1.101  02-Mar-2021  thorpej Complete the pmap symbol renaming shenanigans for pmap_bootstrap[12]().
 1.100  02-Mar-2021  rin Apply PMAPNAME() to pmap_bootstrap[12](); fix build for ofppc, which has
both pmap32 and pmap64bridge in a single kernel.
 1.99  01-Mar-2021  thorpej Split pmap_bootstrap() into 2 functions:
- pmap_bootstrap1(), which sets up the low-level pmap data structures.
- pmap_bootstrap2(), which actually programs the MMU hardware based on
pmap_bootstrap1()'s work.

pmap_bootstrap() is still provided as a wrapper around the two, but this
provides flexibility to platforms that might need to do additional work
between these two phases.
 1.98  06-Jul-2020  rin branches: 1.98.2;
Style and cosmetic changes. No binary changes intended.
 1.97  02-Jul-2020  rin Fix typo; PMAP_OEA64_BRIDGE not PMAP_OEA_BRIDGE.
Tested on Power Mac G5.
 1.96  31-May-2020  rin Stop returning while PMAP_LOCK() (= KERNEL_LOCK(1, NULL)) is held.

Kernel freeze with heavy load is significantly mitigated (fixed?),
in which I could not even enter DDB from console.

XXX
There is still inconsistency in usage of two PVO pools.
I will send-pr later.

XXX
pullup to netbsd-[987]
 1.95  27-Jan-2018  chs branches: 1.95.8;
apply the change from arch/x86/x86/pmap.c rev. 1.266 commitid vZRjvmxG7YTHLOfA:

In pmap_enter_ma(), only try to allocate pves if we might need them,
and even if that fails, only fail the operation if we later discover
that we really do need them. If we are replacing an existing mapping,
reuse the pv structure where possible.

This implements the requirement that pmap_enter(PMAP_CANFAIL) must not fail
when replacing an existing mapping with the first mapping of a new page,
which is an unintended consequence of the changes from the rmind-uvmplock
branch in 2011.

The problem arises when pmap_enter(PMAP_CANFAIL) is used to replace an existing
pmap mapping with a mapping of a different page (eg. to resolve a copy-on-write).
If that fails and leaves the old pmap entry in place, then UVM won't hold
the right locks when it eventually retries. This entanglement of the UVM and
pmap locking was done in rmind-uvmplock in order to improve performance,
but it also means that the UVM state and pmap state need to be kept in sync
more than they did before. It would be possible to handle this in the UVM code
instead of in the pmap code, but these pmap changes improve the handling of
low memory situations in general, and handling this in UVM would be clunky,
so this seemed like the better way to go.

This somewhat indirectly fixes PR 52706 on the remaining platforms where
this problem existed.
 1.94  23-Dec-2016  cherry branches: 1.94.8;
"Make NetBSD great again!"

Introduce uvm_hotplug(9) to the kernel.

Many thanks, in no particular order to:

TNF, for funding the project.

Chuck Silvers - for multiple API reviews and feedback.
Nick Hudson - for testing on multiple architectures and bugfix patches.
Everyone who helped with boot testing.

KeK (http://www.kek.org.in) for hosting the primary developers.
 1.93  14-Feb-2016  dholland branches: 1.93.2;
Add missing va_end; PR 50795 from David Binderman.
 1.92  10-Aug-2014  joerg branches: 1.92.2; 1.92.4;
Update conditions on mfsrin definition to match use.
 1.91  03-Mar-2014  macallan support ppc601
from scole_mail, ok matt@
 1.90  03-Nov-2013  mrg gcc 4.8.1 wants:
- remove some set but unused variables
- move some variables inside their usage #ifdef's
- cast to (void) instead of using a dummy return variable

(there are more to come, but this one is now tested with gcc 4.5)
 1.89  11-Apr-2013  macallan branches: 1.89.4;
make PPC_OEA64_BRIDGE mode work
from Phileas Fogg
 1.88  28-Mar-2013  christos Fix loop bug (Phileas Fogg)
 1.87  20-Oct-2012  kiyohara Support Cache Protocol 'MEI' with MULTIPROCESSOR.
 1.86  28-Jul-2012  matt branches: 1.86.2;
Fix -fno-common fallout.
 1.85  03-Feb-2012  matt Use CPP __VA_ARGS__ for DPRINTF*
 1.84  01-Feb-2012  matt Use kmem instead of malloc. Remove unneeded <sys/malloc.h> includes.
 1.83  01-Feb-2012  matt Enable XBSEN and HIGHBAT for OEA 7455 and related CPUs.
The BAT entries now have a resolution of 8MB. (Adjacent entries are merged
up to a total of 2GB per entry).
 1.82  17-Jul-2011  joerg branches: 1.82.2; 1.82.6;
Retire varargs.h support. Move machine/stdarg.h logic into MI
sys/stdarg.h and expect compiler to provide proper builtins, defaulting
to the GCC interface. lint still has a special fallback.
Reduce abuse of _BSD_VA_LIST_ by defining __va_list by default and
derive va_list as required by standards.
 1.81  30-Jun-2011  matt Modify mapiodev to take a third argument indicating whether the space
should be prefetchable (true) or not (false).
 1.80  19-Jun-2011  matt Use __builtin_clz instead of cntlzw
 1.79  02-May-2011  matt branches: 1.79.2;
A little PMAP_OEA64 pmap support.
 1.78  18-Feb-2011  matt Move powerpc_mmap_flags since pmap.c can get compiled multiple time resulting
in multiple defintions of powerpc_mmap_flags.
 1.77  15-Feb-2011  macallan implement pmap_mmap_flags() and teach PowerPC's bus_space_mmap() to actually
use BUS_SPACE_MAP_PREFETCHABLE which, now that /dev/pci* knows how to use it,
helps improve X performance
 1.76  12-Feb-2011  matt When an OEA kernel is configured for multiple MMU types, use the new
powerpc fixup mechanism to bind the kernel to a particular MMU. This
avoids an indirect call for every pmap call.
 1.75  18-Jan-2011  matt branches: 1.75.2;
Add support for BookE Freescale MPC85xx (e500 core) processors.
Add fast softint support for PowerPC (though only booke uses it).
Redo FPU/VEC support and add e500 SPE support.
Rework trap/intrs to use a common trapframe format.
Support SOFTFLOAT (no hardfloat or fpu emulation) for BookE.
 1.74  12-Nov-2010  uebayasi branches: 1.74.2;
Put VM_PAGE_TO_MD() definition in one place. No functional changes.
 1.73  10-Nov-2010  uebayasi Use more VM_PHYSMEM_*() accessors. No functional changes.
 1.72  30-Oct-2010  uebayasi Use VM_PAGE_TO_MD() to locate struct vm_page_md. No functional
changes.
 1.71  25-Feb-2010  matt branches: 1.71.2;
Adapt to spr.h breakup.
 1.70  25-Feb-2010  skrll s/cpu_fork/cpu_lwp_fork/ in comment
 1.69  21-Nov-2009  rmind branches: 1.69.2;
Use lwp_getpcb() on mips, powerpc and sh3, clean from struct user usage.
 1.68  07-Nov-2009  cegger Add a flags argument to pmap_kenter_pa(9).
Patch showed on tech-kern@ http://mail-index.netbsd.org/tech-kern/2009/11/04/msg006434.html
No objections.
 1.67  21-Oct-2009  rmind Remove uarea swap-out functionality:

- Addresses the issue described in PR/38828.
- Some simplification in threading and sleepq subsystems.
- Eliminates pmap_collect() and, as a side note, allows pmap optimisations.
- Eliminates XS_CTL_DATA_ONSTACK in scsipi code.
- Avoids few scans on LWP list and thus potentially long holds of proc_lock.
- Cuts ~1.5k lines of code. Reduces amd64 kernel size by ~4k.
- Removes __SWAP_BROKEN cases.

Tested on x86, mips, acorn32 (thanks <mpumford>) and partly tested on
acorn26 (thanks to <bjh21>).

Discussed on <tech-kern>, reviewed by <ad>.
 1.66  11-Aug-2009  matt Remove all declarations of physmem from sys/arch. Add an include of
<sys/systm.h> to the one file that did not already contain it.
This now means that physmem can be changed by updating systm.h and uvm_page.c
(excluding fixing printfs)
 1.65  21-Apr-2009  cegger change pmap flags argument from int to u_int.
discussed with christos@ on source-changes-d@
 1.64  11-Dec-2008  pooka branches: 1.64.2;
Since oea pmap.c is #included many times, put kernel_pmap_ptr into
its own source module to avoid multiple initialized data definitions.
 1.63  10-Dec-2008  pooka Make kernel_pmap_ptr a const. Requested by steve_martin.
 1.62  09-Dec-2008  pooka Make pmap_kernel() a MI macro for struct pmap *kernel_pmap_ptr,
which is now the "API" provided by the pmap module. pmap_kernel()
remains as the syntactic sugar.

Bonus cosmetics round: move all the pmap_t pointer typedefs into
uvm_pmap.h.

Thanks to Greg Oster for providing cpu muscle for doing test builds.
 1.61  29-Oct-2008  skrll branches: 1.61.12;
Typo in comment.
 1.60  05-May-2008  chs branches: 1.60.6; 1.60.8;
pmap_upvo_pool needs to use IPL_VM since it is used from
pmap_kenter_pa(), which can be called from interrupt context.
 1.59  28-Apr-2008  martin Remove clause 3 and 4 from TNF licenses
 1.58  08-Apr-2008  garbled branches: 1.58.2; 1.58.4;
SMP support for ofppc. (finally) Much thanks to Matt Thomas for help in
figuring out all the crazy nuances of getting this working, and to
Michael Lorenz for testing/fixing my changes on macppc. Tested with a
quad-proc 7044-270.
Summary of changes:

Bumped CPU_MAXNUM to 16 on ofppc.
Added md_* routines to ofppc/cpu.c, to sync the timebase, and awaken the CPUs.
Fixed a bug in the test for a 64bit bridge cpu early in locore.S
Added code to set the interrupt priority for all CPUs with an openpic.
Change rtas to probe before cpus, to allow use of the rtas freeze/thaw
timebase code routines.
Fix CPU_INFO_FOREACH macro to iterate through detected cpus, not CPU_MAXNUM.
Change most uses of ci_cpuid to ci_index, to deal with CPUs that do not allow
writing to SPR_PIR. Don't write SPR_PIR unless the secondary cpu identifies
itself as 0.
Change the hatchstack/interrupt stack allocations to allocate a 8192byte
interrupt stack, and a 4096 byte hatch stack, align them to 16 bytes, and
allocate them no lower than 0x10000. Allocate them separately to prevent the
hatch stack corrupting the interrupt stack later on.
If the CPU is a 64bit cpu, copy SPR_ASR in cpu_hatch()
Set the idle stack to ci->ci_data.cpu_idlelwp->l_addr->u_pcb.pcb_sp.
Add OF_start_cpu(). Add a routine to ofwoea_initppc to spin up secondary
procs early, and place them into a spinloop waiting for the hatch routines
to be ready.
Modify the ipi routines to deal with openpics that reverse byte order on read
from an ipi register. (such as on the 7044)
Change the rtas setup to allocate the rtas physical base address above
the kernel, to avoid mucking up the hatch/interrupt stacks.
 1.57  11-Mar-2008  matt on MP systems, whenever we change a PTE, make to sync the data cache so that
other processors can see the change.
 1.56  17-Feb-2008  phx branches: 1.56.2; 1.56.6;
Fixed compilation with DEBUG option for PMAP_OEA64_BRIDGE.
Approved by garbled.
 1.55  05-Feb-2008  garbled Ifdef out all the MPC601 code with PPC_OEA601. Now only arches that have the
possibility of running on an MPC601, are infected with all the extra code
and nops that it added.

Also, fix compilation that I broke with the pmap code, by adding
oeacpufeat to the locores of various ppc arches. Noted by mlelstv.
 1.54  05-Feb-2008  mlelstv fix and cleanup debug printf formats
 1.53  05-Feb-2008  garbled Rewrite a big chunk of the pmap and locore code for powerpc to better
deal with the 64bit bridge mode. pmap changes by Matt Thomas, rest by myself.

Change pmap.c to work similar to exec_elf.c to allow us to compile in
multiple pmaps to a single kernel. This allows the pmap for bridge64 to
co-exist with the 32bit pmap.

Yank __HAVE_PMAP_PHYSSEG from all the oea code.

Add a new global, "oeacpufeat", which is used early in locore to determine
certain cpu features. This allows us to conditionalize code early in the boot
for certain CPUs that have special needs.

Yank most of the ifdef PPC_OEA_BRIDGE64 code from almost every file it was
found in. Some of it seemed incorrect, and my 7044 booted just fine
without it. It would appear that the bridge cpus treat BAT instructions
as nops, so they seem to be safe.

In ofppc, check the oeacpufeat, and if we are on a 64bit proc, clear
MSR[SF], and ASR[V].

With all of these changes, a kernel with both PPC_OEA and PPC_OEA_BRIDGE64
will boot on the POWERIII-2 cpu. However, it will not yet boot on a 32bit
cpu, because of CACHELINESIZE. Work remains to be done there to fix that.
 1.52  17-Jan-2008  garbled Add support to ofppc for the IBM 7044-270 machine. This is a POWER3-II
based machine. Currently the kernel to run on this machine is
incompatible with the standard GENERIC kernel, so for now, we have a
separate GENERIC_B64. Eventually, I hope to combine the two.

Please note, this is a port of 32bit ofppc, not a powerpc64 port.

Thanks to Matt Thomas and Kevin Bowling for helping to make this port
possible.

Summary of changes:

Change ofwpci to use the ofmethod config for configuring the PCI bus,
rather than indirect configuration.
Move the wiring of the interrupt controllers from at the start of the
boot, into the configuration of the first PCI bus.
Rewrite the map_isa_ioregs() hack to work on a machine without BATs
Fix a ton of bugs in the genofw_find_pics routine, and in the map_space code.
Split the pic_openpic into openpic_common and pic_openpic.
Create a new pic_distopenpic driver, for the distributed openpic found on
some newer IBM machines.
Fix a bad panic in pmap_extract on 64bit bridge mode
 1.51  09-Jan-2008  garbled fix a bad cast when compiling in bridge mode
 1.50  02-Jan-2008  ad Merge vmlocking2 to head.
 1.49  15-Dec-2007  perry __FUNCTION__ -> __func__
 1.48  12-Mar-2007  ad branches: 1.48.18; 1.48.24; 1.48.26; 1.48.30;
Pass an ipl argument to pool_init/POOL_INIT to be used when initializing
the pool's lock.
 1.47  04-Mar-2007  macallan branches: 1.47.2;
make this compile again
 1.46  04-Mar-2007  christos Kill caddr_t; there will be some MI fallout, but it will be fixed shortly.
 1.45  22-Feb-2007  thorpej TRUE -> true, FALSE -> false
 1.44  21-Feb-2007  thorpej Replace the Mach-derived boolean_t type with the C99 bool type. A
future commit will replace use of TRUE and FALSE with true and false.
 1.43  30-Oct-2006  garbled branches: 1.43.4;
Make these files compile with -Wextra -Wno-unused.
 1.42  19-Sep-2006  matt When mapping the kernel, make to update its segment register to be valid.
 1.41  19-Sep-2006  matt At the end of pmap_bootstrap, if PMAP_NEED_MAPKERNEL, map the kernel into
the kernel's pmap (text will be rx, data will be rw).
 1.40  07-Sep-2006  sanjayl branches: 1.40.2; 1.40.4;
Remove debug printf that got left in accidentally
 1.39  02-Sep-2006  matt Add/rename macros (PVO_xxx_P) for testing WIRED, MANAGED, EXECUTABLE ness
of a PVO entry. (Fixes where PVO_WIRED was tested against pvo_pt.pte_lo
instead of pvo_vaddr)
 1.38  05-Aug-2006  sanjayl branches: 1.38.2;
1st cut of Powermac G5 support (uses bridge mode).
 1.37  13-May-2006  matt Fix a problem when an exec page is mapped, modified, and then unmapped.
Make sure to either clear the execness or sync the page to the icache.

This fixes gdb testsuite failures. Thanks for nathanw for testing.
 1.36  12-May-2006  nathanw Fix a typo in a comment.
 1.35  24-Dec-2005  perry branches: 1.35.4; 1.35.6; 1.35.8; 1.35.12;
Remove leading __ from __(const|inline|signed|volatile) -- it is obsolete.
 1.34  08-Dec-2005  yamt use VM_PAGE_TO_PHYS macro.
 1.33  27-Sep-2005  chs avoid calling into the pool code while PSL_EE is off.
the pool code can do spl*()/splx(), and splx() requires PSL_EE to be on.
 1.32  02-Jun-2005  he branches: 1.32.2;
Remove the hack to compile oea/pmap.c with -Wno-cast-qual, and instead
make use of the new __UNVOLATILE() macro in memset() usage.
 1.31  02-Jun-2005  he Fix variable shadowing warning.
 1.30  29-May-2005  chs in pmap_enter(), preset the ref bit for execute-only mappings too.
 1.29  22-Feb-2005  briggs branches: 1.29.2;
pmap_extract(): Only attempt to set '*pap' if pap is non-NULL.
PR port-powerpc/29507 from Neil Ludban.
 1.28  13-Feb-2005  chs move recursion-detection code inside interrupt-protected region. PR 24254.
 1.27  16-Jan-2005  chs branches: 1.27.2;
add some whitespace.
 1.26  24-Aug-2004  matt branches: 1.26.4;
Add pmap counters for reclaimed pvos and for the times a pvo could not be
obtained.
Switch to EVCNT_ATTACH_STATIC*
In DEBUG/DIAGNOSTIC, decrement/increment pmap_pvo_enter_depth around pool
calls since they could possibly cause a recursion back into pmap_pvo_enter.
 1.25  19-Aug-2004  chs implement pmap_pvo_reclaim(), which steals an existing non-wired pvo entry
for reuse, and use this in pmap_pvo_enter() when we can't allocate a new one.
 1.24  09-Jun-2004  kleink pmap_extract(): consider the MPC601's different battable layout, and its
use of I/O segments.
 1.23  21-Mar-2004  aymeric branches: 1.23.2;
pmap_pinit(): improve the hash function in the case of collisions, the
previous version would easily make the low order bits oscillate between 0
and some other value.

Together with the previous change, this should make those
pmap_pinit: out of segments
panics even less likely.

We should really attempt a systematic search before panic()ing at the end.
 1.22  21-Mar-2004  aymeric . don't call VSID_TO_HASH() on a pmap.pm_vsid. It already holds the hash value.
This should fix PR #24754, as well as many of the hangs and process
aborts reported on port-macppc@ in the last weeks.
This error would cause the pmap's vsid never to be freed, and would
occasionnally free a valid vsid used by another pmap, sometimes the kernel's.
. add a related KASSERT() to avoid regression
 1.21  17-Mar-2004  aymeric defparam PMAP_MEMLIMIT
 1.20  13-Feb-2004  wiz Uppercase CPU, plural is CPUs.
 1.19  27-Dec-2003  mjl Add some casts to printf() args to make it compile w/ DEBUG set.
 1.18  21-Nov-2003  matt More PPC64 changes. (latent for now).
 1.17  21-Nov-2003  matt Restore ci_curpm since it re-enables 603 to working state.
 1.16  27-Oct-2003  kleink pmap_print_mmuregs(): move initialization of addr before its first use;
reported by David Young.
 1.15  27-Oct-2003  dyoung Stop false uninitialized variable warning.
 1.14  24-Aug-2003  chs add support for non-executable mappings (where the hardware allows this)
and make the stack and heap non-executable by default. the changes
fall into two basic catagories:

- pmap and trap-handler changes. these are all MD:
= alpha: we already track per-page execute permission with the (software)
PG_EXEC bit, so just have the trap handler pay attention to it.
= i386: use a new GDT segment for %cs for processes that have no
executable mappings above a certain threshold (currently the
bottom of the stack). track per-page execute permission with
the last unused PTE bit.
= powerpc/ibm4xx: just use the hardware exec bit.
= powerpc/oea: we already track per-page exec bits, but the hardware only
implements non-exec mappings at the segment level. so track the
number of executable mappings in each segment and turn on the no-exec
segment bit iff the count is 0. adjust the trap handler to deal.
= sparc (sun4m): fix our use of the hardware protection bits.
fix the trap handler to recognize text faults.
= sparc64: split the existing unified TSB into data and instruction TSBs,
and only load TTEs into the appropriate TSB(s) for the permissions.
fix the trap handler to check for execute permission.
= not yet implemented: amd64, hppa, sh5

- changes in all the emulations that put a signal trampoline on the stack.
instead, we now put the trampoline into a uvm_aobj and map that into
the process separately.

originally from openbsd, adapted for netbsd by me.
 1.13  12-Aug-2003  matt Nuke ci_curpm and curpm. Nuke pcb_pmreal. Those were use for spill stacks
and those no longer exist. for few uses that need CURPM, use CURPCB/PCB_PM
 1.12  08-Aug-2003  matt Allow only user-mappings to be evicted (spillage). This prevents the
dreaded eviction of a kernel stack page.
 1.11  15-Jul-2003  lukem __KERNEL_RCSID()
 1.10  10-May-2003  thorpej branches: 1.10.2;
Back out the following chagne:
http://mail-index.netbsd.org/source-changes/2003/05/08/0068.html

There were some side-effects that I didn't anticipate, and fixing them
is proving to be more difficult than I thought, do just eject for now.
Maybe one day we can look at this again.

Fixes PR kern/21517.
 1.9  08-May-2003  thorpej Simplify the way the bounds of the managed kernel virtual address
space is advertised to UVM by making virtual_avail and virtual_end
first-class exported variables by UVM. Machine-dependent code is
responsible for initializing them before main() is called. Anything
that steals KVA must adjust these variables accordingly.

This reduces the number of instances of this info from 3 to 1, and
simplifies the pmap(9) interface by removing the pmap_virtual_space()
function call, and removing two arguments from pmap_steal_memory().

This also eliminates some kludges such as having to burn kernel_map
entries on space used by the kernel and stolen KVA.

This also eliminates use of VM_{MIN,MAX}_KERNEL_ADDRESS from MI code,
this giving MD code greater flexibility over the bounds of the managed
kernel virtual address space if a given port's specific platforms can
vary in this regard (this is especially true of the evb* ports).
 1.8  07-Apr-2003  matt Add a KASSERT to pmap_extract so that vtophys is never attempted on a
mapped user address.
 1.7  04-Apr-2003  matt If extracting an address from the kernel pmap, see if the address is outside
the mapped address range. If so, try to look it up via the BAT table. If
successful, translate and return the BAT'ed pa.
 1.6  02-Apr-2003  thorpej Use PAGE_SIZE rather than NBPG.
 1.5  17-Mar-2003  matt fix typo in comment.
 1.4  16-Mar-2003  matt Honor PMAP_NC for pmap_kenter_pa. Fix goof in pmap_pte_to_va.
 1.3  14-Mar-2003  matt Remove Debugger call.
 1.2  05-Feb-2003  matt Make things a bit more LP64 friendly.
 1.1  03-Feb-2003  matt Rename PPC_MPC6XX to PPC_OEA (and any mpc6xx reference to oea).
 1.10.2.10  11-Dec-2005  christos Sync with head.
 1.10.2.9  10-Nov-2005  skrll Sync with HEAD. Here we go again...
 1.10.2.8  04-Mar-2005  skrll Sync with HEAD.

Hi Perry!
 1.10.2.7  15-Feb-2005  skrll Sync with HEAD.
 1.10.2.6  17-Jan-2005  skrll Sync with HEAD.
 1.10.2.5  21-Sep-2004  skrll Fix the sync with head I botched.
 1.10.2.4  18-Sep-2004  skrll Sync with HEAD.
 1.10.2.3  03-Sep-2004  skrll Sync with HEAD
 1.10.2.2  25-Aug-2004  skrll Sync with HEAD.
 1.10.2.1  03-Aug-2004  skrll Sync with HEAD
 1.23.2.1  22-Aug-2004  tron branches: 1.23.2.1.2;
Pull up revision 1.25 (requested by chs in ticket #780):
implement pmap_pvo_reclaim(), which steals an existing non-wired pvo entry
for reuse, and use this in pmap_pvo_enter() when we can't allocate a new one.
 1.23.2.1.2.1  07-Aug-2005  riz Pull up revisions 1.23 and 1.29 (requested by briggs in ticket #1238):
Consider the MPC601's different battable layout and its use of
I/O segments.
Ensure that pap is non-NULL before use in pmap_extract(). Fixes PR#29507.
 1.26.4.1  29-Apr-2005  kent sync with -current
 1.27.2.1  19-Mar-2005  yamt sync with head. xen and whitespace. xen part is not finished.
 1.29.2.1  21-Oct-2005  tron Pull up following revision(s) (requested by chs in ticket #897):
sys/arch/powerpc/oea/pmap.c: revision 1.33 via patch
avoid calling into the pool code while PSL_EE is off.
the pool code can do spl*()/splx(), and splx() requires PSL_EE to be on.
 1.32.2.8  17-Mar-2008  yamt sync with head.
 1.32.2.7  27-Feb-2008  yamt sync with head.
 1.32.2.6  11-Feb-2008  yamt sync with head.
 1.32.2.5  21-Jan-2008  yamt sync with head
 1.32.2.4  03-Sep-2007  yamt sync with head.
 1.32.2.3  26-Feb-2007  yamt sync with head.
 1.32.2.2  30-Dec-2006  yamt sync with head.
 1.32.2.1  21-Jun-2006  yamt sync with head.
 1.35.12.1  24-May-2006  tron Merge 2006-05-24 NetBSD-current into the "peter-altq" branch.
 1.35.8.4  14-Sep-2006  yamt sync with head.
 1.35.8.3  03-Sep-2006  yamt sync with head.
 1.35.8.2  11-Aug-2006  yamt sync with head
 1.35.8.1  24-May-2006  yamt sync with head.
 1.35.6.1  01-Jun-2006  kardel Sync with head.
 1.35.4.1  09-Sep-2006  rpaulo sync with head
 1.38.2.1  08-Sep-2006  rpaulo Pull up following revision(s) (requested by garbled in ticket #134):
sys/arch/powerpc/oea/pmap.c: revision 1.40
Remove debug printf that got left in accidentally
 1.40.4.2  10-Dec-2006  yamt sync with head.
 1.40.4.1  22-Oct-2006  yamt sync with head
 1.40.2.1  18-Nov-2006  ad Sync with head.
 1.43.4.3  24-Mar-2007  yamt sync with head.
 1.43.4.2  12-Mar-2007  rmind Sync with HEAD.
 1.43.4.1  27-Feb-2007  yamt - sync with head.
- move sched_changepri back to kern_synch.c as it doesn't know PPQ anymore.
 1.47.2.1  13-Mar-2007  ad Sync with head.
 1.48.30.3  19-Jan-2008  bouyer Sync with HEAD
 1.48.30.2  10-Jan-2008  bouyer Sync with HEAD
 1.48.30.1  02-Jan-2008  bouyer Sync with HEAD
 1.48.26.2  27-Dec-2007  ad locking changes for macppc. Please test.
 1.48.26.1  26-Dec-2007  ad Sync with head.
 1.48.24.1  18-Feb-2008  mjf Sync with HEAD.
 1.48.18.2  23-Mar-2008  matt sync with HEAD
 1.48.18.1  09-Jan-2008  matt sync with HEAD
 1.56.6.3  17-Jan-2009  mjf Sync with HEAD.
 1.56.6.2  02-Jun-2008  mjf Sync with HEAD.
 1.56.6.1  03-Apr-2008  mjf Sync with HEAD.
 1.56.2.1  24-Mar-2008  keiichi sync with head.
 1.58.4.4  11-Mar-2010  yamt sync with head
 1.58.4.3  19-Aug-2009  yamt sync with head.
 1.58.4.2  04-May-2009  yamt sync with head.
 1.58.4.1  16-May-2008  yamt sync with head.
 1.58.2.1  18-May-2008  yamt sync with head.
 1.60.8.2  28-Apr-2009  skrll Sync with HEAD.
 1.60.8.1  19-Jan-2009  skrll Sync with HEAD.
 1.60.6.1  13-Dec-2008  haad Update haad-dm branch to haad-dm-base2.
 1.61.12.3  26-Jan-2011  matt Change battable to have a granularity of 8MB.
 1.61.12.2  17-Jan-2011  matt Add SPE (signal processing engine) support for mpc85xx/booke. Think of it
as AltiVec-lite (really lite). Genercize AltiVec support so that it could
the same interface could support SPE as well. Rework the FPU support along
the same lines. Move the __asm() to their own XXX_subr.S (altivec, fpu, spe).
 1.61.12.1  07-Jan-2011  matt Deal with new powerpc world.
 1.64.2.1  13-May-2009  jym Sync with HEAD.

Commit is split, to avoid a "too many arguments" protocol error.
 1.69.2.5  06-Nov-2010  uebayasi Sync with HEAD.
 1.69.2.4  30-Oct-2010  uebayasi Implement pmap_physload_device(9) to replace xmd(4) MD backend.
Implement pmap_mmap(9) and use it from mem(4) and xmd(4).
 1.69.2.3  30-Apr-2010  uebayasi Sync with HEAD.
 1.69.2.2  28-Apr-2010  uebayasi Always use struct vm_physseg *vm_physmem_ptrs[] in MD code.
 1.69.2.1  26-Feb-2010  uebayasi Use VM_PAGE_TO_MD(). Only compile tested.
 1.71.2.2  31-May-2011  rmind sync with head
 1.71.2.1  05-Mar-2011  rmind sync with head
 1.74.2.1  06-Jun-2011  jruoho Sync with HEAD.
 1.75.2.2  05-Mar-2011  bouyer Sync with HEAD
 1.75.2.1  17-Feb-2011  bouyer Sync with HEAD
 1.79.2.1  23-Jun-2011  cherry Catchup with rmind-uvmplock merge.
 1.82.6.1  18-Feb-2012  mrg merge to -current.
 1.82.2.3  22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.82.2.2  30-Oct-2012  yamt sync with head
 1.82.2.1  17-Apr-2012  yamt sync with head
 1.86.2.4  03-Dec-2017  jdolecek update from HEAD
 1.86.2.3  20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.86.2.2  23-Jun-2013  tls resync from head
 1.86.2.1  20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.89.4.1  18-May-2014  rmind sync with head
 1.92.4.2  05-Feb-2017  skrll Sync with HEAD
 1.92.4.1  19-Mar-2016  skrll Sync with HEAD
 1.92.2.1  07-Jun-2020  martin Pull up following revision(s) (requested by rin in ticket #1732):

sys/arch/powerpc/oea/pmap.c: revision 1.96

Stop returning while PMAP_LOCK() (= KERNEL_LOCK(1, NULL)) is held.
Kernel freeze with heavy load is significantly mitigated (fixed?),
in which I could not even enter DDB from console.

XXX
There is still inconsistency in usage of two PVO pools.
I will send-pr later.

XXX
pullup to netbsd-[987]
 1.93.2.1  07-Jan-2017  pgoyette Sync with HEAD. (Note that most of these changes are simply $NetBSD$
tag issues.)
 1.94.8.2  07-Jun-2020  martin Pull up following revision(s) (requested by rin in ticket #1554):

sys/arch/powerpc/oea/pmap.c: revision 1.96

Stop returning while PMAP_LOCK() (= KERNEL_LOCK(1, NULL)) is held.
Kernel freeze with heavy load is significantly mitigated (fixed?),
in which I could not even enter DDB from console.

XXX
There is still inconsistency in usage of two PVO pools.
I will send-pr later.

XXX
pullup to netbsd-[987]
 1.94.8.1  27-Feb-2018  martin Pull up following revision(s) (requested by mrg in ticket #593):
sys/dev/marvell/mvxpsec.c: revision 1.2
sys/arch/m68k/m68k/pmap_motorola.c: revision 1.70
sys/opencrypto/crypto.c: revision 1.102
sys/arch/sparc64/sparc64/pmap.c: revision 1.308
sys/ufs/chfs/chfs_malloc.c: revision 1.5
sys/arch/powerpc/oea/pmap.c: revision 1.95
sys/sys/pool.h: revision 1.80,1.82
sys/kern/subr_pool.c: revision 1.209-1.216,1.219-1.220
sys/arch/alpha/alpha/pmap.c: revision 1.262
sys/kern/uipc_mbuf.c: revision 1.173
sys/uvm/uvm_fault.c: revision 1.202
sys/sys/mbuf.h: revision 1.172
sys/kern/subr_extent.c: revision 1.86
sys/arch/x86/x86/pmap.c: revision 1.266 (via patch)
sys/dev/dtv/dtv_scatter.c: revision 1.4

Allow only one pending call to a pool's backing allocator at a time.
Candidate fix for problems with hanging after kva fragmentation related
to PR kern/45718.

Proposed on tech-kern:
https://mail-index.NetBSD.org/tech-kern/2017/10/23/msg022472.html
Tested by bouyer@ on i386.

This makes one small change to the semantics of pool_prime and
pool_setlowat: they may fail with EWOULDBLOCK instead of ENOMEM, if
there is a pending call to the backing allocator in another thread but
we are not actually out of memory. That is unlikely because nearly
always these are used during initialization, when the pool is not in
use.

Define the new flag too for previous commit.

pool_grow can now fail even when sleeping is ok. Catch this case in pool_get
and retry.

Assert that pool_get failure happens only with PR_NOWAIT.
This would have caught the mistake I made last week leading to null
pointer dereferences all over the place, a mistake which I evidently
poorly scheduled alongside maxv's change to the panic message on x86
for null pointer dereferences.

Since pr_lock is now used to wait for two things now (PR_GROWING and
PR_WANTED) we need to loop for the condition we wanted.
make the KASSERTMSG/panic strings consistent as '%s: [%s], __func__, wchan'
Handle the ERESTART case from pool_grow()

don't pass 0 to the pool flags
Guess pool_cache_get(pc, 0) means PR_WAITOK here.
Earlier on in the same context we use kmem_alloc(sz, KM_SLEEP).

use PR_WAITOK everywhere.
use PR_NOWAIT.

Don't use 0 for PR_NOWAIT

use PR_NOWAIT instead of 0

panic ex nihilo -- PR_NOWAITing for zerot

Add assertions that either PR_WAITOK or PR_NOWAIT are set.
- fix an assert; we can reach there if we are nowait or limitfail.
- when priming the pool and failing with ERESTART, don't decrement the number
of pages; this avoids the issue of returning an ERESTART when we get to 0,
and is more correct.
- simplify the pool_grow code, and don't wakeup things if we ENOMEM.

In pmap_enter_ma(), only try to allocate pves if we might need them,
and even if that fails, only fail the operation if we later discover
that we really do need them. This implements the requirement that
pmap_enter(PMAP_CANFAIL) must not fail when replacing an existing
mapping with the first mapping of a new page, which is an unintended
consequence of the changes from the rmind-uvmplock branch in 2011.

The problem arises when pmap_enter(PMAP_CANFAIL) is used to replace an existing
pmap mapping with a mapping of a different page (eg. to resolve a copy-on-write).
If that fails and leaves the old pmap entry in place, then UVM won't hold
the right locks when it eventually retries. This entanglement of the UVM and
pmap locking was done in rmind-uvmplock in order to improve performance,
but it also means that the UVM state and pmap state need to be kept in sync
more than they did before. It would be possible to handle this in the UVM code
instead of in the pmap code, but these pmap changes improve the handling of
low memory situations in general, and handling this in UVM would be clunky,
so this seemed like the better way to go.

This somewhat indirectly fixes PR 52706, as well as the failing assertion
about "uvm_page_locked_p(old_pg)". (but only on x86, various other platforms
will need their own changes to handle this issue.)
In uvm_fault_upper_enter(), if pmap_enter(PMAP_CANFAIL) fails, assert that
the pmap did not leave around a now-stale pmap mapping for an old page.
If such a pmap mapping still existed after we unlocked the vm_map,
the UVM code would not know later that it would need to lock the
lower layer object while calling the pmap to remove or replace that
stale pmap mapping. See PR 52706 for further details.
hopefully workaround the irregularly "fork fails in init" problem.
if a pool is growing, and the grower is PR_NOWAIT, mark this.
if another caller wants to grow the pool and is also PR_NOWAIT,
busy-wait for the original caller, which should either succeed
or hard-fail fairly quickly.

implement the busy-wait by unlocking and relocking this pools
mutex and returning ERESTART. other methods (such as having
the caller do this) were significantly more code and this hack
is fairly localised.
ok chs@ riastradh@

Don't release the lock in the PR_NOWAIT allocation. Move flags setting
after the acquiring the mutex. (from Tobias Nygren)
apply the change from arch/x86/x86/pmap.c rev. 1.266 commitid vZRjvmxG7YTHLOfA:

In pmap_enter_ma(), only try to allocate pves if we might need them,
and even if that fails, only fail the operation if we later discover
that we really do need them. If we are replacing an existing mapping,
reuse the pv structure where possible.

This implements the requirement that pmap_enter(PMAP_CANFAIL) must not fail
when replacing an existing mapping with the first mapping of a new page,
which is an unintended consequence of the changes from the rmind-uvmplock
branch in 2011.

The problem arises when pmap_enter(PMAP_CANFAIL) is used to replace an existing
pmap mapping with a mapping of a different page (eg. to resolve a copy-on-write).
If that fails and leaves the old pmap entry in place, then UVM won't hold
the right locks when it eventually retries. This entanglement of the UVM and
pmap locking was done in rmind-uvmplock in order to improve performance,
but it also means that the UVM state and pmap state need to be kept in sync
more than they did before. It would be possible to handle this in the UVM code
instead of in the pmap code, but these pmap changes improve the handling of
low memory situations in general, and handling this in UVM would be clunky,
so this seemed like the better way to go.

This somewhat indirectly fixes PR 52706 on the remaining platforms where
this problem existed.
 1.95.8.1  07-Jun-2020  martin Pull up following revision(s) (requested by rin in ticket #938):

sys/arch/powerpc/oea/pmap.c: revision 1.96

Stop returning while PMAP_LOCK() (= KERNEL_LOCK(1, NULL)) is held.
Kernel freeze with heavy load is significantly mitigated (fixed?),
in which I could not even enter DDB from console.

XXX
There is still inconsistency in usage of two PVO pools.
I will send-pr later.

XXX
pullup to netbsd-[987]
 1.98.2.1  03-Apr-2021  thorpej Sync with HEAD.
 1.105.4.1  01-Aug-2021  thorpej Sync with HEAD.
 1.114.4.2  29-Dec-2023  martin Additionally pull up following revision(s) (requested by rin in ticket #400):

sys/arch/powerpc/include/oea/pmap.h: revision 1.39
sys/arch/powerpc/include/pmap.h: revision 1.43
sys/arch/powerpc/oea/pmap_kernel.c: revision 1.14
sys/arch/powerpc/oea/pmap.c: revision 1.117
sys/arch/powerpc/oea/pmap.c: revision 1.118
sys/arch/powerpc/oea/pmap.c: revision 1.119
sys/arch/powerpc/include/vmparam.h: revision 1.27
sys/arch/powerpc/powerpc/trap.c: revision 1.165
sys/arch/powerpc/oea/pmap.c: revision 1.120
sys/arch/powerpc/oea/pmap.c: revision 1.121
sys/arch/powerpc/powerpc/vm_machdep.c: revision 1.106
sys/arch/powerpc/powerpc/bus_dma.c: revision 1.56

powerpc/oea: trap: pmap_{pte,ste}_spill() even in the interrupt context

Page table for oea is something like L2 TLB on memory; kernel and
processes share its entries, and process entries can be spilled out.

As done for MMU based on software-managed TLB, we need to restore
such entries even in the interrupt context.

Note that pmap_pte_spill() require no resouce to restore entries.
Still-not-implemented pmap_ste_spill() for OEA64 should also.
Part of PR kern/57621

powerpc/oea: pmap: Drop unused argument for pmap_pvo_reclaim(), NFC
Part of PR kern/57621

powerpc/oea: pmap: Rework pmap_pte_spill()

It was broken in many ways... Now, it gets working stable both for
OEA and OEA64_BRIDGE, as far as I can see.
Part of PR kern/57621

powerpc/oea: pmap: Fix mostly-pointless overhead of pmap_pvo_pool
(1) Drop __aligned(32) from struct pvo_entry; otherwise,
sizeof(struct pvo_entry) is round-up'ed to a multiple of 32.
(2) Do not set sizeof(struct pvo_entry) to `align` argument for
pool_init(9); it must be power of 2.
(3) Align pvo_entry to 32-byte boundary only if reasonably possible,
i.e., OEA without DIAGNOSTIC (--> POOL_REDZONE) for now.
Part of PR kern/57621

powerpc/oea: pmap_create: Use PR_ZERO and drop memset(9), NFC
Part of PR kern/57621

powerpc: oea: For OEA64_BRIDGE, 1:1 map up to 3GiB memory
As done for OEA. Note that kva over 3GiB is reserved.

Provide PMAP_MAP_POOLPAGE for OEA64_BRIDGE at the same time, by
which direct-mapped memory is utilized in order to work around
starvation of 512MiB kernel virtual space.
PR kern/57621

powerpc: Make sure direct-mapped buffer fits within correct range

For OEA and OEA64_BRIDGE, only first 3GiB memory is direct-mapped.
Part of PR kern/57621
 1.114.4.1  09-Oct-2023  martin Pull up following revision(s) (requested by rin in ticket #400):

sys/arch/powerpc/oea/pmap.c: revision 1.115

powerpc/oea: pmap: Use pool_allocator_nointr() for pmap_pool

As done for (majority of) other pmap implementations.
pmap_pool_allocator() allocates memory below 256MB, but it is not
necessary for struct pmap.

Fix part of PR kern/57621, i.e., stall in pmap_create(9).

There should be another bugs that cause (MP?) kernel hangs
reported in the PR, in pmap or other MD components for powerpc
(PR port-powerpc/56922 should be one of the candidates).
XXX

pmap for powerpc/oea apparently needs some clean ups. But leave it
as is, and pull up this minimum fix to netbsd-10 at the moment.

RSS XML Feed