tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pmap attempts at copying to executable pages both on mips and powerpc/booke



I reported a reproducible failure of KASSERT on powerpc/booke in which
destination of pmap_copy_page(9) is executable:

  https://mail-index.netbsd.org/port-powerpc/2016/09/11/msg003498.html

By adding the similar KASSERTs to mips kernel, I observed the same
failure on ERLITE (evbmips64-eb):

  # uname -mpr
  7.99.38 evbmips mips64eb
  # cd /usr/pkgsrc/lang/perl5; make
  (snip)
  => Checking for portability problems in extracted files
  (snip)
  Use which C compiler? [gcc]
  execve_loadvm: check exec failed 8
  execve_loadvm: check exec failed 8
  execve_loadvm: check exec failed 8
  execve_loadvm: check exec failed 8
  Checking for GNU cc in disguise and/or its version number...
  panic: kernel diagnostic assertion "!VM_PAGEMD_EXECPAGE_P(VM_PAGE_TO_MD(dst_pg))" failed: file "/var/build/src/sys/arch/mips/mips/pmap_machdep.c", line 628
  kernel: breakpoint trap
  Stopped in pid 2328.1 (sed) at  netbsd:cpu_Debugger+0x4:        jr      ra
                  bdslot: nop

This is also reproducible, and occurs at the exact same place as in
the case of powerpc/booke. Something must be wrong with the MI parts
of pmap.

I attached the patch for mips kernel, as well as ps and bt in a DDB
session below.

Thanks,
Rin
====
--- src/sys/arch/mips/mips/pmap_machdep.c.orig	2016-09-12 16:08:10.605295167 +0900
+++ src/sys/arch/mips/mips/pmap_machdep.c	2016-09-12 16:16:11.232876559 +0900
@@ -595,6 +595,7 @@
struct vm_page * const dst_pg = PHYS_TO_VM_PAGE(dst_pa); + KASSERT(!VM_PAGEMD_EXECPAGE_P(VM_PAGE_TO_MD(dst_pg)));
 	const register_t dst_va = pmap_md_map_ephemeral_page(dst_pg, false,
 	    VM_PROT_READ|VM_PROT_WRITE, &dst_pte);
@@ -624,6 +625,7 @@
 	    VM_PROT_READ, &src_pte);
KASSERT(VM_PAGE_TO_MD(dst_pg)->mdpg_first.pv_pmap == NULL);
+	KASSERT(!VM_PAGEMD_EXECPAGE_P(VM_PAGE_TO_MD(dst_pg)));
 	const register_t dst_va = pmap_md_map_ephemeral_page(dst_pg, false,
 	    VM_PROT_READ|VM_PROT_WRITE, &dst_pte);
====
db> ps
PID    LID S CPU     FLAGS       STRUCT LWP *               NAME WAIT
2328 >   1 7   0         0   ffffffff8f9f5620                sed
2092     1 3   0        80   ffffffff8fe52920                 sh wait
1117     1 3   0        80   ffffffff8feb4080                 sh pipe_rd
1108     1 3   0        80   ffffffff8feb44c0                 sh wait
764      1 3   0        80   ffffffff8fe531a0               make wait
754      1 3   0        80   ffffffff8fe535e0                 sh wait
575      1 3   0        80   ffffffff8fb40d80               make wait
515      1 3   0        80   ffffffff8fb41a40                 sh wait
437      1 3   0        80   ffffffff8ff28060              login wait
542      1 3   0        80   ffffffff8f9f51e0               cron nanoslp
592      1 3   0        80   ffffffff8fe524e0               qmgr kqueue
465      1 3   0        80   ffffffff8fb41600             pickup kqueue
569      1 3   0        80   ffffffff8f9f5a60             master kqueue
342      1 3   0        80   ffffffff8fb40940               sshd select
331      1 3   0        80   ffffffff8fe52d60               ntpd netio
314      1 3   0        80   ffffffff8fb411c0               ntpd pause
147      1 2   0         0   ffffffff8fe520a0            syslogd
1        1 3   0        80   ffffffff8ff299e0               init wait
0       42 3   0       200   ffffffff8feb5a00            swapiod swapiod
0       41 3   0       200   ffffffff8feb4d40           aiodoned aiodoned
0       40 3   0       200   ffffffff8feb5180            ioflush syncer
0       39 3   0       200   ffffffff8feb55c0           pgdaemon pgdaemon
0       36 3   0       200   ffffffff8ff284a0              nfsio nfsiod
0       35 3   0       200   ffffffff8ff288e0              nfsio nfsiod
0       34 3   0       200   ffffffff8ff308c0              nfsio nfsiod
0       33 3   0       200   ffffffff8ff30480              nfsio nfsiod
0       31 3   0       200   ffffffff8ff30d00           scsibus0 sccomp
0       30 3   0       200   ffffffff8ff30040               usb0 usbevt
0       29 3   0       200   ffffffff8ff295a0              unpgc unpgc
0       28 3   0       200   ffffffff8ff29160           rt_timer rt_timer
0       27 3   0       200   ffffffff8ff28d20        vmem_rehash vmem_rehash
0       18 3   0       200   ffffffff8ff31140         usbtask-dr usbtsk
0       17 3   0       200   ffffffff8ff31580         usbtask-hc usbtsk
0       16 3   0       200   ffffffff8ff319c0               dwc2 dwc2
0       15 3   0       200   ffffffff8ff64020         pmfsuspend pmfsuspend
0       14 3   0       200   ffffffff8ff64460           pmfevent pmfevent
0       13 3   0       200   ffffffff8ff648a0         sopendfree sopendfr
0       12 3   0       200   ffffffff8ff64ce0           nfssilly nfssilly
0       11 3   0       200   ffffffff8ff65120            cachegc cachegc
0       10 3   0       200   ffffffff8ff65560              vrele vrele
0        9 3   0       200   ffffffff8ff659a0             vdrain vdrain
0        8 3   0       200   ffffffff8ff76000          modunload mod_unld
0        7 3   0       200   ffffffff8ff76440            xcall/0 xcall
0        6 1   0       200   ffffffff8ff76880          softser/0
0        5 1   0       200   ffffffff8ff76cc0          softclk/0
0        4 1   0       200   ffffffff8ff77100          softbio/0
0        3 1   0       200   ffffffff8ff77540          softnet/0
0        2 1   0       201   ffffffff8ff77980             idle/0
0        1 3   0       200   ffffffff80506a40            swapper uvm
db> bt
0x9800000410991980: cpu_Debugger+4 (63061,ff00,0,ffffffff804fcaf0) ra ffffffff8039ef1c sz 0
0x9800000410991980: vpanic+15c (63061,ff00,0,ffffffff804fcaf0) ra ffffffff80447e38 sz 64
0x98000004109919c0: kern_assert+48 (63061,ffffffff80463740,ffffffff8046aa88,ffffffff8046a948) ra ffffffff8022d730 sz 96
0x9800000410991a20: pmap_copy_page+100 (63061,ffffffff80463740,ffffffff8046aa88,ffffffff8046a948) ra ffffffff80315190 sz 48
0x9800000410991a50: uvmfault_promote+150 (63061,ffffffff80463740,ffffffff80d75b00,ffffffff8046a948) ra ffffffff80316608 sz 96
0x9800000410991ab0: uvm_fault_internal+bf0 (63061,ffffffff80463740,2,0) ra ffffffff8023315c sz 512
0x9800000410991cb0: trap+89c (63061,1,2,787d1f80) ra ffffffff8022842c sz 496
0x9800000410991ea0: mips64r2_user_gen_exception+cc (63061,1,2,787d1f80) ra 0 sz 0

User-level: pid 2328.1


Home | Main Index | Thread Index | Old Index