A Data Segment Interrupt does not indicate whether it was the result
authorkettenis <kettenis@openbsd.org>
Tue, 11 May 2021 18:21:12 +0000 (18:21 +0000)
committerkettenis <kettenis@openbsd.org>
Tue, 11 May 2021 18:21:12 +0000 (18:21 +0000)
commit2942dd665b2f5211be162d4dd1f187ed5277f9b7
treea81e58cce26f757ff077782c5682f34ababf92fa
parent2daff7cd998682c91211d93da1d8947f3197e396
A Data Segment Interrupt does not indicate whether it was the result
of a read or a write fault.  Unfortunately that means we can't call
uvm_fault(), as we have to pass the right access_type.  In particular,
passing PROT_READ for write access on a write-only page will fail.
Fix this issue by inserting an appropriate SLB entry when a mapping
exists at the fault address.  A subsequent Data Storage Interrupt
will call uvm_fault() to insert a mapping for the page into the
page tables.

Fixes the sys/kern/fork-exit regress test.

Debugging done by bluhm@ and patrick@
ok bluhm@
sys/arch/powerpc64/include/pmap.h
sys/arch/powerpc64/powerpc64/pmap.c
sys/arch/powerpc64/powerpc64/trap.c